poly2trellis
将卷积码多项式转换为网格描述
语法
描述
返回与转化率对应的格状结构描述K/N前馈编码器。K是到编码器的输入位流的数量,和N是输出连接的数量。格子
= poly2trellis (ConstraintLength
,CodeGenerator
)ConstraintLength
指定输入位流到编码器的延迟。CodeGenerator
指定到编码器的输入位流的输出连接。
poly2trellis函数接受卷积编码器的多项式描述,并返回相应的网格结构描述。的输入可以使用该输出convenc
和vitdec
功能。的掩码参数值也可以使用卷积编码器,维特比译码器,应用程序译码器块。
请注意
当与反馈多项式一起使用时,poly2trellis与网格的输入建立反馈连接。
返回与转化率对应的格状结构描述K/N编码器反馈。K是到编码器的输入位流的数量,和N是输出连接的数量。格子
= poly2trellis (ConstraintLength
,CodeGenerator
,FeedbackConnection
)ConstraintLength
指定输入位流到编码器的延迟。CodeGenerator
指定到编码器的输入位流的输出连接。FeedbackConnection
为每个K输入位流到编码器。
例子
使用网格结构的速率1/2前馈卷积编码器
使用网格结构来配置这个图中的速率1/2前馈卷积码。
创建一个网格结构,将约束长度设置为3,并将代码生成器指定为八进制值的向量。图中表示二进制值和多项式形式,表示最左边的位是最显著位(MSB)。二进制向量[1 1 0]表示八进制6,对应于图中二进制数字的上一行。二进制向量[1 1 1]表示八进制7,对应于图中二进制数字的下一行。这些二进制数字表示从寄存器的输出到图中的两个加器的连接。
Trellis = poly2trellis(3,[6 7])
格子=结构体字段:numInputSymbols: 2 numOutputSymbols: 4 numStates: 4 nextStates: [4x2 double] outputs: [4x2 double]
生成随机二进制数据。使用指定的网格结构,对数据进行卷积编码。通过使用具有指定网格结构的维特比算法解码编码数据,其回溯深度、截断操作模式和硬决策34。
Data = randi([0 1],70,1);codedData = convenc(数据、格子);tbdepth = 34;tbdepth decodedData = vitdec (codedData,格子,“trunc”,“硬”);
验证解码数据零误码。
decodedData biterr(数据)
ans = 0
3 /3前馈卷积编码器的网格结构
为一个速率为2/3的前馈卷积代码创建一个网格结构,并显示该网格的下一个状态的一部分。看到convenc
例如使用这个编码器。
图中显示了一个速率2/3的编码器,有两个输入流,三个输出流,七个移位寄存器。
创造一个格子结构。设置上路径的约束长度为5,下路径的约束长度为4。代码生成器矩阵的八进制表示对应于上移位寄存器和下移位寄存器的轻拍。
Trellis = poly2trellis([5 4],[23 35 0;0 5 13])
格子=结构体字段:numInputSymbols: 4 numOutputSymbols: 8 numStates: 128 nextStates: [128x4 double] outputs: [128x4 double]
结构领域numInputSymbols
等于4,因为两个比特流可以产生四个不同的输入符号。结构领域numOutputSymbols
等于8,因为三个位流会产生8个不同的输出符号。因为编码器共有7个移位寄存器,所以可能的状态数为
,如图所示nextStates
字段。
显示128 * 4的前5行trellis.nextStates
矩阵。
: trellis.nextStates (1:5)
ans =5×40 64 8 72 0 64 8 72 1 65 9 73 1 65 9 73 2 66 10 74
Rate 1/2 Feedback Convolutional Encoder使用Trellis Structure
创建一个格状结构来表示速率1/2系统卷积编码器,反馈如图所示。
这个编码器有5作为它的约束长度,[37 33]作为它的生成器多项式矩阵,37作为它的反馈连接多项式。
第一个生成器多项式是octal 37。第二个产生多项式是八进制33。反馈多项式是八进制37。第一个生成器多项式匹配反馈连接多项式,因为第一个输出对应系统位。
二进制向量[1 1 1 1 1]表示八进制37,对应于图中二进制数字的上一行。二进制向量[1 1 0 1 1]表示八进制33,对应于图中二进制数字的下一行。这些二进制数字表示从寄存器的输出到图中两个加器的连接。第一个1对应的是输入位。
方法将多项式转换为网格结构poly2trellis
函数。当与反馈多项式一起使用时,poly2trellis
建立到网格输入的反馈连接。
格架= poly2trellis(5,[37 33],37)
格子=结构体字段:numInputSymbols: 2 numOutputSymbols: 4 numStates: 16 nextStates: [16x2 double] outputs: [16x2 double]
生成随机二进制数据。使用指定的网格结构对数据进行卷积编码。通过使用具有指定网格结构的维特比算法解码编码数据,其回溯深度、截断操作模式和硬决策34。
Data = randi([0 1],70,1);codedData = convenc(数据、格子);tbdepth = 34;维特比解码器的%回溯深度tbdepth decodedData = vitdec (codedData,格子,“trunc”,“硬”);
验证解码数据零误码。
decodedData biterr(数据)
ans = 0
以多项式形式指定代码生成器
演示为网格结构指定代码生成器的其他形式是等价的。
使用网格结构来配置这个图中的速率1/2前馈卷积码。图中表示二进制值和多项式形式,表示最左边的位是最显著位(MSB)。
设置约束长度为4。使用多项式字符向量的单元格数组来指定代码生成器。有关更多信息,请参见通信工具箱中多项式的表示。在使用字符表示来指定代码生成器时,可以按升序或降序指定多项式,但是poly2trellis
函数总是按降序分配寄存器,最左边的寄存器用于MSB。
{trellis_poly = poly2trellis(4日“x3 + x”,‘x3 + x2 + 1’})
trellis_poly =结构体字段:numInputSymbols: 2 numOutputSymbols: 4 numStates: 8 nextStates: [8x2 double] outputs: [8x2 double]
二进制向量[1 0 1 0]表示八进制12,对应于图中二进制数字的上一行。二进制向量[1 1 0 1]表示八进制15,对应于图中二进制数字的下一行。使用八进制表示来指定等价格状结构的代码生成器。
Trellis = poly2trellis(4,[12 15])
格子=结构体字段:numInputSymbols: 2 numOutputSymbols: 4 numStates: 8 nextStates: [8x2 double] outputs: [8x2 double]
使用isequal
来确认两个格架是相等的。
trellis_poly isequal(格子)
ans =逻辑1
创建用户定义的网格结构
这个例子演示了为具有未编码位和反馈的卷积编码器创建非标准网格结构。不能使用创建编码器poly2trellis
,因为编码器的特殊规格与输入要求不匹配poly2trellis
。
您可以手动创建网格结构,然后将其用作编码器和解码器的输入网格结构。的卷积编码器和维特比译码器的块无编码位和反馈卷积编码器模型加载在这里创建的网格结构使用PreLoadFcn
回调。
卷积编码器
创建一个速率3/4卷积编码器,带有反馈连接,其MSB位保持未编码。
根据规范声明变量。
K = 3;N = 4;constraintLength = 4;
创建框架结构
格架由一个具有以下字段的结构表示:
numInputSymbols
-输入符号个数numOutputSymbols
-输出符号的数量numStates
-州的数量nextStates
-下一个状态矩阵输出
——输出矩阵
有关这些结构字段的更多信息,请参见istrellis
。
的任何先前发生的myTrellis
结构。
清晰的myTrellis;
定义网格结构字段。
myTrellis。numInputSymbols = 2 ^ K;myTrellis。numOutputSymbols = 2 ^ N;myTrellis。numStates=2^(constraintLength-1);
创建nextStates
矩阵
的nextStates
矩阵是一个[numStates
xnumInputSymbols
]矩阵。(我,我)元素的下一个状态矩阵是结果的最终状态索引,对应于从初始状态的转换我对于等于的输入j。
myTrellis。nextStates=[0 1 2 3 0 1 2 3;…6 7 4 5 6 7 4 5;…1 0 3 2 1 0 3 2;…7 6 5 4 7 6 5 4;…2 3 0 1 2 3 0 1;…4 5 6 7 4 5 6 7;…3 2 1 0 3 2 1 0;…5 4 7 6 5 4 7 6]
myTrellis =结构体字段:numInputSymbols: 8 numOutputSymbols: 16 numStates: 8 nextStates: [8x8 double]
情节nextStates
矩阵
使用commcnv_plotnextstates
辅助函数来绘制nextStates
矩阵,以说明给定输入的不同状态之间的分支转换。
commcnv_plotnextstates (myTrellis.nextStates);
创建输出
矩阵
的输出
矩阵是一个[numStates
xnumInputSymbols
]矩阵。(我,我)的元素是给定当前状态的八进制格式的输出符号我对于等于的输入j。
输出= [0 2 4 6 10 12 14 16;…13 5 7 11 13 15 17;…0 2 4 6 10 12 14 16;…13 5 7 11 13 15 17;…0 2 4 6 10 12 14 16;…13 5 7 11 13 15 17;…0 2 4 6 10 12 14 16;…13 5 7 11 13 15 17]
输出=8×80 2 4 6 10 12 14 16 13 5 7 11 13 15 17 0 2 4 6 10 12 14 16 13 5 7 11 13 15 17 0 2 4 6 10 12 14 16 13 5 7 11 13 15 17 0 2 4 6 10 12 14 16 13 5 7 11 13 15 17 0 2 4 6 10 12 14 16 0 2 4 6 10 12 14 16 13 5 7 11 11 13 15 16 13 5 7 11 13 15 17 17
使用oct2dec
以十进制格式显示这些值。
outputs_dec = oct2dec(输出)
outputs_dec =8×80 2 4 6 8 10 12 14 13 5 7 9 11 13 15 0 2 4 6 8 10 12 14 13 5 7 9 11 13 15 0 2 4 6 8 10 12 14 13 5 6 8 10 12 14 13 5 7 9 11 13 15 0 2 4 6 8 10 12 14 0 2 4 6 8 10 12 14 13 5 7 9 11 13 15 13 5 7 9 11 13 15
将输出矩阵复制到myTrellis
结构。
myTrellis。输出=输出
myTrellis =结构体字段:numInputSymbols: 8 numOutputSymbols: 16 numStates: 8 nextStates: [8x8 double] outputs: [8x8 double]
情节输出
矩阵
使用commcnv_plotoutputs
辅助函数来绘制输出
矩阵,根据输入符号说明给定状态下可能的输出符号。
commcnv_plotoutputs (myTrellis。输出,myTrellis。numOutputSymbols);
检查结果网格结构
istrellis (myTrellis)
ans =逻辑1
的返回值。1
确认网格结构是有效的。
实现不痒的决定解码
Decode的3位软决策分区,使接近0的值映射到0,接近1的值映射到7。如果你的应用程序需要更好的解码性能,细化分区以获得更精细的量化。
该示例对代码进行解码并计算误码率。当将解码后的数据与原始消息进行比较时,示例必须考虑到解码延迟。维特比译码器的连续操作模式导致的延迟等于回溯长度,所以味精(1)
对应于解码(tblen + 1)
而不是解码(1)
。
系统设置
初始化消息数据、网格、误码率计算和回溯长度的运行时变量。
流= RandStream.create (“mt19937ar”,“种子”, 94384);prevStream = RandStream.setGlobalStream(流);MSG = randi([0 1],4000,1);%随机数据格架= poly2trellis(7,[171 133]);%定义框架数量= 0 (3,1);%存储BER值tblen = 48;%回溯长度
创建一个AWGN通道系统对象™、一个Viterbi解码器系统对象和一个错误率计算器系统对象。对维特比译码器的回溯长度造成的接收延迟进行说明。
awgnChan = comm.AWGNChannel (“NoiseMethod”,“信噪比(SNR)”,“信噪比”6);vitDec = comm.ViterbiDecoder(格子,“InputFormat”,“软”,…“SoftInputWordLength”3,“TracebackDepth”tblen,“TerminationMethod”,“连续”);errorCalc = comm.ErrorRate (“ReceiveDelay”, tblen);
运行编码和解码
对消息进行卷积编码,通过AWGN滤波器传入,量化噪声消息进行软决策解码。使用使用生成的网格执行维特比解码poly2trellis
。
代码= convenc(味精,格子);awgnChan。SignalPower =(代码' *代码)/长度(代码);ncode = awgnChan(代码);
使用quantiz
将有噪声的数据值映射到0到7之间适当的决策值整数。中的第二个参数quantiz
是一个分区向量,确定哪些数据值映射到0、1、2等。
qcode = quantiz (ncode, (0.001, 0.1, 0.3, 0.5, 0.7, 0.9, 0.999]);解码= vitDec (qcode);
计算误码率。
数量= errorCalc(味精,解码);比率= 1 (1)
率= 0.0013
数量= 1 (2)
数量= 5
RandStream.setGlobalStream (prevStream);
输入参数
ConstraintLength
- - - - - -约束长度
行向量
限制长度,指定为1乘-K定义每个的延迟的行向量K输入位流到编码器。
数据类型:双
CodeGenerator
- - - - - -代码生成器
矩阵|字符向量的单元格数组|字符串数组
代码生成器,指定为K——- - - - - -N八进制矩阵,aK——- - - - - -N多项式字符向量的单元格数组,或一个K——- - - - - -N字符串数组。CodeGenerator
指定了N输出连接的每个K输入位流到编码器。
在使用字符表示来指定代码生成器时,可以按升序或降序指定多项式,但是poly2trellis
函数总是按降序分配寄存器,最左边的寄存器为最重要位(MSB)。有关更多信息,请参见以多项式形式指定代码生成器。
数据类型:双
|字符
|字符串
FeedbackConnection
- - - - - -反馈连接
行向量
反馈连接,指定为1 × -K八进制数的行向量,定义了每个的反馈连接K输入位流到编码器。
数据类型:双
输出参数
格子
——格子描述
结构
网格描述,作为带有这些字段的结构返回。有关该结构的更多信息,请参见istrellis
函数。
numInputSymbols
-输入符号的数量
标量
输入符号的数量,作为值为2的标量返回K。该值表示编码器和输入符号的数量K表示输入位流的个数。
numOutputSymbols
-输出符号的数量
标量
输出符号的数量,作为值为2的标量返回N。该值表示来自编码器和的输出符号的数量N表示输出位流的数量。
numStates
-州数
标量
编码器中的状态数,作为标量返回。
nextStates
——下一个状态
矩阵
当前状态和当前输入的所有组合的Next状态,返回为numStates
2K矩阵,K表示输入位流的个数。
输出
——输出
矩阵
当前状态和当前输入的所有组合的输出,作为a返回numStates
2K矩阵,K表示输入位流的个数。这个矩阵的元素是八进制数。
扩展功能
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
输入必须是常量,其中最多可以有3个(ConstraintLength
,CodeGenerator
,FeedbackConnection
)。
版本历史
之前介绍过的R2006a
MATLAB命令
你点击了对应这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令即可运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)获得最佳网站表现。其他MathWorks国家站点没有针对您所在位置的访问进行优化。