《213卷积码编码和译码.docx》由会员分享,可在线阅读,更多相关《213卷积码编码和译码.docx(15页珍藏版)》请在三一办公上搜索。
1、No.15 (2,1,3)卷积码的编码及译码摘要:本报告对于(2,1,3)卷积码原理部分的论述主要参照啜刚教材和课件,编程仿真部分绝对原创, 所有的程序都是在Codeblocks 8.0环境下用C语言编写的,编译运行都正常。完成了卷积码的 编码程序,译码程序,因为对于短于3组的卷积码,即2 bit或4 bit纠错是没有意义的,所以对 正确的短序列直接译码,对长序列纠错后译码,都能得到正确的译码结果。含仿真结果和程序源 代码。如果您不使用Codeblocks运行程序,则可能不支持中文输出显示,但是所有的数码输出 都是正确的。一、卷积码编码原理卷积码编码器对输入的数据流每次1bit或k bit进行
2、编码,输出n bit编码符号。但是输 出的分支码字的每个码元不仅于此时可输入的k个嘻嘻有关,业余前m个连续式可输入的 信息有关,因此编码器应包含m级寄存器以记录这些信息。_k通常卷积码表示为(n,k,m).编码率r n当k=1时,卷积码编码器的结构包括一个由m个串接的寄存器构成的移位寄存器(成 为m级移位寄存器、n个连接到指定寄存器的模二加法器以及把模二加法器的输出转化为 穿行的转换开关。本报告所讲的(2,1,3)卷积码是最简单的卷积码。就是n = 2,k 1,m = 3的卷积 码。每次输入1 bit输入信息,经过3级移位寄存器,2个连接到指定寄存器的模二加法器, 并把加法器输出转化为串行输出
3、。Encoder编码器如题所示。二、卷积码编码器程序仿真C语言编写的仿真程序。为了简单起见,这里仅仅提供数组长度30 bit的仿真程序,当然如果需要可以修改数 组大小。为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果需要 也可以增加相应的功能。进入程序后,先提示输入数据的长度,请用户输入int (整型数)程序默认用户输入 的数据小于30,然后提示输入01数码,读入数码存储与input数组中,然后运算输出 卷积码。经过实验仿真,编码完全正确。以下是举例:a.课件上的输入101输出11 10 00的实验C: U ser 武吕Icto p 213 卷柱码,binDebug213 卷积
4、码,已 kp ress any key to continue-b. 更长的序列测试C:LI ses吕粉De5 ktop21 卷茫码旧 nLe 成i g21 ?卷租码 exe1011031011 卷积码输出: 1110 B0 01 01 11 11 10 S3 01iProcess returned 0 0x0) execution tine : 22 -027 s iPiess any key to cant in Lie .三、卷积码译码原理由有限状态移位寄存器产生的卷积码实质上是一个有限状态机。(n,)线性分组码的最 大似然译码就是在所有合法码字中找出一个最接近接收码字的码字。卷积码的最
5、大似然 译码法则是对于给定的接收符号序列R,找出最大可能的编码符号序列C。维特比于1967 年提出的维特比算法能够系统地去除那些不可能具有最大度量的路径排除,从而降低了 最大似然译码的复杂度。编码器的 状态s虚线代表输入1 编码输出实线代衮稣入(2,1,3 )卷积码的状态图(2,1,3 )卷积码的网格图S0 = 00, S1=01, S2 = 1。,S3=11卷积码一码通常按最大似然法则一码,对二进制对称信道(BSC),它就等小于最小汉 明距离译码。在这种译码器中,把接收序列和所有可能发送序列比较,选择一个汉明距 离最小的序列盘坐发送序列。由于信息序列编码序列有着一一对应关系,这种序列和网 格
6、图的一条路径唯一对应,因此译码就是根据接收序列R在网格图上全力搜索编码器在 编码时经过的路径。四、卷积码译码器程序仿真C语言编写的仿真程序。为了简单起见,这里仅仅提供数组长度2X10 bit的仿真程序,当然如果需要可以修 改数组大小。为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果 需要也可以增加相应的功能。进入程序后,先提示输入数据的长度,请用户输入int (整型数)程序默认用户输入 的数据小于30,然后提示输入01数码,读入数码存储与input数组中,然后运算输出 卷积码。经过实验仿真,译码完全正确。以下是举例:a.课件上 接收码字11 10 00译码101的实验C:Use
7、s侣膏p罹积括甥玛也i nD bu改苞积码帽彰ex e 515卷积码解码结果:101Pracess returned 0execution time : 15.482Press any key tu continue.b.对应上文中的,长序列译码测试结果C:LI e nA吕格,ktop卷和匡序cbinD? bu g.卷程裙睦码启炽T4_iiIB四01011111if?明魅01共有防位错误咨译码如下打1B11B01011Process re turned. & ex&Eut ion time : 22 _ 042 sPress any key to cont inuec. 译码与编码的区别在于容
8、错性,如果在传输过程中有出错的比特,也应该用Viterbi decoder在一定的范围内自动纠错,得到正确的发端的编码,并翻译出发端的原码。本 报告中对于比较长的序列(2)进行纠错。以课件中的例子进行仿真R=10 10 00 0111 01OlL1000,01,01R是收到的码字,C是发送方发出的正确的码字,R有2 bit信息出现错误。运行程序 的到结果。当用译码器接收正确的序列C时 显示以下结果:共有咆错误,译码如下;101116Process returned 0超(曲Press an 刑略廿 to con t inu.e .当接收到的序列错误时R=10 10 00 01 11 01译码结
9、果如下:?nc:eE:s: returned S Fi*ess aii key to cnntinue共有位错误,译码如下:如此时把译码结果输入上文中的编码器程序,即可得到发送方发出的正确的码字:=11,10.00,0140,01综上,译码程序能对于正确的较短(3组)的卷积码序列进行译码,得到正确的译 码结果。对于较长的序列(2)可以纠错,纠正后,得到正确的卷积码,然后译码得到 原码。程序仿真完全正确。d. 模拟一个完整的传输过程:发送方输入序列11001010输入到编码器程序中:C:LfsersX目善口太以叩讦配051。2巽号08鸵102遇吕葬Nol5 213卷积码案IWZ据“ 芦强相输出;
10、MlII 1 1&5T5*j*Dcess vet:ur*ned ft CBxBi execut:Ion t:Ime : 13 -1511 s *rcs3 ciny cy to con*t Inuc .得到卷积码输出:11 01 01 11 11 10 00 10若传送到接收端,由于信道的各种干扰,接收码字发生了变化,得到的接收码字:11 11 01 11 01 10 11 10共有2 bit出现错误,输入到解码器中,纠错解码后得到:C:Users吕爵De-sktop60&0510228号08361021Nol5 213卷积码、卷请篇人8组接收到的数子:11110111011(3咽113共有2位
11、错误,译码如下:11001010Process returned (1 execution tine : 22.791 s Press any key to continue-有效地纠错,解码,还原了发送方的信息。e. 进一步大量仿真得到结果:当错误量比较多,或者比较集中时,有些时候不能有效 地纠错,得到的译码结果可能也有1bit是错误的。具体截图略。五、编码C源程序清单#include #include short add3(short a,short b, short c)/* 3位模二加法器*/(short sum;sum = a+b+c;sum = sum%2;return sum;s
12、hort add2(short a,short b)/* 2位模二加法器*/(short sum;sum = a+b;sum = sum%2;return sum;int main()(short a=0, b=0, c=0;/*三个移位寄存器初始状态为0*/int length=0;/*输入长度*/short x,y;/*两个输出寄存器*/short input30;/*存储输入数据的数组*/int i;printf(需要输入几位数据?);scanf(%d,&length);printf(请输A%d 位数字:n”,length);for (i=0;ilength;i+)(scanf(%1hd
13、,&inputi);printf(卷积码输出:n);for (i=0;ilength;i+)(c=b;b=a;a=inputi;/*移位运算*/x=add3(a,b,c);y=add2(a,c);printf(%d%dn,x,y);return 0;六、译码程序清单#include #include int de(codenow)(/*短序列不纠错解码器*/int decode,now,code;now=codenow%100;code =(codenow-now)/100;/*分离状态和接收到的码字*/switch (now)(case 10:if (code=10)(now=01;deco
14、de=0;else(now=11;decode=1;break;case 11:if (code=01)(now = 01;decode=0;else(now=11;decode=1;break;case 01:if (code=11)(now = 00;decode=0;else(now=10;decode=1;break;case 00:if (code=00)(now = 00;decode=0;else(now=10;decode=1;break;default:printf(error!);codenow=decode*100+now;return codenow;int hanmi
15、ng(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(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结束时*
16、/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,0)+hanming(code1,11);d01=hanming(code0,11)+hanming(code1,10);d11=hanming(code0,11)+hanming(code1,01);for (i=2;ilength;i+)/*00状态路径*/if (d00+
17、hanming(0,codei)(d01+hanming(11,codei)for (j=0;ji;j+)lz00j=lu00j;lz00i=0;dz00=d00+hanming(0,codei); elsefor (j=0;ji;j+)(lz00j=lu01j;lz00i=0;dz00=d01+hanming(11,codei);/*10状态路径*/if (d00+hanming(11,codei)(d01+hanming(00,codei)(for (j=0;ji;j+)(lz10j=lu00j;lz10i=1;dz10=(d00+hanming(11,codei);else(for (j
18、=0;ji;j+)(lz10j=lu01j;lz10i=1;dz10=d01+hanming(00,codei);/*01状态路径*/if (d10+hanming(10,codei)(d11+hanming(01,codei)(for (j=0;ji;j+)(lz01j=lu10j;lz01i=0;dz01=d10+hanming(10,codei);else(for (j=0;ji;j+)(lz01j=lu11j;lz01i=0;dz01=d11+hanming(01,codei);/*11状态路径*/if (d10+hanming(01,codei)(d11+hanming(10,cod
19、ei)(for (j=0;ji;j+)(lz11j=lu10j;lz11i=1;dz11=d10+hanming(01,codei);else(for (j=0;ji;j+)(lz11j=lu11j;lz11i=1;dz11=d11+hanming(10,codei);/*更新*/d00=dz00;d10=dz10;d01=dz01;d11=dz11;for (m=0;mlength;m+)(lu00m=lz00m;for (m=0;mlength;m+)(lu10m=lz10m;for (m=0;mlength;m+)(lu01m=lz01m;for (m=0;mlength;m+)(lu1
20、1m=lz11m;/*最后一步,在四条路径中选择汉明距离最小的一条*/error=d00;p=lu00;if (d01error)(error=d01;p=lu01;if (d10error)(error=d10;p=lu10;if (d11error)(error=d11;p=lu11;printf(共有d位错误,译码如下:n,error);for (m=0;mlength;m+)(printf(%d”,*p);p+;int main()(int codenow=0;int now=0;/*当前状态*/int length=0;/*输入长度*/int decode;/*输出*/int cod
21、e20;/*存储输入数据的数组*/int i;printf(-需要输入几组数据?);scanf(%d,&length);printf(请输A%d组接收到的数字:n”,length);for (i=0;i2)(correct(code,length);/*长度小于3的直接译码*/else(printf(n卷积码解码结果:n);/*解码过程如下*/for (i=0;ilength;i+)(codenow =codei*100+now;codenow=de(codenow);now=codenow%100;decode = (codenow-now)/100;printf(%d,decode);return 0;