ploy2trellis函数有两种调用形式
trellis=poly2trellis(ConstraintLength,CodeGenerator);
trellis=poly2trellis(ConstraintLength,CodeGenerator,...FeedbackConnection)
后者应用于有负反馈的情形
ploy2treliis 顾名思义:多项式ploy到网格图trellis
卷积码的生成多项式可以由一系列多项式描述,我们将多项式转化为trellis结构,这种结构又可以作为matalb中线形卷积编码函数convenc和或者其解码(如Viterbi解码函数vitdec)的输入。
考虑如下卷积码生成图
(3,2,4)卷积码,2进3出,记忆长度(约束长度)L=max{4,3}+1=5
输入数据共两个对应两行寄存器,第一行有4个移位寄存器,第二行3个,分别对应约束长度(4+1,3+1)=(5,4)。那么ConstraintLength就应该是[5,4]。
第一位输出由第一行寄存器的“贡献”(生成序列)为(10,011)=23
第二位输出由第一行寄存器的“贡献”(生成序列)为(11,101)=35
第三位输出由第一行寄存器的“贡献”(生成序列)为(00,000)=0
第一位输出由第二行寄存器的“贡献”(生成序列)为( 0,000)=0
第二位输出由第二行寄存器的“贡献”(生成序列)为( 0,101)=5
第三位输出由第二行寄存器的“贡献”(生成序列)为( 1,011)=13
那么CodeGenerator就是[23,35,0;0,5,13]
运行
trellis=poly2trellis([5,4],[23,35,0;0,05,13])
输出如下
trellis =
包含以下字段的 struct:
numInputSymbols: 4
numOutputSymbols: 8
numStates: 128
nextStates: [128×4 double]
outputs: [128×4 double]
numInputSymbols: 4 输入状态数
表示两路输入共有4(2^k k为输入的路数)种状态分别为00,01,10,11
numOutputSymbols: 8 输出状态数
表示输出共有8(2^n n为输出的路数)种状态分别为000,001,010,011,100,101,110,111
numStates: 128 寄存器状态数
当前状态数是128(2^7,7是寄存器的总个数) 状态是7为二进制数
nextStates: [128x4 double] 下一个状态
nextState是numStates-by-2k的矩阵。他表示所有当前状态和当前输入组合所产生的下一状态。相当于马尔科夫链的状态转移表。
行表示各种不同的当前状态,依次表示从全0状态到全1状态。
列表示各种不同的输入,依次表示从全0到全1的输入。
outputs: [128x4 double] 输出
outputs也是numStates-by-2k的矩阵。他表示所有当前状态和当前输入组合所产生的输出(8进制表示)。
行和列的意义的nextState相同。
>> trellis.nextStates(1:5,:)
ans =
0 64 8 72
0 64 8 72
1 65 9 73
1 65 9 73
2 66 10 74
上面我们列出了nextStates的1-5行
(1,1)的元素表示在全0状态(0000000)时,输入00时的下一个状态还是全0(0000000),即所有的寄存器的结果还都是0.
(1,2)的元素表示在全0状态(0000000)时,输入01时的下一个状态是64(1000000)
……
(2,1)的元素表示在1状态(0000001)时,输入为00时的下一个状态时全0(0000000)
……
同理,记忆长度(约束长度)L=4+1=5,生成
第一位输出由寄存器的“贡献”(生成序列)为(11,111)=37
第二位输出由寄存器的“贡献”(生成序列)为(11,011)=33
那么CodeGenerator就是[37,33]
负反馈多项式为为(11,111)=37
或者可以这样想,真是一个系统反馈卷积码(RSC)生成多项式矩阵为G(D)=[1 (1+D+D3+D4 )/(1+D+D2+D3+D4)] 即[ 1 33/37 ]的RSC
运行
trellis = poly2trellis(5,[37 33],37)
trellis = struct with fields:
numInputSymbols: 2
numOutputSymbols: 4
numStates: 16
nextStates: [16x2 double]
outputs: [16x2 double]
结构体中的变量含义与第一节一致。
得到trellis结构后就可以利用它来编码了,输入如下语句
%编码部分
data = randi([0 1],70,1);%产生一段二进制信息序列
code_data=convenc(data,trellis);%trellis是我们在一或二节产生的网格图,得到卷积码
%译码部分
tbdepth = 34; % 维特比解码器的回溯深度
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');
%验证解码数据是否有错误。
numOfErrorBit=biterr(data,decodedData)
参考:
【1】线性卷积编码的线形移位寄存器poly2trellis的解释
【2】关于trellis结构的解释
【3】matlab实现卷积编码’适合小白理解学习’
【4】matlab官方ploy2trellis函数文档
如有错误望大佬们不吝赐教