主要内容

comm.ConvolutionalEncoder

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

描述

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

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

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

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

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

创建

描述

例子

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(或者,在多个约束长度的情况下,年代=总和(constraintLength(1))。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) = convencoder (消息也返回编码器的最终状态。要启用此语法,请设置FinalStateOutputPort财产1(真正的)和TerminationMethod财产“连续”“截断”

输入参数

全部展开

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

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

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

依赖关系

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

数据类型:

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

依赖关系

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

数据类型:|逻辑

输出参数

全部展开

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

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

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

编码器的最终状态,作为整数返回。

依赖关系

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

数据类型:

对象的功能

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

发行版(obj)

全部展开

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

例子

全部折叠

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

创建必要的System对象。

conEnc = comm.ConvolutionalEncoder;modDPSK = comm.DPSKModulator (“BitInput”,真正的);陈= comm.AWGNChannel (“NoiseMethod”,“信噪比(SNR)”,“信噪比”10);demodDPSK = comm.DPSKDemodulator (“BitOutput”,真正的);vDec = comm.ViterbiDecoder (“InputFormat”,“硬”);错误= comm.ErrorRate (“ComputationDelay”3,“ReceiveDelay”34);

按照以下步骤处理数据。

  1. 生成随机位。

  2. 对数据进行卷积编码。

  3. 应用DPSK调制。

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

  5. 解调噪声信号。

  6. 使用Viterbi算法解码数据。

  7. 收集错误统计信息。

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

显示错误数。

错误(2)
ans = 3

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

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

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

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

conEnc = comm.ConvolutionalEncoder (“PuncturePatternSource”,“属性”,“PuncturePattern”, pPatternVec);viDec = comm.ViterbiDecoder (“InputFormat”,“硬”,“PuncturePatternSource”,“属性”,“PuncturePattern”, pPatternVec);

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

错误= comm.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个卷积码。本例展示了两个速率2/3卷积码的并行拼接,通过使用实现有效速率1/3 turbo码comm.ConvolutionalEncodercomm.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 值来生成BER性能的结果。的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 = 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,为turbo码指定了基本速率-1/n的卷积码,但结果表明,使用更高速率的卷积码作为turbo码是可行的。

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

图中包含一个axes对象。标题为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) + puntrvecidx;outIndices = dIdx (:);yEnc = y (outIndices);结束函数yDec = helperTurboDec (yEnc、cAPPDec1 cAPPDec2,格子,blkLength、intrIndices inIndices numIter)% Turbo解码使用两个a后验概率(APP)解码器%格子参数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);结束

更多关于

全部展开

参考文献

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

[2]Gitlin, Richard D., Jeremiah F. Hayes, Stephen B. Weinstein。数据通信原理。通信理论的应用。纽约:全会出版社,1992年。

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

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

[5]Begin, G., D. Haccoun,和C. Paquin。“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

Baidu
map