主要内容

comm.APPDecoder

卷积解码代码通过使用应用程序的方法

描述

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

卷积解码代码通过使用应用方法:

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

  2. 调用对象的参数,就好像它是一个函数。

了解更多关于系统对象是如何工作的,看到的系统对象是什么?

创建

描述

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

例子

appDec = comm.APPDecoder (的名字,价值)设置使用一个或多个属性名称-值对。例如,comm.APPDecoder(“算法”,“真正的应用程序”)配置系统对象,appDec,实现真正的后验概率解码。在报价附上每个属性的名字。

例子

appDec = comm.APPDecoder(格子,的名字,价值)创建一个应用程序译码器对象,appDec,TrellisStructure属性设置为格子

属性

全部展开

属性,除非另有注明nontunable后,这意味着你不能改变它们的值调用对象。对象锁当你叫他们,释放函数打开它们。

如果一个属性可调在任何时候,你可以改变它的值。

改变属性值的更多信息,请参阅系统设计在MATLAB使用系统对象

框架描述,指定为一个MATLAB®包含框架结构描述率K/N代码。K代表输入比特流的数量,N代表输出比特流的数量。

您可以使用poly2trellis函数创建框架结构或手动创建它。更多关于这个结构,请参阅格子卷积编码的描述istrellis函数。

格子结构包含这些字段。

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

数据类型:

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

数据类型:

许多州在编码器中,指定为2的幂。

数据类型:

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

数据类型:

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

数据类型:

数据类型:结构体

终止帧编码方法,指定为“截断”“终止”。当你设定这个属性“截断”后,这个系统对象假设编码器停止编码输入帧的最后一个符号。当你设定这个属性“终止”,这个系统对象假设编码器部队每一帧结束的格子全0状态通过编码附加符号。如果你使用comm.ConvolutionalEncoder系统对象生成编码框架,这个属性值必须匹配的属性值卷积编码器和这个系统对象。

数据类型:字符|字符串

解码算法,指定为“马克斯*”,“真正的应用程序”,或“马克斯”。当你设定这个属性“真正的应用程序”,这个系统对象实现了真正的软件解码。当你将此属性设置为任何其他值,这个系统对象使用近似计算的速度增加。有关更多信息,请参见算法

数据类型:字符|字符串

数量的扩展部分,指定为一个整数范围(0,8)。这个属性指定了解码器使用的比特数输入数据规模,以避免失去在计算精度。

依赖关系

要启用这个特性,设置算法财产“马克斯*”

数据类型:

(LLR)选项来启用coded-bit对数似然比输出,指定为一个数字或逻辑1(真正的)或0()。禁用第二输出当你调用这个系统对象,设置该属性0()。

数据类型:逻辑

使用

描述

(路德,液晶显示器)= appDec (,信用证)执行应用程序解码编码器输入比特llr的顺序,序列的编码比特llr,信用证。系统对象返回路德液晶显示器。这些输出值的更新版本信用证分别和基于编码器得到信息。

路德= appDec (,信用证)执行应用程序解码的液晶显示器输出禁用。禁用液晶显示器输出设置CodedBitLLROutputPort财产0()。

输入参数

全部展开

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

数据类型:|

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

数据类型:|

输出参数

全部展开

陆,返回更新后的值作为一个实值列向量。

数据类型:|

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

数据类型:|

请注意

如果2的卷积码使用一个字母n可能的符号,n每个输入符号的比特数,然后呢信用证液晶显示器向量的长度l×n对于一些正整数l。类似地,如果2的解码数据使用一个字母k输出符号,k是位/输出符号的数量,然后呢路德向量的长度l×k

该系统对象接受一个列向量与任何正整数输入信号值l。大小可变的输入,l可以在多个调用不同。

对象的功能

使用一个目标函数,指定系统对象作为第一个输入参数。例如,释放系统资源的系统对象命名obj使用这个语法:

发行版(obj)

全部展开

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

例子

全部折叠

指定噪声方差和帧长度的位。创建卷积编码器、相移键控调制器和AWGN信道系统对象。

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

创建卷积应用译码器、相移键控解调和错误率系统对象。

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

传输一个卷积编码8-PSK-modulated通过AWGN信道比特流。解调接收信号使用不痒的决定。使用软件解码器解码解调信号。

