卷积码编码
poly2trellis()函数和convenc()函数
函数作用:
poly2trellis:用于生成相应卷积码的网格表,作为convenc函数的参数。
convenc:根据生成的网格表,生成卷积码。
poly2trellis和convenc函数一般配套用于卷积码编码。
函数原型:
trellis =poly2trellis(ConstraintLength,CodeGenerator);
code_data =convenc(P_data,trellis);
函数参数:
trellis:网格表,用来规定我们使用的卷积编码的规则(比如几输入、几输出、几个寄存器)。
ConstraintLength:描述每一路输入的长度(如100011 ConstraintLength=6)。
CodeGenerator:描述输入和模2加法器的连接关系(8进制计数,如,CodeGenerator=133)。
P_data:表示输入的二进制比特。
code_data:表示输出的二进制比特。
poly2trellis()函数主要是给convenc()函数提供一个生成卷积码的网格表。下面是一个(2,1,3)卷积码编码简单的生成示例
input=[1 0 1 1 0 1 0 1 0 1 0 0 0 1 1];
n=2;k=1;L=3;
gen=[5,7];
%生成卷积码
trellis = poly2trellis(L,gen);
code_data = convenc(input,trellis);
这里gen是卷积码的生成矢量组成的矩阵(g1=101;g2=111,换算成八进制就是5和7了)。
poly2trellis()函数的输入即为卷积码的约束长度和它的生成矢量,生成矢量一般是换算成八进制。
convenc()函数的输入就主要是编码前的序列和poly2trellis()函数生成的网格图。
卷积码译码
vitdec()函数
函数作用:
使用Viterbi算法对矢量码进行解码。
函数原型:
decoded =vitdec(code,trellis,tblen,opmode,dectype);
函数参数:
decoded:输出的解码序列。解码中的每个符号由log2(trelli .numinputsymbols)位组成。
code:输入的待解码序列。代码包含一个或多个符号,
每个符号由log2(trelli .numoutputsymbols)位组成。
trellis:网格表,用来规定我们使用的卷积编码的规则
(比如几输入、几输出、几个寄存器)。用poly2trellis()函数描述。
tblen:指定回溯深度的正整数标量。如果代码率是1/2,
则tblen的典型值大约是代码约束长度的5倍。
opmode:译码器的工作模式及其对相应编码器工作的假设。如所示
'cont':假设编码器已在全零状态启动。解码器用最佳度量从状态回溯。此模式适用于
重复调用此函数并希望保持连续调用之间的连续性。
'term':假设编码器的开始和结束都处于全零状态。解码器从全零状态回溯,这种方式不
产生延时。当未编码的消息末尾有足够的零来填充编码器的所有内存寄存器时,此模式
是合适的。如果编码器有k个输入流和约束长度向量常量(使用编码器的多项式描述),“足
够”意味着k*max(约束-1)。
'trunc':假设编码器已在全零状态启动。解码器用最佳度量从状态回溯。这种方式不产生
延时。当您不能假设编码器以全零状态结束,并且不希望保持此函数的连续调用之间的
连续性时,此模式是合适的。
对于“term”和“trunc”模式,回溯深度(tblen)必须是正整数标量值,
不大于代码中输入符号的数量。
dectype:用于指明译码器的决策类型,并影响译码器在代码中所期望的数据类型。
选择如下所示。
'unquant':代码包含实际的输入值,其中1表示逻辑0,-1表示逻辑0。
'hard':代码包含二进制输入值
'soft':使用软判决译码
下面是一个213卷积码译码的示例
k = log2(trellis.numInputSymbols);
tblen=32;
x=zeros(1,2*tblen);
BPSK_REC_Data=[BPSK_REC_Data(:,1:end),x];
d = vitdec(BPSK_REC_Data,trellis,tblen,'cont','hard');
Decode_Data=d(tblen*k+1:end);
这里的tblen指维特比译码的回溯深度,一般是卷积码约束长度的五倍。matlab的译码的正确译码位置是从第二个回溯深度开始的,所以要给输入序列的末尾补上相应的0,然后去掉译码结果的第一个回溯深度的译码序列,就可以得到正确的译码结果。