香農(nóng)編碼實驗報告_第1頁
香農(nóng)編碼實驗報告_第2頁
香農(nóng)編碼實驗報告_第3頁
香農(nóng)編碼實驗報告_第4頁
香農(nóng)編碼實驗報告_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上 中南大學(xué) 信息論與編碼實驗報告 題 目 信源編碼實驗 指導(dǎo)教師 學(xué) 院專業(yè)班級 姓名 學(xué)號 日期 目錄一、香農(nóng)編碼.3 實驗?zāi)康?3 實驗要求.3 編碼算法.3 調(diào)試過程.3 參考代碼.4 調(diào)試驗證.7 實驗總結(jié).7二、哈夫曼編碼.8 實驗?zāi)康?8 實驗原理.8 數(shù)據(jù)記錄.9 實驗心得.10一、香農(nóng)編碼1、實驗?zāi)康?(1)進(jìn)一步熟悉Shannon編碼算法; (2)掌握C語言程序設(shè)計和調(diào)試過程中數(shù)值的進(jìn)制轉(zhuǎn)換、數(shù)值與字符串之間的轉(zhuǎn)換等技術(shù)。2、實驗要求 (1)輸入:信源符號個數(shù)q、信源的概率分布p; (2)輸出:每個信源符號對應(yīng)的Shannon編碼的碼字。3、Shan

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

3、;: No such file or directory原因:unistd.h和values.h是Unix操作系統(tǒng)下所使用的頭文件糾錯:刪去即可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 '0

4、xa1'原因:有不能被識別的符號糾錯:在錯誤處將不能識別的符號改為符合C語言規(guī)范的符號4、 error C2021: expected exponent value, not ' '原因:if(fabs(sum-1.0)>DELTA); 這一行中DELTA宏定義不正確糾錯:# define DELTA 0.5、 error C2143: syntax error : missing '' before ''原因:少寫了“;”號糾錯:在對應(yīng)位置添加上“;”號5、 參考代碼# include<stdio.h># includ

5、e<math.h># include<stdlib.h># include<string.h># define DELTA 0./*精度*/void sort(float*,int);/*排序*/int main(void)register int i,j;int n; /*符號個數(shù)*/int temp;/*中間變量*/float *p_i; /*符號的概率*/float *P_i; /*累加概率*/int *l_i; /*碼長*/char * *C; /*碼集合*/*用sum來檢驗數(shù)據(jù),用p來緩存了中間數(shù)據(jù)*/float sum,p;/*輸入符號數(shù)*/fs

