高速率卷积编码了Turbo编码
级联卷积编码提供高可靠性和获得了声望和使用涡轮码。的comm.TurboEncoder
和comm.TurboDecoder
系统对象支持率仅1 / n卷积金宝app码。这个例子展示了两个速度的并行连接2/3卷积码实现一个有效的利率1/3涡轮代码通过使用comm.ConvolutionalEncoder
和comm.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;%的误码率测量
框架处理循环
通过一系列的循环
值来生成结果的误码率性能。的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 =兰迪([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)“迭代”]);
辅助函数
函数[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);结束