主要内容

comm.TurboEncoder

使用并行级联编码方案对输入信号进行编码

描述

comm.TurboEncoder系统对象™对二进制输入消息应用并行级联编码方案。该编码方案使用两个卷积编码器,并在编码后的数据位流的末尾追加终止位。有关更多信息,请参见并行级联卷积编码方案

使用并行级联编码方案对二进制输入消息编码:

  1. 创建comm.TurboEncoder对象并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

有关系统对象如何工作的详细信息,请参见什么是系统对象?

创建

描述

例子

turboenc= comm.TurboEncoder创建一个涡轮编码器系统对象。该对象使用默认对象配置执行turbo编码。

例子

turboenc= comm.TurboEncoder (的名字价值使用一个或多个名称-值对设置属性。例如,comm.TurboEncoder(“InterleaverIndicesSource”,输入端口)配置一个涡轮编码器系统对象,其中交织器索引在被调用时作为输入参数提供给系统对象。将每个属性名用引号括起来。

例子

turboenc= comm.TurboEncoder (格子interlvrindices属性创建涡轮编码器系统对象TrellisStructure而且InterleaverIndices属性设置为格子而且interlvrindices,分别。的格子类型所描述的输入必须指定TrellisStructure财产。的interlvrindices类型所描述的输入必须指定InterleaverIndices财产。

属性

全部展开

除非另有说明,属性为nontunable,这意味着在调用对象后不能更改它们的值。对象在调用时锁定,而释放功能解锁它们。

如果属性为可调,您可以随时更改其值。

有关更改属性值的详细信息,请参见使用系统对象的MATLAB系统设计

构成卷积码的网格描述,指定为包含速率的网格描述的结构KN代码。K输入比特流的个数,和N输出比特流的数量。

请注意

K涡轮编码器必须为1。有关更多信息,请参见编码率

你可以使用poly2trellis函数来创建网格结构或手动创建它。有关此结构的更多信息,请参见卷积码的网格描述istrellis函数。

网格结构包含这些字段。

输入到编码器的符号数,指定为等于2的整数K,在那里K输入比特流的个数。

数据类型:

编码器输出的符号数,指定为等于2的整数N,在那里N输出比特流的数量。

数据类型:

编码器中的状态数,指定为2的幂。

数据类型:

当前状态和当前输入的所有组合的Next状态,指定为整数矩阵。矩阵大小必须为numStates2K

数据类型:

当前状态和当前输入的所有组合的输出,指定为八进制矩阵。矩阵大小必须为numStates2K

数据类型:

数据类型:结构体

交叉器索引的源,指定为“属性”输入端口的

  • 当您将此属性设置为“属性”属性指定的交织器索引执行InterleaverIndices属性。

  • 当您将此属性设置为输入端口的,对象使用input参数执行interlvrindices当你调用对象时。交错索引和二进制输入消息的向量长度和值可以随着对对象的每次调用而改变。

数据类型:字符|字符串

交叉索引,指定为整数列向量。向量必须是长度l,在那里l二进制输入消息的长度。向量的每个元素必须是范围[1,l并且必须是唯一的。交织器索引定义了用于在编码器上排列输入位的映射。

可调:是的

依赖关系

属性可启用此属性InterleaverIndicesSource财产“属性”

数据类型:

输出索引的来源,指定为“汽车”“属性”,或输入端口的

  • 当您将此属性设置为“汽车”时,该对象计算输出指标,这些指标穿透第二个系统流并包括所有尾部位。

  • 当您将此属性设置为“属性”属性指定的输出索引时,对象使用OutputIndices财产。

  • 当您将此属性设置为输入端口的,该对象使用输入参数指定的输出索引执行outindices.输出索引的向量长度和值,以及编码的输出信号可以随着对对象的每次调用而改变。

数据类型:字符|字符串

用于完全编码的数据的位排序和刺穿的输出索引,指定为整数列向量。编码器输出的比特数等于此属性的长度。的最大编码长度不能超过(l+mLenN× 2,其中l为输入块长度,mLen是内存长度,和N组成编码器的已编码流的数目。

依赖关系

属性可启用此属性OutputIndicesSource财产“属性”

数据类型:

使用

描述

例子

码字= turboenc (消息使用网格结构和交织索引指定的并行级联卷积编码方案对输入消息进行编码。turboenc返回二进制编码的码字。消息而且码字是字长为1 (fi(定点设计师)对象)。有关更多信息,请参见并行级联卷积编码方案

例子

码字= turboenc (消息interlvrindices另外指定交织器索引。interlvrindices必须为列向量,包含范围为[1,l],没有重复值。l是二进制输入消息的长度,消息.类型时应用此语法InterleaverIndicesSource属性设置为输入端口的.交织器索引定义了用于在编码器上排列输入位的映射。

码字= turboenc (消息interlvrindicesoutindices另外指定对消息数据进行编码时使用的位排序和刺穿。要启用此语法,请设置OutputIndicesSource财产输入端口的.输出索引向量值必须相对于编码方案的完全编码数据,包括所有流的尾部位。

输入参数

全部展开

输入消息,指定为长度的二进制列向量l,在那里l未编码的输入消息的长度。

数据类型:|int8|fi(数据、0、1)

交叉索引,指定为整数列向量。向量必须是长度l,在那里l二进制输入消息的长度。向量的每个元素必须是范围[1,l并且必须是唯一的。交织器索引定义了用于在编码器上排列输入位的映射。

依赖关系

要启用此参数,请设置InterleaverIndicesSource财产输入端口的

数据类型:

用于完全编码的数据的位排序和刺穿的输出索引,指定为整数列向量。元素的值。outindices矢量必须相对于编码方案的完全编码数据,包括所有流的尾部位。

依赖关系

要启用此参数,请设置OutputIndicesSource财产输入端口的

数据类型:

输出参数

全部展开

并行连接码字,作为长度的二进制列向量返回,在那里并行连接码字中的位数。类的数据类型继承消息输入。

数据类型:|int8|fi(数据、0、1)

对象的功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,释放system对象的系统资源obj,使用这种语法:

发行版(obj)

全部展开

一步 运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 重置的内部状态系统对象

例子

全部折叠

通过使用带有默认网格结构的速率1/3的涡轮编码器配置来编码输入消息,poly2trellis (4 15 [13], 13),如图所示。

对于64位的输入消息,编码器输出的码字为204位。前192位输出对应于三个64位流,交错为 X k Z k , Z k .系统比特流, X k ,奇偶校验位流, Z k ,分别来自第一个编码器和奇偶校验位流, Z k ,是来自第二个编码器。当开关在较低的位置时,信号遵循虚线,最后12位对应于来自两个编码器的尾部位。第一组6位(3个系统位和3个奇偶校验位)是来自第一个组成编码器的输出尾位。第二组6位(3个系统位和3个奇偶校验位)是来自第二个组成编码器的输出尾位。

使用默认设置创建一个涡轮编码器。生成一帧二进制消息数据,然后对消息数据进行编码。

rng默认的turboenc = com . turboencoder;frameLen = 64;帧长%data = randi([0 1],frameLen,1);encData = turboenc(数据);codewordLen = length(encData);

计算编码率。由于尾位的存在,编码器输出码率略低于1/3。

codingrate = frameLen/codewordLen
Codingrate = 0.3137

属性定义输出索引OutputIndices财产。显示完整长度编码输出和穿孔编码输出的速率1/2码和10位块长度。

初始化参数

定义参数来初始化编码器。

blkLen = 10;格子= poly2trellis(4,[13 15],13);n = log2(trellis.numOutputSymbols);mLen = log2(trellis.numStates);

全长编码输出

初始化变量和一个涡轮编码器系统对象以进行全长编码。显示turbo码率。检查编码输出的长度与输出索引向量的长度。

fullOut = (1:(mLen+blkLen)*2*n)';outLen = length(fullOut);中性= blkLen/outLen;data = randi([0 1],blkLen,1);intIndices = randperm(blkLen);turboEnc = com . turboencoder (“TrellisStructure”格子);turboEnc。InterleaverIndices = intIndices;turboEnc。OutputIndicesSource =“属性”;turboEnc。OutputIndices = fullOut;encMsg = turboEnc(data);%编码disp (['Turbo码率:'num2str (netRate)))
Turbo码率:0.19231
encOutLen = length(encMsg)显示编码长度
encOutLen = 52
isequal (encOutLen outLen)检查长度%
ans =逻辑1

穿孔编码输出

属性指定用于第二个系统流的刺穿的输出指标getTurboIOIndices函数。初始化变量和涡轮编码器系统对象,用于穿孔编码。显示turbo码率。检查编码输出的长度与输出索引向量的长度。

punout = getTurboIOIndices(blkLen,n,mLen);outLen = length(puncOut);中性= blkLen/outLen;data = randi([0 1],blkLen,1);intIndices = randperm(blkLen);turboEnc = com . turboencoder (“TrellisStructure”格子);turboEnc。InterleaverIndices = intIndices;turboEnc。OutputIndicesSource =“属性”;turboEnc。OutputIndices = puncOut;encMsg = turboEnc(data);%编码disp (['Turbo码率:'num2str (netRate)))
Turbo码率:0.25641
encOutLen = length(encMsg)显示编码长度
encOutLen = 39
isequal (encOutLen outLen)检查长度%
ans =逻辑1

比较完整输出和穿孔输出

编码器的输出使各个比特流相互交错。每个4位元组的第三位从全长代码中移除,以产生穿孔代码。这第三个输出位流对应于第二个系统位流。显示全长代码的索引和被刺穿代码的索引,以显示每个4位元组的第三位被刺穿。

fullOut”
ans =1×5212 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
puncOut”
ans =1×3912 45 6 8 9 10 12 13 14 16 17 18 20 21 22 24 25 26 28 29 30 32 33 34 36 37 38 40 41 42 44 45 46 48 49 50 52

在AWGN信道上使用turbo编码和解码模拟BPSK数据的传输和接收。

指定仿真参数,然后计算有效编码率和噪声方差。对于BPSK调制, E 年代 / N 0 = E b / N 0 因为每个符号的比特数(bps)是1。为了便于在其他调制方案中重用此代码,本例中的计算包括bps项。定义数据包长度、网格结构和迭代次数。计算噪声方差 E 年代 / N 0 还有编码率。将随机数生成器设置为默认状态,以确保结果可重复。

modOrd = 2;调制阶数bps = log2(modOrd);每个符号的比特数%EbNo = 1;%每比特能量与噪声功率谱密度之比,单位为dBEsNo = EbNo + 10*log10(bps);%每个符号能量与噪声功率谱密度之比,单位为dBL = 256;输入数据包长度(以比特为单位)格子= poly2trellis(4,[13 15 17],13);Numiter = 4;n = log2(trellis.numOutputSymbols);numTails = log2(trellis.numStates)*n;M = L*(2*n - 1) + 2*numTails;%输出码字包长度利率= L/M;编码率snrdB = EsNo + 10*log10(rate);%信噪比,单位:dBnoiseVar = 1./(10.^(snrdB/10));%噪声方差rng默认的

生成随机交织索引。

intrlvrIndices = randperm(L);

创建一个涡轮编码器和解码器对。使用定义的网格结构和随机交织索引。将解码器配置为最多运行四次迭代。

turboenc = com . turboencoder(网格,intrlvrIndices);turbodec = com . turbodecoder(格子,intrlvrIndices,numiter);

创建一个BPSK调制器和解调器对,其中解调器输出使用LLR方法确定的软位。

bpskmod = com . bpskmodulator;bpskdemod = com . bpskdemo解调器(“DecisionMethod”的“对数似然比...“方差”, noiseVar);

创建一个AWGN通道对象和一个错误率对象。

awgnchan = com . awgnchannel (“NoiseMethod”“方差”“方差”, noiseVar);errrate = com . errorrate;

主处理循环执行这些步骤。

  1. 生成二进制数据。

  2. Turbo编码数据。

  3. 调制编码的数据。

  4. 将调制信号通过AWGN信道传递。

  5. 利用LLR对噪声信号进行解调,输出软位。

  6. Turbo解码解调数据。由于解调器的位映射与涡轮解码器所期望的位映射相反,解码器输入必须使用解调信号的逆。

  7. 计算错误统计信息。

frmIdx = 1:100 data = randi([0 1],L,1);encodedData = turboenc(data);modSignal = bpskmod(encodedData);receivedSignal = awgnchan(modSignal);demodSignal = bpskdemod(receivedSignal);receivedBits = turbodec(-demodSignal);errorStats = errrate(数据,receivedBits);结束

显示错误数据。

流('误码率= %5.2e\n错误数= %d\n总比特数= %d\n'errorStats)
误码率= 2.34e-04误码率= 6总比特数= 25600

在AWGN信道中使用16-QAM信号和turbo码模拟端到端通信链路。在帧处理循环中,数据包大小随机选择为500、1000或1500位。由于数据包大小不同,交织器索引被提供给涡轮编码器和解码器,作为它们关联的System对象的输入参数。比较turbo编码误码率结果与非编码误码率结果。

初始化模拟

的调制顺序和调制范围 E b / N 0 值。计算每个符号的比特数和每个符号的能量与噪声比( E 年代 / N 0 ),根据调制顺序和 E b / N 0 .要获得可重复的结果,请输入随机数。

modOrder = 16;调制阶数bps = log2(modOrder);每个符号的比特数%EbNo = (2:0.5:4);%每比特能量与噪声功率谱密度之比,单位为dBEsNo = EbNo + 10*log10(bps);%每个符号能量与噪声功率谱密度之比,单位为dBrng (1963);

创建一个涡轮编码器和解码器对。因为每个帧的包长度不同,所以指定交织器索引在执行时由System对象的输入参数提供。指定解码器执行四次迭代。

turboEnc = com . turboencoder (“InterleaverIndicesSource”输入端口的);turboDec = com . turbodecoder (“InterleaverIndicesSource”输入端口的“NumIterations”4);格子= poly2trellis(4,[13 15 17],13);n = log2(turboEnc.TrellisStructure.numOutputSymbols);numTails = log2(turboencc . trellisstructure . numstates)*n;

创建一个错误率对象。

errRate = com . errorrate;

主要处理回路

帧处理循环执行这些步骤。

  1. 随机选择数据包长度,生成随机二进制数据。

  2. 计算输出码字长度和编码率。

  3. 计算信噪比(SNR)和噪声方差。

  4. 生成交织索引。

  5. Turbo编码数据。

  6. 应用16-QAM调制,将信号平均功率归一化。

  7. 将调制信号通过AWGN信道传递。

  8. 采用LLR方法对噪声信号进行解调,输出软位,归一化平均信号功率。

  9. Turbo解码数据。由于解调器的位映射顺序与turbo解码器预期的映射顺序相反,解码器输入必须使用解调信号的逆。

  10. 计算错误统计信息。

ber = 0(1,长度(EbNo));k = 1:长度(EbNo)% numFrames = 100;errorStats = 0 (1,3);%for pktIdx = 1:numFramesL = 500*randi([1 3],1,1);%数据包长度(以比特为单位)M = L*(2*n - 1) + 2*numTails;%输出码字包长度利率= L/M;%当前包的编码率snrdB = EsNo(k) + 10*log10(rate);%信噪比,单位:dBnoiseVar = 1./(10.^(snrdB/10));%噪声方差errorStats(2) < 100 && errorStats(3) < 1e7 data = randi([1],L,1);intrlvrIndices = randperm(L);encodedData = turboEnc(data,intrlvrIndices);modSignal = qammod(encodedData,modOrder,...“InputType”“一点”“UnitAveragePower”,真正的);rxSignal = awgn(modSignal,snrdB);demodSignal = qamdemod(rxSignal,modOrder,“OutputType”“llr”...“UnitAveragePower”,真的,“NoiseVariance”, noiseVar);rxBits = turboDec(-demodSignal,intrlvrIndices);解调信号被否定errorStats = errRate(数据,rxBits);结束保存误码率数据并重置误码率对象ber(k) = errorStats(1);重置(errRate)结束

阴谋的结果

绘制误码率并将其与未编码的误码率进行比较。

semilogy (EbNo误码率,“o”grid xlabel(“Eb /不(dB)”) ylabel (“误码率”) uncodedBER = berawgn(EbNo,“qam”, modOrder);%估计的未编码误码率持有semilogy (EbNo uncodedBER)传说(“涡轮”的未编码的“位置”“西南”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象代表Turbo, Uncoded。

更多关于

全部展开

参考文献

[1]贝鲁,C., A. Glavieux和P. Thitimajshima。接近香农极限的纠错编码和解码:涡轮码第93届IEEE国际通信会议论文集, 1993年5月,瑞士日内瓦,1064-70。https://doi.org/10.1109/icc.1993.397441。

[2]贝内代托,S. G.蒙托西,D.迪萨拉和F.波拉拉。一个软输入软输出最大后验(MAP)模块来解码并行和串行级联码。喷气推进实验室TDA进展报告, 42-127(1996年11月)。

[3]施莱格尔,克里斯蒂安和兰斯·佩雷斯。网格和Turbo编码.IEEE数字与移动通信丛书。皮斯卡塔韦,新泽西 ;霍博肯,新泽西州:IEEE出版社 ;Wiley-Interscience, 2004年。

[4]3gpp ts 36.212。“多路复用和信道编码。”第三代伙伴计划;技术规范集团无线接入网;改进通用地面无线电接达(E-UTRA)https://www.3gpp.org

扩展功能

版本历史

在R2012a中引入