6、canf(stdin,"%d",&n);/*分配內(nèi)存地址 */p_i=(float *)calloc(n,sizeof(float);P_i=(float *)calloc(n,sizeof(float);l_i=(int *)calloc(n,sizeof(int); /* 存儲信道傳輸?shù)母怕?/ for(i=0;i<n;i+) fscanf(stdin,"%f",&p_ii); /*確認(rèn)輸入的數(shù)據(jù)*/ sum=0.0; for(i=0;i<n;i+) sum+=p_ii; if(fabs(sum-(1.0)>DELT

7、A) fprintf(stderr,"Invalid input data n"); fprintf(stdout,"Startingnn"); /*以降序排列概率*/ sort (p_i,n); /*計算每個符號的碼長*/ for(i=0;i<n;i+) p=(float)(-(log(p_ii)/log(2.0); l_ii=(int)ceil(p); /*為碼字分配內(nèi)存地址*/ C=(char *)calloc(n,sizeof(char *); for(i=0;i<n;i+) Ci=(char *)calloc(l_ii+1,size

8、of(char); Ci0='0' /*計算概率累加和*/ P_i0=0.0; for(i=1;i<n;i+) P_ii=P_ii-1+p_ii-1; /*將概率和轉(zhuǎn)變?yōu)槎M(jìn)制編碼*/ for(i=0;i<n;i+) for(j=0;j<l_ii;j+) /*乘2后的整數(shù)部分即為這一位的二進(jìn)制碼元*/ P_ii=P_ii*2; temp=(int)(P_ii); P_ii=P_ii-temp;/*整數(shù)部分大于0為1,等于0為0*/ if(temp=0) Ci=strcat(Ci,"0"); else Ci=strcat(Ci,"1

9、"); /*顯示編碼結(jié)果*/ fprintf(stdout,"The output coding is :n"); for(i=0;i<n;i+) fprintf(stdout,"%s",Ci); fprintf(stdout,"nn"); /*釋放內(nèi)存空間*/ for(i=n-1;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;/*外

10、層循環(huán)變量*/ int j=1;/*內(nèi)層循環(huán)變量*/ int finish=0;/*結(jié)束標(biāo)志*/ float temp;/*中間變量*/ while(i<m&&!finish) finish=1; for(j=0;j<m-i;j+) /*將小的數(shù)后移*/ if(kj<kj+1) temp=kj; kj=kj+1; kj+1=kj; finish=0; i+; 6、 調(diào)試驗證:程序結(jié)果:7、 實驗總結(jié)1949年香農(nóng)在有噪聲時的通信一文中提出了信道容量的概念和信道編碼定理,為信道編碼奠定了理論基礎(chǔ)。無噪信道編碼定理(又稱香農(nóng)第一定理)指出,碼字的平均長度只能大于或

11、等于信源的熵。有噪信道編碼定理(又稱香農(nóng)第二定理)則是編碼存在定理。它指出只要信息傳輸速率小于信道容量,就存在一類編碼,使信息傳輸?shù)腻e誤概率可以任意小。隨著計算技術(shù)和數(shù)字通信的發(fā)展,糾錯編碼和密碼學(xué)得到迅速的發(fā)展。香農(nóng)編碼定理雖然指出了理想編碼器的存在性,但是并沒有給出實用碼的結(jié)構(gòu)及構(gòu)造方法,編碼理論正是為了解決這一問題而發(fā)展起來的科學(xué)理論。編碼的目的是為了優(yōu)化通信系統(tǒng)。香農(nóng)編碼是碼符號概率大的用短碼表示,概率小的是用長碼表示,程序中對概率排序,最后求得的碼字就依次與排序后的符號概率對應(yīng)。2、 哈夫曼編碼1、實驗?zāi)康暮腿蝿?wù)1、 理解信源編碼的意義;2、 熟悉 MATLAB程序設(shè)計; 3、 掌握

12、哈夫曼編碼的方法及計算機實現(xiàn); 、 對給定信源進(jìn)行香農(nóng)編碼,并計算編碼效率; 2、實驗原理介紹1、把信源符號按概率大小順序排列, 并設(shè)法按逆次序分配碼字的長度;2、在分配碼字長度時,首先將出現(xiàn)概率 最小的兩個符號的概率相加合成一個概率;3、把這個合成概率看成是一個新組合符號地概率,重復(fù)上述做法直到最后只剩下兩個符號概率為止; 4、完成以上概率順序排列后,再反過來逐步向前進(jìn)行編碼,每一次有二個分支各賦予一個二進(jìn)制碼,可以對概率大的賦為零,概率小的賦為1;5、從最后一級開始,向前返回得到各個信源符號所對應(yīng)的碼元序列,即相應(yīng)的碼字。 3、實驗內(nèi)容和步驟對如下信源進(jìn)行哈夫曼編碼,并計算編碼效率。(1)

13、 計算該信源的信源熵,并對信源概率進(jìn)行排序(2) 首先將出現(xiàn)概率最小的兩個符號的概率相加合成一個概率,把這個合成概率與其他的概率進(jìn)行組合,得到一個新的概率組合,重復(fù)上述做法,直到只剩下兩個概率為止。之后再反過來逐步向前進(jìn)行編碼,每一次有兩個分支各賦予一個二進(jìn)制碼。對大的概率賦“1”,小的概率賦“0”。 (3)從最后一級開始,向前返回得到各個信源符號所對應(yīng)的碼元序列,即相應(yīng)的碼字。(4)計算碼字的平均碼長得出最后的編碼效率。4、實驗數(shù)據(jù)記錄 >> clear all>> p=0.20 0.18 0.15 0.17 0.19 0.10 0.01;l=0;H=0;N=leng

14、th(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 %對字符數(shù)組c碼字賦值過程,記下沿路徑的“1”和"0" c(N-i,1:N-1)=c(N-

15、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);%計算平

溫馨提示

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

評論

0/150

提交評論