桂林电子科大《软件无线电》课程论文.docx
《桂林电子科大《软件无线电》课程论文.docx》由会员分享,可在线阅读,更多相关《桂林电子科大《软件无线电》课程论文.docx(21页珍藏版)》请在冰豆网上搜索。
桂林电子科大《软件无线电》课程论文
桂林电子科大《软件无线电》课程论文
引言
卷积码是1955年由Elias等人提出的,是一种非常有前途的编码方法。
我们在一些资料上可以找到关于分组码的一些介绍,分组码的实现是将编码信息分组单独进行编码,因此无论是在编码还是译码的过程中不同码组之间的码元无关。
卷积码的Viterbi译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。
本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真。
卷积码的译码有两种方法——软判决和硬判决,此课程设计采用硬判决的维特比译码。
1卷积码编码及译码原理
1.1卷积码编码原理
卷积码是一种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。
卷积码一般表示为(n,k,K)的形式,即将k各信息比特编码为n个比特的码组,K为编码约束长度,说明编码过程中相互约束的码段个数。
卷积码编码后的n各码元不经与当前组的k个信息比特有关,还与前K-1个输入组的信息比特有关。
编码过程中相互关联的码元有K*n个。
R=k/n是编码效率。
编码效率和约束长度是衡量卷积码的两个重要参数。
典型的卷积码一般选n,k较小,但K值可取较大(>10),以获得简单而高性能的卷积码。
卷积码的编码描述方式有很多种:
冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。
1.1.1卷积码解析表示法
卷积码的解析表示发大致可以分为离散卷积法,生成矩阵法,码多项式法。
下面以离散卷积为例进行说明。
卷积码的编码器一般比较简单,为一个具有k个输入端,n个输出端,m级移位寄存器的有限状态有记忆系统。
下图所示为(2,1,7)卷积码的编码器。
若输入序列为u=(u0u1u2u3),
则对应两个码字序列c①=(c0①c1①c2①c3)和c②=(c0②c1②c2②c3)
相应的编码方程可写为c①=u*g①,c①=u*g②,c=(c①,c②)。
“*”符号表示卷积运算,g①,g②表示编码器的两个冲激响应,即编码器的输出可以由输入序列和编码器的两个冲击响应卷积而得到,故称为卷积码。
这里的冲激响应指:
当输入为[10000]序列时,所观察到的两个输出序列值。
由于上图K值为7,故冲激响应至多可持续到第7位,可写为
g①=[1111001],g②=[1011011]
然后将两个输出端的码字序列合并为一个码字序列为
c=(c0①c0②c1①c1②c2①c2②)
若输入信息序列为[1101];
则c①=[1001010101],c②=[1111101111]
c=[11010111011001110111]。
下图所示为(2,1,3)卷积码的编码器,也是本次课程设计所研究的卷积码编码器,由于其生成冲激响应分别为[111]和[101],故被称为(7,5)码。
1.1.2卷积码图形表示法
除了用解析法描述卷积码的编码外,还可以使用比较形象的图形法来表示卷积码。
比较常用的有状态图法,网格图法和树图法。
下面简介状态图法和网格图法。
状态图法:
由于卷积码编码器在下一时刻的输出取决于编码器的当前状态和下一时刻的输入,而编码器当前状态取决于编码器当前各移位寄存器的存储内容。
称编码器当前各移位寄存器存储内容(0或)为编码器在该时刻的状态(此状态代表记忆以前的输入信息)。
随着信息序列的不断输入,编码器不断从一个状态转移到另外一个状态,并且输出相应的编码序列。
编码器的总可能状态数为2mk个。
对(7,5)码的编码器来说,n=2,k=1,K=3,
m=2。
共有四个可能状态,其状态图如下:
图中四个方块表示状态,状态间的连线与箭头表示转移方向,连线上的数字表示是状态发生转移的到来比特,斜杠后的数字由一个状态到另一个状态转移时的输出码字。
如当前状态为11,输入信息为0,则转移到01状态并输出01码字,若输入信息为1,则依然为11状态并输出10码字。
网格图法:
网格图可以描述卷积码的状态随时间推移而转移的情况。
该图纵坐标表示所有状态,横坐标表示时间。
网格图在卷积码的概率译码,特别是Viterbi译码中非常重要,它综合了状态图法直观简单和树图法时序关系清晰的特点。
如下图
图中实线表示输入0时所走分支,虚线表示输入1时所走分支,编码时只需从起始状态开始依次选择路线并读出输出即可。
假设从a状态开始,输入为[1011],则可由图中读出输出为[11101001]。
1.2卷积码译码原理
卷积码的译码方式主要有三种:
1).1963年Massey提出的门限译码,这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码。
2).1963年有Fano改进的序列译码,这是基于码的树状图结构的一种准最佳概率译码。
3).1967年Viterbi提出的Viterbi算法,基于码的网格图基础上的最大似然译码算法,是一种最佳概率译码。
其中,代数译码,利用编码本身的代数结构进行译码,不考虑信道本身的统计特性。
该方法的硬件实现简单,但性能较差,其中具有典型意义的是门限译码。
另一类是概率译码,这种译码通常建立在最大似然准则的基础上。
由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。
常用的概率译码方法有维特比译码和序列译码。
维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。
1.2.1Viterbi译码
卷积码概率译码的基本思路是:
以接收码流为基础,逐个计算它与其他所有可能出现的、连续的网格图路径的距离,选出其中可能性最大的一条作为译码估值输出。
概率最大在大多数场合可解释为距离最小,这种最小距离译码体现的正是最大似然的准则。
卷积码的最大似然译码与分组码的最大似然译码在原理上是一样的,但实现方法上略有不同。
主要区别在于:
分组码是孤立地求解单个码组的相似度,而卷积码是求码字序列之间的相似度。
基于网格图搜索的译码是实现最大似然判决的重要方法和途径。
用格图描述时,由于路径的汇聚消除了树状图中的多余度,译码过程中只需考虑整个路径集合中那些使似然函数最大的路径。
如果在某一点上发现某条路径已不可能获得最大对数似然函数,就放弃这条路径,然后在剩下的"幸存"路径中重新选择路径。
这样一直进行到最后第L级(L为发送序列的长度)。
由于这种方法较早地丢弃了那些不可能的路径,从而减轻了译码的工作量,Viterbi译码正是基于这种想法。
对于(n,k,K)卷积码,其网格图中共2kL种状态。
由网格图的前K-1条连续支路构成的路径互不相交,即最初2k_1条路径各不相同,当接收到第K条支路时,每条路径都有2条支路延伸到第K级上,而第K级上的每两条支路又都汇聚在一个节点上。
在Viterbi译码算法中,把汇聚在每个节点上的两条路径的对数似然函数累加值进行比较,然后把具有较大对数似然函数累加值的路径保存下来,而丢弃另一条路径,经挑选后第K级只留下2K条幸存路径。
选出的路径同它们的对数似然函数的累加值将一起被存储起来。
由于每个节点引出两条支路,因此以后各级中路径的延伸都增大一倍,但比较它们的似然函数累加值后,丢弃一半,结果留存下来的路径总数保持常数。
由此可见,上述译码过程中的基本操作是,"加-比-选",即每级求出对数似然函数的累加值,然后两两比较后作出选择。
有时会出现两条路径的对数似然函数累加值相等的情形,在这种情况下可以任意选择其中一条作为"幸存"路径。
卷积码的编码器从全零状态出发,最后又回到全零状态时所输出的码序列,称为结尾卷积码。
因此,当序列发送完毕后,要在网格图的终结处加上(K-1)个己知的信息作为结束信息。
在结束信息到来时,由于每一状态中只有与已知发送信息相符的那条支路被延伸,因而在每级比较后,幸存路径减少一半。
因此,在接收到(K-1)个己知信息后,在整个网格图中就只有唯一的一条幸存路径保留下来,这就是译码所得的路径。
也就是说,在己知接收到的序列的情况下,这条译码路径和发送序列是最相似的。
2MATLAB仿真
在本次课程设计中,我们对整个通信过程进行了仿真,其过程如下:
下面将分别对每一部分进行仿真
2.1卷积码编码仿真
在程序设计中,我们没有采用MATLAB自带的编码函数而是采用了自己的编码函数codec,其参数m为输入信息序列,g1,g2为两个输出端口的冲激响应序列。
functioncod=codec(m,g1,g2)%g1,g2为两输出端口的冲激响应序列。
m1=conv(m,g1);
m2=conv(m,g2);
l=length(m1);
fori=1:
l;
cod([2*i-1])=rem(m1([i]),2);
cod([2*i])=rem(m2([i]),2);
end
下为试运行编码结果,g1=[111],g2=[101]。
clearall
g1=[111];
g2=[101];
msg=[1101];
cod=codec(msg,g1,g2)
输出为:
cod=110101001011
符合预期结果。
2.2信道传输过程仿真
为了方便起见,我们采用了BPSK调制,为了了解整个通信系统,我们对BPSK的调制过程作了研究,用一个简短的程序对BPSK的全过程进行了观察。
function[bpsk_output]=bpsk_1(bpsk_input);
%g=[10111001];基带信号
g=bpsk_input;
f=100;%载波频率
t=0:
2*pi/99:
2*pi;
cp=[];sp=[];
mod=[];mod1=[];bit=[];
forn=1:
length(g);
ifg(n)==0;
die=-ones(1,100);%Modulante
se=ones(1,100);%
end
c=sin(f*t);
cp=[cpdie];
mod=[modc];
bit=[bitse];
end
bpsk=cp.*mod;
subplot(2,1,1);plot(bit,'LineWidth',1.5);gridon;
title('BinarySignal');
axis([0100*length(g)-2.52.5]);
bpsk_output=bpsk;
subplot(2,1,2);plot(bpsk,'LineWidth',1.5);gridon;
title('BPSKmodulation');
axis([0100*length(g)-2.52.5]);
观察到如下波形
上图很好的符合了BPSK的调制特性。
信道中存在噪声,我们对高斯白噪声信道做了模拟,采用
noise=randn(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为编码序列。
解调时由于涉及软硬判决的信道信息问题,故留在Viterbi译码时一并讨论。
2.3译码过程仿真
维特比译码可分为软判决和硬判决两种,下面我们对其分别进行仿真研究。
2.3.1硬判决译码
硬判决译码即比较汉明距作为累计度量,故直接将接收序列转为[0,1]序列即可,此时的判决代码为:
forj=1:
length(recv);
ifrecv(j)>0;
recv(j)=1;
else
recv(j)=0;
end
end
相应的译码程序为:
functiondec=Hviterbi(cod)
leth=length(cod)/2;
nextstate=[02;02;13;13];%储存下一个到达状态信息
outputs=[03;30;12;21];%储存状态转移时的输出信息。
suropt=zeros(4,leth-2);%使用2维数组保存幸存路径信息。
suroptem=suropt;
current=[0000];%保存到达当前路径的累计汉明距值
current
(1)=HMdist([0000],cod([1234]));%初始化前两步的码重度量信息
current
(2)=HMdist([1101],cod([1234]));%
current(3)=HMdist([0011],cod([1234]));%
current(4)=HMdist([1110],cod([1234]));%
suropt(1,[12])=[00];%前两步的输出信息
suropt(2,[12])=[10];
suropt(3,[12])=[01];
suropt(4,[12])=[11];
currenttem=[0000];
ls=[10;20;30;40;11;21;31;41];%保存能到达当前状态的前两个状态
fori=3:
(leth-2);%开始译码
forx=1:
4;
c=HMdist(deci2bin(outputs(ls(x*2-1,1),ls(x*2-1,2)+1),2),cod([i*2-1i*2]));%有两个状态能转移到当前状态,计算其中一个转移过来时的输出与当前接收码的汉明距。
d=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;%
suroptem(x,:
)=suropt(ls(x*2,1),:
);
suroptem(x,i)=ls(x*2,2);
end
end
current=currentem;
suropt=suroptem;
end
a=[19999];
fors=1:
4;%找出累计度量最小的路径,即最佳路径
ifcurrent(s)(2);
a
(2)=current(s);
a
(1)=s;
else
end
end
dec=suropt(a
(1),:
);%输出。
其中HMdist为比较两个序列的汉明距,deci2bin为将十进制数转换为二进制。
下图为在0~30dB信噪比下,硬判决维特比译码与无信道编码直接判决的对比。
由图中可见,在信噪比非常低的情况下,卷积码编码译码后的误码率反而比较高,因为误比特太多导致接受信息几乎无效,信噪比稍高后卷积码编码译码的误码率就大大降低。
2.3.2软判决译码
由于硬判决在判决过程中将接收直接判决为[10],而损失了相应的近似信息,导致了接收信息在某种意义上的浪费。
软判决将接收电平量化,尽可能保存相应的信息,故可以提高译码性能。
理想情况下软判决根据信道特性而选取量化方式,而对于实际产品如手机来说,信道特性是可变的,未知的,故在仿真中采取了均匀量化,相应的接收和量化程序如下。
msg=(randn(1,96)>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)
即不判决而将直接将接收电平序列输入Viterbi软判决译码器。
量化程序如下:
functiono=quantization(s,l);
o=0;
ifs>1;
o=2^l;
elseifs<-1;
o=-2^l;
elsec=abs(s);
fori=1:
2^l;
ifc>1/2^(l+1)+(i-1)/2^l;
o=o+1;
end
end
ifs<0;
o=-o;
end
end
o=(o+2^l)/2^(l+1);
l为量化比特数,s为输入电平序列。
程序将输入电平均匀量化为0~1之间的一级数。
一共2l级电平。
软判决代码如下:
functiondec=Sviterbi(recv,l);
leth=length(recv)/2;
fori=1:
length(recv);
qr(i)=quantization(recv(i),l);
end
nextstate=[02;02;13;13];
outputs=[03;30;12;21];
suropt=zeros(4,leth-2);
suroptem=suropt;
current=[0000];
current
(1)=EUdist([0000],qr([1234]));
current
(2)=EUdist([1101],qr([1234]));
current(3)=EUdist([0011],qr([1234]));
current(4)=EUdist([1110],qr([1234]));
suropt(1,[12])=[00];
suropt(2,[12])=[10];
suropt(3,[12])=[01];
suropt(4,[12])=[11];
currenttem=[0000];
ls=[100;200;300;400;101;201;301;401];
fori=3:
(leth-2);
forx=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-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;
end
a=[19999];
fors=1:
4
ifcurrent(s)(2);
a
(2)=current(s);
a
(1)=s;
else
end
end
dec=suropt(a
(1),:
);
其与硬判决的差异仅在于其比较欧氏距而非汉明距,并以欧氏距度量累计作为选择路径的标准。
其理论上比硬判决有着3dB左右的优势。
EUdist为欧氏距比较函数。
其与硬判决的差错率比较如下图
由图可见,软判决的确比硬判决有着一定的优势,在信噪比低的情况下尤其如此。
而在现代通信环境下,软判决译码将比硬判决译码有着相当大的优势。
其总过程程序为
functionmainprocedureS
functionmainprocedureS
g1=[101];
g2=[111];
forw=1:
20%选择1~20dB信噪比
q=0;
fori=1:
200;%循环200次
msg=(randn(1,96)>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
forw=1:
20;%
a=0;
fori=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;
forj=1:
length(recv);%先判决再将[01]序列送入硬判决译码器
ifrecv(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);%画图
gridon;
holdon;
plot(e);
3实验心得及总结
本次实验可以算是一波三折,我们选择了卷积码Viterbi译码这个当时觉得很难的课题,但是由于当时还没有接触到分组码卷积码等内容,听的其实不是很明白,后来自己在课余时间将信道编码那一章完全读过一次后才初步了解了卷积码和Viterbi译码的基本原理。
但是由于各种