主要内容

comm.ConvolutionalEncoder

卷积编码二进制数据

描述

comm.ConvolutionalEncoder系统对象™编码二进制输入向量序列以产生二进制输出向量序列。

对二进制数据进行卷积编码:

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

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

有关系统对象如何工作的详细信息,请参见什么是系统对象?

创建

描述

例子

convencoder= comm.ConvolutionalEncoder创建一个卷积编码器系统对象。

例子

convencoder= comm.ConvolutionalEncoder(格子)设置TrellisStructure财产格子

例子

convencoder= comm.ConvolutionalEncoder (___名字价值属性除了以前语法中的任何参数组合外,还使用一个或多个名称-值参数。例如,“TerminationMethod”、“连续”将终止方法指定为连续的,以保留每个输入向量末尾的编码器状态,以便与下一个输入向量一起使用。

属性

全部展开

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

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

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

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

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

网格结构包含这些字段。

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

数据类型:结构体

编码帧的终止方法,指定为这些值之一。

  • “连续”- System对象保留每个输入向量末尾的编码器状态,以便与下一个输入向量一起使用。

  • “截断”—System对象独立地处理每个输入向量。编码器状态在每个输入向量的开始处重置。如果你设置InitialStateInputPort财产0),对象将其状态重置为全零状态。如果你设置InitialStateInputPort财产1真正的方法中指定的值,对象将其状态重置为InitialStateInputPort输入。

  • “终止”—System对象独立地处理每个输入向量。对于每个输入向量,对象使用额外的位将编码器状态设置为向量末尾的全零状态。以一种价格K/N代码中,对象输出一个长度向量 N × l + 年代 K ,在那里年代=constraintLength- 1(或者,在多个约束长度的情况下,年代=总和constraintLength1))。l是输入的长度。constraintLength- 1定义为log2(NumStates)。

数据类型:字符|字符串

选项,以启用编码器重置输入,以逻辑形式指定1真正的)或0).将此属性设置为1真正的)以启用对象的额外输入。当这个额外的重置输入是非零值时,编码器的内部状态重置为初始条件。

依赖关系

属性可启用此属性TerminationMethod财产“连续”

数据类型:逻辑

选项,用于延迟输出重置,指定为这些逻辑值之一。

  • 1真正的编码器内部状态的重置发生在对象计算编码数据之后。

  • 0编码器内部状态的重置发生在对象计算编码数据之前。

依赖关系

属性可启用此属性ResetInputPort财产1真正的).

数据类型:逻辑

选项,以启用初始状态输入,以逻辑形式指定1真正的)或0).当您将此属性设置为1真正的),该对象使您能够为每个输入向量指定编码器的初始状态。

依赖关系

属性可启用此属性TerminationMethod财产“截断”

数据类型:逻辑

选项,以启用最终状态输出,指定为逻辑1真正的)或0).将此属性设置为1真正的)以获得编码器的最终状态作为输出。

依赖关系

属性可启用此属性TerminationMethod财产“连续”“截断”

数据类型:逻辑

穿刺模式的来源,指定为这些值之一。

  • “没有”—该物体不适用刺穿。

  • “属性”-物体刺穿代码。的穿刺模式向量为基础进行穿刺PuncturePattern财产。

依赖关系

属性可启用此属性TerminationMethod财产“连续”“截断”

数据类型:字符|字符串

刺穿模式向量用于刺穿编码数据,指定为列向量。向量必须包含1年代和0年代,0表示穿孔位或排除位的位置。

依赖关系

属性可启用此属性TerminationMethod财产“连续”“截断”PuncturePatternSource财产“属性”

数据类型:

使用

描述

例子

码字= convencoder (消息使用网格结构指定的卷积编码方案对输入消息进行编码。码字是已编码的码字。消息码字是字长为1的数字、逻辑或无符号定点值的列向量(fi(定点设计器)对象)。

码字= convencoder (消息initstate为每个输入向量指定编码器的初始状态。要启用此语法,请设置TerminationMethod财产“截断”InitialStateInputPort财产1真正的).

码字= convencoder (消息resetstate指定重置编码器内部状态的输入。要启用此语法,请设置TerminationMethod财产“连续”ResetInputPort财产1真正的).

码字finalstate= convcoder (消息还返回编码器的最终状态。要启用此语法,请设置FinalStateOutputPort财产1真正的)及TerminationMethod财产“连续”“截断”

输入参数

全部展开

输入消息,指定为二进制值列向量。

数据类型:|int8|fi(数据、0、1)

编码器的初始状态,指定为整数。

依赖关系

要启用此参数,请设置TerminationMethod财产“截断”InitialStateInputPort财产1真正的).

