視音頻信號處理課程設計_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  《視音頻信號處理課程設計》</p><p> ?。?013/2014-1第19周)</p><p><b>  2014年1月</b></p><p>  視音頻信號處理課程設計</p><p><b>  任 務 書</b></p><p><

2、;b>  一、設計目的:</b></p><p>  1.掌握視音頻系統(tǒng)方案設計的一般方法,主要包括系統(tǒng)分析、系統(tǒng)設計的組織和實施。</p><p>  2.掌握音頻信號處理和圖像數(shù)據(jù)處理方法和技術(shù)。</p><p>  3. 掌握視頻的預測編碼處理的編程技術(shù),并能獨立完成一般小型視音頻信號處理系統(tǒng)的程序設計、調(diào)試運行等工作。</p>

3、<p>  3.培養(yǎng)把所學知識運用到具體實踐對象,并能提出詳細解決方案的能力。</p><p><b>  二、任務要求: </b></p><p>  請設計一種處理視頻(連續(xù)圖像)數(shù)據(jù)的壓縮和解壓算法,并編程實現(xiàn),實現(xiàn)語言為C/C++。</p><p>  圖像的原始數(shù)據(jù)文件為BMP文件,圖像數(shù)據(jù)請自行獲取,所處理的圖像幀數(shù)不能

4、少于10幀。輸出的編碼文件格式請自行定義。</p><p>  壓縮算法的環(huán)節(jié)必須包括運動估計和運動補償、熵編碼,變換編碼(比如DCT變換)為建議環(huán)節(jié),不是必須環(huán)節(jié)。</p><p>  解壓算法需要能夠從壓縮數(shù)據(jù)恢復圖像數(shù)據(jù)。</p><p>  請計算你所完成壓縮算法的壓縮性能(壓縮比)以及圖像質(zhì)量(PSNR)。</p><p><

5、b>  三、結(jié)果形式:</b></p><p>  1、算法流程設計:關(guān)于所設計的視頻壓縮解壓算法流程的詳細描述。</p><p><b>  2、算法源代碼。</b></p><p><b>  3、原始圖像文件。</b></p><p>  4、算法性能分析報告:主要包括壓縮算

6、法的壓縮性能(壓縮比)以及圖像質(zhì)量的實驗計算結(jié)果。</p><p><b>  5、上機正常運行。</b></p><p><b>  四、成績考核:</b></p><p>  1.課程設計態(tài)度(30分)。</p><p>  2.遞交的課程設計報告(60分)。</p><p&

7、gt;  3、上機運行情況(10分)。</p><p>  評分按任務項具體要求的基本要求為標準,總分100分??偝煽冋酆弦晕寮壷瞥煽冇嫞▋?yōu)秀、良好、中、及格、不及格)。</p><p>  要求同學們獨立完成,發(fā)現(xiàn)抄襲的,經(jīng)查實后以0分計。</p><p>  五、工作進度:(共1周)</p><p>  《視音頻信號處理課程設計》設計報告

8、</p><p><b>  目 錄</b></p><p>  一、算法流程設計:5</p><p>  二、算法源代碼:5</p><p>  三、原始圖像文件:5</p><p>  四、算法性能分析:5</p><p>  五、結(jié)果分析、結(jié)論與體會:5

9、</p><p>  六、參考文獻及資料:5</p><p><b>  算法流程設計:</b></p><p><b>  視像數(shù)據(jù)的壓縮算法</b></p><p>  MPEG-1視像(MPEG-1 Video) 壓縮視像數(shù)據(jù)的基本方法可以歸納成兩個要點</p><p&g

10、t;  在空間方向上,采用與JPEG類似的算法來去掉空間冗余數(shù)據(jù)</p><p>  在時間方向上,采用移動補償(motion compensation)算法來去掉時間冗余數(shù)據(jù)</p><p><b>  視像數(shù)據(jù)結(jié)構(gòu)</b></p><p>  把視像片段看成由一系列靜態(tài)圖像(picture)組成的視像序列(sequence)</p&g

