213卷积码编码和译码
- 格式:docx
- 大小:396.94 KB
- 文档页数:15
卷积码编码及译码实验浅谈卷积编码下的FPGA实现
卷积编码是现代数字通信系统中常见的一种前向纠错码,区别于常规的线性分组码,卷积编码的码字输出不仅与当前时刻的信息符号输入有关,还与之前输入的信息符号有关。
本文主要是关于卷积码编码及译码实验的相关介绍,并着重分析阐述了基于卷积编码下的FPGA实现。
卷积编码卷积码的编码分为两类:前馈和反馈,在每类中又可分为系统和非系统形式。
我们这里只考虑非系统形式的前馈编码器。
‘
上图是WLAN 802.11a协议中采用的卷积编码器结构,输入比特k=1,输出n=2,存储器长度m=6,编码输出不仅与当前输入有关,还与存储器存储的之前的输入数据有关,具体由之前的哪些数据得到编码输出呢,由生成多项式确定其连接关系。
这里,生成多项式为g0=133(八进制)和g1=171(八进制)(右边是最高位),输出数据A的生成多项式为:
输出数据B的生成多项式为:
生成多项式确定了卷积编码器输出的连接关系。
根据多项式的系数,在相应项进行连接。
生成多项式写成二进制序列的形式分别为:g0 = [1 0 1 1 0 1 1]和g1 = [1 1 1 1 0 0 1](右边是最高位)。
我们假设信息序列u,两个编码器输出序列分别为v(0)和v(1),编码器可以看成一个线性系统,系统的信道响应脉冲最多持续m+1个时间单元,编码输出可以写成编码输入与信道脉冲响应的卷积(即生成多项式),即
其中需要注意的是,所有的加法都是模2加运算。
卷积码编码及译码实验基本原理
1、卷积码编码
卷积码是一种纠错编码,它将输入的k个信息比特编成n个比特输出,特别适合以串行形。
实验二--卷积码编码及译码实验实验二卷积码编码及译码实验一、实验目的通过本实验掌握卷积编码的特性、产生原理及方法,卷积码的译码方法,尤其是维特比译码的原理、过程、特性及其实现方法。
二、实验内容1、观察NRZ基带信号及其卷积编码信号。
2、观察帧同步信号的生成及巴克码的特性。
3、观察卷积编码信号打孔及码速率匹配方法。
4、观察接收端帧同步过程及帧同步信号。
5、观察译码结果并深入理解维特比译码的过程。
6、观察随机差错及突发差错对卷积译码的影响。
三、基本原理1、卷积码编码卷积码是一种纠错编码,它将输入的k个信息比特编成n个比特输出,特别适合以串行形式进行传输,时延小。
卷积码编码器的形式如图17-1所示,它包括:一个由N段组成的输入移位寄存器,每段有k 段,共Nk 个寄存器;一组n 个模2和相加器;一个由n 级组成的输出移位寄存器,对应于每段k 个比特的输入序列,输出n 个比特。
12…k 12…k …12…k12…n 卷积码输出序列信息比特一次移入k 个Nk 级移位寄存器…图17-1 卷积编码器的一般形式由图17-1可以看到,n 个输出比特不仅与当前的k 个输入信息有关,还与前(N -1)k 个信息有关。
通常将N 称为约束长度(有的书中也把约束长度定为nN 或N -1)。
常把卷积码记为:(n 、k 、N ),当k =1时,N -1就是寄存器的个数。
编码效率定义为:/c R k n (17-1)卷积码的表示方法有图解表示法和解析表示法两种:解析法,它可以用数学公式直接表达,包括离散卷积法、生成矩阵法、码生成多项式法;图解表示法,包括树状图、网络图和状态图(最的图形表达形式)三种。
一般情况下,解析表示法比较适合于描述编码过程,而图形法比较适合于描述译码。
(1)图解表示法(2)解析法下面以(2,1,3)卷积编码器为例详细讲述卷积码的产生原理和表示方法。
(2,1,3)卷积码的约束长度为3,编码速率为1/2,编码器的结构如图17-2所示。
卷积码门限译码
卷积码门限译码是一种在卷积码通信系统中用于译码的技术。
卷积码是一种常用的纠错编码方式,它通过将信息序列映射到一组较长的码字,从而提供一定的错误纠正能力。
门限译码则是卷积码译码的一种方法,通过设定一个阈值来判断接收到的信号是否超过门限,从而进行译码。
在卷积码门限译码中,通常采用最大后验概率(MAP)或最大互信息(MMI)等算法进行译码。
这些算法基于接收到的信号和已知的信道特性,计算出每个码字的概率或互信息,并选择概率或互信息最大的码字作为译码结果。
门限值的选择对译码性能有着重要影响。
如果门限值设置过低,可能会导致过多的误码;如果门限值设置过高,则可能会导致译码失败。
因此,需要根据信道特性、噪声水平、卷积码的约束长度等因素来选择合适的门限值。
总的来说,卷积码门限译码是一种有效的卷积码译码方法,它在通信、雷达、声呐等领域有着广泛的应用。
卷积码编码维特比译码实验设计报告SUN一、实验目的掌握卷积码编码和维特比译码的基本原理,利用了卷积码的特性, 运用网格图和回溯以得到译码输出。
二、实验原理1.卷积码是由连续输入的信息序列得到连续输出的已编码序列。
其编码器将k个信息码元编为n个码元时,这n个码元不仅与当前段的k个信息有关,而且与前面的(m-1)段信息有关(m为编码的约束长度)。
2.一般地,最小距离d表明了卷积码在连续m段以内的距离特性,该码可以在m个连续码流内纠正(d-1)/2个错误。
卷积码的纠错能力不仅与约束长度有关,还与采用的译码方式有关。
3. 维特比译码算法基本原理是将接收到的信号序列和所有可能的发送信号序列比较,选择其中汉明距离最小的序列认为是当前发送序列。
卷积码的Viterbi 译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。
4.所谓“最佳”, 是指最大后验条件概率:P( C/ R) = max [ P ( Cj/ R) ] , 一般来说, 信道模型并不使用后验条件概率,因此利用Beyes 公式、根据信道特性出结论:max[ P ( Cj/ R) ]与max[ P ( R/ Cj) ]等价。
考虑到在系统实现中往往采用对数形式的运算,以求降低运算量,并且为求运算值为整数加入了修正因子a1 、a2 。
令M ( R/ Cj) = log[ P ( R/ Cj) ] =Σa1 (log[ P( Rm/ Cmj ) ] + a2) 。
其中, M 是组成序列的码字的个数。
因此寻找最佳路径, 就变成寻找最大M( R/ Cj) , M( R/ Cj) 称为Cj 的分支路径量度,含义为发送Cj 而接收码元为R的似然度。
5.卷积码的viterbi译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程并可以纠正接收码字中的错误比特。
三、实验代码#include<stdio.h>#include "Conio.h"#define N 7#include "math.h"#include <stdlib.h>#include<time.h>#define randomize() srand((unsigned)time(NULL))encode(unsigned int *symbols, /*编码输出*/unsigned int *data, /*编码输入*/unsigned int nbytes, /*nbytes=n/16,n为实际输入码字的数目*/unsigned int startstate /*定义初始化状态*/)////////////////////////////////////////////////////////////////////////////卷积码编码///////////////////////////////////////////////////////////////////////////////{unsigned int j;unsigned int input,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0;for(j=0;j<nbytes;j++){input=*data;data++;*symbols = input^a1^a2^a3^a6; //c1(171)symbols++;*symbols = input^a2^a3^a5^a6; //c2(133)symbols++;a2=a1;a1=input;}return 0;}int trandistance(int m, int state1, int state2)/*符号m与从state1到state2时输出符号的汉明距离,如果state1无法到state2则输出度量值为100*/{int c;int sym,sym1,sym2;sym1=((state2>>1)&1)^(state2&1)^(state1&1);sym2=((state2>>1)&1)^(state1&1);sym=(sym1<<1) | sym2;if ( ((state1&2)>>1)==(state2&1))c=((m&1)^(sym&1))+(((m>> 1)&1)^((sym >> 1)&1));elsec=10000;return(c);}int traninput(int a,int b) /*状态从a到b时输入卷积码的符号*/{int c;c=((b&2)>>1);return(c);}int tranoutput(int a,int b) /*状态从a到b时卷积码输出的符号*/{int c,s1,s2;s1=(a&1)^((a&2)>>1)^((b&2)>>1);s2=(a&1)^((b&2)>>1);c=(s1<<1)|s2;return(c);}////////////////////////////////////////////////////////////////////////////维特比译码///////////////////////////////////////////////////////////////////////////////void viterbi(int initialstate, /*定义解码器初始状态*/int *viterbiinput, /*解码器输入码字序列*/int *viterbioutput /*解码器输出码字序列*/){struct sta /*定义网格图中每一点为一个结构体,其元素包括*/ {int met; /*转移到此状态累计的度量值*/int value; /*输入符号*/struct sta *last; /*及指向前一个状态的指针*/};struct sta state[4][N];struct sta *g,*head;int i,j,p,q,t,r,u,l;for(i=0;i<4;i++) /* 初始化每个状态的度量值*/for(j=0;j<N;j++)state[i][j].met=0;for(l=0;l<4;l++){state[l][0].met=trandistance(*viterbiinput,initialstate,l);state[l][0].value=traninput(initialstate,l);state[l][0].last=NULL;}viterbiinput++; /*扩展第一步幸存路径*/for(t=1;t<N;t++){for(p=0;p<4;p++){state[p][t].met=state[0][t-1].met+trandistance(*viterbiinput,0,p);state[p][t].value=traninput(0,p);state[p][t].last=&state[0][t-1];for(q=0;q<4;q++){if(state[q][t-1].met+trandistance(*viterbiinput,q,p)<state[p][t].met){state[p][t].met=state[q][t-1].met+trandistance(*viterbiinput,q,p);state[p][t].value=traninput(q,p);state[p][t].last=&state[q][t-1];}}}viterbiinput++;} /*计算出剩余的幸存路径*/r=state[0][N-1].met; /*找出n步后度量值最小的状态准备回溯路由*/g=&state[0][N-1];for(u=N;u>0;u--) /*向前递归的找出最大似然路径*/{*(viterbioutput+(u-1))=g->value;g=g->last;}/* for(u=0;u<8;u++)*(viterbioutput+u)=state[u][2].met; */ /*此行程序可用于检测第n列的度量值*/}void decode(unsigned int *input, int *output,int n){int viterbiinput[100];int j;for(j=0;j<n+2;j++){viterbiinput[j]=(input[j*2]<<1)|input[j*2+1];}viterbi(0,viterbiinput,output);}void main(){unsigned intencodeinput[100],wrong[10]={0,0,0,0,0,0,0,0,0,0},encodeoutput[100];int n=5,i,m,j=0,decodeinput[100],decodeoutput[100];randomize();for(i=0; i<n; i++)encodeinput[i]=rand()%2;encodeinput[n]= encodeinput[n+1]=0;encode(encodeoutput,encodeinput,n+2,0);printf("the input of encoder is :\n"); //信息源输入的信息码(随机产生)for(i=0;i<n; i++)printf("%2d",encodeinput[i]);printf("\n");printf("the output of encoder is :\n"); //编码之后产生的卷积码for(i=0;i<(n+2)*2;i++){printf("%2d",encodeoutput[i]);if(i%20==19)printf("\n");}printf("\n");printf("please input the number of the wrong bit\n"); //信道传输收到干扰而产生的错误码scanf("%d",&m);printf("please input the positions of the wrong bit(0-9)\n");for(i=0;i<m;i++){scanf("%d",&wrong[m]);if(encodeoutput[wrong[m]]==0)encodeoutput[wrong[m]]=1;elseencodeoutput[wrong[m]]=0;}printf("the input of decoder is :\n");for(i=0;i<(n+2)*2;i++){printf("%2d",encodeoutput[i]);if(i%20==19)printf("\n");}printf("\n");decode(encodeoutput,decodeoutput,n+2);printf("the output of decoder is :\n");for(i=0;i<n;i++)printf("%2d",decodeoutput[i]);printf("\n");for(i=0;i<n;i++){if(encodeinput[i]!=decodeoutput[i])j++;}printf("the number of incorrect bit is:%d\n",j);}四、实验总结(1)了解实验原理,分析实验所占数组变量很重要,也是相对考虑较多的;(2)对于读写文件,通过本实验更加熟悉;(3)记录实验程序最佳路径是本实验的难点;。
No.15 (2,1,3)卷积码的编码及译码摘要:本报告对于 (2,1,3)卷积码原理部分的论述主要参照啜刚教材和课件,编程仿真部分绝对原创,所有的程序都是在Codeblocks 8.02环境下用C语言编写的,编译运行都正常。
完成了卷积码的编码程序,译码程序,因为对于短于 3 组的卷积码,即2 bit 或4 bit 纠错是没有意义的,所以对正确的短序列直接译码,对长序列纠错后译码,都能得到正确的译码结果。
含仿真结果和程序源代码。
如果您不使用Codeblocks 运行程序,则可能不支持中文输出显示,但是所有的数码输出都是正确的。
一、卷积码编码原理卷积码编码器对输入的数据流每次1bit或k bit进行编码,输出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个连接到指定寄存器的模二加法器,并把加法器输出转化为串行输出。
EncoderOuTi>iit编码器如题所示。
二、卷积码编码器程序仿真C语言编写的仿真程序。
为了简单起见,这里仅仅提供数组长度30 bit的仿真程序,当然如果需要可以修改数组大小。
为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果需要也可以增加相应的功能。
进入程序后,先提示输入数据的长度,请用户输入int (整型数)程序默认用户输入的数据小于30,然后提示输入01数码,读入数码存储与input数组中,然后运算输出卷积码。
No.15 (2,1,3)卷积码的编码及译码摘要:本报告对于(2,1,3)卷积码原理部分的论述主要参照啜刚教材和课件,编程仿真部分绝对原创,所有的程序都是在Codeblocks 8.02环境下用C语言编写的,编译运行都正常。
完成了卷积码的编码程序,译码程序,因为对于短于3组的卷积码,即2 bit或4 bit纠错是没有意义的,所以对正确的短序列直接译码,对长序列纠错后译码,都能得到正确的译码结果。
含仿真结果和程序源代码。
如果您不使用Codeblocks运行程序,则可能不支持中文输出显示,但是所有的数码输出都是正确的。
一、 卷积码编码原理卷积码编码器对输入的数据流每次1bit 或k bit 进行编码,输出n bit 编码符号。
但是输出的分支码字的每个码元不仅于此时可输入的k 个嘻嘻有关,业余前m 个连续式可输入的信息有关,因此编码器应包含m 级寄存器以记录这些信息。
通常卷积码表示为 (n,k,m). 编码率 k r n=当k=1时,卷积码编码器的结构包括一个由m 个串接的寄存器构成的移位寄存器(成为m 级移位寄存器、n 个连接到指定寄存器的模二加法器以及把模二加法器的输出转化为穿行的转换开关。
本报告所讲的(2,1,3)卷积码是最简单的卷积码。
就是2n =,1k =,3m =的卷积码。
每次输入1 bit 输入信息,经过3级移位寄存器,2个连接到指定寄存器的模二加法器,并把加法器输出转化为串行输出。
编码器如题所示。
二、卷积码编码器程序仿真 C 语言编写的仿真程序。
为了简单起见,这里仅仅提供数组长度30 bit 的仿真程序,当然如果需要可以修改数组大小。
为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果需要也可以增加相应的功能。
进入程序后,先提示输入数据的长度,请用户输入int (整型数)程序默认用户输入的数据小于30,然后提示输入01数码,读入数码存储与input 数组中,然后运算输出卷积码。
经过实验仿真,编码完全正确。
以下是举例:a.课件上的输入101 输出11 10 00 的实验b.更长的序列测试三、卷积码译码原理由有限状态移位寄存器产生的卷积码实质上是一个有限状态机。
(n, k)线性分组码的最大似然译码就是在所有合法码字中找出一个最接近接收码字的码字。
卷积码的最大似然译码法则是对于给定的接收符号序列R,找出最大可能的编码符号序列C。
维特比于1967年提出的维特比算法能够系统地去除那些不可能具有最大度量的路径排除,从而降低了最大似然译码的复杂度。
(2,1,3)卷积码的状态图(2,1,3)卷积码的网格图卷积码一码通常按最大似然法则一码,对二进制对称信道(BSC),它就等小于最小汉明距离译码。
在这种译码器中,把接收序列和所有可能发送序列比较,选择一个汉明距离最小的序列盘坐发送序列。
由于信息序列编码序列有着一一对应关系,这种序列和网格图的一条路径唯一对应,因此译码就是根据接收序列R在网格图上全力搜索编码器在编码时经过的路径。
四、卷积码译码器程序仿真C语言编写的仿真程序。
为了简单起见,这里仅仅提供数组长度2×10 bit的仿真程序,当然如果需要可以修改数组大小。
为了更精练的实现算法,程序输入模块没有提供非法字符处理过程,如果需要也可以增加相应的功能。
进入程序后,先提示输入数据的长度,请用户输入int(整型数)程序默认用户输入的数据小于30,然后提示输入01数码,读入数码存储与input数组中,然后运算输出卷积码。
经过实验仿真,译码完全正确。
以下是举例:a.课件上接收码字11 10 00 译码101的实验b.对应上文中的,长序列译码测试结果c.译码与编码的区别在于容错性,如果在传输过程中有出错的比特,也应该用Viterbi decoder在一定的范围内自动纠错,得到正确的发端的编码,并翻译出发端的原码。
本报告中对于比较长的序列(>2)进行纠错。
以课件中的例子进行仿真R是收到的码字,C是发送方发出的正确的码字,R有2 bit信息出现错误。
运行程序的到结果。
当用译码器接收正确的序列C时显示以下结果:当接收到的序列错误时译码结果如下:如此时把译码结果输入上文中的编码器程序,即可得到发送方发出的正确的码字:综上,译码程序能对于正确的较短(<3组)的卷积码序列进行译码,得到正确的译码结果。
对于较长的序列(>2)可以纠错,纠正后,得到正确的卷积码,然后译码得到原码。
程序仿真完全正确。
d.模拟一个完整的传输过程:发送方输入序列11001010输入到编码器程序中:得到卷积码输出:11 01 01 11 11 10 00 10若传送到接收端,由于信道的各种干扰,接收码字发生了变化,得到的接收码字:11 11 01 11 01 10 11 10共有2 bit出现错误,输入到解码器中,纠错解码后得到:有效地纠错,解码,还原了发送方的信息。
e.进一步大量仿真得到结果:当错误量比较多,或者比较集中时,有些时候不能有效地纠错,得到的译码结果可能也有1bit是错误的。
具体截图略。
五、编码C源程序清单#include <stdio.h>#include <stdlib.h>short add3(short a,short b, short c)/* 3位模二加法器*/{short sum;sum = a+b+c;sum = sum%2;return sum;}short 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 input[30];/*存储输入数据的数组*/int i;printf("需要输入几位数据?");scanf("%d",&length);printf("请输入%d位数字:\n",length);for (i=0;i<length;i++){scanf("%1hd",&input[i]);}printf("卷积码输出:\n");for (i=0;i<length;i++){c=b;b=a;a=input[i];/*移位运算*/x=add3(a,b,c);y=add2(a,c);printf("%d%d\n",x,y);}return 0;}六、译码程序清单#include <stdio.h>#include <stdlib.h>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;}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 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(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 lu00[10]={0,0};int lu10[10]={0,1};int lu01[10]={1,0};int lu11[10]={1,1};int lz00[10]={0},lz10[10]={0};int lz01[10]={0},lz11[10]={0};d00=hanming(code[0],0)+hanming(code[1],0);d10=hanming(code[0],0)+hanming(code[1],11);d01=hanming(code[0],11)+hanming(code[1],10);d11=hanming(code[0],11)+hanming(code[1],01);for (i=2;i<length;i++){/*00状态路径*/if ((d00+hanming(0,code[i]))<(d01+hanming(11,code[i]))){for (j=0;j<i;j++){lz00[j]=lu00[j];}lz00[i]=0;dz00=d00+hanming(0,code[i]);}else{for (j=0;j<i;j++){lz00[j]=lu01[j];}lz00[i]=0;dz00=d01+hanming(11,code[i]);}/*10状态路径*/if ((d00+hanming(11,code[i]))<(d01+hanming(00,code[i]))) {for (j=0;j<i;j++){lz10[j]=lu00[j];}lz10[i]=1;dz10=(d00+hanming(11,code[i]));}else{for (j=0;j<i;j++){lz10[j]=lu01[j];}lz10[i]=1;dz10=d01+hanming(00,code[i]);}/*01状态路径*/if ((d10+hanming(10,code[i]))<(d11+hanming(01,code[i]))) {for (j=0;j<i;j++){lz01[j]=lu10[j];}lz01[i]=0;dz01=d10+hanming(10,code[i]);}else{for (j=0;j<i;j++){lz01[j]=lu11[j];}lz01[i]=0;dz01=d11+hanming(01,code[i]);}/*11状态路径*/if ((d10+hanming(01,code[i]))<(d11+hanming(10,code[i]))) {for (j=0;j<i;j++){lz11[j]=lu10[j];}lz11[i]=1;dz11=d10+hanming(01,code[i]);}else{for (j=0;j<i;j++){lz11[j]=lu11[j];}lz11[i]=1;dz11=d11+hanming(10,code[i]);}/*更新*/d00=dz00;d10=dz10;d01=dz01;d11=dz11;for (m=0;m<length;m++){lu00[m]=lz00[m];}for (m=0;m<length;m++){lu10[m]=lz10[m];}for (m=0;m<length;m++){lu01[m]=lz01[m];}for (m=0;m<length;m++){lu11[m]=lz11[m];}}/*最后一步,在四条路径中选择汉明距离最小的一条*/ error=d00;p=lu00;if (d01<error){error=d01;p=lu01;}if (d10<error){error=d10;p=lu10;}if (d11<error){error=d11;p=lu11;}printf("共有%d位错误,译码如下:\n",error);for (m=0;m<length;m++){printf("%d",*p);p++;}}int main(){int codenow=0;int now=0;/*当前状态*/int length=0;/*输入长度*/int decode;/*输出*/int code[20];/*存储输入数据的数组*/int i;printf("需要输入几组数据?");scanf("%d",&length);printf("请输入%d组接收到的数字:\n",length);for (i=0;i<length;i++){scanf("%2d",&code[i]);}/*长度大于3的用Viterbi decoder纠错过程如下,*/ if (length>2){correct(code,length);}/*长度小于3的直接译码*/else{printf("\n卷积码解码结果:\n");/*解码过程如下*/for (i=0;i<length;i++){codenow =code[i]*100+now;codenow=de(codenow);now=codenow%100;decode = (codenow-now)/100;printf("%d",decode);}}return 0;}。