数据类型:

重置编码器的内部状态,指定为数字或逻辑1真正的)或0).

依赖关系

要启用此参数,请设置TerminationMethod财产“连续”ResetInputPort财产1真正的).

数据类型:|逻辑

输出参数

全部展开

卷积编码的消息,作为二进制值列向量返回。此输出向量具有与输入相同的数据类型和方向消息

当卷积编码器表示一个速率K/N代码,输入向量的长度等于K×l对于某个正整数l.该对象将此输出向量的长度设置为l×N

数据类型:|int8|fi(数据、0、1)

编码器的最终状态,以整数形式返回。

依赖关系

要启用此参数,请设置TerminationMethod财产“连续”“截断”

数据类型:

对象的功能

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

发行版(obj)

全部展开

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

例子

全部折叠

通过加性高斯白噪声(AWGN)信道传输卷积编码的8差分相移键控(DPSK)调制比特流。然后,使用维特比解码器对调制后的比特流进行解调和解码。

创建必要的System对象。

conEnc = com . convolutionalencoder;modDPSK = com . dpskmodulator (“BitInput”,真正的);chan = com . awgnchannel (“NoiseMethod”信噪比(SNR)“信噪比”10);demodDPSK = com . dpsk解调器(“BitOutput”,真正的);vDec = com . viterbidecoder (“InputFormat”“硬”);error = com . errorrate (“ComputationDelay”,3,“ReceiveDelay”34);

按照以下步骤处理数据。

  1. 生成随机比特。

  2. 卷积编码数据。

  3. 应用DPSK调制。

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

  5. 解调噪声信号。

  6. 使用维特比算法解码数据。

  7. 收集错误统计信息。

Counter = 1:20 data = randi([0 1],30,1);encodedData = conEnc(数据);modSignal = modDPSK(encodedData);receivedSignal = chan(modSignal);demodSignal = demodDPSK(receivedSignal);receivedBits = vDec(demodSignal);errors =错误(数据,receivedBits);结束

显示错误数。

错误(2)
Ans = 3

使用卷积编码器和带有定义的穿刺模式的维特比解码器对比特序列进行编码和解码。验证输入和输出位是否相同。

定义一个穿刺模式矩阵,并将其重塑为矢量形式,以便与编码器和解码器系统对象一起使用。

pPatternMat = [1 0 1;1 10 0];pPatternVec =重塑(pPatternMat,6,1);

创建一个卷积编码器和维特比解码器,其中穿刺模式由定义pPatternVec

conEnc = com . convolutionalencoder (“PuncturePatternSource”“属性”“PuncturePattern”, pPatternVec);viDec = com . viterbidecoder (“InputFormat”“硬”“PuncturePatternSource”“属性”“PuncturePattern”, pPatternVec);

创建带有适当接收延迟的错误率计数器。

error = com . errorrate (“ReceiveDelay”, viDec.TracebackDepth);

编码一个随机比特序列,然后解码编码后的消息。

dataIn = randi([0 1],600,1);dataEncoded = conEnc(dataIn);dataOut = viDec(dataEncoded);

验证输出数据中不存在错误。

errStats =错误(dataIn,dataOut);errStats (2)
Ans = 0

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

系统参数

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

卷积编码器/解码器参数

格子= 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调制顺序

初始化系统对象

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

