香農編碼實驗報告_第1頁
香農編碼實驗報告_第2頁
香農編碼實驗報告_第3頁
香農編碼實驗報告_第4頁
香農編碼實驗報告_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 中南大學 信息論與編碼實驗報告 題 目 信源編碼實驗 指導教師 學 院專業班級 姓名 學號 日期 目錄一、香農編碼.3 實驗目的.3 實驗要求.3 編碼算法.3 調試過程.3 參考代碼.4 調試驗證.7 實驗總結.7二、哈夫曼編碼.8 實驗目的.8 實驗原理.8 數據記錄.9 實驗心得.10一、香農編碼1、實驗目的 (1)進一步熟悉Shannon編碼算法; (2)掌握C語言程序設計和調試過程中數值的進制轉換、數值與字符串之間的轉換等技術。2、實驗要求 (1)輸入:信源符號個數q、信源的概率分布p; (2)輸出:每個信源符號對應的Shannon編碼的碼字。3、Shannon編碼算法 1:pro

2、cedure SHANNON(q,)2: 降序排列3: for i=1 q do4: F() 5: 6:將累加概率F()(十進制小數)變換成二進制小數。7:取小數點后個二進制數字作為第i個消息的碼字。8:end for9:end procedure-4、 調試過程1、fatal error C1083: Cannot open include file: unistd.h: No such file or directory fatal error C1083: Cannot open include file: values.h: No such file or directory原因:un

3、istd.h和values.h是Unix操作系統下所使用的頭文件糾錯:刪去即可2、error C2144: syntax error : missing ) before type int error C2064: term does not evaluate to a function原因:l_i(int *)calloc(n,sizeof(int); l_i后缺少賦值符號使之不能通過編譯糾錯:添加上賦值符號3、 error C2018: unknown character 0xa1原因:有不能被識別的符號糾錯:在錯誤處將不能識別的符號改為符合C語言規范的符號4、 error C2021:

4、expected exponent value, not 原因:if(fabs(sum-1.0)DELTA); 這一行中DELTA宏定義不正確糾錯:# define DELTA 0.5、 error C2143: syntax error : missing ; before 原因:少寫了“;”號糾錯:在對應位置添加上“;”號5、 參考代碼# include# include# include# include# define DELTA 0./*精度*/void sort(float*,int);/*排序*/int main(void)register int i,j;int n; /*符號

5、個數*/int temp;/*中間變量*/float *p_i; /*符號的概率*/float *P_i; /*累加概率*/int *l_i; /*碼長*/char * *C; /*碼集合*/*用sum來檢驗數據,用p來緩存了中間數據*/float sum,p;/*輸入符號數*/fscanf(stdin,%d,&n);/*分配內存地址 */p_i=(float *)calloc(n,sizeof(float);P_i=(float *)calloc(n,sizeof(float);l_i=(int *)calloc(n,sizeof(int); /* 存儲信道傳輸的概率*/ for(i=0;i

6、n;i+) fscanf(stdin,%f,&p_ii); /*確認輸入的數據*/ sum=0.0; for(i=0;iDELTA) fprintf(stderr,Invalid input data n); fprintf(stdout,Startingnn); /*以降序排列概率*/ sort (p_i,n); /*計算每個符號的碼長*/ for(i=0;in;i+) p=(float)(-(log(p_ii)/log(2.0); l_ii=(int)ceil(p); /*為碼字分配內存地址*/ C=(char *)calloc(n,sizeof(char *); for(i=0;in;i

7、+) Ci=(char *)calloc(l_ii+1,sizeof(char); Ci0=0; /*計算概率累加和*/ P_i0=0.0; for(i=1;in;i+) P_ii=P_ii-1+p_ii-1; /*將概率和轉變為二進制編碼*/ for(i=0;in;i+) for(j=0;jl_ii;j+) /*乘2后的整數部分即為這一位的二進制碼元*/ P_ii=P_ii*2; temp=(int)(P_ii); P_ii=P_ii-temp;/*整數部分大于0為1,等于0為0*/ if(temp=0) Ci=strcat(Ci,0); else Ci=strcat(Ci,1); /*顯示

8、編碼結果*/ fprintf(stdout,The output coding is :n); for(i=0;i=0;i-) free(Ci); free(C); free(p_i); free(P_i); free(l_i); exit(0); /*冒泡排序法*/ void sort(float *k,int m) int i=1;/*外層循環變量*/ int j=1;/*內層循環變量*/ int finish=0;/*結束標志*/ float temp;/*中間變量*/ while(im&!finish) finish=1; for(j=0;jm-i;j+) /*將小的數后移*/ if(

9、kj clear all p=0.20 0.18 0.15 0.17 0.19 0.10 0.01;l=0;H=0;N=length(p);for i=1:N H=H+(-p(i)*log2(p(i); endfprintf(信源信息熵:n);disp(H);for i=1:N-1 for j=i+1:N if p(i)p(j) m=p(j); p(j)=p(i); p(i)=m; end endendfor i=1:N-1 c(i,:)=blanks(N*N); end c(N-1,N)=0; c(N-1,2*N)=1; for i=1:N-1 %對字符數組c碼字賦值過程,記下沿路徑的“1”

10、和0; c(N-i,1:N-1)=c(N-i+1,N*(find(m(N-i+1,:)=1)-(N-2):N*(find(m(N-i+1,:)=1); c(N-i,N)=0; c(N-i,N+1;2*N-1)=c(N-i,1:N-1); c(N-i,2*N)=1; for j=1:i-1 c(N-i,(j+1)*N+1:(j+2)*N)=c(N-i+1,N*(find(m(N-i+1,:)=j+1)-1)+1:N*find(m(N-i+1,:)=j+1); endendfor i=1:N h(i,1:N)=c(1,N*(find(m(1,:)=i)-1)+1:find(m(1,:)=i)*N);%碼字賦值 ll(i)=length(find(abs(h(i,:)=32);%各碼字碼長 endl=sum(p.*ll);%計算平均碼長n=H/l;%計算編碼效率fprintf(編碼的碼字:n);disp(h

溫馨提示

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

評論

0/150

提交評論