matlab有关卷积码编译码的函数

卷积码编码

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,然后去掉译码结果的第一个回溯深度的译码序列,就可以得到正确的译码结果。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值