主要内容

comm.ConvolutionalEncoder

卷积编码二进制数据

描述

ConvolutionalEncoder对象对二进制输入向量序列进行编码,以产生二进制输出向量序列。

对二进制信号进行卷积编码:

  1. 定义并设置卷积编码器对象。看到建设

  2. 调用对二进制输入向量序列进行编码,以根据输入向量的特性产生二进制输出向量序列comm.ConvolutionalEncoder.的行为特定于工具箱中的每个对象。

请注意

从R2016b开始,不再使用方法来执行由系统对象定义的操作™, 可以使用参数调用对象,就像调用函数一样。例如y=阶跃(obj,x)y = obj (x)执行等效操作。

建设

H = comm.ConvolutionalEncoder创建一个System对象,H它对二进制数据进行卷积编码。

H = comm.ConvolutionalEncoder (名称价值创建卷积编码器对象,H,并将每个指定的属性设置为指定的值。可以按以下任意顺序指定其他名称-值对参数:(名称1Value1,...,纳明).

H = comm.ConvolutionalEncoder(格子,名称价值创建卷积编码器对象,H此对象具有网格结构属性设置为格子,并将其他指定属性设置为指定值。

性质

网格结构

卷积码的网格结构

将网格指定为包含卷积代码的网格描述的MATLAB结构。使用伊斯特雷利斯函数检查结构是否为有效的网格结构。默认值是多年生植物(7, 133年[171])

终止法

编码帧的终止方法

指定如何将编码帧终止为其中一个帧连续|截断|结束. 默认值是连续. 当您将此属性设置为连续,对象在每个输入向量的末尾保留编码器状态,以便与下一个输入向量一起使用。当您将此属性设置为截断,对象独立处理每个输入向量。编码器状态在每个输入向量开始时重置。如果你设置InitialStateInputPort财产,则该对象将其状态重置为全零状态。如果你设置InitialStateInputPort财产真正的,对象将状态重置为您在初始状态中指定的值输入方法。当您将此属性设置为结束,对象将独立处理每个输入向量。对于每个输入向量,对象使用额外的位将编码器状态设置为向量末尾的全零状态。收费K/N代码中,方法输出具有长度的向量 N × l + 年代 K 哪里年代约束长度–1(或在多个约束长度的情况下,年代总和约束长度)–1)).l输入的长度是方法。

重置输入端口

使能编码器复位输入

将此属性设置为真正的要启用对的附加输入,请执行以下操作:方法。默认值是. 当此附加重置输入为非零值时,编码器的内部状态重置为初始状态。此属性在设置终止法财产连续

DelayedResetAction

延迟输出复位

将此属性设置为真正的延迟重置对象输出。默认值是. 当您将此属性设置为真正的,编码器的内部状态的重置发生在对象计算编码数据之后。当您将此属性设置为,编码器的内部状态的重置发生在对象计算已编码的数据之前。属性设置时将应用此属性重置输入端口财产真正的

InitialStateInputPort

启用初始状态输入

将此属性设置为真正的启用方法输入,该方法允许为每个输入向量指定编码器的初始状态。默认值是. 此属性在设置终止法财产截断

FinalStateOutputPort

启用最终状态输出

将此属性设置为true,以通过方法的输出。默认值是. 此属性在设置终止法财产连续截断

PuncturePatternSource

穿刺模式的来源

指定刺穿图案的来源为没有一个|财产. 默认值是没有一个. 当您将此属性设置为没有一个该物体不适用穿刺。当您将此属性设置为财产,物体戳穿密码。这个穿刺是基于你在PuncturePattern财产。属性设置时将应用此属性终止法财产连续截断

PuncturePattern

穿刺模式向量

指定用于将编码数据作为列向量进行穿刺的穿刺模式。默认值是(1;1;0;1;0;1].向量包含1s和0年代,0表示被戳穿或排除的位。属性设置时将应用此属性终止法财产连续截断PuncturePatternSource财产财产

方法

卷积编码二进制数据
所有系统对象都是通用的
释放

允许系统对象属性值改变

重置

重置System对象的内部状态

例子

全部折叠

通过AWGN信道传输卷积编码的8-DPSK调制比特流。然后,使用维特比解码器解调和解码。

创建必要的System对象。

hConEnc = comm.ConvolutionalEncoder;hMod = comm.DPSKModulator (“BitInput”,真正的);hChan = comm.AWGNChannel (“噪音法”...“信噪比”...“信噪比”,10); hDemod=通信DPSK解调器(“BitOutput”,真正的);hDec = comm.ViterbiDecoder (“InputFormat”“硬”);hError = comm.ErrorRate (“ComputationDelay”3.“ReceiveDelay”34);

使用以下步骤处理数据:

  1. 生成随机比特

  2. 对数据进行卷积编码

  3. 应用DPSK调制

  4. 将调制后的信号通过AWGN传输

  5. 解调噪声信号

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

  7. 收集错误统计信息

