主要内容

comm.TurboDecoder

采用并行级联译码方案对输入信号进行解码

描述

comm.TurboDecoder系统对象™使用并行连接解码方案来解码编码的输入信号。输入信号通常是来自基带解调操作的软决策输出。有关更多信息,请参见并行级联卷积译码方案

译码:用并行串接译码方案译码输入信号:

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

  2. 调用带有参数的对象,就像调用函数一样。

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

创建

描述

turbodec= comm.TurboDecoder创建一个涡轮译码器系统对象。该对象使用无网格概率(APP)成分解码器迭代解码并行级联卷积编码的输入数据。

例子

turbodec= comm.TurboDecoder (格子interlvrindicesnumiter方法创建一个涡轮译码器系统对象TrellisStructureInterleaverIndices,numiter,分别。的格子控件所描述的方式指定输入TrellisStructure财产。的interlvrindices控件所描述的方式指定输入InterleaverIndices财产。的numiter控件所描述的方式指定输入NumIterations财产。

例子

turbodec= comm.TurboDecoder (___的名字价值使用一个或多个名称-值对以及来自前面语法的任何输入参数组合设置属性。将每个属性名用引号括起来。例如,comm.TurboDecoder(“InterleaverIndicesSource”,输入端口)配置一个涡轮译码器系统对象,其中包含在调用系统对象时作为输入参数提供的交织器索引。

属性

全部展开

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

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

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

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

请注意

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

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

网格结构包含了这些区域。

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

数据类型:结构体

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

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

  • 当您将此属性设置为“属性”方法指定的交织器索引执行该对象InterleaverIndices属性在配置对象时。

数据类型:字符|字符串

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

依赖关系

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

数据类型:

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

  • 当您将此属性设置为“汽车”,该对象计算输入索引,假设第二个系统流被戳穿并且所有尾部位都包含在输入中。

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

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

数据类型:字符|字符串

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

依赖关系

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

数据类型:

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

数据类型:字符|字符串

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

依赖关系

启用此属性,设置算法财产“马克斯*”

数据类型:

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

数据类型:

使用

描述

例子

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

例子

decmsg= turbodec (码字interlvrindices另外,指定交织器索引。要启用此语法,请设置InterleaverIndicesSource财产输入端口的.交织器索引定义用于在解码器上排列输入的映射。

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

输入参数

全部展开

并行连接码字,指定为长度的列向量,在那里是并行连接码字的长度。

数据类型:|

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

可调:是的

依赖关系

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

数据类型:

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

依赖关系

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

数据类型:

输出参数

全部展开

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

对象的功能

要使用对象函数,请将System对象指定为第一个输入参数。例如,释放名为obj,使用以下语法:

发行版(obj)

全部展开

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

例子

全部折叠

方法定义输出索引OutputIndices属性来定义输入索引InputIndices属性用于turbo解码。显示速率为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);中性= blkLen/outLen;data = randi([0 1],blkLen,1);intIndices = randperm(blkLen);turboencoder = comm.TurboEncoder(“TrellisStructure”格子);turboEnc。interleaverindexes = intIndices;turboEnc。OutputIndicesSource =“属性”;turboEnc。OutputIndices = fullOut;turboDec = comm.TurboDecoder(“TrellisStructure”格子);turboDec。interleaverindexes = intIndices;turboDec。InputIndicesSource =“属性”;turboDec。InputIndices = fullOut;encMsg = turboEnc(data);%编码disp (['Turbo编码率:'num2str (netRate)))
Turbo编码率:0.19231
encOutLen = length(encMsg)%显示编码长度
encOutLen = 52
isequal (encOutLen outLen)%检查长度
ans =逻辑1
rxMsg = turboDec(2*encMsg-1);%解码rxMsg isequal(数据)比较位与已解码位
ans =逻辑1

被戳穿的编码和解码

方法指定第二个系统流的穿孔输出指标getTurboIOIndices函数。初始化变量和turbo编码和解码用于穿孔编码的系统对象。Turbo编码和解码消息。显示turbo码率。检查编码输出的长度与输出索引向量的长度。

pingout = getTurboIOIndices(blkLen,n,mLen);outLen =长度(穿孔);中性= blkLen/outLen;data = randi([0 1],blkLen,1);intIndices = randperm(blkLen);turboencoder = comm.TurboEncoder(“TrellisStructure”格子);turboEnc。interleaverindexes = intIndices;turboEnc。OutputIndicesSource =“属性”;turboEnc。OutputIndices = punout;turboDec = comm.TurboDecoder(“TrellisStructure”格子);turboDec。interleaverindexes = intIndices;turboDec。InputIndicesSource =“属性”;turboDec。InputIndices = punout;encMsg = turboEnc(data);%编码disp (['Turbo编码率:'num2str (netRate)))
Turbo编码率:0.25641
encOutLen = length(encMsg)%显示编码长度
encOutLen = 39
isequal (encOutLen outLen)%检查长度
ans =逻辑1
rxMsg = turboDec(2*encMsg-1);%解码rxMsg isequal(数据)比较位与已解码位
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

通过使用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);%每符号能量与噪声功率谱密度之比,单位为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* numtail;输出码字包长度速率= L/M;编码率snrdB = EsNo + 10*log10(速率);%信噪比,单位为dBnoiseVar = 1./(10.^(snrdB/10));噪声方差%rng默认的

生成随机交错索引。

intrlvrIndices = randperm(L);

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

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

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

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

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

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

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

  1. 生成二进制数据。

  2. 涡轮编码数据。

  3. 调制编码的数据。

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

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

  6. Turbo解码解调后的数据。因为来自解调器的位映射与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(data,receivedBits);结束

显示错误数据。

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

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

初始化模拟

的调制顺序和调制范围 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对象的输入参数提供交错索引。指定解码器执行四次迭代。

turboencoder = comm.TurboEncoder(“InterleaverIndicesSource”输入端口的);turboDec = comm.TurboDecoder(“InterleaverIndicesSource”输入端口的“NumIterations”4);网格= poly2trellis(4,[13 15 17],13);n = log2(turboce . trellisstructure . numoutputsymbols);numTails = log2(turboce . trellisstructure . numstates)*n;

创建一个错误率对象。

errRate = com . errorrate;

主处理回路

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

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

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

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

  4. 生成交织索引。

  5. 涡轮编码数据。

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

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

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

  9. 涡轮解码数据。因为来自解调器的位映射顺序与turbo解码器所期望的映射顺序相反,解码器输入必须使用解调信号的倒数。

  10. 计算错误统计信息。

ber = 0 (1,length(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* numtail;输出码字包长度速率= L/M;%当前包的编码率snrdB = EsNo(k) + 10*log10(rate);%信噪比,单位为dBnoiseVar = 1./(10.^(snrdB/10));噪声方差%errorStats(2) < 100 && errorStats(3) < 1e7 data = randi([0 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(data,rxBits);结束%保存误码率数据并重置误码率对象ber(k) = errorStats(1);重置(errRate)结束

阴谋的结果

画出误码率,并将其与未编码的误码率进行比较。

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

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。这些对象代表Turbo,未编码。

更多关于

全部展开

参考文献

[1]贝尼代托,S.蒙托西,D.迪夫撒拉和F.波拉拉。一种软输入软输出最大后验(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]施莱格尔,克里斯蒂安,兰斯·佩雷斯。网格和涡轮编码.IEEE数字和移动通信丛书。皮斯卡塔韦,新泽西 ;霍博肯,新泽西州:IEEE出版社 ;Wiley-Interscience, 2004年。

[5]3gpp ts 36.212。“多路复用和信道编码。”第三代伙伴关系项目;技术规范组无线电接入网;进化通用地面无线电接入(E-UTRA)https://www.3gpp.org

扩展功能

版本历史

在R2012a中介绍

Baidu
map