11、t;<p>  把視像序列分成許多像組(group of picture,GOP)</p><p>  把像組中的每一幀圖像分成許多像片(slice),每個像片由16行組成</p><p>  把像片分成16行×16像素/行的宏塊(macroblock,MB)</p><p>  把宏塊分成若干個8行×8像素/行的圖塊(block)

12、</p><p>  使用子采樣格式為4:2:0時,一個宏塊由4個亮度(Y)圖塊和兩個色度圖塊(Cb和Cr)組成</p><p>  預測圖像P的壓縮編碼算法 </p><p><b>  算法原理</b></p><p>  預測圖像P的編碼以宏塊(MB)為基本編碼單元,一個宏塊定義為像素的圖塊,一般取16×

13、16</p><p>  預測圖像P使用兩種類型的參數(shù)表示</p><p>  當前要編碼的圖像宏塊與參考圖像的宏塊之間的差值</p><p>  宏塊的移動矢量(motion vector, MV)</p><p>  BMP文件組成 BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù) 四部分組成。 1. BMP文件頭 BMP文件頭數(shù)

14、據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。 </p><p><b>  2. 位圖信息頭 </b></p><p>  3. 顏色表 顏色表用于說明位圖中的顏色,它有若干個表項,每 一個表項是一個RGBQUAD類型的結(jié)構(gòu),定義一種顏色。</p><p>  4. 位圖數(shù)據(jù) 位圖數(shù)據(jù)記錄了位圖的每一個像素值,記錄順序是在掃描

15、行內(nèi)是從左到右,掃描行之間是從下到上。</p><p><b>  具體流程</b></p><p>  進行主框架的搭建,即main函數(shù)的編寫,獲取視頻的幀數(shù)及相應的圖片,并聲明bmp圖片的讀入和寫出的函數(shù)、殘差計算運動估計函數(shù)以及游程編碼和解碼函數(shù),并在main函數(shù)相關(guān)位置調(diào)用readwrite()函數(shù)。</p><p>  bmp圖片的讀

16、寫函數(shù)的功能進行編寫,在本函數(shù)中設立一個switch語句進行用戶操作判斷,若用戶選擇壓縮操作,則將指定文件讀入,并進行運動估計及游程編碼的操作,最后將壓縮后的信息寫在.raw文件中。</p><p>  編寫差值計算函數(shù),即diff()函數(shù),在函數(shù)中,第一幀圖像的殘差值為自身,而后的圖片的殘差圖像為當前圖像與前一幀圖像的差值,</p><p>  將所得到的殘差值進行編碼,由于殘差值有較多

17、的0,則這里使用游程編碼,并將結(jié)構(gòu)寫入到.raw文件中。</p><p>  編寫游程解碼函數(shù),通過編碼得到的文件中的數(shù)據(jù)進行解碼,得到解碼后的bmp圖像。</p><p><b>  流程圖:</b></p><p>  壓縮操作 解壓操作 退出操作</p><p><b>  算法

18、源代碼:</b></p><p>  main函數(shù):(程序入口)</p><p>  int main()</p><p><b>  {</b></p><p>  int xsize = 512;//圖像寬</p><p>  int ysize = 257*3;//圖像高<

19、/p><p>  unsigned char *image;//用于存放讀入的圖片</p><p>  unsigned char *header;//記錄文件頭</p><p>  image = (unsigned char *)malloc((size_t)xsize*ysize);</p><p>  header = (unsigned

20、 char *)malloc(54);</p><p>  if (image == NULL) </p><p>  return -1;</p><p>  if (header == NULL) </p><p>  return -1;</p><p>  readwrite_bmp(image,header,

21、xsize,ysize);//文件的讀入</p><p>  free(image);</p><p>  free(header);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  Readwrite_bm

22、p函數(shù):(進行操作判斷,壓縮操作時讀入位圖信息)</p><p>  int readwrite_bmp(unsigned char *image,unsigned char *header,int xsize,int ysize)</p><p><b>  {</b></p><p><b>  int i;</b>&

23、lt;/p><p>  int choice= -1;</p><p>  FILE *fp,*ifp;</p><p>  char fname_bmp[20]; </p><p>  unsigned char *pre;</p><

24、;p>  pre=(unsigned char *)malloc((size_t)xsize*ysize); //分配空間 </p><p>  for(i=0;i<xsize*ysize;i++) pre[i]=0;//初始化</p><p>  unsigned char *temp;</p><p>  temp=(unsigned char *

25、)malloc((size_t)xsize*ysize);</p><p>  for(i=0;i<xsize*ysize;i++) temp[i]=0;//初始化</p><p>  while(choice)</p><p><b>  {</b></p><p>  printf("********

