1、惹和码输岀包htl10eerpocess j*ecitpned Q C0x0 execut ion time : 7.197rress any ky to continue.b更长的序列测试C :U se r 2吕静g 5 ktop213巻积碍中 niDe b u g21 巻职码亡灼PyQcess petupned Q execution tine : 22.027PTess an y eeatiitn time : 22.042 si*etai*ned. 0 (0x0Press any he y to con t xnue .c译码与编码的区别在于容错性,如果在传输过程中有出错的比特,也应该
2、用 Viterbidecoder在一定的范围内自动纠错,得到正确的发端的编码,并翻译出发端的原码。本 报告中对于比较长的序列(2)进行纠错。以课件中的例子进行仿真R=10 10 00 01 11 0|lc=ii40h00,0140/01R是收到的码字,C是发送方发出的正确的码字, R有2 bit信息出现错误。运行程序 的到结果。当用译码器接收正确的序列 C时 显示以下结果:iimi祐字; 阴13共有0位错误,译码如下i101110BxecutIon tine : 19-700 sProcess pcttirned 0 0x0)Press an kej/ to cont inite .当接收到的
3、序列错误时R=10 10 00 01 11 01译码结果如下:eTsa 嵯码冷 bi riD e 袒嬌誓碍启鴉la|0iai共有2位皓误.译码如下;JppocesE returned 8 execution tine : 26.488 epess Any key to continue-如此时把译码结果输入上文中的编码器程序,即可得到发送方发出的正确的码字:c=ii,io,oo,oi40,oi综上,译码程序能对于正确的较短( 2)可以纠错,纠正后,得到正确的卷积码,然后译码得到 原码。程序仿真完全正确。d.模拟一个元整的传输过程:发送方输入序列11001010输入到编码器程序中:K CAUse
4、fiVS静20口6帕051022書号0阳6102班 Nol5 213巻积码PpnreKSPreaa fliny keyi*t itpnf!d n Kxertit inn tin# J 13.1 FiO s得到卷积码输出: 若传送到接收端,to continue”11 01 01 11 11 10 00 10由于信道的各种干扰,接收码字发生了变化,得到的接收码字:11 11 01 11 01 10 11 10共有2 bit出现错误,输入到解码器中,纠错解码后得到:iSSAfi组接”如的数字:911690LS共有2位错误,译码如下:11091910Process ret urned 9 execi
5、it io n tine : 22.791 sPress any key ta continue _有效地纠错,解码,还原了发送方的信息。e.进一步大量仿真得到结果:当错误量比较多,或者比较集中时,有些时候不能有效 地纠错,得到的译码结果可能也有 1bit是错误的。具体截图略。五、编码C源程序清单#include stdlib.h/* 3short add3(short a,short b, short c) 位模二加法器 */short sum; sum = a+b+c; sum = sum%2; return sum;short add2(short a,short b)/* 2 位模二加
6、法器 */sum = a+b;sum = sum%2;int main()short a=0, b=0, c=0;/* 三个移位寄存器初始状态为 0*/ int length=0;/* 输入长度 */short x,y;/* 两个输出寄存器 */short input30;/* 存储输入数据的数组 */int i;printf( 需要输入几位数据? ); scanf(%d,&length); 请输入 %d 位数字: n,length); for (i=0;ilength;i+)scanf(%1hdinputi); 卷积码输出:for (i=0;c=b;b=a;a=inputi;/* 移位运算
7、*/ x=add3(a,b,c); y=add2(a,c); printf(%d%dn,x,y); return 0;六、译码程序清单int de(codenow)/* 短序列不纠错解码器 */ int decode,now,code; now=codenow%100;code =(codenow-now)/100;/* 分离状态和接收到的码字 */ switch (now)case 10:if (code=10)now=01; decode=0; elsenow=11;decode=1; break;case 11:if (code=01) now = 01;case 01:if (code
8、=11) now = 00;now=10; break;case 00:if (code=00) decode=1;default:error! codenow=decode*100+now; return codenow;int hanming(int x, int y)/* 计算 xy 两个 2bit 数的汉明距离 */ int x1,x2,y1,y2,sum=0;/* 分解数位 */x2=x%2;x1=(x-x2)/10; y2=y%2;y1=(y-y2)/10; if (x1 != y1) sum+;if (x2 != y2) sum+;return sum; void correct
9、(int code,int length)/* 长序列纠错解码器 */int i,j,m,error=0;int *p;int d00=0, d10=0, d01=0, d11=0;int dz00=0, dz10=0, dz01=0, dz11=0;/* 时刻 1 结束时 */int lu0010=0,0;int lu1010=0,1;int lu0110=1,0;int lu1110=1,1;int lz0010=0,lz1010=0;int lz0110=0,lz1110=0;d00=hanming(code0,0)+hanming(code1,0);d10=hanming(code0,
10、0)+hanming(code1,11);d01=hanming(code0,11)+hanming(code1,10);d11=hanming(code0,11)+hanming(code1,01);for (i=2;/*00 状态路径 */if (d00+hanming(0,codei)(d01+hanming(11,codei) for (j=0;ji;j+)lz00j=lu00j;lz00i=0;dz00=d00+hanming(0,codei);lz00j=lu01j;dz00=d01+hanming(11,codei); /*10 状态路径 */if (d00+hanming(11
11、,codei)(d01+hanming(00,codei) lz10j=lu00j; lz10i=1; dz10=(d00+hanming(11,codei);lz10j=lu01j;lz10i=1;状态路径 */dz10=d01+hanming(00,codei);/*01if (d10+hanming(10,codei)(d11+hanming(01,codei) lz01j=lu10j; lz01i=0;dz01=d10+hanming(10,codei);lz01j=lu11j;lz01i=0;dz01=d11+hanming(01,codei); /*11 状态路径 */if (d1
12、0+hanming(01,codei)(d11+hanming(10,codei) lz11j=lu10j; lz11i=1;dz11=d10+hanming(01,codei);lz11j=lu11j; dz11=d11+hanming(10,codei);/* 更新 */d00=dz00;d10=dz10;d01=dz01;d11=dz11;for (m=0;mm+)lu00m=lz00m;lu10m=lz10m;lu01m=lz01m;lu11m=lz11m;*/* 最后一步,在四条路径中选择汉明距离最小的一条 error=d00;p=lu00;if (d01error) error=d01; p=lu01;if (d10 error=d10; p=lu10;if (d112)correct(code,length);/* 长度小于 3 的直接译码 */elsen 卷积码解码结果:/* 解码过程如下 */codenow =codei*100+now; codenow=de(codenow);decode = (codenow-now)/100;,decode);return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1