

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 信息論與編碼課程設計報告</p><p> 設計題目: 統(tǒng)計信源熵與香農編碼 </p><p><b> 設計任務與要求</b></p><p><b> 1、 統(tǒng)計信源熵</b></p><p> 要求:統(tǒng)計任意文本文件中各字符(區(qū)分大小寫)數(shù)量,計算字符
2、概率,并計算信源熵。</p><p><b> 2、香農編碼</b></p><p> 要求:任意輸入消息概率,利用香農編碼方法進行編碼,并計算信源熵和編碼效率。</p><p><b> 設計思路</b></p><p> 本次課程設計中主要運用C語言編程以實現(xiàn)任務要求,分析所需要的統(tǒng)計量
3、以及相關變量,依據(jù)具體公式和計算步驟編寫語句,組成完整C語言程序。運行環(huán)境為VC++6.0。 </p><p><b> 1、統(tǒng)計信源熵 </b></p><p> 定義:信源各個離散消息的自信息量的數(shù)學期望為信源的平均信息量,一般稱為信源的信息熵,也叫信源熵或香農熵,有時稱為無條件熵或熵函數(shù),簡稱熵,記為H(X)。 </p><p>&l
4、t;b> 計算公式:。</b></p><p> 統(tǒng)計信源熵就是對一篇英文文章,或者是輸入一段字符串,通過對其中的a,b,c,d/A,B,C,D.....(區(qū)分大小寫)和數(shù)字符號1,2,3,4…以及各個符號如:, 。 !等統(tǒng)計符號的個數(shù)N和每一個符號的數(shù)目n,有這個公式P=n/N可得每個字母的概率,最后又信源熵計算公式 ,可計算出信源熵H,所以整體步驟就是先統(tǒng)計出英文段落的總字符數(shù),或者是輸
5、入字符串的總個數(shù)。包括字母(區(qū)分大小寫)、數(shù)字、標點等,然后再統(tǒng)計每個字符的個數(shù),即每遇到同一個字符就++1,直到算出每個字符的個數(shù),進而算出每個字符的概率,再由信源熵計算公式計算出信源熵。</p><p><b> 2、香農編碼: </b></p><p> 香農編碼主要通過一系列步驟支出平均碼長與信源之間的關系,同時使平均碼長達到極限值,即選擇的每個碼字的長度
6、滿足下式:</p><p><b> 具體步驟如下: </b></p><p> 將信源消息符號按其概率從大到小排列</p><p> 確定滿足下列不等式的整數(shù)碼長Ki</p><p> 令P1=0,計算第i個消息的累加概率</p><p> 將累加概率Pi變換成二進制數(shù),取小數(shù)點后Ki
7、位為該消息的碼字</p><p> 在香農編碼中對于求解編碼效率主要是依靠這個公式:R=H(X)/K,其中</p><p><b> ? </b></p><p> 對于求解信源熵主要依靠公式: </p><p><b> 設計流程圖</b></p><p><
8、b> 1、統(tǒng)計信息熵</b></p><p><b> 2、香農編碼</b></p><p><b> 程序運行及結果</b></p><p><b> 1、統(tǒng)計信息熵</b></p><p><b> 2、香農編碼</b>&l
9、t;/p><p><b> 心得體會</b></p><p> 這真是一次有意義的學習旅程。在設計期間,我和我的團隊一直沉浸于探索、探討之中,各種有意思的想法層出不窮。我們總是想盡可能的把課程設計做的足夠的完美,足夠的精彩,可是同時又不得不面臨一個又一個的技術難題。有些經過我們的努力,通過不斷地修改不斷的翻閱資料得以解決,可是仍有好多的的問題是我們苦思冥想所參索不透的
10、!真是知識用時方恨少??!</p><p> 課程設計很是考察個人能力和團隊合作協(xié)調能力,在面對自己所不熟悉甚至不了解的問題時,是怎樣一步步的設計完成給定的任務,及時有成效的解決面臨的問題的。從整體的分析設計到后面語句變量的敲定最終完成課題是對自己極其有益的鍛煉,從中收獲的不僅是知識上的,也是學習經驗的積累和思維能力的提升,雖然一次課程設計任務不是那么繁重,可是認真去完成其中的一個個細節(jié)也是一種難得的體驗。還有就
11、是在此過程中,經常遇到自己不能解決的問題,就會請教其他組員,一起共同討論,直到解決,這是的我們充分認識到了團隊協(xié)作的重要性,也體驗到了在問題得到解決的時候所獨有的那份喜悅。也體會到了與隊友的合作更是一件快樂的事情,只有彼此都付出,彼此都努力維護才能將作品做的更加完美。</p><p> 在此次課程設計中,我們主要是做了統(tǒng)計信源熵與香農編碼這兩個題目,初一看題目感覺應該很簡單,但真正的去做的時候才發(fā)現(xiàn)并不是想象的
12、那么簡單,本次課設的困難主要集中在程序的編寫上。我們團隊是基于C語言編寫的程序。C語言雖然一直都在用,可每次都感覺非常難。雖然我們的思路是正確的、明確的,可是由于變量的定義,語法的不規(guī)范,以及指針的指向錯誤等等一系列問題阻礙了我們走向勝利。不過我們是不會輕易放棄的。我們起早貪黑,熬夜到半夜一點,翻書翻了好幾本。</p><p> 我認為本次課程設計是成功的,在這學期的課程設計中,在收獲知識的同時,還收獲了閱歷,
13、收獲了成熟,在此過程中,我們通過查找大量資料,請教學長,以及不懈的努力,不僅培養(yǎng)了獨立思考,在各種其它能力上也都有了提高。更重要的是,在課程設計上,我們學會了很多學習的方法。而這是日后最實用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學習、實踐,再學習、再實踐</p><p><b> 參考文獻</b></p><p> [1]曹雪虹,張宗橙.信息論與編碼.北
14、京:清華大學出版社,2009.</p><p> [2]楊永國,張冬明.Visual C++6.0實用教程.北京:清華大學出版社,2007.</p><p> [3]賈宗璞,許合利.《C語言程序設計》人民郵電出版社.2014.</p><p><b> 附錄</b></p><p><b> 1、統(tǒng)計信
15、息熵</b></p><p> #include <stdio.h></p><p> #include <math.h></p><p> #include <stdlib.h> </p><p> #define N 1000</p><p> int m
16、ain(void)</p><p><b> { </b></p><p> char s[N],M[N]; </p><p> int i = 0,j=0,n=0,L=0; </p><p> int len, num[95] = {0}; </p><p> dou
17、ble result=0,p[95]= {0}; </p><p> FILE *f; </p><p> char temp[N]; </p><p><b> char c;</b></p><p> int sum=0;</p><p> printf("p
18、lease input an essay:\n"); </p><p><b> gets(s); </b></p><p> sum=strlen(s);</p><p> printf("%d",sum);</p><p> for(i=0; i<sum; i++)<
19、;/p><p><b> { </b></p><p> if(s[i]>=' '&&s[i]<='~')</p><p> num[s[i]-32]++;</p><p><b> }</b></p><p>
20、; printf("英文文本文件中各字符數(shù)量:\n");</p><p> for(j=0; j<95; j++)</p><p><b> { </b></p><p> M[j]=num[j]; </p><p> printf("%4c:%d\t",j+32,
21、M[j]);/*輸出格式,%4c在該字符前在空三個空格*/</p><p><b> L++; </b></p><p> if(L==15)/*輸出格式,每行十五個字符*/</p><p><b> {</b></p><p> printf("\n");
22、</p><p><b> L=0;</b></p><p><b> } </b></p><p><b> } </b></p><p> /*****計算各個字符出現(xiàn)概率****/ </p><p> printf(&quo
23、t;\n文本文件中各個字符概率:\n");</p><p> for(i=0; i<95; i++)</p><p><b> { </b></p><p> p[i]=(double)num[i]/sum; </p><p> printf(" P(%c)=%f\t",i
24、+32,p[i]);</p><p><b> n++;</b></p><p> if(n==5)/*輸出格式,每行五個字符概率*/</p><p><b> { </b></p><p> printf("\n");</p><p>
25、;<b> n=0;</b></p><p><b> }</b></p><p><b> } </b></p><p> for(i=0; i<95; i++) /*計算信源熵*/</p><p><b> { </b></p
26、><p> if (p[i]!=0) </p><p> result=result+p[i]*log(p[i])*1.433;/*信源熵,I(x)=-logp(x)*/</p><p><b> } </b></p><p> result=-result; </p><p> print
27、f("信源熵為:%f",result); </p><p> printf("\n");</p><p> return 0; </p><p><b> } </b></p><p><b> 2、香農編碼</b></p><p
28、> #include<stdio.h> </p><p> #include<math.h> </p><p> void main() </p><p><b> { </b></p><p> int i,n, j,k; </p><p> fl
29、oat sum=0;</p><p> float b[100]={0};</p><p> float p[100]={0}; </p><p> float m,H1=0,H2=0; </p><p> float Pi[100]={0}; </p><p> int L[100]; </p
30、><p> char c[100][100]; </p><p> printf("輸入X的個數(shù) \n"); </p><p> scanf("%d",&n); </p><p> printf("\n"); </p><p> printf
31、("輸入P[i]的概率分布\n"); </p><p> for(i=0;i<n;i++) </p><p> scanf("%f",&p[i]); </p><p> for(i=0;i<n;i++) </p><p> sum=sum+p[i]; </p&g
32、t;<p> if (fabs(sum-1) > 1e-6) </p><p><b> { </b></p><p><b> sum=0;</b></p><p> printf("錯誤輸入,請重新輸入\n"); </p><p>
33、printf("輸入X的個數(shù)\n"); </p><p> scanf("%d",&n); </p><p> printf("\n"); </p><p> printf("輸入P[i]的概率分布\n"); </p><p> for
34、(i=0;i<n;i++) </p><p> scanf("%f",&p[i]); </p><p> for(i=0;i<=n;i++) </p><p> sum=sum+p[i]; </p><p><b> }</b></p><p
35、> for(j=0;j<n-1;j++) </p><p><b> { </b></p><p> for(i=0;i<n-1-j;i++) </p><p> if(p[i]<p[i+1]) </p><p><b> { </b><
36、;/p><p><b> m=p[i];</b></p><p> p[i]=p[i+1];</p><p> p[i+1]=m; </p><p><b> }</b></p><p><b> }</b></p><p>
37、; Pi[0]=0; </p><p> for(j=1;j<n+1;j++) </p><p><b> { </b></p><p> Pi[j]=Pi[j-1]+p[j-1];</p><p><b> } </b></p><p> for
38、(i=0;i<n;i++) </p><p><b> { </b></p><p> m=log(1/p[i])/log(2); </p><p><b> b[i]=m;</b></p><p> if(m==(int)m) </p><p>
39、L[i]=(int)m; </p><p><b> else </b></p><p> L[i]=(int)(m+1); </p><p><b> } </b></p><p> for(i=0;i<n;i++) </p><p><b>
40、{ </b></p><p><b> m=Pi[i]; </b></p><p> for(k=0;k<L[i];k++) </p><p><b> { </b></p><p><b> m=m*2.00;</b></p>
41、<p> if(m>=1) </p><p><b> { </b></p><p> m=m-1.00; </p><p> c[i][k]='1'; </p><p><b> } </b></p><p
42、><b> else </b></p><p> c[i][k]='0'; </p><p><b> } </b></p><p><b> }</b></p><p> printf("P[i]序列為 累加概率pi為 -logp(
43、x)為 碼長L為\t");</p><p> printf(" 碼字為\n"); </p><p> for(i=0;i<n;i++) </p><p><b> { </b></p><p> printf("%5.2f\t %5.2f\t\t %5.2
44、f\t\t%d\t",p[i],Pi[i],b[i],L[i]); </p><p> for(k=0;k<L[i];k++) </p><p> printf(" %c",c[i][k]); </p><p> printf("\n");</p><p><b> }
45、 </b></p><p> for(i=0;i<n;i++) </p><p><b> { </b></p><p> H1=H1-p[i]*log10(p[i])/log10(2); </p><p> H2=H2+p[i]*L[i]; </p><p>&l
46、t;b> }</b></p><p> printf("信息熵為:%0.3f\n",H1);</p><p> printf("平均碼長為:%0.3f\n",H2);</p><p> printf("編碼效率為:%0.3f\n",H1/H2); </p><p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論