信息論與編碼課程設計 河南理工大學_第1頁
信息論與編碼課程設計 河南理工大學_第2頁
信息論與編碼課程設計 河南理工大學_第3頁
信息論與編碼課程設計 河南理工大學_第4頁
信息論與編碼課程設計 河南理工大學_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

設計目的信息論與編碼是我們電子信息工程的一門重要的專業課,通過對本次課程設計,學習將學到的理論知識用于實踐,同時也學習了用軟件編寫程序,進一步對本課程知識的鞏固和理解。學習分析問題,解決問題的方法和途徑,提高對本專業的學習興趣。二設計任務與要求(1)統計信源熵要求:統計任意文本文件中各字符(不區分大小寫)數量,計算字符概率,并計算信源熵。(2)哈夫曼編碼要求:任意輸入消息概率,利用哈夫曼編碼方法進行編碼,并計算信源熵和編碼效率。三理論簡介3.1通信系統的模型消耳1信號I消耳信源竺=編碼器信道—譯碼器也巴信宿干擾噪聲源通信系統的模型通信系統的性能指標主要是有效性、可靠性、安全性和經濟性,通信系統優化就是使這些指標達到最佳,除了經濟性,這些指標正是信息論的研究對象,可以通過各種編碼處理來使通信系統的性能最優化。根據信息論的各種編碼定理和上述通信系統的指標,編碼問題可以分為3類:信源編碼、信道編碼和加密編碼。3.1.1信源編碼由于信源符號之間存在分布不均勻和相關性,使得信源存在冗余度,信源編碼的主要任務就是減少冗余度,提高編碼效率。信源編碼的基礎是信息論中的兩個編碼定理:無失真編碼定理和限失真編碼定理。前者適用于離散信源或數字信號;后者主要用于連續信源或模擬信號。本次課程設計就是利用的無失真信源編碼。3.1.2信道編碼信源編碼器的作用:把信源發出的消息變換成由二進制碼元(或多進制碼元)組成的代碼組,這種代碼組就是基帶信號。同時通過信源編碼可以壓縮信源的冗余度,以提高通信系統傳輸消息的效率。信源譯碼器的作用:把信道譯碼器輸出的代碼組變換成信宿所需要的消息形式,它的作用相當于信源編碼器的逆過程。3.1.3加密編碼加密編碼是研究如何隱蔽消息中的信息內容,以便在傳輸過程中不被竊聽,提高通信系統的安全性。3.2信源熵3.2.1信源的描述和分類&按信源在時間和幅度上的分布情況離散信源:文字、數據、電報連續信源:語音、圖像&按發出符號的數量單個符號信源:指信源每次只發出一個符號代表一個消息符號序列信源:指信源每次發出一組含二個以上符號的符號序列代表一個消息&按符號間的關系無記憶信源有記憶信源3.2.2離散信源熵&自信息量:隨機事件的自信息量定義為其概率對數的負值,即I(七/y^)=—logp(x^/y^)在信息論中常用的對數底是2,信息量的單位為比特(bit);&聯合自信息量兩個消息xi,yj同時出現的聯合自信息量:I(x,yj)=-logp(x.y.)&條件自信息量在事件yj出現的條件下,隨機事件xi發生的條件概率為p(xi/yj),則它的條件自信息量定義為條件概率對數的負值:M、i1(I(x)=log()=一logp(x.)i&離散信源炳為信源中各個符號不確定度的數學期望,即H(X)=E[j(X)]=Sp(x)I(x)=-Sp(x)logp(x:^)ii單位為:比特/符號或者比特/符號序列。信息炳H(X)表示信源輸出后,每個消息(或符號)所提供的平均信息量。

四設計思路4.1編碼效率編碼效率計算公式如下:H(X)K其中H(X)為信源熵,K表示平均碼長。4.2變長碼的編碼方法能獲得最佳碼的編碼方法主要有:&香農(Shannon)&費諾(Fano)&霍夫曼(Huffman4.2.1香農編碼將信源消息符號按其概率從大到小排列p(X1)>p(X2)>>p(X)確定滿足下列不等式的整數碼長.Ki令P1=0,-logp(x)<K〈一log計算第i個消息的累加概率勇1p(xk)k=1將累加概率Pi變換成二進制數,取小數點后Ki位為該消息的碼字4.2.2費諾編碼令P1=0,費諾編碼屬于概率匹配編碼,不是最佳的編碼方法。編碼過程如下:將信源消息符號按其出現的概率依次排列p(x1)Np(x2)N???Np(xn)按編碼進制數將概率分組,使每組概率盡可能接近或相等,并為每一組分配一位碼元。如編二進制碼就分成兩組,編m進制碼就分成m組。將每一分組再按同樣原則劃分,重復步驟2,直至概率不再可分為止。信源符號所對應的碼字即為費諾碼。4.2.3哈夫曼編碼將信源消息符號按其出現的概率大小依次排列p(x1)Np(x2)日…日p(xn)取兩個概率最小的符號分別配以0和1,并將這兩個概率相加作為一個新符號的概率,與未分配碼元的符號重新排隊。對重排后的兩個概率最小符號重復步驟2的過程。繼續上述過程,直到最后兩個符號配以0和1為止。從最后一級開始,向前返回得到各個信源符號所對應的碼元序列,即相應的碼字。4.3設計思路4.3.1統計信源熵的設計思路在VC++環境中進行編程打開一篇文章,將26個英文字母及空格作為信源。計算每個字母出現的次數(不區分大小寫),再通過計算信源總大小來計算在本篇文章中每個字母出現的概率。通過信源炳計算公式來計算信源炳。4.3.2哈弗曼編碼的設計思路在matlab中進行編碼輸入概率矩陣,并檢驗是否正確,即各概率不能小于零,總概率之和等于一。建立各概率符號的位置索引矩陣Index,利于編碼后從樹根進行回溯,從

而得出對應的編碼輸出所需的哈弗曼編碼。計算信源熵,并計算平均碼長,算出編碼效率。輸出結果。五設計流程圖5.1統計信源熵的設計思路

六程序運行及結果6.1統計信源熵程序運行結果測試輸入:text.txtThereisnohatewithoutfear.Hateiscrystallizedfear,fearsdividend,fearobjectivized.Wehatewhatwefearandsowherehateis,fearislurking.Thuswehatewhatthreatensourperson,ourvanityandourdreamsandplansforourselves.Ifwecanisolatethiselementinwhatwehatewemaybeabletoceasefromhating.測試目的:檢驗程序是否正確。檢驗方法:用驗證法來檢驗;看中概率是否為一,并檢測信源熵是否正確。檢驗結果:程序運行結果正確。如下截屏所示文檔口各個字母出現的次數二fi:29B:3C:4文檔口各個字母出現的次數二fi:29B:3C:429B3C4D9E40F9G2H16117J1K1LSM4N14013P2QaR19S17T23U7U4U11*aA01233208.927523E:B-122324F:9.827523CI;0.0519B8J嘰093啟58L:H,024465M0.Q12232H:0.8420130=0.035755PQ:0.600000R:0.058104S0-051988T=0-070336U=0.321407U0.012232U:B.S33G3?H:0.000000V0-00?174Z:0.006116王格0183486信息=3-890255文章總字符長度327TressanytocontinLie6.2哈弗曼編碼程序運行結果測試輸入:0.20.190.180.170.150.100.01測試目的:測試經常出現的信源符號是否對應較短的碼長,檢測程序運行結果是否正確。正確輸出:010011111010110011000信源熵為2.6087bit/符號平均碼長為2.7碼元/符號傳送速率為0.9591bit/碼元實際輸出:與爭取而輸出一樣檢測結果:程序無錯誤以下為截屏請輸海源撒率向里F=[Q.LQ.也口.18』.0Q.15,Q.1SD.Q1]Q=0.20000.19000.18000.17000.15000.10000.0100信源概率及其對應的Huffman編碼如下0.20000.19000.18Q00.170Q0.150Q0.10000.0100010011111010110011000信源端為2.60S?國/符號平均碼長為2.7200碼元/符號傳輸諫率為0.9591'bit/碼元八心得體會課程設計是非常鍛煉我們能力的一種方法,在準備課程設計的過程中,各方面都有所提高。首先,再一次對課本知識進行學習,將所有設計到的知識重新溫習一遍,并且針對設計,還要看些其它相關書籍,對知識進行升華,其次,針對課程設計,必須針對其要求進一步提取有效內容,鍛煉分析問題,解決問題的能力,盡管本次課程設計相對簡單些,我們還是需要從各方面進行準備,另外就是編寫程序,這是本次課程設計的關鍵,編寫程序,從不懂到會,這無疑又是一種極大的提高,還有在編程時遇見了不少問題,各種函數的應用都在考驗著我們,然后便是我們小組的合作精神,隨著學習的深入和實踐的鍛煉,我們越來越覺得團隊合作對于我們的重要性,在現在的社會,幾乎沒有人可以脫離團體單獨工作,科技的發展,人類的進步,我們社會工作狀態都呈現了一種個人分工,集體作戰的策略,因此,在我們未正式進入社會之前,能夠鍛煉自己的團隊精神,這是相當好的。參考文獻1曹雪虹、張宗橙編著《《信息論與編碼》》.清華大學出版社,2009年第2版2賈宗璞、許合利編著《《C語言程序設計》》.人民郵電出版社,2010年第1版3嚴蔚敏、吳偉民編著《《數據結構(C語言版)》》.清華大學出版社,1997年第1版附錄源程序清單一.統計信源熵〃要求:統計任意文本文件中各字符(不區分大小寫)數量,計算字母及空格概率,并計算信源熵。#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#defineN1000〃出錯地方:字符總數不對,求字符串長度有問題。似乎跟N有關。intmain(void)〃沒有輸出字符個數。{chars[N],M[N];inti=0,j=0,n=0,L=0;intlen,num[27]={0};doubleresult=0,p[27]={0};FILE*f;chartemp[N];/*以下是打開一個指定文件的過程*/if(!(f=fopen("C:test2.txt","rb"))){printf("文件打開失??!\n");return0;}while(!feof(f))//feof輸入輸出函數,檢查文件是否結束,如結束,則返回非零值,否則返回0.函數原型為:intfeof(FILE*fp){len=fread(temp,1,486,f);//fread返回讀取的字符個數temp為內存區域首地址1為每次讀入字節數486讀入次數f指針}fclose(f);〃關閉文件temp[len]='\0';〃方便統計字符總數memcpy(s,temp,sizeof(temp));〃從temp中拷貝sizeof個字節到目標s中/*統計26個字母及空格出現次數*/for(i=0;i<strlen(s);i++){if(s[i]=='')num[26]++;elseif(s[i]>='a'&&s[i]<='z')num[s[i]-97]++;elseif(s[i]>='A'&&s[i]<='Z')num[s[i]-65]++;}printf(-文檔中各個字母出現的次數:\n");for(j=0;j<26;j++){M[j]=num[j];printf("%3c:%d\t”,j+65,M[j]);L++;if(L==3){printf("\n");L=0;}}printf("空格:%d\t",num[26]);/*統計26個字母或者空格出現概率*/printf("\n文檔中各個字母出現的概率:\n");for(i=0;i<26;i++){p[i]=(double)num[i]/strlen(s);printf("%3c:%f\t",i+65,p[i]);n++;if(n==3){printf("\n");n=0;}}p[26]=(double)num[26]/strlen(s);printf("空格:%f\t",p[26]);printf("\n");/*計算信源熵*/for(i=0;i<27;i++){if(p[i]!=0)result=result+p[i]*log(p[i])*1.433;}result=-result;printf("信源熵為:%f",result);printf("\n文章總字符長度:%d",strlen(temp));printf("\n");return0;}二.哈夫曼編碼%要求:任意輸入消息概率,利用上述編碼方法進行編碼,并計算信源熵和編碼效率。>>clear;P=input('請輸入信源概率向量P=');N=length(P);forcomponent=1:1:Nif(P(component)<0)error('信源概率不能小于0');endendif((sum(P)-1)>0.0001)error('信源概率之和必須為1');end%建立各概率符號的位置索引矩陣Index,利于編碼后從樹根進行回溯,從而得出對應的編碼Q=PIndex=zeros(N-1,N);%初始化Indexfori=1:N-1[Q,L]=sort(Q);Index(i,:)=[L(1:N-i+1),zeros(1,i-1)];G(i,:)=Q;Q=[Q(1)+Q(2),Q(3:N),1];%將Q中概率最小的兩個元素合并,元素不足的地方補1end%根據以上建立的Index矩陣,進行回溯,獲取信源編碼fori=1:N-1Char(i,:)=blanks(N*N);%初始化一個由空格符組成的字符矩陣N*N,用于存放編碼end%從碼樹的樹根向樹葉回溯,即從G矩陣的最后一行按與Index中的索引位置的對應關系向其第一行進行編碼Char(N-1,N)='0';%G中的N-1行即最后一行第一個元素賦為0,存到Char中N-1行的N列位置Char(N-1,2*N)='1';%G中的N-1行即最后一行第二個元素賦為1,存到Char中N-1行的2*N列位置%以下從G的倒數第二行開始向前編碼fori=2:N-1Char(N-i,1:N-1)=Char(N-i+1,N*(find(Index(N-i+1,:)==1))-(N-2):N*(find(Index(N-i+1,:)==1)));%將Index后一行中索引為1的編碼碼字填入到當前行的第一個編碼位置Char(N-i,N)='0';%然后在當前行的第一個編碼位置末尾填入'0'Char(N-i,N+1:2*N-1)=Char(N-i,1:N-1);%將G后一行中索引為1的編碼碼字填入到當前行的第二個編碼位置Char(N-i,2*N)='1';%然后在當前行的第二個編碼位置末尾填入'1'forj=1:i-1%內循環作用:將Index后一行中索引不為1處的編碼按照左右順序填入當前行的第3個位置開始的地方,最后計算到Index的首行為止.Char(N-i,(j+1)*N+1:(j+2)*N)=Char(N-i+1,N*(find(Index(N-i+1,:)==j+1)-1)+1:N*find(Index(N-i+1,:)==j+1));endend%Char中第一行的編碼結果就是所需的Huffman編碼輸出,通過Index中第一行索引將編碼對應到相應概率的信源符號上。fori=1:NResult(i,1:N)=Char(1,N*(find(Index(1,:)==i)-1)+1:find(Index(1,:)==i)*N);h(i)=length(find(abs(Result(i,:))?=32));end%計算信源熵H=-sum(P.*log2(P));%計算平均碼長和信息傳輸速率K=sum(P.*h);R=H/K;%打印編碼結果String='信源概率及其對應的Huffman編碼如下';disp(String);disp(P);disp(Result);string='信源熵為';disp(string);disp(H);string='bit/符號';disp(string);string='平均碼長為';disp(string);disp(K);string='碼兀/符號';disp(string);string='傳輸速率為';disp(string);disp(R);string='bit/碼兀';disp(string);目錄TOC\o"1-5"\h\z\o"CurrentDocument"一設計目的1\o"CurrentDocument"二設計任務與要求1\o"CurrentDocument"三理論簡介1\o"CurrentDocument"3.1通信系統的模型1\o"CurrentDocument"3.1.1信源編碼2\o"CurrentDocument"3.1.2信道編碼2\o"CurrentDocument"3.1.3加密編碼2\o"CurrentDocument"3.2信源熵2\o"CurrentDocument"3.2.1信源的描述和分類2\o"CurrentDocument"3.2.2離散信源熵3四設計思路4\o"CurrentDocument"4.1

溫馨提示

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

評論

0/150

提交評論