主要内容

comm.APPDecoder

用APP方法解码卷积码

描述

APPDecoder系统对象™对卷积码执行后验概率(APP)解码。

用APP方法解码卷积码:

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

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

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

创建

描述

appDec = comm.APPDecoder创建一个APP解码器系统对象,appDec,它使用APP方法解码卷积码。

例子

appDec = comm.APPDecoder (的名字价值使用一个或多个名值对设置属性。例如,comm.APPDecoder(“算法”,“真正的应用程序”)配置System对象,appDec,实现真后验概率解码。将每个属性名用引号括起来。

例子

appDec = comm.APPDecoder(格子,的名字价值创建一个APP解码器对象,appDec,TrellisStructure属性设置为格子

属性

全部展开

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

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

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

网格描述,指定为MATLAB®结构,该结构包含速率的网格描述K/N代码。K表示输入位流的数量,和N表示输出位流的数量。

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

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

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

数据类型:结构体

编码帧的终止方法,指定为“截断”“终止”.当您将此属性设置为“截断”,这个System对象假定编码器在对输入帧中的最后一个符号进行编码后停止。当您将此属性设置为“终止”,这个System对象假定编码器通过编码额外的符号强制网格以全零状态结束每一帧。如果您使用comm.ConvolutionalEncoder系统对象生成编码的帧,该属性值必须与卷积编码器的属性值和该系统对象的属性值匹配。

数据类型:字符|字符串

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

数据类型:字符|字符串

缩放位数,指定为范围[0,8]的整数。此属性指定解码器用于缩放输入数据的位数,以避免在计算期间损失精度。

依赖关系

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

数据类型:

选项可启用码位对数似然比(LLR)输出,指定为数值或逻辑1真正的)或0).若要在调用此System对象时禁用第二个输出,请将此属性设置为0).

数据类型:逻辑

使用

描述

