这个例子展示了如何使用卷积编码器和维特比解码器系统对象来模拟穿孔编码系统。维特比译码器的复杂度随着码率的增加而迅速增加。穿刺术是一种允许使用标准速率1/2编码器和解码器对更高速率码进行编码和解码的技术。
本示例演示了由随机二进制源、卷积编码器、BPSK调制器、加性高斯白噪声(AWGN)信道和维特比译码器组成的通信系统的仿真。该示例演示了如何运行仿真来获得误码率(BER)曲线,并将这些曲线与理论界限进行比较。
带有穿刺的卷积编码
速率为1/2,限制长度为7comm.ConvolutionalEncoder
系统对象。该编码器采用1位符号作为输入,生成2位符号作为输出。如果您假定3位消息字作为输入,那么编码器将生成6位码字输出。
召集人= comm.ConvolutionalEncoder(poly2trellis(7, [171 133]));
指定一个穿刺图案,使用穿刺图案向量[1;1;0;1;1;0],从先前的1/2码创建速率3/4码。穿刺图案向量中的1表示传输位置1、2、4、5的位,而0表示从传输信号中刺穿或去除位置3、6的位。穿孔的效果是,现在每3位输入,穿孔代码生成4位输出(与穿孔前产生的6位相反)。结果是速率为3/4的代码。在这里的示例中,穿刺图案向量的长度必须是6的整数倍,因为3位输入通过速率1/2卷积编码器转换为6位输出。
要在卷积编码器System对象中设置所需的穿刺模式,hConvEnc
,设置PuncturePatternSource
财产财产
和PuncturePattern
财产[1; 1, 0, 1, 1, 0]
.
convEncoder。PuncturePatternSource =“属性”;convEncoder。PuncturePattern = [1; 1, 0, 1, 1, 0];
调制器和通道
创建一个comm.BPSKModulator
使用二进制相移键控调制在信道上传输编码数据的系统对象。
bpskMod = comm.BPSKModulator;
创建一个comm.AWGNChannel
系统对象。设置NoiseMethod
属性信噪比(Eb/No)
使用每位能量与噪声功率谱密度比(Eb/No)指定噪声级。在运行仿真时,通过改变Eb/No比值来测试编码系统的不同值EbNo
属性。BPSK调制器的输出产生单位功率信号;设置SignalPower
性质为1瓦特。现有的系统是以符号速度进行的;设置SamplesPerSymbol
属性为1。
频道= comm.AWGNChannel (“NoiseMethod”,“信噪比(Eb/No)”,...“SignalPower”, 1“SamplesPerSymbol”1);
维特比解码与脱刺
配置一个comm.ViterbiDecoder
系统对象,因此它解码为卷积编码器指定的穿透码。本例假设Viterbi解码器的输入为非量化的,因此设置InputFormat
财产Unquantized
.
vitDecoder = comm.ViterbiDecoder(poly2trellis(7, [171 133])),...“InputFormat”,“Unquantized”);
一般来说,卷积编码器和维特比解码器使用的穿刺模式向量必须相同。要指定穿刺模式,设置PuncturePatternSource
维特比解码器的属性hVitDec
,财产
.设置PuncturePattern
属性与用于卷积编码器的穿刺图案向量相同。
因为被刺穿的比特没有被传输,所以没有信息来表示它们的值。因此,解码过程会忽略它们。
vitDecoder。PuncturePatternSource =“属性”;vitDecoder。PuncturePattern = convEncoder.PuncturePattern;
对于没有穿孔的速率1/2码,通常将维特比译码器的回溯深度设置为接近40的值。为了给解码器提供足够的数据来解决刺穿引起的歧义,对刺穿码的解码要求较高的值。本例使用的回溯深度为96。属性设置此值TraceBackDepth
维特比解码器对象的属性,hVitDec
.
vitDecoder。TracebackDepth = 96;
计算错误率
创建一个comm.ErrorRate
比较解码位和原始传输位的系统对象。错误率计算器对象的输出是一个包含计算误码率(BER)、观察到的错误数和处理的比特数的三元素向量。维特比解码器在输出解码的比特流中创建一个与回溯长度相等的延迟。为了解释这个延迟,设置ReceiveDelay
属性的错误率计算器系统对象为96。
errorCalc = comm.ErrorRate (“ReceiveDelay”, vitDecoder.TracebackDepth);
分析了不同噪声水平下穿孔编码系统的误码率性能。
未编码和编码Eb/No比率值
通常,您根据信道编码器输入处可用的每位能量与噪声功率谱密度比(Eb/No)的值来衡量系统性能。原因是这个量是由系统工程师直接控制的。分析了2 ~ 5db的Eb/No编码系统的性能。
EbNoEncoderInput = 2:0.5:5;在dB %
进入AWGN信道的信号是编码信号。转换Eb/No值,使它们与编码器输出的能量比相对应。如果输入3位编码器,得到4位输出,则能量关系按3/4速率给出如下:
bnoencoderoutput = bnoencoderinput + 10*log10(3/4);
模拟循环
为了获得误码率性能的结果,需要在通信系统中传输3000比特的帧。对于每个Eb/No值,在达到特定数量的错误或传输时停止模拟。为了提高结果的准确性,可以增加目标误差数或最大传输次数。
frameLength = 3000;%该值必须是3的整数倍targetErrors = 300;maxNumTransmissions = 5 e6;
循环经过编码的Eb/No值(模拟将花费几秒钟完成)。
BERVec = 0(3、长度(EbNoEncoderOutput));%分配内存来存储结果为n=1:length(EbNoEncoderOutput) reset(errorCalc) reset(召集人编码器)reset(vitDecoder) channel。EbNo = EbNoEncoderOutput (n);%设置模拟的通道EbNo值而(BERVec(2,n) < targetErrors) && (BERVec(3,n) < maxnumtransmission)%生成由frameLength变量指定大小的二进制帧数据= randi([0 1], frameLength, 1);对数据进行卷积编码encData = convEncoder(数据);%调制编码数据modData = bpskMod (encData);%将调制后的信号通过AWGN通道channelOutput =通道(modData);%通过通道复输出的实部作为未量化输入到维特比解码器。decData = vitDecoder(真正的(channelOutput));%计算和累积错误BERVec(:,n) = errorCalc(data, decData);结束结束
比较结果与理论曲线
我们比较了仿真结果,使用了一个近似的误码概率界,以[1]为单位。下面的命令使用中Eb/No值的求和的前七项来计算这个界的近似2:0.5:5
.nerr的值可以在[2]的表2中找到。
dist = 11;Nerr = [42 201 1492 10469 62935 379644 2253373];codeRate = 3/4;绑定= nerr *(1/6) *误差补函数(√codeRate *(10.0。^ ((2:.02:5)/ 10))* dist))的;
阴谋的结果。如果为模拟指定的目标错误数或最大传输数过小,曲线拟合算法可能会失败。
berfit (EbNoEncoderInput BERVec (1:));%曲线拟合仿真结果持有在;semilogy((2: .02:5)绑定,‘g’);%的理论结果传奇(“经验系统”,“适合模拟误码率”,“误码率的理论界限”轴([1 6 10^-5 1])
在某些情况下,在较低的误码率下,模拟结果似乎表明误码率略高于界限。这是由模拟方差(如果观察到小于500位错误)或译码器中有限的回溯深度造成的。
我们利用几个System对象来模拟一个带有卷积编码和穿刺的通信系统。我们模拟了系统在不同Eb/No比值下的误码率性能。将误码率结果与理论界限进行比较。
Yasuda, Y., K. Kashiki, Y. Hirata,“用于软判决维特比解码的高速率穿透卷积码”,IEEE通信学报,Vol. COM-32, March, 1984, pp. 315-319
Begin, G., Haccoun, D., and Paquin, C.,“用于维特比和顺序解码的高速率穿透卷积码的进一步结果”,《IEEE通信汇刊》,第38卷,第11期,1990年11月,p. 1923