counter = 1:5 data =兰迪([0 1]frameLength 1);encodedData = convEncoder(数据);modSignal = pskMod (encodedData);receivedSignal = awgnChan (modSignal);demodSignal = pskDemod (receivedSignal);%程序译码器假定软的极化%逆的解调器的输入%软输出。改变解调信号的符号。receivedSoftBits = appDecoder (0 (frameLength, 1), -demodSignal);%转换不痒的决定艰难的决定。receivedBits =双(receivedSoftBits > 0);%计算错误errorStats = errRate(数据、receivedBits);结束

显示出错率信息。

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

级联卷积编码提供高可靠性和获得了声望和使用涡轮码。的comm.TurboEncodercomm.TurboDecoder系统对象支持率仅1 / n卷积金宝app码。这个例子展示了两个速度的并行连接2/3卷积码实现一个有效的利率1/3涡轮代码通过使用comm.ConvolutionalEncodercomm.APPDecoder系统对象。

系统参数

blkLength = 1024;%块长度EbNo = 0:5;% Eb /不值遍历numIter = 3;%的译码迭代次数maxNumBlks = 1 e2;%最大数量的块/ Eb /没有价值

卷积编码器/解码器参数

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

初始化系统对象

初始化系统对象™卷积编码,软件解码,BPSK调制和解调,摘要频道,出错率计算。解调输出软位方法使用对数似然比。

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 值来生成结果的误码率性能。的helperTurboEnchelperTurboDec辅助函数执行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 =兰迪([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);%涡轮解调解码数据receivedBits = helperTurboDec (-demodSignal、cAPPDec1 cAPPDec2,格子、blkLength intrIndices、outIndices numIter);%计算误差的统计数据errorStats = bitError(数据、receivedBits);结束数量(ebNoIdx) = errorStats (1);重置(bitError);结束

显示结果

而实际的无线系统,如LTE和冲洗液,指定基地1 / n为涡轮码卷积码,结果显示使用更高的卷积码作为涡轮码率是可行的。

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

图包含一个坐标轴对象。坐标轴对象与标题高速率卷积编码Turbo编码包含一个类型的对象。这个对象表示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) + punctrVecIdx;outIndices = dIdx (:);yEnc = y (outIndices);结束函数yDec = helperTurboDec (yEnc、cAPPDec1 cAPPDec2,格子,blkLength、intrIndices inIndices numIter)%涡轮使用两个无网格概率(APP)解码器解码%格子参数k = log2 (trellis.numInputSymbols);n = log2 (trellis.numOutputSymbols);rCodLen = 2 * (n / k) * blkLength;typeyEnc =类(yEnc);根据outIndices %重新订货编码比特x = 0 (rCodLen, 1);x (inIndices) = yEnc;%生成第一编码器的输出码=重塑(x (1: rCodLen), 2 * n, []);lc1D =码(1:n:);Lc1_in = lc1D (:);%生成第二编码器的输出lc2D =码(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);着干活(intrIndices:) =重塑(Lu2_out (1: blkLength), k, []) ';Lu1_in =重塑(着干活”,[],1);结束%为最终的迭代计算llr和解码比特llr =重塑(着干活”,[],1)+ Lu1_out (1: blkLength);yDec =投((llr > = 0), typeyEnc);结束

算法

该系统根据对象实现soft-input-soft-output应用解码算法[1][2]

“真正的应用程序”选择的算法属性实现了软件解码按方程20 V节[1]。获得速度,“马克斯*”“马克斯”的值算法属性近似表达式等 日志 经验值 ( 一个 ) 其他数量。的“马克斯”选项使用max (一个)作为近似。的“马克斯*”选项使用max (一个)+一个修正项的表达式 ln ( 1 + 经验值 ( | 一个 1 一个 | ) )

设置算法财产“马克斯*”使NumScalingBits这个系统对象的属性。这个属性表示,这个系统的比特数对象尺度的数据流程(增加输入2NumScalingBits并把pre-output相同的因素)。使用这个属性来避免损失在计算精度。

引用

[1]Benedetto, S。,G. Montorsi, D. Divsalar, and F. Pollara. "A Soft-Input Soft-Output Maximum A Posterior (MAP) Module to Decode Parallel and Serial Concatenated Codes."喷气推进实验室TDA进展报告42 - 127(1996年11月)。

[2]维特比,A.J.“直观的理由和地图的简化实现卷积码译码器。”IEEE在选定地区通讯》杂志上16日,没有。2(1998年2月):260 - 64。https://doi.org/10.1109/49.661114。

[3]Benedetto, S。,和G. Montorsi. “Performance of Continuous and Blockwise Decoded Turbo Codes.”IEEE通信信1,没有。3(1997年5月):77 - 79。https://doi.org/10.1109/4234.585802。

扩展功能

版本历史

介绍了R2012a