主要内容

comm.TurboDecoder

使用并行连接解码方案进行解码输入信号

描述

comm.TurboDecoderSystem object™使用并行级联解码方案来解码编码的输入信号。输入信号通常是基带解调操作的软判决输出。有关更多信息,请参见并行级联卷积译码方案

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

  1. 创造comm.TurboDecoder对象,并设置其属性。

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

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

创建

描述

turbodec= comm.TurboDecoder创建turbo解码器System对象。此对象使用无网格概率(APP)组成译码器对并行级联卷积编码的输入数据进行迭代解码。

例子

turbodec= comm.TurboDecoder (格子InterlvRindices.数量控件创建turbo解码器系统对象TrellisStructureInterleaverIndices,数量,分别。的格子输入必须按照所描述的输入指定输入TrellisStructure财产。的InterlvRindices.输入必须按照所描述的输入指定输入InterleaverIndices财产。的数量输入必须按照所描述的输入指定输入NumIterations财产。

例子

turbodec= comm.TurboDecoder (___的名字价值除了使用以前语法中的任何输入参数组合外,还使用一个或多个名称-值对设置属性。将每个属性名用引号括起来。例如,comm.TurboDecoder(“InterleaverIndicesSource”,输入端口)配置turbo译码器System对象,在调用System对象时,将交错器索引作为输入参数提供给它。

属性

全部展开

除非另有说明,属性是不可努力,这意味着在调用对象后无法更改其值。当您调用它们时,对象锁定释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

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

请注意

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

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

格子结构包含这些字段。

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

数据类型:双倍的

编码器输出的符号数,指定为等于2的整数N, 在哪里N输出位流的个数。

数据类型:双倍的

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

数据类型:双倍的

当前状态和当前输入的所有组合的下一个状态,指定为整数矩阵。矩阵大小必须为numStates-By-2K

数据类型:双倍的

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

数据类型:双倍的

数据类型:结构体

交织器指数的来源,指定为'财产'输入端口的

  • 当您将此属性设置为输入端口的时,对象使用输入参数执行InterlvRindices.当你调用对象时。矢量长度和交织索引和编码输入信号的值可以随着对对象的每次调用而改变。

  • 当您将此属性设置为'财产',对象使用您指定的交织索引执行InterleaverIndices属性。

数据类型:char|字符串

定义用于对输入到解码器的码字位进行置换的映射的交织索引,指定为整数列向量。向量必须是长度的l.向量的每个元素必须是范围[1,l并且必须是唯一的。l为解码输出消息的长度,decmsg.向量的每个元素必须是范围[1,l并且必须是唯一的。

依赖关系

要启用此属性,请设置InterleaverIndicesSource财产'财产'

数据类型:双倍的

输入指标的来源,指定为“汽车”'财产',或输入端口的

  • 当您将此属性设置为“汽车”,对象计算假设第二系统流被打孔的输入指数,并且所有尾位都包含在输入中。

  • 当您将此属性设置为'财产',对象使用您指定的输入索引InputIndices财产。

  • 当此属性设置为时输入端口的时,对象使用输入参数指定的输入索引执行inindices.输入索引的矢量长度和值和编码输入信号可以随着对象的每个调用而改变。

数据类型:char|字符串

输入索引用于完全编码数据上的位排序和插入,指定为整数列向量。此属性的长度必须等于输入数据向量的长度码字

依赖关系

要启用此属性,请设置InputIndicesSource财产'财产'

数据类型:双倍的

译码算法,指定为“真正的应用程序”'最大限度*',或“马克斯”.当您将此属性设置为“真正的应用程序”,该对象实现了真正的APP解码。当您将此属性设置为'最大限度*'“马克斯”,对象使用近似来提高计算速度。有关更多信息,请参见应用程序译码器

数据类型:char|字符串

缩放位的数目,指定为范围[0,8]的整数。此属性设置组成解码器用于缩放输入数据以避免在计算期间丢失精度的比特数。组成解码器将输入乘以2NumScalingBits将预输出除以相同的因子。有关更多信息,请参见应用程序译码器

依赖关系

启用此属性,设置算法财产'最大限度*'

数据类型:双倍的

解码迭代的数量,指定为正整数。此属性设置对对象的每个调用的解码迭代的数量。该对象迭代并提供未编码输出位的日志似然比(LLR)的更新。对象的输出是最终LLR更新的硬判决输出。

数据类型:双倍的

使用

描述

例子

decmsg= Turbodec(码字使用由栅格结构和交织索引指定的并行级联卷积译码方案对输入码字进行译码。turbodec返回二进制解码数据。有关更多信息,请参见并行级联卷积译码方案

例子

decmsg= Turbodec(码字InterlvRindices.另外指定交织器索引。要启用此语法,请设置InterleaverIndicesSource财产输入端口的.交错索引定义用于在解码器处对输入进行置换的映射。

decmsg= Turbodec(码字InterlvRindices.inindices另外指定在完全编码的数据上使用的位顺序和穿刺。要启用此语法,请设置InputIndicesSource财产输入端口的.输入指数矢量值必须相对于完全编码的数据,包括用于所有流的编码方案的尾位。

输入参数

全部展开

并行连接码字,指定为长度的列向量, 在哪里为并行级联码字的长度。

数据类型:双倍的|

交织索引,指定为整数的列向量。向量必须是长度的l, 在哪里l为解码输出信息的长度,decmsg.向量的每个元素必须是范围[1,l并且必须是唯一的。交错索引定义用于在解码器处排列输入位的映射。

可调:是的

依赖关系

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

数据类型:双倍的

输入索引用于完全编码数据上的位排序和插入,指定为整数列向量。长度inindices矢量必须等于输入数据向量的长度码字.元素的值inindices向量必须相对于完整编码的数据,包括所有流的编码方案的尾位。

依赖关系

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

数据类型:双倍的

输出参数

全部展开

解码消息,作为长度的二进制列向量返回l, 在哪里l是解码输出消息的长度。该输出信号与的数据类型相同码字输入。

对象的功能

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

发行版(obj)

全部展开

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

例子

全部折叠

属性定义输出索引OutputIndices属性用于turbo编码,并使用InputIndicesturbo解码的特性。显示全长穿刺式编码和解码速率1/2码和10位块长度。

初始化参数

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

Blklen = 10;格子= Poly2trellis(4,[13 15],13);n = log2(trellis.numoutputsymbols);mlen = log2(trellis.numstates);

全长编码和解码

初始化变量和turbo编码和解码系统对象的全长编码。Turbo对信息进行编码和解码。显示turbo编码速率。检查编码输出的长度与输出索引向量的长度。

fullOut = (1: (mLen + blkLen) * 2 * n) ';outLen =长度(fullOut);netRate = blkLen / outLen;数据= randi([0 1],blkLen,1);intIndices = randperm (blkLen);turboEnc = comm.TurboEncoder (“TrellisStructure”格子);turboEnc。InterleaverIndices = intIndices;turboEnc。OutputIndicesSource ='财产';turboEnc。OutputIndices = fullOut;turboDec = comm.TurboDecoder (“TrellisStructure”格子);turboDec。InterleaverIndices = intIndices;turboDec。InputIndicesSource ='财产';turboDec。InputIndices = fullOut;encMsg = turboEnc(数据);%编码disp ([Turbo编码率:num2str (netRate)))
涡轮编码率:0.19231
encOutLen =长度(encMsg)%显示编码长度
encOutLen = 52
isequal (encOutLen outLen)%检查长度
ans =逻辑1
RXMSG = Turbodec(2 * EncMSG-1);%解码Isequal(数据,RXMSG)%比较位与解码位
ans =逻辑1

穿孔编码和解码

指定通过使用使用的用于打孔第二系统流的输出索引getTurboIOIndices函数。初始化变量和turbo编码和解码系统对象用于穿刺编码。Turbo对信息进行编码和解码。显示turbo编码速率。检查编码输出的长度与输出索引向量的长度。

puncOut = getTurboIOIndices (blkLen n mLen);outLen =长度(puncOut);netRate = blkLen / outLen;数据= randi([0 1],blkLen,1);intIndices = randperm (blkLen);turboEnc = comm.TurboEncoder (“TrellisStructure”格子);turboEnc。InterleaverIndices = intIndices;turboEnc。OutputIndicesSource ='财产';turboenc.outputindices =邮政;turboDec = comm.TurboDecoder (“TrellisStructure”格子);turboDec。InterleaverIndices = intIndices;turboDec。InputIndicesSource ='财产';turboDec。InputIndices = puncOut;encMsg = turboEnc(数据);%编码disp ([Turbo编码率:num2str (netRate)))
Turbo编码率:0.25641
encOutLen =长度(encMsg)%显示编码长度
encOutLen = 39
isequal (encOutLen outLen)%检查长度
ans =逻辑1
RXMSG = Turbodec(2 * EncMSG-1);%解码Isequal(数据,RXMSG)%比较位与解码位
ans =逻辑1

比较完整输出和穿孔输出

编码器的输出使单个的位流交错。从全长代码中删除每个4位元组的第三位,以生成穿孔代码。第三个输出位流对应于第二个系统位流。显示全长代码的索引和插入代码的索引,以显示每个4位元组的第三位被插入。

fullOut”
ans =1×52.12 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×391 2 4 5 6 8 9 10 12 13 14 16 17 18 20 21 24 25 26 26 22 32 32 32 32 37 37 32 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 40 52 50 52

通过使用Turbo编码和解码来模拟AWGN通道上的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);每符号能量与噪音功率谱密度之比,以分贝计L = 256;%输入数据包长度,单位为比特Trellis = 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); / /DB中的噪声比率%noiseVar = 1. / (10 ^ (snrdB / 10));%噪声方差rng默认的

生成随机交织器指数。

intrlvrIndices = randperm (L);

创建一个turbo编码器和解码器对。使用定义的网格结构和随机交织指标。将解码器配置为最多运行4次迭代。

intrlvrIndices turboenc = comm.TurboEncoder(格子);turbodec = comm.TurboDecoder(格子,intrlvrIndices numiter);

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

bpskmod = comm.BPSKModulator;bpskdemod = comm.BPSKDemodulator (“DecisionMethod”的“对数似然比...“方差”, noiseVar);

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

awgnchan = comm.AWGNChannel (“NoiseMethod”“方差”“方差”, noiseVar);errrate = comm.errrate;

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

  1. 生成二进制数据。

  2. Turbo对数据进行编码。

  3. 调制编码数据。

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

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

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

  7. 计算错误统计。

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

显示错误数据。

流('误码率=%5.2e \ nnumber的错误=%d \ ntotal bits =%d \ n'errorStats)
误码率= 2.34e-04错误数= 6位总位数= 25600

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

初始化模拟

设置调制顺序和范围 E b / N 0 价值观。计算每个符号的比特数和每个符号的能量到噪声比( E 年代 / N 0 )的调制顺序和 E b / N 0 .为了获得可重复的结果,种子随机数。

modOrder = 16;%调制顺序个基点= log2 (modOrder);每符号%位EBNO =(2:0.5:4);%每比特能量与噪声功率谱密度比,单位为dBEsNo = EbNo + 10*log10(bps);每符号能量与噪音功率谱密度之比,以分贝计rng (1963);

创建一个turbo编码器和解码器对。由于数据包长度随每帧而变化,因此在执行时指定由System对象的输入参数提供交织器索引。指定解码器执行四次迭代。

turboEnc = comm.TurboEncoder ('interleaverindicessource'输入端口的);turboDec = comm.TurboDecoder ('interleaverindicessource'输入端口的'numiteration'4);Trellis = poly2trellis(4,[13 15 17],13);n = log2 (turboEnc.TrellisStructure.numOutputSymbols);numTails = log2 (turboEnc.TrellisStructure.numStates) * n;

创建错误率对象。

errRate = comm.ErrorRate;

主要处理循环

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

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

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

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

  4. 生成分界指标。

  5. Turbo对数据进行编码。

  6. 采用16-QAM调制,并对平均信号功率进行归一化。

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

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

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

  10. 计算错误统计。

1 = 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(速率);DB中的噪声比率%noiseVar = 1. / (10 ^ (snrdB / 10));%噪声方差errorStats(2) < 100 && errorStats(3) < 1e7 data = randi([0 1],L,1);intrlvrIndices = randperm (L);encodedData = turboEnc(数据、intrlvrIndices);modSignal = qammod (encodedData modOrder,...“InputType”'少量''onemaveragepower',真的);rxsignal = awgn(modsignal,snrdb);emodsignal = qamdemod(rxsignal,modorder,“OutputType”“llr”...'onemaveragepower',真的,“NoiseVariance”, noiseVar);rxBits = turboDec (-demodSignal intrlvrIndices);%被解调的信号被否定errorstats =错误(数据,rxbits);结束%保存误码率数据并重置误码率对象BER(k)= errorstats(1);重置(错误)结束

阴谋的结果

图的误码率和比较它与未编码的误码率。

semilogy (EbNo误码率,“o”)网格包含(“Eb /不(dB)”) ylabel ('误码率')Uncodedber = Berawgn(EBNO,“qam”,modorder);%未编码误码率估计值持有semilogy (EbNo uncodedBER)传说(“涡轮”的未编码的“位置”“西南”

图包含轴。轴包含2个类型的型号。这些物体代表涡轮增压器,未编码。

更多关于

全部展开

参考

[1]贝内代托,S., G.蒙托西,D. Divsalar和F. Pollara。用于译码并行和串行级联码的软输入软输出最大后验(MAP)模块。喷气推进实验室TDA进展报告, 42-127,(1996年11月)。

[2]卷积码MAP译码器的直观论证和简化实现。IEEE通信选定领域期刊16日,没有。2(1998年2月):260-64。https://doi.org/10.1109/49.661114。

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

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

[5]3 gpp TS 36.212。"多路复用和信道编码"第三代合作伙伴计划;技术规范集团无线电接入网络;进化的通用地面无线电接入(E-UTRA)https://www.3gpp.org

扩展功能

介绍了R2012a