cEnc1 = com . convolutionalencoder (“TrellisStructure”格子,“TerminationMethod”“截断”);cEnc2 = com . convolutionalencoder (“TrellisStructure”格子,“TerminationMethod”“截断”);cAPPDec1 = com . appdecoder (“TrellisStructure”格子,“TerminationMethod”“截断”“算法”, decAlg);cAPPDec2 = com . appdecoder (“TrellisStructure”格子,“TerminationMethod”“截断”“算法”, decAlg);bpskMod = com . bpskmodulator;bpskDemod = com . bpskdemo解调器(“DecisionMethod”的“对数似然比“VarianceSource”输入端口的);awgnChan = com . awgnchannel (“NoiseMethod”“方差”“VarianceSource”输入端口的);bitError = com . errorrate;误码率测量

帧处理循环

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

ber = 0(长度(EbNo),1);bitsPerSymbol = log2(modOrder);turboEncRate = k/(2*n);ebNoIdx = 1:length(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(data,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);结束ber(ebNoIdx) = errorStats(1);重置(bitError);结束

显示结果

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

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

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

辅助函数

函数[yEnc,outIndices] = helperTurboEnc(data,hCEnc1,hCEnc2,trellis,blkLength,intrIndices)使用两个并行卷积编码器的Turbo编码。没有尾位处理,并假设没有输出流刺穿。%网格参数k = log2(trellis.numInputSymbols);n = log2(trellis.numOutputSymbols);cLen = blkLength*n/k;punctrVec = [0;0;0;0;0];%假设所有流都输出N = length(find(punctrVec==0));编码随机数据位y1 = step(hCEnc1, data);y2 = step(hCEnc2,重塑(intrlv(重塑(data, 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);puntrvecidx = find(puntrvec ==0);dIdx = repmat(idx, N, 1) + punctrVecIdx;outIndices = dIdx(:);yEnc = y(outIndices);结束函数yDec = helperTurboDec(yEnc,cAPPDec1,cAPPDec2,trellis,blkLength,intrIndices,inIndices,numIter)使用两个后验概率(APP)解码器的Turbo解码%网格参数k = log2(trellis.numInputSymbols);n = log2(trellis.numOutputSymbols);rCodLen = 2*(n/k)*blkLength;typeyEnc = class(yEnc);根据outindexes重新排序编码位x = 0 (rCodLen, 1);x(inIndices) = yEnc;生成第一个编码器的输出yD =重塑(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);% Turbo Decodeout1 = 0 (blkLength/k, k, typeyEnc);iterIdx = 1: numIter [Lu1_out, ~] = step(cAPPDec1, Lu1_in, Lc1_in);tmp = Lu1_out(1:blkLength);Lu2_in =重塑(tmp, k, [])';[Lu2_out, ~] = step(cAPPDec2,重塑(Lu2_in (intrIndices , :)', [], 1)、Lc2_in);out1(intrIndices,:) =重塑(Lu2_out(1:blkLength), k, [])';Lu1_in =重塑(out1', [], 1);结束计算最终迭代的llr和解码位llr =重塑(out1', [], 1) + Lu1_out(1:blkLength);yDec = cast((llr>=0), typeyEnc);结束

更多关于

全部展开

参考文献

[1]克拉克,乔治·C和j·比布·凯恩。数字通信纠错编码.通讯理论应用“,”纽约:全会出版社,1981年。

[2]吉特林、理查德·D、耶利米·f·海耶斯和斯蒂芬·b·韦恩斯坦。数据通信原则。传播学理论应用.纽约:全会出版社,1992年。

[3]安田,Y., K. Kashiki和Y. Hirata。“用于软决策维特比解码的高速率穿孔卷积码。”IEEE通讯汇刊32岁的没有。3(1984年3月):315-19。https://doi.org/10.1109/TCOM.1984.1096047。

[4]哈昆,D.和G.贝京。用于维特比和顺序解码的高速率刺穿卷积码IEEE通讯汇刊37岁的没有。11(1989年11月):1113-25。https://doi.org/10.1109/26.46505。

[5]贝京,G.哈昆,C.帕奎因。用于Viterbi和顺序解码的高速率刺穿卷积码的进一步结果IEEE通讯汇刊38岁的没有。11(1990年11月):1922-28。https://doi.org/10.1109/26.61470。

[6]Moision B。卷积码的截断深度经验法则信息理论与应用研讨会(2008年1月27日- 2008年2月1日,加州圣地亚哥),555-557。纽约:IEEE, 2008。

扩展功能

在R2012a中引入