这个例子展示了如何使用卷积编码器和维特比解码器系统对象来模拟穿孔编码系统。维特比解码器的复杂性随着码率的增加而迅速增加。刺穿是一种技术,允许使用标准速率1/2编码器和解码器编码和解码更高速率的代码。
本例展示了一个由随机二进制源、卷积编码器、BPSK调制器、加性高斯白噪声(AWGN)信道和维特比解码器组成的通信系统的仿真。该示例展示了如何运行模拟以获得误码率(BER)曲线,并将这些曲线与理论边界进行比较。
带穿刺的卷积编码
创建速率为1/2,约束长度为7comm.ConvolutionalEncoder
系统对象。该编码器以1位符号作为输入,并生成2位符号作为输出。如果假设3位消息字作为输入,那么编码器将生成6位码字输出。
convcoder = com . 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位输出。
要在卷积编码器系统对象中设置所需的穿刺模式,hConvEnc
,设置PuncturePatternSource
财产财产
和PuncturePattern
财产[1; 1, 0, 1, 1, 0]
.
convEncoder。PuncturePatternSource =“属性”;convEncoder。puncrepattern = [1;1;0;1;1;0];
调制器和通道
创建一个comm.BPSKModulator
在信道上使用二进制相移键控调制传输编码数据的系统对象。
bpskMod = com . bpskmodulator;
创建一个comm.AWGNChannel
系统对象。设置NoiseMethod
属性的通道信噪比(Eb/No)
使用每比特能量与噪声功率谱密度之比(Eb/No)来指定噪声级别。运行模拟时,通过改变Eb/No比值的值来测试编码系统EbNo
通道对象的属性。BPSK调制器的输出产生单元功率信号;设置SignalPower
属性为1瓦。手头的系统是符号速率;设置SamplesPerSymbol
属性为1。
通道= com . awgnchannel (“NoiseMethod”,信噪比(Eb/No),...“SignalPower”, 1“SamplesPerSymbol”1);
维特比解码与去刺
配置一个comm.ViterbiDecoder
对象,因此它解码为卷积编码器指定的穿孔代码。本例假设Viterbi解码器的非量化输入,因此设置InputFormat
财产Unquantized
.
vitDecoder = com . viterbidecoder (poly2trellis(7, [171 133]),...“InputFormat”,“Unquantized”);
通常,用于卷积编码器和维特比解码器的穿刺模式向量必须相同。要指定穿刺模式,请设置PuncturePatternSource
属性的维特比解码器系统对象,hVitDec
,财产
.设置PuncturePattern
属性设置为用于卷积编码器的相同穿刺模式向量。
因为被击穿的比特没有被传输,所以没有信息表明它们的值。结果,解码过程忽略了它们。
vitDecoder。PuncturePatternSource =“属性”;vitDecoder。标点图案= convcode .标点图案;
对于速率为1/2且没有刺穿的代码,通常将维特比解码器的回溯深度设置为接近40的值。解码被刺穿的代码需要一个更高的值,以便为解码器提供足够的数据来解决刺穿所带来的模糊性。本例使用的回溯深度为96。属性设置此值TraceBackDepth
维特比解码器对象的属性,hVitDec
.
vitDecoder。TracebackDepth = 96;
计算错误率
创建一个comm.ErrorRate
calculator用于比较解码位与原始传输位的系统对象。错误率计算器对象的输出是一个三元素向量,包含计算的误码率(BER)、观察到的错误数和处理的比特数。维特比译码器在输出译码的位流中产生等于回溯长度的延迟。要考虑此延迟,请设置ReceiveDelay
将错误率计算器系统对象设置为96。
errorCalc = com . errorrate (“ReceiveDelay”, vitDecoder.TracebackDepth);
分析了不同噪声水平下穿孔编码系统的误码率性能。
未编码和编码Eb/No比值值
通常,您可以根据通道编码器输入处可用的每比特能量与噪声功率谱密度比(Eb/No)的值来测量系统性能。原因是这个数量是由系统工程师直接控制的。分析Eb/No值在2到5 dB之间的编码系统的性能。
EbNoEncoderInput = 2:0.5:5;% (dB)
进入AWGN信道的信号为编码信号。转换Eb/No值,使其与编码器输出的能量比相对应。如果向编码器输入3位,并获得4位输出,则能量关系由3/4速率给出如下:
EbNoEncoderOutput = EbNoEncoderInput + 10*log10(3/4);
模拟循环
为了获得误码率性能结果,可以通过通信系统传输3000位的帧。对于每个Eb/No值,在达到特定数量的错误或传输时停止模拟。为了提高结果的准确性,可以增加目标错误数或最大传输数。
frameLength = 3000;%此值必须是3的整数倍targetErrors = 300;maxnumtransfers = 5e6;
循环经过编码的Eb/No值(模拟将花费几秒钟完成)。
BERVec = 0 (3,length(EbNoEncoderOutput));分配内存来存储结果为n=1:length(EbNoEncoderOutput) reset(errorCalc) reset(convcoder) reset(vitDecoder) channel。EbNo = EbNoEncoderOutput(n);设置模拟通道EbNo值而(BERVec(2,n) < targetErrors) && (BERVec(3,n) < maxnumtransfers)生成由frameLength变量指定大小的二进制帧data = randi([0 1], frameLength, 1);%卷积编码数据encData = convcoder (data);调制编码的数据modData = bpskMod(encData);将调制信号通过AWGN信道传递channelOutput = channel(modData);将通道复数输出的实部作为非量化输出传递%输入到维特比解码器。decData = vitDecoder(real(channelOutput));计算并积累错误BERVec(:,n) = errorCalc(data, decData);结束结束
将结果与理论曲线进行比较
我们比较模拟结果使用一个近似的误码概率为每个刺穿的代码为[1]。中的Eb/No值的和的前七个项,下面的命令计算这个界的近似值2:0.5:5
.nerr的值见[2]的表2。
区域= 5: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,“用于软决策Viterbi解码的高速率刺穿卷积码”,IEEE®通讯汇刊,COM-32卷,1984年3月,第315-319页
Begin, G., Haccoun, D.和Paquin, C.,“用于Viterbi和顺序解码的高速率刺穿卷积码的进一步结果”,IEEE通讯汇刊,第38卷,第11期,1990年11月,第1923页