摘 要 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真,并进行误码率分析。
实验原理
QPSK:QPSK是英文QuadraturePhaseShiftKeying的缩略语简称,
意为正交相移键控,是一种数字调制方式。四相相移键控信号简称“QPSK”。它分为绝对相移和相对相移两种。
卷积码:又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。卷积码是在一个滑动的数据比特序列上进行模2和操作,从而生成一个比特码流。卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输入的信息序列得到连续输出的已编码序列。卷积码具有误码纠错的能力,首先被引入卫星和太空的通信中。NASA标准(2,1,6)卷积码生成多项式为:
346g1(D)1DDDD 6345g2(D)1DDDD其卷积编码器为:
+输入序列输出c1+
图1.1 K=7,码率为1/2的卷积码编码器
输出c2
维特比译码:采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。如果接收到L组信息比特,每个符号包括v个比特。接收到的Lv比特序列与2L条路径进行比较,汉明距离最近的那一条路径被选择为最有可能被传输的路劲。当L较大时,使得译码器难以实现。维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。它并不是在网格图上一次比较所有可能的2kL条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。
下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。为了能说明解码过程,这里给出该码的状态图,如图2.2所
y1j b
00 11 a 11 c 00 10 01 01 d 10输入序列 m1,m2,…mj,… mj mj-1 mj-2 输出序列 y2j
图2.1 (2,1,3)卷积码编码器
图2.2 (2,1,3)卷积码状态图
示。维特比译码需要利用图来说明移码过程。根据卷积码画网格的方法,我们可以画出该码的网格图,如图2.3所示。该图设接收到的序列长度为8,所以画8个时间单位,图中分别标以0至7。这里设编码器从a状态开始运作。该网格图的每一条路径都对应着不同的输入信息序列。由于所有可能输入信息序列共有2kL个,因而网格图中所有可能的路径也为2L条。这里节点a=00,b=10,c=01,d=11。
节点号 0
00 11 1
00 11 2
00 11 11 3
00 11 11 00 10 01 01 01 4
00 11 11 10 00 5
00 11 10 6
00 11 7
a b
10 c d
01 01 01 01 01 01 01 01
图2.3 (2,1,3)卷积码网格图
设输入编码器的信息序列为(11011000),则由编码器对应输出的序列为Y=(1101010001011100)。若收到的序列R=(0101011001011100),对照网格图来说明维特比译码的方法。
首先选择接收序列的前6位序列R1=(010101)同到达第3时刻的可能的8个码序列(即8条路径)进行比较,并计算出码距。该例中到达第3时刻a点的路径序列是(000000)和(111011),他们与R1的距离分别为3和4;到达第3时刻b点的路径序列是(000011)和(111000),他们与R1的距离分别为3和4;到达第3时刻c点的路径序列是(001110)和(110101),他们与R1的距离分别为4和1;到达第3时刻d点的路径序列是(001101)和(110110),他们与R1的距离分别为2和3。上述每个节点都保留码距较小的路径作为幸存路径,所以幸存路径码序列是(000000)、(000011)、(1101001)和(001101),如图2.4所示。用于上面类似的方法可以得到第4、5、6、7时刻的幸存路径。
节点号 0
00 11 1
00 11 2
00 11 3
a b c d
01 01 01
图2.4 维特比译码第3时刻幸存路径
需要指出的是,对于某个节点,如果比较两条路径与接收序列的累计码距值
相等时,则可以任意选者一条路径作为幸存路径,此时不会影响最终的译码结果。在码的终了时刻a状态,得到一条幸存路径。如果2.5所示。由此可看到译码器节点号
0
11 1
2
3
4
5
6
7 00 11 00 01 8
a b c d
01 01 01
图2.5 第8时刻幸存路径
输出是R’=(1101010001011100),即可变换成序列(11011000),恢复了发端原始信息。比较R’和R序列,可以看到在译码过程中已纠正了在码序列第1和第7位上的差错。当然如果差错出现太频繁,以致超出卷积码的纠错能力,还是会发生纠误的。
仿真分析
本实验用matlab仿真一个简单的OFDM系统中,观察在不同信噪比下的卷积码和Viterbi算法软判决译码的性能,并与没有编码的接收信号的误码率进行比较。
主要调用函数的介绍:
1. trellis = poly2trellis(7,[155 117]);
产生约束长度为7,一输入两输出的卷积码,比特连接向量分别为: 1101101,1001111;
2. code = convenc(Signal,trellis);
将原始信号进行卷积编码,编码器由上式产生; 3. REdata=awgn(TrData,SNR(i),'measured'); 加性高斯白噪声信道;
4. [d m p in] =vitdec(ReSig,trellis,tblen,'cont','soft',1);
利用Viterbi 算法译卷积码。ReSig为poly2trellis函数或istrellis函数定义的格形trellis结构的卷积码。参数tblen 取正整数,表示记忆(traceback)深度。参数'cont'代表解码操作模型,假设编码器在全零状态开始。'soft'表示软判决,参数
nsdec做信道量化。
仿真结果:
下图显示的是在不同信噪比下,通过卷积编码和维特比译码与未编码的接收端误码率的对比。在低信噪比时(小于等于7dB时),未编码的误码率要低于编码的误码率。这是因为在低信噪比的情况下,卷积码的纠错能力范围超过纠错门限后,纠错码就不是纠错了,而是加错了。当信噪比比较高时,编码的误码率要好于未编码的误码率。
图2卷积编码和原始信号在不同信噪比下的接收端的误码率
程序代码:
SNR=1:0.5:15; %信噪比取值;单位为db\\ Ns=10;
datalength=256; %每个数据符号中可用子载波
error_bit_rata_code=0; %经卷积编码后解调出的数据的误比特率 error_bit_rata_nocode=0; %未经卷积编码后解调出的数据的误比特率
for i=1:1:29
Signal=double(rand(1,datalength*Ns)>0.5); trel = poly2trellis(7,[155 117]); code = convenc(Signal,trel); %进行串并转化
Para=reshape(code,datalength,2*Ns);
%进行QPSK数据调制,将数据分为两个通道,SigPara为datalength行2Ns列 for j=1:Ns
s1(:,j)=Para(:,2*j-1);%ich为datalength行Ns列 s2(:,j)=Para(:,2*j); end
kmod=1./sqrt(2); s1=s1.*kmod; s2=s2.*kmod;
x=s1+s2.*sqrt(-1); % 产生复信号
y=ifft(x); %通过傅立叶反变换,将频域数据转换为时域数据 ich2=real(y); %I信道取变换后的实部 qch2=imag(y); %Q信道取变换后的虚部 ich4=reshape(ich2,1,datalength*Ns); qch4=reshape(qch2,1,datalength*Ns); TrData=ich4+qch4.*sqrt(-1); % 加入高斯白噪声
ReData=awgn(TrData,SNR(i),'measured');
idata=real(ReData); qdata=imag(ReData); %进行串并转化
idata1=reshape(idata,datalength,Ns); qdata1=reshape(qdata,datalength,Ns); Rex=idata1+qdata1.*sqrt(-1); ry=fft(Rex);
ReIChan=real(ry); ReQChan=imag(ry);
ReIChan=ReIChan/kmod; ReQChan=ReQChan/kmod; for j=1:Ns
RePara(:,2*j-1)=ReIChan(:,j);
RePara(:,2*j)=ReQChan(:,j); end
ReSig=reshape(RePara,1,datalength*Ns*2); %符号抽样判决
ReSig=double(ReSig>0.5); %维特比译码
tblen= log2(trel.numInputSymbols)
[d m p in] =vitdec(ReSig,trel,tblen,'cont','soft',1); %统计错误比特数,并计算误比特率
error_bit_code=sum(abs(d(2:datalength*Ns)-Signal(1:datalength*Ns-1))) ; error_bit_nocode(i)=sum(abs(ReSig-code));
error_bit_rata_code1=error_bit_code/length(Signal); error_bit_rata_code(i)=error_bit_rata_code1;
error_bit_rata_nocode(i)=error_bit_nocode(i)/2/length(Signal); end figure(1);
plot(SNR,error_bit_rata_nocode,'-ro',SNR,error_bit_rata_code,'-.b'); h=legend('没有卷积','卷积',1); grid on;
因篇幅问题不能全部显示,请点此查看更多更全内容