26、**************************************\n");</p><p>  printf("*請選擇操作: *\n");</p><p>  printf("*1、圖像壓縮; *\n");</p><

27、;p>  printf("*2、圖像解壓; *\n");</p><p>  printf("*3、退出; *\n");</p><p>  printf("*********************************************

28、*\n\n");</p><p>  scanf("%d",&choice);</p><p>  switch(choice)</p><p><b>  {</b></p><p><b>  case 1:</b></p><p>

29、  ifp=fopen("test.rmvb", "wb");</p><p>  for(i=0;i<10;i++) //圖像序列</p><p><b>  {</b></p><p>  sprintf(fname_bmp, "xj%d.bmp", i);

30、//把格式化的數(shù)據(jù)寫入某個字符串中 當前文件名</p><p>  if (!(fp = fopen(fname_bmp, "rb")))</p><p>  return -1;</p><p>  fread(header, sizeof(unsigned char), 54, fp);//讀取文件的header信息</p>&

31、lt;p>  fread(image, sizeof(unsigned char), (size_t)(long)xsize*ysize, fp);//讀取圖片信息存入image數(shù)組中</p><p>  diff(ifp,header,temp,pre,image,xsize,ysize);//調(diào)用運動估計函數(shù)</p><p>  fclose(fp);</p>&

32、lt;p><b>  }</b></p><p>  fclose(ifp);</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  runlength_de(pre,temp,header,xsize,

33、ysize);//解壓</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p><b>  exit(0);</b></p><p><b>  break;</b></p>&l

34、t;p><b>  default:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  free(pre);</p><p

35、>  free(temp);</p><p>  return 0;}</p><p>  Diff( )函數(shù):(將各圖像進行殘差計算)</p><p>  void diff(FILE *ifp,unsigned char *header,unsigned char *temp,unsigned char *pre,unsigned char *now,i

36、nt xsize,int ysize)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  unsigned char *diff;</p><p>  /*for( i = 0; i <xsie; i++ )</p>

37、<p><b>  {</b></p><p>  for( j = 0; j < ysize; j++ )</p><p><b>  {</b></p><p>  for(int k=3;k>0;k--){</p><p>  for(int m=i-k;m<i+

38、k;m=m+k){</p><p>  for(int n=j-k;n<j+k;n=n+k){</p><p>  if(m!=i||n!=j){</p><p><b>  cnt=</b></p><p><b>  }</b></p><p><b> 

39、 }</b></p><p><b>  }</b></p><p><b>  }*/</b></p><p>  diff=(unsigned char *)malloc((size_t)xsize*ysize);//空間申請</p><p>  for(i=0;i<xsize

40、;i++)</p><p><b>  {</b></p><p>  for(j=0;j<ysize;j++)</p><p><b>  {</b></p><p>  diff[i*ysize+j]=now[i*ysize+j]-pre[i*ysize+j];</p>&l

41、t;p>  pre[i*ysize+j]=now[i*ysize+j];//對每張圖片計算其殘差圖像。首張圖片的殘差圖像為其本身,后續(xù)圖片的殘差圖像為當前圖像與前一幀圖像的差值。</p><p><b>  }</b></p><p><b>  }</b></p><p>  runlength_en(ifp,di

42、ff,header,xsize,ysize);</p><p>  free(diff);</p><p><b>  }</b></p><p>  Runlength_en( )函數(shù):(將所得到的殘差值進行游程編碼)</p><p>  int runlength_en(FILE *ifp,unsigned char

43、 *diff,unsigned char *header,int xsize,int ysize) //游程編碼</p><p><b>  {</b></p><p>  int i,j,k,sign,num,tmp;</p><p><b>  FILE *fa;</b></p><p>  

