電子科技大學(xué)-信息論課程設(shè)計(jì)(霍夫曼-費(fèi)諾-香農(nóng))_第1頁(yè)
電子科技大學(xué)-信息論課程設(shè)計(jì)(霍夫曼-費(fèi)諾-香農(nóng))_第2頁(yè)
電子科技大學(xué)-信息論課程設(shè)計(jì)(霍夫曼-費(fèi)諾-香農(nóng))_第3頁(yè)
電子科技大學(xué)-信息論課程設(shè)計(jì)(霍夫曼-費(fèi)諾-香農(nóng))_第4頁(yè)
電子科技大學(xué)-信息論課程設(shè)計(jì)(霍夫曼-費(fèi)諾-香農(nóng))_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

電子科技大學(xué)信息與通信工程學(xué)院信息論與編碼課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)名稱:利用編程語(yǔ)言實(shí)現(xiàn)霍夫曼、費(fèi)諾、香農(nóng)編碼課設(shè)要求:1)、霍夫曼編碼:實(shí)現(xiàn)任意Q符號(hào)的N重序列信源的最優(yōu)R進(jìn)制編碼,這里:2)、費(fèi)諾、香農(nóng)編碼:實(shí)現(xiàn)任意Q符號(hào)信源的二進(jìn)制編碼,這里:三、課設(shè)原理分析:1)Q信源N進(jìn)制霍夫曼編碼:霍夫曼編碼的平均碼長(zhǎng)最短,是最佳編碼。編碼步驟如下:(1)由q=(r-1)*θ+r;其中θ為縮進(jìn)次數(shù),為整數(shù),找出q>=Q的最小整數(shù)(2)將信源符號(hào)擴(kuò)展到q且q>Q信源概率為0,q個(gè)符號(hào)按概率大小排序;(3)對(duì)概率最小的N個(gè)符號(hào)求其概率之和,同時(shí)給N符號(hào)分別賦予碼元0、1、2、、、N-1;(4)將N個(gè)符號(hào)的概率之和作為一個(gè)新的符號(hào)與剩下的概率一起,形成一個(gè)縮減信源,再重復(fù)上述步驟,直到概率和為1為止;(5)按上述步驟實(shí)際上構(gòu)成了一個(gè)碼樹(shù),從根到端點(diǎn)經(jīng)過(guò)的樹(shù)枝即為碼字。2)費(fèi)諾編碼:編碼步驟如下:將信源概率從大到小排序;將信源符號(hào)分成兩組,使兩組信源符號(hào)的概率之和近似相等,并給兩組信源符號(hào)分別賦0和1;再把各個(gè)小組的信源符號(hào)細(xì)分為兩組并賦碼元,方法與第一次分組相同;如此一直下去,直到每一個(gè)小組只含一個(gè)信源符號(hào)為止;由此可構(gòu)造成一個(gè)碼樹(shù),所有終端節(jié)點(diǎn)上的碼字組成費(fèi)諾碼。3)香農(nóng)編碼:編碼方法如下:⑴

將信源消息符號(hào)按其出現(xiàn)的概率大小依次排列

p(u1)≥p(u2)≥…≥

p(un)⑵

確定碼長(zhǎng)Ki

(整數(shù))

