1、桂林电子科大软件无线电课程论文桂林电子科大软件无线电课程论文引言卷积码是1955年由Elias等人提出的,是一种非常有前途的编码方法。我们在一些资料上可以找到关于分组码的一些介绍,分组码的实现是将编码信息分组单独进行编码,因此无论是在编码还是译码的过程中不同码组之间的码元无关。卷积码的Viterbi 译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真。卷积码的译码有两种方法软判决和硬判决,此课程设计采用硬判决的维特比译
2、码。1卷积码编码及译码原理1.1卷积码编码原理 卷积码是一种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。卷积码一般表示为(n,k,K)的形式,即将k各信息比特编码为n个比特的码组,K为编码约束长度,说明编码过程中相互约束的码段个数。卷积码编码后的n各码元不经与当前组的k个信息比特有关,还与前K-1个输入组的信息比特有关。编码过程中相互关联的码元有K*n个。R=k/n是编码效率。编码效率和约束长度是衡量卷积码的两个重要参数。典型的卷积码一般选n,k较小,但 K值可取较大(10),以获得简单而高性能的卷积码。 卷积码的编码描述方式有很多
3、种:冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。1.1.1卷积码解析表示法卷积码的解析表示发大致可以分为离散卷积法,生成矩阵法,码多项式法。下面以离散卷积为例进行说明。 卷积码的编码器一般比较简单,为一个具有 k 个输入端,n 个输出端,m 级移位寄存器的有限状态有记忆系统。下图所示为(2,1,7)卷积码的编码器。若输入序列为 u=(u0u1u2u3 ), 则对应两个码字序列c=(c0c1c2c3 )和c=(c0c1c2c3 )相应的编码方程可写为c=u*g,c=u*g,c=(c,c)。“*”符号表示卷积运算,g,g表示编码器的两个冲激响应,即编码器的
4、输出可以由输入序列和编码器的两个冲击响应卷积而得到,故称为卷积码。这里的冲激响应指:当输入为1 0 0 0 0 序列时,所观察到的两个输出序列值。由于上图K值为7,故冲激响应至多可持续到第7位,可写为g=1 1 1 1 0 0 1,g=1 0 1 1 0 1 1然后将两个输出端的码字序列合并为一个码字序列为c=(c0c0c1c1c2c2 )若输入信息序列为1 1 0 1;则c=1 0 0 1 0 1 0 1 0 1,c=1 1 1 1 1 0 1 1 1 1c=1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1。下图所示为(2,1,3)卷积码的编码器,也是本次课程设
5、计所研究的卷积码编码器,由于其生成冲激响应分别为1 1 1和1 0 1,故被称为(7,5)码。1.1.2 卷积码图形表示法 除了用解析法描述卷积码的编码外,还可以使用比较形象的图形法来表示卷积码。比较常用的有状态图法,网格图法和树图法。下面简介状态图法和网格图法。 状态图法: 由于卷积码编码器在下一时刻的输出取决于编码器的当前状态和下一时刻的输入,而编码器当前状态取决于编码器当前各移位寄存器的存储内容。称编码器当前各移位寄存器存储内容(0 或)为编码器在该时刻的状态(此状态代表记忆以前的输入信息)。随着信息序列的不断输入,编码器不断从一个状态转移到另外一个状态,并且输出相应的编码序列。编码器的
6、总可能状态数为2mk 个。对(7,5)码的编码器来说,n=2,k=1,K=3,m=2。共有四个可能状态,其状态图如下:图中四个方块表示状态,状态间的连线与箭头表示转移方向,连线上的数字表示是状态发生转移的到来比特,斜杠后的数字由一个状态到另一个状态转移时的输出码字。如当前状态为 11,输入信息为 0,则转移到 01 状态并输出 01 码字,若输入信息为 1,则依然为 11状态并输出 10 码字。网格图法: 网格图可以描述卷积码的状态随时间推移而转移的情况。该图纵坐标表示所有状态,横坐标表示时间。网格图在卷积码的概率译码,特别是 Viterbi 译码中非常重要,它综合了状态图法直观简单和树图法时
7、序关系清晰的特点。如下图图中实线表示输入 0 时所走分支,虚线表示输入 1 时所走分支,编码时只需从起始状态开始依次选择路线并读出输出即可。假设从 a 状态开始,输入为1 0 1 1,则可由图中读出输出为11 10 10 01。1.2 卷积码译码原理 卷积码的译码方式主要有三种: 1).1963 年 Massey 提出的门限译码,这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码。 2).1963 年有 Fano 改进的序列译码,这是基于码的树状图结构的一种准最佳概率译码。 3).1967 年 Viterbi 提出的 Viterbi 算法,基于码的网格图基础上的最大似然译码算法,是
8、一种最佳概率译码。 其中,代数译码,利用编码本身的代数结构进行译码,不考虑信道本身的统计特性。该方法的硬件实现简单,但性能较差,其中具有典型意义的是门限译码。另一类是概率译码,这种译码通常建立在最大似然准则的基础上。由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。常用的概率译码方法有维特比译码和序列译码。维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。 1.2.1 Viterbi 译码 卷积码概率译码的基本思路是:以接收码流为基础,逐个计算它与其他所有可能出现的、连续的
9、网格图路径的距离,选出其中可能性最大的一条作为译码估值输出。概率最大在大多数场合可解释为距离最小,这种最小距离译码体现的正是最大似然的准则。卷积码的最大似然译码与分组码的最大似然译码在原理上是一样的,但实现方法上略有不同。主要区别在于:分组码是孤立地求解单个码组的相似度,而卷积码是求码字序列之间的相似度。基于网格图搜索的译码是实现最大似然判决的重要方法和途径。用格图描述时,由于路径的汇聚消除了树状图中的多余度,译码过程中只需考虑整个路径集合中那些使似然函数最大的路径。如果在某一点上发现某条路径已不可能获得最大对数似然函数,就放弃这条路径,然后在剩下的幸存路径中重新选择路径。这样一直进行到最后第
10、 L 级(L 为发送序列的长度)。由于这种方法较早地丢弃了那些不可能的路径,从而减轻了译码的工作量,Viterbi 译码正是基于这种想法。对于(n, k, K )卷积码,其网格图中共 2kL 种状态。由网格图的前 K-1 条连续支路构成的路径互不相交,即最初 2k_1 条路径各不相同,当接收到第 K 条支路时,每条路径都有 2 条支路延伸到第 K 级上,而第 K 级上的每两条支路又都汇聚在一个节点上。在 Viterbi译码算法中,把汇聚在每个节点上的两条路径的对数似然函数累加值进行比较,然后把具有较大对数似然函数累加值的路径保存下来,而丢弃另一条路径,经挑选后第 K 级只留下 2K 条幸存路径
11、。选出的路径同它们的对数似然函数的累加值将一起被存储起来。由于每个节点引出两条支路,因此以后各级中路径的延伸都增大一倍,但比较它们的似然函数累加值后,丢弃一半,结果留存下来的路径总数保持常数。由此可见,上述译码过程中的基本操作是,加-比-选,即每级求出对数似然函数的累加值,然后两两比较后作出选择。有时会出现两条路径的对数似然函数累加值相等的情形,在这种情况下可以任意选择其中一条作为幸存路径。 卷积码的编码器从全零状态出发,最后又回到全零状态时所输出的码序列,称为结尾卷积码。因此,当序列发送完毕后,要在网格图的终结处加上(K-1)个己知的信息作为结束信息。在结束信息到来时,由于每一状态中只有与已
12、知发送信息相符的那条支路被延伸,因而在每级比较后,幸存路径减少一半。因此,在接收到(K-1)个己知信息后,在整个网格图中就只有唯一的一条幸存路径保留下来,这就是译码所得的路径。也就是说,在己知接收到的序列的情况下,这条译码路径和发送序列是最相似的。2MATLAB 仿真 在本次课程设计中,我们对整个通信过程进行了仿真,其过程如下:下面将分别对每一部分进行仿真2.1 卷积码编码仿真 在程序设计中,我们没有采用 MATLAB 自带的编码函数而是采用了自己的编码函数 codec,其参数 m 为输入信息序列,g1,g2 为两个输出端口的冲激响应序列。function cod=codec(m,g1,g2)
13、%g1,g2为两输出端口的冲激响应序列。 m1=conv(m,g1); m2=conv(m,g2); l=length(m1); for i=1:l; cod(2*i-1)=rem(m1(i),2); cod(2*i)=rem(m2(i),2); end 下为试运行编码结果,g1=1 1 1,g2=1 0 1。 clear all g1=1 1 1; g2=1 0 1; msg=1 1 0 1; cod=codec(msg,g1,g2) 输出为: cod =110101001011 符合预期结果。 2.2 信道传输过程仿真 为了方便起见,我们采用了BPSK调制,为了了解整个通信系统,我们对BP
14、SK的调制过程作了研究,用一个简短的程序对BPSK的全过程进行了观察。function bpsk_output=bpsk_1(bpsk_input); %g=1 0 1 1 1 0 0 1;基带信号 g=bpsk_input; f=100; %载波频率t=0:2*pi/99:2*pi; cp=;sp=; mod=;mod1=;bit=;for n=1:length(g); if g(n)=0; die=-ones(1,100); %Modulantese=ones(1,100); %end c=sin(f*t); cp=cp die; mod=mod c; bit=bit se; end bp
15、sk=cp.*mod; subplot(2,1,1);plot(bit,LineWidth,1.5);grid on; title(Binary Signal); axis(0 100*length(g) -2.5 2.5); bpsk_output=bpsk; subplot(2,1,2);plot(bpsk,LineWidth,1.5);grid on; title(BPSK modulation); axis(0 100*length(g) -2.5 2.5); 观察到如下波形 上图很好的符合了BPSK的调制特性。 信道中存在噪声,我们对高斯白噪声信道做了模拟,采用noise=randn
16、(1,length(bpsk); sigma=sqrt(5)*10(-w/20); recv=bpsk+3*sigma*noise; 来产生噪声并叠加到BPSK调制信号上,w为信噪比。由于高斯白噪声的固有性质。若,则X为高斯随机变量,数学期望0,方差为。则对于BPSK系统,接收信号为其中。则知Z也为高斯随机变量。由以上分析,为了简便起见,在主程序中可以直接将高斯白噪声叠加到输入-1,1序列上,即将调制过程简化为bpsk=cod*2-1; noise=randn(1,length(bpsk); recv=bpsk+3*sigma*noise; 其中cod为编码序列。 解调时由于涉及软硬判决的信道
17、信息问题,故留在Viterbi译码时一并讨论。2.3译码过程仿真 维特比译码可分为软判决和硬判决两种,下面我们对其分别进行仿真研究。2.3.1 硬判决译码硬判决译码即比较汉明距作为累计度量,故直接将接收序列转为0,1序列即可,此时的判决代码为:for j=1:length(recv); if recv(j)0; recv(j)=1; else recv(j)=0; end end 相应的译码程序为: function dec=Hviterbi(cod) leth=length(cod)/2; nextstate=0 2;0 2;1 3;1 3;%储存下一个到达状态信息 outputs=0 3;
18、3 0;1 2;2 1;%储存状态转移时的输出信息。 suropt=zeros(4,leth-2);%使用2维数组保存幸存路径信息。 suroptem=suropt; current=0 0 0 0;%保存到达当前路径的累计汉明距值 current(1)=HMdist(0 0 0 0,cod(1 2 3 4);%初始化前两步的码重度量信息 current(2)=HMdist(1 1 0 1,cod(1 2 3 4);% current(3)=HMdist(0 0 1 1,cod(1 2 3 4);% current(4)=HMdist(1 1 1 0,cod(1 2 3 4);% suropt
19、(1,1 2)=0 0;%前两步的输出信息 suropt(2,1 2)=1 0; suropt(3,1 2)=0 1; suropt(4,1 2)=1 1; currenttem=0 0 0 0; ls=1 0;2 0;3 0;4 0;1 1;2 1;3 1;4 1; %保存能到达当前状态的前两个状态 for i=3:(leth-2); %开始译码 for x=1:4; c=HMdist(deci2bin(outputs(ls(x*2-1,1),ls(x*2-1,2)+1),2),cod(i*2-1 i*2);%有两个状态能转移到当前状态,计算其中一个转移过来时的输出与当前接收码的汉明距。 d
20、=HMdist(deci2bin(outputs(ls(x*2,1),ls(x*2,2)+1),2),cod(i*2-1i*2); 计算另外一个状态转移过来时的输出与当前接收码的汉明距。 if (current(ls(x*2-1,1)+c)(current(ls(x*2,1)+d);%比较找出累计码重较小的一个 currentem(x)=current(ls(x*2-1,1)+c; suroptem(x,:)=suropt(ls(x*2-1,1),:); suroptem(x,i)=ls(x*2-1,2); else%= currentem(x)=current(ls(x*2,1)+d;% s
21、uroptem(x,:)=suropt(ls(x*2,1),:); suroptem(x,i)=ls(x*2,2); end end current=currentem; suropt=suroptem; end a=1 9999; for s=1:4;%找出累计度量最小的路径,即最佳路径 if current(s)0); sigma=sqrt(5)*10(-w/20); cod=codec(msg,g1,g2); bpsk=cod*2-1; noise=randn(1,length(bpsk); recv=bpsk+3*sigma*noise; de=Sviterbi(recv,3) 即不判
22、决而将直接将接收电平序列输入Viterbi软判决译码器。量化程序如下:function o=quantization(s,l); o=0; if s1; o=2l; elseif s1/2(l+1)+(i-1)/2l; o=o+1; end end if s0; o=-o; end end o=(o+2l)/2(l+1); l为量化比特数,s为输入电平序列。程序将输入电平均匀量化为01之间的一级数。一共 2l 级电平。软判决代码如下:function dec=Sviterbi(recv,l); leth=length(recv)/2; for i=1:length(recv); qr(i)=q
23、uantization(recv(i),l); end nextstate=0 2;0 2;1 3;1 3; outputs=0 3;3 0;1 2;2 1; suropt=zeros(4,leth-2); suroptem=suropt; current=0 0 0 0; current(1)=EUdist(0 0 0 0,qr(1 2 3 4); current(2)=EUdist(1 1 0 1,qr(1 2 3 4); current(3)=EUdist(0 0 1 1,qr(1 2 3 4); current(4)=EUdist(1 1 1 0,qr(1 2 3 4); suropt
24、(1,1 2)=0 0; suropt(2,1 2)=1 0; suropt(3,1 2)=0 1; suropt(4,1 2)=1 1; currenttem=0 0 0 0; ls=1 0 0;2 0 0;3 0 0;4 0 0;1 0 1;2 0 1;3 0 1;4 0 1; for i=3:(leth-2); for x=1:4; c=EUdist(deci2bin(outputs(ls(x*2-1,1),ls(x*2-1,3)+1),2),qr(i*2-1i*2); d=EUdist(deci2bin(outputs(ls(x*2,1),ls(x*2,3)+1),2),qr(i*2-
25、1i*2); if (current(ls(x*2-1,1)+c)(current(ls(x*2,1)+d); currentem(x)=current(ls(x*2-1,1)+c; suroptem(x,:)=suropt(ls(x*2-1,1),:); suroptem(x,i)=ls(x*2-1,3); else currentem(x)=current(ls(x*2,1)+d; suroptem(x,:)=suropt(ls(x*2,1),:); suroptem(x,i)=ls(x*2,3); end end current=currentem; suropt=suroptem; e
26、nd a=1 9999; for s=1:4 if current(s)0);%每次96比特信息 sigma=sqrt(5)*10(-w/20); cod=codec(msg,g1,g2); bpsk=cod*2-1; noise=randn(1,length(bpsk); recv=bpsk+3*sigma*noise; %叠加噪声 de=Sviterbi(recv,3);%直接将电平送入译码器 q=q+HMdist(msg,de);%计算总误码数 end q=q+0 c(w)=10*log10(q/19200);%将误码率转为dB形式 end for w=1:20;% a=0; for i
27、=1:200; sigma=sqrt(5)*10(-w/20); msg=(randn(1,96)0); cod=codec(msg,g1,g2); bpsk=cod*2-1; noise=randn(1,length(bpsk); recv=bpsk+3*sigma*noise; for j=1:length(recv);%先判决 再将0 1序列送入硬判决译码器 if recv(j)0; recv(j)=1; else recv(j)=0; end end de=Hviterbi(recv);% a=a+HMdist(msg,de);% end a=a+0 e(w)=10*log10(a/19200); end plot(c); %画图 grid on; hold on; plot(e); 3实验心得及总结本次实验可以算是一波三折,我们选择了 卷积码Viterbi 译码这个当时觉得很难的课题,但是由于当时还没有接触到分组码卷积码等内容,听的其实不是很明白,后来自己在课余时间将信道编码那一章完全读过一次后才初步了解了卷积码和Viterbi 译码的基本原理。但是由于各种
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1