44、char A[20];</p><p>  char str[512][257*3];</p><p>  fwrite(header,sizeof(unsigned char),54,ifp);</p><p>  unsigned char *buf;</p><p>  sign=0;k=0;</p><p> 

45、 buf=(unsigned char *)malloc((size_t)xsize*ysize*2);</p><p>  for(i=0;i<xsize;i++)</p><p><b>  {</b></p><p>  for(j=0;j<ysize;j++)//按行逐個取殘差值</p><p>&l

46、t;b>  {</b></p><p>  if(sign==0) //第一副圖像的殘差取自身的</p><p><b>  {</b></p><p>  tmp=diff[i*ysize+j];</p><p><b>  sign=1;</b></p><

47、p><b>  num=1;</b></p><p><b>  }</b></p><p>  else//后續(xù)圖像</p><p><b>  {</b></p><p>  if(tmp==diff[i*ysize+j])//相等時個數(shù)加</p>&l

48、t;p><b>  {</b></p><p>  //if(num<ysize) </p><p><b>  num++;</b></p><p><b>  //else</b></p><p><b>  //{</b></p&g

49、t;<p>  //buf[k]=tmp;</p><p>  //buf[k+1]=num;</p><p>  //k+=2;//每次村兩個數(shù)據(jù)</p><p>  //tmp=diff[i*ysize+j];</p><p><b>  //sign=1;</b></p><p&g

50、t;<b>  //num=1;</b></p><p><b>  //}</b></p><p><b>  }</b></p><p>  else//不同時將計算好的值及個數(shù)進行存入相應數(shù)組</p><p><b>  {</b></p>

51、;<p>  buf[k]=tmp;</p><p>  buf[k+1]=num;</p><p><b>  k+=2;</b></p><p>  tmp=diff[i*ysize+j];</p><p><b>  sign=1;</b></p><p>

52、;<b>  num=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  str[i][j]=tmp;</p><p><b>  }</b></p><p><b

53、>  }</b></p><p>  fwrite(&k,sizeof(unsigned int),1,ifp);</p><p>  fwrite(buf,sizeof(unsigned char),k,ifp);//存入編碼后的值</p><p>  sprintf(A, "A0%d.raw", round);//文

54、件的輸出</p><p>  if(!(fa=fopen(A,"wb")))</p><p>  printf("error to open A.raw\n");</p><p>  fwrite(str,sizeof(str),1,fa);</p><p>  fclose(fa);</p>

55、;<p>  free(buf);round++;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  runlength_de( )函數(shù):(讀取之前壓縮后的文件信息,并用游程解碼進行譯碼)</p><p>  int r

56、unlength_de(unsigned char *diff,unsigned char *temp,unsigned char *header,int xsize,int ysize) //游程解碼</p><p><b>  {</b></p><p>  FILE *ofp,*ifp;</p><p>  int i,j,k,leng

57、th;</p><p>  unsigned char *buf;</p><p>  ifp = fopen("test.rmvb", "rb");</p><p>  char fname_out[128];</p><p>  buf=(unsigned char *)malloc((size_t

58、)xsize*ysize*2);</p><p>  for(int m=0;m<10;m++)</p><p><b>  {</b></p><p>  sprintf(fname_out, "%d_out.bmp", m);//解壓后圖片的文件名格式</p><p>  if (!(ofp

59、 = fopen(fname_out, "wb"))) //</p><p>  return -1; </p><p>  fread(header,sizeof(unsigned char),54,ifp);//讀取文件頭信息</p><p>  fread(&length,sizeof(int),1,ifp);

60、//讀取文件信息</p><p>  fread(buf,sizeof(unsigned char),length,ifp);//讀取編碼后的信息</p><p><b>  k=0;</b></p><p>  for(i=0;i<xsize;i++)</p><p><b>  {</b>