Ki=[log1⑶

為了編成唯一可譯碼,計(jì)算第i個(gè)消息的累加概率

pi⑷

將累加概率Pi變換成二進(jìn)制數(shù)。⑸

取pi二進(jìn)制數(shù)的小數(shù)點(diǎn)后Ki位即為該消息符號(hào)的二進(jìn)制數(shù)。三、課設(shè)目的:通過(guò)編程實(shí)現(xiàn)三種方式的編碼,掌握三種編 碼方式的步驟。四、課設(shè)思路:三種編碼方式的編程思路:1、Q信源二進(jìn)制霍夫曼編碼:(1)對(duì)給定的q個(gè)權(quán)值{W1,W2,W3,...,Wi,...,Wq}構(gòu)成q叉樹(shù)的初始集合F={T1,T2,T3,...,Ti,...,Tq},其中每棵二叉樹(shù)Ti中只有一個(gè)權(quán)值為Wi的根結(jié)點(diǎn),它的左右子樹(shù)均為空。(我們直接在c語(yǔ)言中用typedef來(lái)定義數(shù)據(jù)類型)

(2)在F中選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹(shù)作為新構(gòu)造的二叉樹(shù)的左右子樹(shù),新二叉樹(shù)的根結(jié)點(diǎn)的權(quán)值為其左右子樹(shù)的根結(jié)點(diǎn)的權(quán)值之和。

(3)從F中刪除這兩棵樹(shù),并把這棵新的二叉樹(shù)同樣以升序排列加入到集合F中。

(4)重復(fù)二和三兩步,直到集合F中只有一棵二叉樹(shù)為止。2、Q信源r進(jìn)制霍夫曼編碼 用typedef來(lái)定義數(shù)據(jù)類型,如下圖定義父節(jié)點(diǎn),子節(jié)點(diǎn)其中有5個(gè),可以滿足2進(jìn)制到5進(jìn)制內(nèi)編碼要求(如3進(jìn)制時(shí)僅選擇lchild、zhong和rchild為子節(jié)點(diǎn),parent為父節(jié)點(diǎn),weight為權(quán)重,可以進(jìn)行編碼,當(dāng)輸入為Q時(shí),利用由q=(r-1)*θ+r;其中θ為縮進(jìn)次數(shù),為整數(shù),找出q>=Q的最小整數(shù),對(duì)q信源符號(hào)進(jìn)行r進(jìn)制編碼,lchild為0,zhong為1,rchild為2,parent的權(quán)值為這三個(gè)權(quán)值之和,再進(jìn)行排序,直到僅剩一個(gè)三叉樹(shù))3、Q信源R進(jìn)制N重信源的霍夫曼編碼 如下圖,(下圖為n信源q進(jìn)制,寫的時(shí)候順手了,沒(méi)有改),當(dāng)為二重編碼時(shí),對(duì)信源權(quán)值進(jìn)行分步乘積得到新的信源權(quán)值,信源個(gè)數(shù)為Q的二次方,再對(duì)其進(jìn)行編碼進(jìn)行編碼效率計(jì)算時(shí),q重序列,信源熵為原來(lái)的q倍4、費(fèi)諾編碼的編程思路:(1)先使用冒泡法對(duì)信源概率概率排序;(2)依次將按排好序的符號(hào)概率進(jìn)行近似1:1分成兩大組;(3)對(duì)各組賦予一個(gè)二進(jìn)制碼元“0”和“1”;(4)輸出符號(hào),符號(hào)概率及編碼。5、香農(nóng)編碼:(1)對(duì)于一個(gè)給定的符號(hào)列表,制定了概率相應(yīng)的列表或頻率計(jì)數(shù),使每個(gè)符號(hào)的相對(duì)發(fā)生頻率是已知。(2)排序根據(jù)頻率的符號(hào)列表,最常出現(xiàn)的符號(hào)在左邊,最少出現(xiàn)的符號(hào)在右邊。(3)清單分為兩部分,使左邊部分的總頻率和盡可能接近右邊部分的總頻率和。(4)該列表的左半邊分配二進(jìn)制數(shù)字0,右半邊是分配的數(shù)字1。這意味著,在第一半符號(hào)代都是將所有從0開(kāi)始,第二半的代碼都從1開(kāi)始。(5)對(duì)左、右半部分遞歸應(yīng)用步驟3和4,細(xì)分群體,并添加位的代碼,直到每個(gè)符號(hào)已成為一個(gè)相應(yīng)的代碼樹(shù)的葉。五、器材(設(shè)備、元器件):計(jì)算機(jī)、visualc++6.0六、設(shè)計(jì)代碼:見(jiàn)附錄七、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果根據(jù)上述實(shí)驗(yàn)程序得到的實(shí)驗(yàn)數(shù)據(jù)及結(jié)果如下:霍夫曼編碼:當(dāng)進(jìn)行8信源2進(jìn)制1重霍夫曼編碼時(shí)得到如下結(jié)果結(jié)果與手動(dòng)計(jì)算一致進(jìn)行15信源5進(jìn)制1重霍夫曼編碼結(jié)果如下圖所示,計(jì)算結(jié)果正確進(jìn)行8信源2進(jìn)制2重編碼,結(jié)果如下,結(jié)果正確中間碼子太多,不一一粘貼過(guò)來(lái)費(fèi)諾編碼:進(jìn)行10信源費(fèi)諾編碼,結(jié)果如下經(jīng)驗(yàn)算結(jié)果正確香農(nóng)編碼:進(jìn)行12信源編碼,結(jié)果如下,驗(yàn)算正確八、結(jié)論完成的3種編碼中霍夫曼編碼編碼效率最高,費(fèi)諾編碼其次,香農(nóng)編碼效率最低九、總結(jié)及心得體會(huì)通過(guò)這次課程設(shè)計(jì),我掌握了三種編碼方式的步驟,并能夠利用編程實(shí)現(xiàn)編碼,提高了自己的編程水平和對(duì)該知識(shí)點(diǎn)的掌握程度,特別掌握了typedef關(guān)鍵字的應(yīng)用,對(duì)c++程序與我們所學(xué)習(xí)的課程之間的相輔相成的關(guān)系更加了解。附錄代碼:霍夫曼編碼#include<stdlib.h>#include<iostream>#include<algorithm>#include<math.h>usingnamespacestd;#defineMAXBIT100#defineMAXVALUE1000#defineMAXLEAF100#defineMAXNODEMAXLEAF*3-1#defineN1000typedefstruct//定義節(jié)點(diǎn){doubleweight; doubleweightq;intparent; intlup; intzhong; intrup;intlchild;intrchild;charvalue;}HNodeType;typedefstruct//定義編碼類型{intbit[MAXBIT];//存儲(chǔ)01編碼的數(shù)組intstart;//編碼在數(shù)組中開(kāi)始的位置,從最后往前減小}HCodeType;HNodeTypeHuffNode[MAXNODE];//定義一個(gè)足夠大的節(jié)點(diǎn)數(shù)組HCodeTypeHuffCode[MAXLEAF];voidHuffmanTree(HNodeTypeHuffNode[MAXNODE],intn,intz,intr,intq)//構(gòu)造霍夫曼樹(shù){inti,j,t,e,x1,x2,x3,x4,x5;doublem1,m2,m3,m4,m5;for(i=0;i<(r*z-1)/(r-1);i++)//初始化節(jié)點(diǎn)數(shù)據(jù){HuffNode[i].weight=0; HuffNode[i].weightq=0;HuffNode[i].parent=-1;HuffNode[i].lchild=-1; HuffNode[i].zhong=-1; HuffNode[i].lup=-1; HuffNode[i].rup=-1;HuffNode[i].rchild=-1;} cout<<"輸入各信源符號(hào)概率"<<endl;;for(i=0;i<n;i++)//輸入節(jié)點(diǎn)數(shù)據(jù){cin>>HuffNode[i].value>>HuffNode[i].weightq;} if(q==1) { for(i=0;i<n;i++) { HuffNode[i].weight=HuffNode[i].weightq; } for(i=n;i<z;i++) { HuffNode[i].value=i; HuffNode[i].weight=0.0; } } elseif(q==2) { e=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) {HuffNode[e].value=HuffNode[i].value+HuffNode[j].value; HuffNode[e].weight=(HuffNode[i].weightq*HuffNode[j].weightq); e=e+1; if(e==n*n) break; } if(e==n*n) break; } for(e=n*n;e<z;e++) { HuffNode[e].value=e; HuffNode[e].weight=0.0; } } elseif(q==3) { e=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(t=0;t<n;t++) {HuffNode[e].value=HuffNode[i].value+HuffNode[j].value+HuffNode[t].value; HuffNode[e].weight=(HuffNode[i].weightq*HuffNode[j].weightq*HuffNode[t].weightq); e=e+1; if(e==n*n*n) break; } if(e==n*n*n) break; } if(e==n*n*n) break; } for(e=n*n*n;e<z;e++) { HuffNode[e].value=e; HuffNode[e].weight=0.0; } } if(r==2) { for(i=0;i<z-1;i++)//循環(huán)合并n-1次 {m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<z+i;j++)//在已有的節(jié)點(diǎn)里找權(quán)重最小的且沒(méi)有parent的節(jié)點(diǎn){if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1){m2=m1;x2=x1;m1=HuffNode[j].weight;x1=j;}elseif(HuffNode[j].weight<m2&&HuffNode[j].parent==-1){m2=HuffNode[j].weight;x2=j;}}//最后m1,m2為最新權(quán)重節(jié)點(diǎn)的權(quán)重,x1,x2為其位置HuffNode[x1].parent=z+i;HuffNode[x2].parent=z+i;HuffNode[z+i].weight=m1+m2;HuffNode[z+i].lchild=x1;HuffNode[z+i].rchild=x2; } } elseif(r==3) { for(i=0;i<((z-1)/(r-1));i++)//循環(huán)合并n-1次 { m1=m2=m3=MAXVALUE; x1=x2=x3=0; for(j=0;j<z+i;j++)//在已有的節(jié)點(diǎn)里找權(quán)重最小的且沒(méi)有parent的節(jié)點(diǎn) { if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1) { m3=m2; m2=m1; x3=x2; x2=x1; m1=HuffNode[j].weight; x1=j; } elseif(HuffNode[j].weight<m2&&HuffNode[j].parent==-1) { m3=m2; x3=x2; m2=HuffNode[j].weight; x2=j; } elseif(HuffNode[j].weight<m3&&HuffNode[j].parent==-1) { m3=HuffNode[j].weight; x3=j; } }//最后m1,m2為最新權(quán)重節(jié)點(diǎn)的權(quán)重,x1,x2為其位置 HuffNode[x1].parent=z+i; HuffNode[x2].parent=z+i; HuffNode[x3].parent=z+i; HuffNode[z+i].weight=m1+m2+m3; HuffNode[z+i].lchild=x1; HuffNode[z+i].zhong=x2; HuffNode[z+i].rchild=x3; } } elseif(r==4) { for(i=0;i<((z-1)/(r-1));i++)//循環(huán)合并n-1次 { m1=m2=m3=m4=MAXVALUE; x1=x2=x3=x4=0; for(j=0;j<z+i;j++)//在已有的節(jié)點(diǎn)里找權(quán)重最小的且沒(méi)有parent的節(jié)點(diǎn) { if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1) { m4=m3; m3=m2; m2=m1; x4=x3; x3=x2; x2=x1; m1=HuffNode[j].weight; x1=j; } elseif(HuffNode[j].weight<m2&&HuffNode[j].parent==-1) { m4=m3; x4=x3; m3=m2; x3=x2; m2=HuffNode[j].weight; x2=j; } elseif(HuffNode[j].weight<m3&&HuffNode[j].parent==-1) { m4=m3; x4=x3; m3=HuffNode[j].weight; x3=j; } elseif(HuffNode[j].weight<m4&&HuffNode[j].parent==-1) { m4=HuffNode[j].weight; x4=j; } }//最后m1,m2為最新權(quán)重節(jié)點(diǎn)的權(quán)重,x1,x2為其位置 HuffNode[x1].parent=z+i; HuffNode[x2].parent=z+i; HuffNode[x3].parent=z+i; HuffNode[x4].parent=z+i; HuffNode[z+i].weight=m1+m2+m3+m4; HuffNode[z+i].lchild=x1; HuffNode[z+i].lup=x2; HuffNode[z+i].rup=x3; HuffNode[z+i].rchild=x4; } } elseif(r==5) { for(i=0;i<((z-1)/(r-1));i++)//循環(huán)合并n-1次 { m1=m2=m3=m4=m5=MAXVALUE; x1=x2=x3=x4=x5=0; for(j=0;j<z+i;j++)//在已有的節(jié)點(diǎn)里找權(quán)重最小的且沒(méi)有parent的節(jié)點(diǎn) { if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1) { m5=m4; x5=x4; m4=m3; m3=m2; m2=m1; x4=x3; x3=x2; x2=x1; m1=HuffNode[j].weight; x1=j; } elseif(HuffNode[j].weight<m2&&HuffNode[j].parent==-1) { m5=m4; x5=x4; m4=m3; x4=x3; m3=m2; x3=x2; m2=HuffNode[j].weight; x2=j; } elseif(HuffNode[j].weight<m3&&HuffNode[j].parent==-1) { m5=m4; x5=x4; m4=m3; x4=x3; m3=HuffNode[j].weight; x3=j; } elseif(HuffNode[j].weight<m4&&HuffNode[j].parent==-1) { m5=m4; x5=x4; m4=HuffNode[j].weight; x4=j; } elseif(HuffNode[j].weight<m5&&HuffNode[j].parent==-1) { m5=HuffNode[j].weight; x5=j; } }//最后m1,m2為最新權(quán)重節(jié)點(diǎn)的權(quán)重,x1,x2為其位置 HuffNode[x1].parent=z+i; HuffNode[x2].parent=z+i; HuffNode[x3].parent=z+i; HuffNode[x4].parent=z+i; HuffNode[x5].parent=z+i; HuffNode[z+i].weight=m1+m2+m3+m4+m5; HuffNode[z+i].lchild=x1; HuffNode[z+i].zhong=x3; HuffNode[z+i].lup=x2; HuffNode[z+i].rup=x4; HuffNode[z+i].rchild=x5; } }}voidHuffmanCode(HCodeTypeHuffCode[MAXLEAF],intn,intz,intr)//對(duì)生成的樹(shù)進(jìn)行編碼{HCodeTypecd;//臨時(shí)結(jié)構(gòu)體inti,j,c,p;for(i=0;i<z;i++){cd.start=(z-1)/(r-1);c=i;p=HuffNode[c].parent;//p為遍歷過(guò)程中每個(gè)節(jié)點(diǎn)的parent值 while(p!=-1&&r==2)//如果未到根節(jié)點(diǎn){if(HuffNode[p].lchild==c)//為parent的左節(jié)點(diǎn)則在該處編碼為0cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;//編碼長(zhǎng)度加1,start位置減1c=p;p=HuffNode[c].parent;}while(p!=-1&&r==3)//如果未到根節(jié)點(diǎn){if(HuffNode[p].lchild==c)//為parent的左節(jié)點(diǎn)則在該處編碼為0cd.bit[cd.start]=0;elseif(HuffNode[p].zhong==c)cd.bit[cd.start]=1; else cd.bit[cd.start]=2;cd.start--;//編碼長(zhǎng)度加1,start位置減1c=p;p=HuffNode[c].parent;} while(p!=-1&&r==4)//如果未到根節(jié)點(diǎn){if(HuffNode[p].lchild==c)//為parent的左節(jié)點(diǎn)則在該處編碼為0cd.bit[cd.start]=0;elseif(HuffNode[p].lup==c)cd.bit[cd.start]=1; elseif(HuffNode[p].rup==c)cd.bit[cd.start]=2; else cd.bit[cd.start]=3;cd.start--;//編碼長(zhǎng)度加1,start位置減1c=p;p=HuffNode[c].parent;} while(p!=-1&&r==5)//如果未到根節(jié)點(diǎn){if(HuffNode[p].lchild==c)//為parent的左節(jié)點(diǎn)則在該處編碼為0cd.bit[cd.start]=0; elseif(HuffNode[p].lup==c)cd.bit[cd.start]=1; elseif(HuffNode[p].zhong==c)cd.bit[cd.start]=2; elseif(HuffNode[p].rup==c)cd.bit[cd.start]=3; else cd.bit[cd.start]=4;cd.start--;//編碼長(zhǎng)度加1,start位置減1c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<((z+r-2)/(r-1));j++)HuffCode[i].bit[j]=cd.bit[j];HuffCode[i].start=cd.start;//將臨時(shí)變量復(fù)制到編碼結(jié)構(gòu)體}}intmain(){inti,j,n,r,q,M[N]; doublez,p,H=0.0,K=0.0;cout<<"請(qǐng)輸入信源符號(hào)個(gè)數(shù)Q"<<endl;cin>>n; cout<<"請(qǐng)輸入R進(jìn)制編碼"<<endl; cin>>r; cout<<"需要生成N重序列"<<endl; cin>>q; if(q==1) { z=n;} elseif(q==2) { z=n*n;} elseif(q==3) { z=n*n*n;} p=(z-r)/(r-1); while((p-int(p))!=0) { z=z+1; p=(z-r)/(r-1); }HuffmanTree(HuffNode,n,z,r,q);HuffmanCode(HuffCode,n,z,r); if(q==1) { cout<<"霍夫曼編碼如下:"<<endl;for(i=0;i<n;i++){ M[i]=0;cout<<HuffNode[i].weight<<":碼子為:";for(j=HuffCode[i].start+1;j<((z+r-2)/(r-1));j++) {cout<<HuffCode[i].bit[j];M[i]++; } cout<<":碼長(zhǎng)為:"<<M[i];cout<<endl;} for(i=0;i<n;i++) {H=-(HuffNode[i].weightq*log(HuffNode[i].weightq)/log(2))+H; }cout<<"信源熵H(X)="<<H<<"(比特/符號(hào))"<<endl; for(i=0;i<n;i++) {K=HuffNode[i].weight*M[i]+K; }cout<<"平均碼長(zhǎng)K="<<K<<"(比特/符號(hào))"<<endl; } if(q==2) { cout<<"霍夫曼編碼如下:"<<endl;for(i=0;i<n*n;i++){ M[i]=0;cout<<HuffNode[i].weight<<":碼子為:";for(j=HuffCode[i].start+1;j<((z+r-2)/(r-1));j++) {cout<<HuffCode[i].bit[j];M[i]++; } cout<<":碼長(zhǎng)為:"<<M[i];cout<<endl;} for(i=0;i<n;i++) {H=-(HuffNode[i].weightq*log(HuffNode[i].weightq)/log(2))+H; }cout<<"信源熵H(X)="<<H<<"(比特/符號(hào))"<<endl; for(i=0;i<n*n;i++) {K=HuffNode[i].weight*M[i]+K; }cout<<"平均碼長(zhǎng)K="<<K<<"(比特/符號(hào))"<<endl; } if(q==3) { cout<<"霍夫曼編碼如下:"<<endl;for(i=0;i<n*n*n;i++){ M[i]=0;cout<<HuffNode[i].weight<<":馬長(zhǎng)為:";for(j=HuffCode[i].start+1;j<((z+r-2)/(r-1));j++) {cout<<HuffCode[i].bit[j];M[i]++; } cout<<":碼長(zhǎng)為:"<<M[i];cout<<endl;} for(i=0;i<n;i++) {H=-(HuffNode[i].weightq*log(HuffNode[i].weightq)/log(2))+H; }cout<<"信源熵H(X)="<<H<<"(比特/符號(hào))"<<endl; for(i=0;i<n*n*n;i++) {K=HuffNode[i].weight*M[i]+K; }cout<<"平均碼長(zhǎng)K="<<K<<"(比特/符號(hào))"<<endl; } cout<<"編碼效率為"<<((H*q)/(K*log(r)/log(2)))*100<<"%"<<endl; system("pause");return0;}費(fèi)諾編碼#include<stdlib.h>#include<iostream.h>#include<math.h>#defineN30intpa[N][N];voidfano(floatp[],inta[N][N],intn,intm,intk){floatg=0.0,h=0.0,d,b,c;inti,j,flase;if(n<m){for(i=n;i<=m;i++) {g=p[i]+g; }g=g/2;for(i=n;i<=m;i++){h=h+p[i];if(h>g){d=h-p[i];b=h-g;c=g-d; if(c>b) { for(j=n;j<=i;j++)a[j][k]=0; fano(p,a,n,i,k+1); for(j=i+1;j<=m;j++)a[j][k]=1; fano(p,a,i+1,m,k+1); } else { for(j=n;j<=i-1;j++)a[j][k]=0; fano(p,a,n,i-1,k+1); for(j=i;j<=m;j++)a[j][k]=1; fano(p,a,i,m,k+1); } break;}}}}voidmain(){inti,j,k[N],n,flase=0;floatp[N],m,H=0.0,K=0.0,sum=0.0;cout<<"輸入信源符號(hào)個(gè)數(shù)"<<endl;cin>>n;cout<<"輸入各信源符號(hào)概率"<<endl;for(i=1;i<=n;i++) { cin>>p[i]; }for(i=1;i<=n;i++) {sum=sum+p[i]; }for(i=1;i<=n;i++) { if(p[i]<0.0) {cout<<"inputgailverror!";flase=1;break;} } if(flase==0) { for(i=0;i<=n;i++)for(j=0;j<=n;j++) {pa[i][j]=10;}fano(p,pa,1,n,1); cout<<"信源費(fèi)諾編碼如下:\n";for(i=1;i<=n;i++) {k[i]=0; cout<<"x"<<i<<"="<<p[i]<<"\t碼字為\t"; for(j=1;j<=n;j++) { if(pa[i][j]!=10) {cout<<pa[i][j];k[i]++;} } cout<<"\t碼長(zhǎng)為\t"<<k[i]<<endl; } for(i=1;i<=n;i++) {H=-(p[i]*log(p[i])/log(2))+H; }cout<<"信源熵H(X)="<<H<<"(比特/符號(hào))"<<endl;for(i=1;i<=n;i++) {K=p[i]*k[i]+K; }cout<<"平均碼長(zhǎng)K="<<K<<"(比特/符號(hào))"<<endl;cout<<"編碼效率為"<<(H/K)*100<<"%"<<endl; }//if(flase==0) cout<<endl; system("pause");}香農(nóng)編碼#include<stdlib.h>#include<iostream.h>#include<math.h>#include<iomanip.h>#include<stdlib.h>classT{public:T(){}~T();voidCreate();voidCoutpxj();void

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論