Counter = 1:20 data = randi([0 1],30,1);encodedData = step(hConEnc, data);modSignal = step(hMod, encodedData);receivedSignal = step(hChan, modSignal);demod = step(hDemod, receivedSignal);receivedBits = step(hDec, demodSignal);errors = step(hError, data, receivedBits);结束

显示错误的数量。

错误(2)
ans = 3

使用具有确定穿刺模式的卷积编码器和维特比译码器对比特序列进行编码和解码。检查输入位和输出位是否相同

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

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

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

ENC=通信卷积编码器(...“PuncturePatternSource”“财产”...“PuncturePattern”, pPatternVec);12月= comm.ViterbiDecoder (“InputFormat”“硬”...“PuncturePatternSource”“财产”...“PuncturePattern”, pPatternVec);

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

错误=通信错误率(“ReceiveDelay”, DEC.TracebackDepth);

对随机位序列进行编码和解码。

dataIn = randi([0 1],600,1);dataIn dataEncoded =步骤(ENC);dataOut =步骤(12月,dataEncoded);

确认输出数据中没有错误。

errStats =步骤(呃,dataIn dataOut);errStats (2)
ans = 0

串接卷积码可靠性高,在turbo码中得到了广泛的应用。的comm.TurboEncodercomm.TurboDecoder系统对象只支持1/n的卷积码。金宝app这个例子展示了两个速率为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秩序

初始化系统对象

Initialize Systems对象用于卷积编码、APP解码、BPSK调制解调、AGWN信道和错误率计算。解调输出采用对数似然比方法。

cEnc1=通信卷积编码器(“网格结构”...格子,“TerminationMethod”“截断”); cEnc2=通信卷积编码器(“网格结构”...格子,“TerminationMethod”“截断”); cAPPDec1=comm.APPDecoder(“网格结构”,格架,...“TerminationMethod”“截断”“算法”,贴花);cAPPDec2=comm.APPDecoder(“网格结构”,格架,...“TerminationMethod”“截断”“算法”, decAlg);bpskMod = comm.BPSKModulator;bpskDemod = comm.BPSKDemodulator (“DecisionMethod”“对数似然比”...“VarianceSource”输入端口的);awgnChan = comm.AWGNChannel (“噪音法”“差异”...“VarianceSource”输入端口的); 比特错误=通信错误率;%的误码率测量

框架处理循环

的范围内循环 E b / N 0 用于生成BER性能结果的值。这个帮手城市中心helperTurboDec辅助函数执行turbo编码和解码。

数量= 0(长度(EbNo), 1);bitsPerSymbol = log2 (modOrder);turboEncRate = k / n (2 *);ebNoIdx = 1:长度(EbNo)%根据EbNo计算噪声方差EsNo = bno (bnoidx) + 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解调噪声信号以输出软位解调信号=BPSKDEMOR(接收信号,噪声评估);Turbo解码解调后的数据receivedBits = helperTurboDec (-demodSignal cAPPDec1 cAPPDec2,...格子、blkLength intrIndices、outIndices numIter);%计算错误统计信息errorStats = bitError(数据、receivedBits);结束ber(ebNoIdx)=错误统计(1);复位(位错误);结束

显示结果

在LTE和CCSDS等实际无线系统中,turbo码采用的是基本速率为1/n的卷积码,结果表明使用更高速率的卷积码作为turbo码是可行的。

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

图中包含一个坐标轴。标题为“Turbo编码的高速率卷积码”的轴包含一个类型为line的对象。该对象表示N = 1024,3次迭代。

辅助函数

函数[yEnc, outIndices] = helperTurboEnc(数据、hCEnc1 hCEnc2,格子,blkLength intrIndices)使用两个并行卷积编码器的Turbo编码。没有尾位处理,假定没有输出流穿透。%格子参数k=log2(格状数字符号);n=log2(网格、numOutputSymbols);cLen=blkLength*n/k;c=[0;0;0;0;0;0];%假设所有流都输出N =长度(找到(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);punctrVecIdx =找到(punctrVec = = 0);/ / / / / / / / / / / / /outIndices = dIdx (:);yEnc = y (outIndices);结束函数yDec=helperTurboDec(是的,cAPPDec1,cAPPDec2,网格,blkLength,intrindice,inIndices,numIter)%使用两个a-后验概率(APP)解码器的Turbo解码%格子参数k = log2 (trellis.numInputSymbols);n = log2 (trellis.numOutputSymbols);rCodLen = 2 * (n / k) * blkLength;typeyEnc =类(yEnc);%根据outIndices对编码位重新排序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 = zeros(blkLength, 1, typeyEnc);%Turbo译码out1=零(BLKLENGHT/k,k,typeyEnc);iterIdx = 1: numIter [Lu1_out, ~] = step(cAPPDec1, Lu1_in, Lc1_in);tmp = Lu1_out (1: blkLength);Lu2_in = replaceall (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:BLKLENGHT);yDec=cast((llr>=0),类型为YENC);结束

算法

此对象实现上描述的算法、输入和输出卷积编码器块引用页。对象特性与块参数相对应,但以下情况除外:

操作模式通过端口重置非零输入块参数对应于重置输入端口财产。

扩展能力

介绍了R2012a