路德液晶显示器) = appDec (信用证对编码器输入位的llr序列进行APP解码,,编码位的llr序列,信用证.System对象返回路德而且液晶显示器.的更新版本而且信用证,分别根据编码器信息得到。

路德= appDec (信用证函数执行APP解码液晶显示器输出禁用。禁用液晶显示器输出设置CodedBitLLROutputPort财产0).

输入参数

全部展开

编码器输入数据的llr序列,指定为实值列向量。正的软输入被解释为逻辑1,一个负的软输入被解释为逻辑0

数据类型:|

的llr序列,指定为的实值列向量。正的软输入被解释为逻辑1,一个负的软输入被解释为逻辑0

数据类型:|

输出参数

全部展开

LU的更新值,作为实值列向量返回。

数据类型:|

LC的更新值,作为实值列向量返回。

数据类型:|

请注意

如果卷积码使用2的字母n可能的符号,n是每个输入符号的比特数,那么信用证而且液晶显示器向量的长度l×n对于某个正整数l.类似地,如果解码数据使用字母2k输出符号,k是每个输出符号的比特数,那么而且路德向量的长度l×k

这个System对象接受列向量输入信号,其值为任意正整数l.大小可变的输入,l可以在多个调用期间发生变化。

对象的功能

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

发行版(obj)

全部展开

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

例子

全部折叠

指定噪声方差和帧长度(以位为单位)。创建卷积编码器、PSK调制器和AWGN通道系统对象。

noiseVar = 2 e 1;frameLength = 300;convEncoder = comm.ConvolutionalEncoder (...“TerminationMethod”“截断”);pskMod = comm.PSKModulator (“BitInput”,真的,“PhaseOffset”, 0);awgnChan = comm.AWGNChannel (“NoiseMethod”“方差”...“方差”, noiseVar);

创建卷积APP解码器、PSK解调器和错误率系统对象。

appDecoder = comm.APPDecoder (...“TrellisStructure”poly2trellis(7, 133年[171]),...“算法”“真正的应用程序”...“CodedBitLLROutputPort”、假);pskDemod = comm.PSKDemodulator (...“BitOutput”,真的,...“PhaseOffset”0,...“DecisionMethod””“近似对数似然比...“方差”, noiseVar);errRate = comm.ErrorRate;

通过AWGN信道发送卷积编码的8- psk调制位流。利用软决策对接收信号进行解调。使用APP解码器对解调信号进行解码。

counter = 1:5 data = randi([0 1],frameLength,1);encodedData = convEncoder(数据);modSignal = pskMod (encodedData);receivedSignal = awgnChan (modSignal);demodSignal = pskDemod (receivedSignal);APP解码器假定软的偏振。%的输入,与解调器的输入相反%软输出。改变被解调信号的符号。receivedSoftBits = appDecoder (...0 (frameLength, 1), -demodSignal);从软决策转变为硬决策。receivedBits = double(receivedSoftBits > 0);%计算错误errorStats = errRate(数据、receivedBits);结束

显示错误率信息。

流('错误率= %f\n错误数= %d\n'...errorStats errorStats (1), (2))
错误率= 0.000000错误数= 0

级联卷积码提供了高可靠性,并已获得突出地位和使用作为涡轮码。的comm.TurboEncoder而且comm.TurboDecoder系统对象只支持速率为1/n的卷积码。本例展示了两个速率为2/3的卷积码的并行拼接,通过使用实现有效速率为1/3的turbo码comm.ConvolutionalEncoder而且comm.APPDecoder系统对象。

系统参数

blkLength = 1024;%块长度EbNo = 0:5;% Eb/没有要循环的值numIter = 3;译码迭代次数maxNumBlks = 1 e2;%每个Eb的最大块数/无值

卷积编码器/解码器参数

Trellis = poly2trellis([5 4],[23 35 0;0 5 13]);k = log2 (trellis.numInputSymbols);输入比特数的%n = log2 (trellis.numOutputSymbols);输出位的百分比intrIndices = randperm (blkLength / k)”;%随机交叉decAlg =“真正的应用程序”%解码算法modOrder = 2;% PSK-modulation秩序

初始化系统对象

初始化系统对象™用于卷积编码,APP解码,BPSK调制和解调,AGWN通道和错误率计算。使用对数似然比方法解调输出软位元。

cEnc1 = comm.ConvolutionalEncoder (...“TrellisStructure”格子,...“TerminationMethod”“截断”);cEnc2 = comm.ConvolutionalEncoder (...“TrellisStructure”格子,...“TerminationMethod”“截断”);cAPPDec1 = comm.APPDecoder (...“TrellisStructure”格子,...“TerminationMethod”“截断”...“算法”, decAlg);cAPPDec2 = comm.APPDecoder (...“TrellisStructure”格子,...“TerminationMethod”“截断”...“算法”, decAlg);bpskMod = comm.BPSKModulator;bpskDemod = comm.BPSKDemodulator (...“DecisionMethod”的“对数似然比...“VarianceSource”输入端口的);awgnChan = comm.AWGNChannel (...“NoiseMethod”“方差”...“VarianceSource”输入端口的);bitError = comm.ErrorRate;%的误码率测量

框架处理循环

循环通过的范围 E b / N 0 值来生成误码率性能的结果。的helperTurboEnc而且helperTurboDec辅助函数执行turbo编码和解码。

数量= 0(长度(EbNo), 1);bitsPerSymbol = log2 (modOrder);turboEncRate = k / n (2 *);ebNoIdx = 1:长度(EbNo)%从EbNo计算噪声方差EsNo = EbNo(ebNoIdx) + 10*log10(bitsPerSymbol);SNRdB = EsNo + 10*log10(turboEncRate);%说明代码率noiseVar = 10 ^ (-SNRdB / 10);numBlks = 1: maxNumBlks%生成二进制数据data = randi([0 1],blkLength,1);% Turbo编码数据[encodedData, outIndices] = helperTurboEnc (...数据、cEnc1 cEnc2,...格子、blkLength intrIndices);调制编码的数据modSignal = bpskMod (encodedData);将调制信号通过AWGN通道receivedSignal = awgnChan (modSignal noiseVar);用LLR解调噪声信号输出软位demodSignal = bpskDemod (receivedSignal noiseVar);% Turbo解码解调数据receivedBits = helperTurboDec (...-demodSignal、cAPPDec1 cAPPDec2,...格子、blkLength intrIndices、outIndices numIter);%计算错误统计errorStats = bitError(数据、receivedBits);结束数量(ebNoIdx) = errorStats (1);重置(bitError);结束

显示结果

虽然实际的无线系统,如LTE和CCSDS,指定了基本速率-1/n的卷积码作为turbo码,但结果表明,使用更高速率的卷积码作为turbo码是可行的。

图;semilogy (EbNo误码率,“* - - - - - -”);网格;包含(“E_b / N_0 (dB)”);ylabel (“方方面面”);标题(“用于涡轮编码的高速率卷积码”);传奇([“N =”num2str (blkLength)”、“num2str (numIter)“迭代”]);

图中包含一个axes对象。标题为“Turbo Coding的High Rate Convolutional Codes for Turbo Coding”的axes对象包含一个类型为line的对象。该对象表示N = 1024, 3次迭代。

辅助函数

函数[yEnc, outIndices] = helperTurboEnc (...数据、hCEnc1 hCEnc2,格子,blkLength intrIndices)使用两个并行卷积编码器的Turbo编码。无尾位处理,并假定无输出流刺穿。%格子参数k = log2 (trellis.numInputSymbols);n = log2 (trellis.numOutputSymbols);cLen = blkLength * n / k;punctrVec = [0, 0, 0, 0, 0, 0);%假设所有流都被输出N =长度(找到(punctrVec = = 0));编码随机数据位日元= hCEnc1(数据);y2 = hCEnc2 (...重塑(intrlv(重塑(数据、k []), intrIndices), [], 1));y1D =重塑(y1 (1: cLen), n, []);y2D =重塑(y2 (1: cLen), n, []);yDTemp = [y1D;y2D];y = yDTemp (:);使用刺穿向量生成输出指标向量idx = 0: 2*n:(blkLength - 1)*2*(n/k);punctrVecIdx =找到(punctrVec = = 0);dIdx = repmat(idx, N, 1) +穿孔vecidx;outIndices = dIdx (:);yEnc = y (outIndices);结束函数yDec = helperTurboDec (...yEnc、cAPPDec1 cAPPDec2,格子,...blkLength、intrIndices inIndices numIter)使用两个后验概率(APP)解码器进行Turbo解码%格子参数k = log2 (trellis.numInputSymbols);n = log2 (trellis.numOutputSymbols);rCodLen = 2 * (n / k) * blkLength;typeyEnc =类(yEnc);根据outindexes重新排序编码位x = 0 (rCodLen, 1);x (inIndices) = yEnc;生成第一个编码器的输出码=重塑(x (1: rCodLen), 2 * n, []);lc1D = yD(1:n,:);Lc1_in = lc1D (:);%生成第二个编码器的输出lc2D = yD(n+1:2*n,:);Lc2_in = lc2D (:);初始化未编码的数据输入Lu1_in = 0 (blkLength 1 typeyEnc);%涡轮解码着干活= 0 (blkLength / k, k, typeyEnc);iterIdx = 1: numIter [Lu1_out, ~] = cAPPDec1(Lu1_in,Lc1_in);tmp = Lu1_out (1: blkLength);Lu2_in =重塑(tmp k []) ';[Lu2_out, ~] = cAPPDec2(...:重塑(Lu2_in (intrIndices)”,[],1),Lc2_in);out1(intrIndices,:) =重塑(Lu2_out(1:blkLength),k,[])';Lu1_in =重塑(着干活”,[],1);结束计算最终迭代的llr和解码位llr =重塑(out1', [], 1) + Lu1_out(1:blkLength);yDec = cast((llr>=0), typeyEnc);结束

算法

该系统对象实现了软输入软输出APP解码算法[1]而且[2]

“真正的应用程序”选择的算法属性根据[1]第V节中的公式20-23实现APP解码。为了加快速度“马克斯*”而且“马克斯”的值算法属性近似表达式如下 日志 经验值 一个 其他数量。的“马克斯”选项使用max (一个)作为近似。的“马克斯*”选项使用max (一个)加上表达式给出的修正项 ln 1 + 经验值 | 一个 1 一个 |

设置算法财产“马克斯*”使NumScalingBits属性。这个属性表示这个System对象用来扩展它所处理的数据的位数(将输入乘以2)NumScalingBits并将预输出除以相同的因子)。使用此属性可避免在计算期间丢失精度。

参考文献

[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]贝内代托,S.和G.蒙托西。连续和块解码Turbo码的性能。IEEE通信信1,没有。3(1997年5月):77-79。https://doi.org/10.1109/4234.585802。

扩展功能

版本历史

介绍了R2012a

Baidu
map