61、;</p><p>  for(j=0;j<ysize;j++)</p><p><b>  {</b></p><p>  if(buf[k+1]>0)</p><p><b>  {</b></p><p>  diff[i*ysize+j]=buf[k];&

62、lt;/p><p>  buf[k+1]--;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  k+=2;</b></p&g

63、t;<p>  diff[i*ysize+j]=buf[k];</p><p>  buf[k+1]--;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

64、t;  for(i=0;i<xsize;i++)</p><p>  for(j=0;j<ysize;j++)</p><p>  temp[i*ysize+j]=diff[i*ysize+j]+temp[i*ysize+j];//運動補償</p><p>  fwrite(header,sizeof(unsigned char),54,ofp);<

65、;/p><p>  fwrite(temp,(size_t)xsize*ysize,1,ofp);</p><p>  fclose(ofp);</p><p><b>  }</b></p><p>  free(buf);</p><p>  fclose(ifp);</p><

66、;p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  原始圖像文件:</b></p><p><b>  四、算法性能分析:</b></p><p>  壓縮算法的環(huán)節(jié)必須包括運動估計和運動

67、補償、熵編碼,變換編碼(比如DCT變換)為建議環(huán)節(jié),不是必須環(huán)節(jié)。</p><p>  本程序用到的壓縮算法為:先利用運動估計得到圖像殘差值,再根據(jù)所得到的殘差值進行游程編碼,并將結(jié)果保存到.raw文件中。</p><p>  解壓算法需要能夠從壓縮數(shù)據(jù)恢復圖像數(shù)據(jù)。</p><p>  本程序使用switch條件判斷語句進行操作判斷,當選擇解碼操作時,就先讀入原先

68、編碼所得的raw文件中的數(shù)據(jù),在使用游程編碼的解碼進行圖像數(shù)據(jù)的恢復。</p><p>  請計算你所完成壓縮算法的壓縮性能(壓縮比)以及圖像質(zhì)量(PSNR)。</p><p>  圖像原始大小為:385kb</p><p>  壓縮后的大小為:386kb</p><p>  壓縮比為:385/386</p><p>

69、  結(jié)果分析、結(jié)論與體會:</p><p><b>  運行結(jié)果:</b></p><p><b>  運行界面:</b></p><p><b>  原圖像:</b></p><p><b>  壓縮后的文件:</b></p><p&

70、gt;<b>  解碼所得圖像:</b></p><p><b>  分析:</b></p><p>  本次所編寫的算法大致分為四個步驟,先是用readwrite_bmp()函數(shù)進行讀取文件;再用diff()進行殘差值的計算;再將所得到的殘差值進行游程編碼;最后根據(jù)壓縮所得文件進行解碼。</p><p><b>

71、;  心得體會:</b></p><p>  本次課程設計的內(nèi)容雖然在本學期的各個實驗中大部分都涉及到,雖然每次實驗基本能自己進行編寫和理解,但是在本次綜合性的作業(yè)中還是遇到了很大的麻煩。對于題目中每個要求大致能編寫相關(guān)算法,也知道程序大致的框架,但是不會整合的將這些功能連接到一起,在調(diào)用及參數(shù)上的關(guān)系理解還是有些混亂,也使得這次自己嘗試完整的編寫的代碼沒能將所要求的功能進行綜合。而后參考了別人的代碼

72、進行編寫,一開始對于bmp文件格式的不了解,不怎么能讀懂圖像文件的寫入算法,后來通過百度相關(guān)知識,知道了bmp圖像文件的基本結(jié)構(gòu)(如:BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù),并且對其文件頭進行了深部的了解);而對其所用的參數(shù)也不是很清晰,對代碼的理解方面帶來了麻煩,后來通過慢慢的整合分析,基本明白了參考程序,并開始隨著他的思想進行編寫,并對于他所編的我覺得比較麻煩一些算法進行一定的改變(如:將原本的全搜索改成了三步搜索)。通

73、過本次課程設計,鞏固了本學期視音頻課程所學的知識,也學到了很多課上所未怎么涉及的內(nèi)容。通過本次編程,掌握了視音頻系統(tǒng)方案設計的一般方法(主要包括系統(tǒng)分析、系統(tǒng)設計的組織和實施);掌握了音頻信號處理和圖像</p><p>  六、參考文獻及資料:</p><p>  1、《多媒體技術(shù)基礎(chǔ)》第三版,清華大學出版社</p><p>  2、位圖文件組成:百度文庫</

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論