数字通信系统中卷积码的方针实现软件课程设计报告.doc

上传人:laozhun 文档编号:4192537 上传时间:2023-04-09 格式:DOC 页数:18 大小:473.50KB
返回 下载 相关 举报
数字通信系统中卷积码的方针实现软件课程设计报告.doc_第1页
第1页 / 共18页
数字通信系统中卷积码的方针实现软件课程设计报告.doc_第2页
第2页 / 共18页
数字通信系统中卷积码的方针实现软件课程设计报告.doc_第3页
第3页 / 共18页
数字通信系统中卷积码的方针实现软件课程设计报告.doc_第4页
第4页 / 共18页
数字通信系统中卷积码的方针实现软件课程设计报告.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《数字通信系统中卷积码的方针实现软件课程设计报告.doc》由会员分享,可在线阅读,更多相关《数字通信系统中卷积码的方针实现软件课程设计报告.doc(18页珍藏版)》请在三一办公上搜索。

1、中南民族大学软件课程设计报告 学院 级 专业题目 数字通信系统中卷积码的仿真实现 学生 学号 指导教师 目 录数字通信系统中卷积码的仿真实现11 引言22 卷积码编码及译码原理22.1 卷积码解析表示法22.2 卷积码图形表示法42.3 卷积码译码原理63 MATLAB卷积码仿真73.1 传输信道仿真83.2 改变卷积码参数仿真93.2 .1不同回朔长度对卷积码性能的影响93.2.2不同码率对卷积码性能影响103.2.3 不同约束长度对卷积码性能影响114 MATLAB译码过程仿真124.1 硬件判决译码124.1 软件判决译码155 实验心得体会18参考文献18数字通信系统中卷积码的仿真实现

2、设计摘要:本文主要实现了用matlab实现卷积码的编码过程,Viterbi译码程序,用软件仿真了其实现过程,并且计算了器误码率,对比在没有卷积码的情况下实现相应的通信的时候误码率,得出了卷积码的优良抗噪性能。关键字:matlab 卷积码 Viterbi译码1 引言卷积码最早于 1955 年由 Elias 提出,稍后,1957 年 Wozencraft 提出了一种有效地译实用的门限译码方法,使得卷积码开始走向实用化。而后 1967 年 Viterbi 提出了最大似然译码算法,它对存储级数较小的卷积码很容易实现,被称作Viterbi译码算法,广泛的应用于现代通信中。2卷积码编码及译码原理卷积码是一

3、种性能优越的信道编码,它的编码器和解码器都比较易于实现,同时还具有较强的纠错能力,这使得它的使用越来越广泛。卷积码一般表示为(n,k,K)的形式,即将 k各信息比特编码为 n个比特的码组,K为编码约束长度,说明编码过程中相互约束的码段个数。卷积码编码后的 n 各码元不经与当前组的 k 个信息比特有关,还与前 K-1 个输入组的信息比特有关。编码过程中相互关联的码元有 K*n 个。R=k/n 是编码效率。编码效率和约束长度是衡量卷积码的两个重要参数。 典型的卷积码一般选n,k较小,但K值可取较大(10),以获得简单而高性能的卷积码。卷积码的编码描述方式有很多种:冲激响应描述法、生成矩阵描述法、多

4、项式乘积描述法、状态图描述,树图描述,网格图描述等。2.1.1 卷积码解析表示法卷积码的解析表示发大致可以分为离散卷积法,生成矩阵法,码多项式法。下面以离散卷积为例进行说明。 卷积码的编码器一般比较简单,为一个具有 k个输入端,n个输出端,m级移位寄存器的有限状态有记忆系统。下图所示为(2,1,7)卷积码的编码器。若输入序列为u=(u0u1u2u3), 则对应两个码字序列则对应两个码字序列𝐜 = (c0c1c2c3)和𝐜 = (c0c1c2c3) 相应的编码方程可写为𝐜 = 𝐮 𝐠,𝐜 =

5、9854; 𝐠,c=(𝐜, 𝐜)。 “” 符号表示卷积运算,𝐠,𝐠表示编码器的两个冲激响应,即编码器的输出可以由输入序列和编码器的两个冲击响应卷积而得到,故称为卷积码。这里的冲激响应指:当输入为1 0 0 0 0 序列时,所观察到的两个输出序列值。由于上图 K值为7,故冲激响应至多可持续到第7 位,可写为𝐠 = 1 1 1 1 0 0 1,𝐠 = 1 0 1 1 0 1 1 然后将两个输出端的码字序列合并为一个码字序列为𝐜 = (c0c0c1c1c2c2) 若输入信息

6、序列为1 1 0 1; 则𝐜 = 1 0 0 1 0 1 0 1 0 1,𝐜 = 1 1 1 1 1 0 1 1 1 1 c=1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1。下图所示为(2,1,3)卷积码的编码器,也是本次课程设计所研究的卷积码编码器,由于其生成冲激响应分别为1 1 1和1 0 1,故被称为(7,5)码。2.1.2 卷积码图形表示法 除了用解析法描述卷积码的编码外,还可以使用比较形象的图形法来表示卷积码。比较常用的有状态图法,网格图法和树图法。下面简介状态图法和网格图法。 状态图法: 由于卷积码编码器在下一时刻的输

7、出取决于编码器的当前状态和下一时刻的输入,而编码器当前状态取决于编码器当前各移位寄存器的存储内容。称编码器当前各移位寄存器存储内容(0 或)为编码器在该时刻的状态(此状态代表记忆以前的输入信息)。随着信息序列的不断输入,编码器不断从一个状态转移到另外一个状态,并且输出相应的编码序列。编码器的总可能状态数为2mk个。对(7,5)码的编码器来说,n=2,k=1,K=3,m=2。共有四个可能状态,其状态图如下:图中四个方块表示状态,状态间的连线与箭头表示转移方向,连线上的数字表示是状态发生转移的到来比特,斜杠后的数字由一个状态到另一个状态转移时的输出码字。如当前状态为11,输入信息为 0,则转移到0

8、1 状态并输出01 码字,若输入信息为 1,则依然为11状态并输出10 码字。网格图法:网格图可以描述卷积码的状态随时间推移而转移的情况。该图纵坐标表示所有状态,横坐标表示时间。网格图在卷积码的概率译码,特别是 Viterbi 译码中非常重要,它综合了状态图法直观简单和树图法时序关系清晰的特点。如下图图中实线表示输入0 时所走分支,虚线表示输入1时所走分支,编码时只需从起始状态开始依次选择路线并读出输出即可。假设从 a状态开始,输入为1 0 1 1,则可由图中读出输出为11 10 10 01。2.2 卷积码译码原理卷积码的译码方式主要有三种: 1).1963 年 Massey 提出的门限译码,

9、这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码。 2).1963年有Fano改进的序列译码,这是基于码的树状图结构的一种准最佳概率译码。 3).1967 年 Viterbi提出的Viterbi 算法,基于码的网格图基础上的最大似然译码算法,是一种最佳概率译码。 其中,代数译码,利用编码本身的代数结构进行译码,不考虑信道本身的统计特性。该方法的硬件实现简单,但性能较差,其中具有典型意义的是门限译码。另一类是概率译码,这种译码通常建立在最大似然准则的基础上。由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。常用的概率译码方法有维特比译

10、码和序列译码。维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。2.2.1 Viterbi 译码卷积码概率译码的基本思路是:以接收码流为基础,逐个计算它与其他所有可能出现的、连续的网格图路径的距离,选出其中可能性最大的一条作为译码估值输出。概率最大在大多数场合可解释为距离最小,这种最小距离译码体现的正是最大似然的准则。卷积码的最大似然译码与分组码的最大似然译码在原理上是一样的,但实现方法上略有不同。主要区别在于:分组码是孤立地求解单个码组的相似度,而卷积码是求码字序列之间的相似度。基于网格图搜索的译码是实现最大似然判决的

11、重要方法和途径。用格图描述时,由于路径的汇聚消除了树状图中的多余度,译码过程中只需考虑整个路径集合中那些使似然函数最大的路径。如果在某一点上发现某条路径已不可能获得最大对数似然函数,就放弃这条路径,然后在剩下的“幸存”路径中重新选择路径。这样一直进行到最后第 L级(L为发送序列的长度)。由于这种方法较早地丢弃了那些不可能的路径,从而减轻了译码的工作量,Viterbi译码正是基于这种想法。 对于(n, k, K )卷积码,其网格图中共 2kL种状态。由网格图的前 K-1 条连续支路构成的路径互不相交,即最初2k_1 条路径各不相同,当接收到第K条支路时,每条路径都有2条支路延伸到第 K级上,而第

12、K级上的每两条支路又都汇聚在一个节点上。在 Viterbi译码算法中,把汇聚在每个节点上的两条路径的对数似然函数累加值进行比较,然后把具有较大对数似然函数累加值的路径保存下来,而丢弃另一条路径,经挑选后第K级只留下2K条幸存路径。选出的路径同它们的对数似然函数的累加值将一起被存储起来。由于每个节点引出两条支路,因此以后各级中路径的延伸都增大一倍,但比较它们的似然函数累加值后,丢弃一半,结果留存下来的路径总数保持常数。由此可见,上述译码过程中的基本操作是,“加-比-选”,即每级求出对数似然函数的累加值,然后两两比较后作出选择。有时会出现两条路径的对数似然函数累加值相等的情形,在这种情况下可以任意

13、选择其中一条作为“幸存”路径。卷积码的编码器从全零状态出发,最后又回到全零状态时所输出的码序列,称为结尾卷积码。因此,当序列发送完毕后,要在网格图的终结处加上(K-1)个己知的信息作为结束信息。在结束信息到来时,由于每一状态中只有与已知发送信息相符的那条支路被延伸,因而在每级比较后,幸存路径减少一半。因此,在接收到(K-1)个己知信息后,在整个网格图中就只有唯一的一条幸存路径保留下来,这就是译码所得的路径。也就是说,在己知接收到的序列的情况下,这条译码路径和发送序列是最相似的。3. MATLAB仿真 在本次课程设计中,我们对整个通信过程进行了仿真,其过程如下:下面将分别对每一部分进行仿真3.1

14、卷积码编码仿真在程序设计中,我们没有采用 MATLAB 自带的编码函数而是采用了自己的编码函数codec,其参数m为输入信息序列,g1,g2 为两个输出端口的冲激响应序列。function cod=codec(m,g1,g2) %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;

15、msg=1 1 0 1; cod=codec(msg,g1,g2) 输出为: cod =110101001011 符合预期结果。3.2信道传输过程仿真为了方便起见,我们采用了BPSK调制,为了简化设计,我们紧紧采用了基带传输,没有采用调频方式的BPSK,并测试了误码率,程序设计代码如下:x=randint(1,3000);for i=1:3000 if(x(i)0) x(i)=1; else x(i)=-1; endendxy = awgn(x,5);%n,Wn = buttord(Wp,Ws,Rp,Rs);for i=1:3000 if(y(i)0) y(i)=1; else y(i)=-1

16、; endendytt=sum(abs(x-y)/2我们随机产生3000个数据,然后通过BPSK调制后,在通道里面叫上高斯白噪声,我们统计了除了传输中出错的个数。列表如下:3.3改变卷积码参数仿真以及结论1、 不同回溯长度对卷积码性能的影响下面将以(2,1,7)卷积码来建立模块仿真。将译码模块中的Traceback depth分别设置为20,35,45并在一个图中画出这三种方式下的误码性能曲线得到下图4-8。从上到下的三条曲线分别是Traceback depth为20,35,45。可以看出:回溯长度是在Viterbi 译码过程中一个很重要的参数,他决定了译码延迟,随着他的不断变化,误码性能也随

17、误比特率曲线可以清楚地看到,当回溯长度一定时,随着信道噪声的逐渐减小,系统的误比特率逐渐降低;当回溯长度逐渐增加,系统的误比特率随之逐渐降低,但是当回溯程度增加到5 N 时( N 为编码的约束长度) ,误比特率数值趋于稳定,因此,在确定回溯长度时既要考虑到随着的增加误比特率随之降低的趋势,也要考虑到译码延迟会变大,在选取回溯长度时,通常取= 5 N。2、3、 图4-8 不同回溯长度对误码性能的影响4、 分析不同回溯长度对卷积码误码性能的影响时用到的程序如下:5、 x=-10:5;6、 y=x; 7、 for i=1:length(x)8、 SNR=x(i);9、 sim(yima);10、 y

18、(i)=mean(BitErrorRate);11、 end12、 semilogy(x,y);13、 hold on;14、 for i=1:length(x)15、 SNR=x(i);16、 sim(yima1);17、 y(i)=mean(BitErrorRate);18、 end19、 semilogy(x,y);20、 hold on;21、 for i=1:length(x)22、 SNR=x(i);23、 sim(yima2);24、 y(i)=mean(BitErrorRate);25、 end26、 semilogy(x,y);2、不同码率对卷积码误码性能的响下面图4-9是通

19、过改变卷积码的码率为1/2和1/3而得到的二条对比曲线。上面的一条曲线是码率为1/2,下面的是码率为1/3。卷积码的码率R = k/ n,他是卷积码的一个重要参数,当改变卷积码的码率时,系统的误码性能也将随之发生变化。从图4-9中的误比特率曲线可以看出,当码率一定时,随着信道噪声的逐渐减小,系统的误比特率也逐渐减小,当改变系统码率时,随着卷积码码率的逐渐提高,系统的误比特率也呈现出增大的趋势,也就是说码率越低,系统的误比特率就越小,误码性能就越好。图4-9卷积码不同码率对误码性能的影响分析不同码率对卷积码误码性能的影响时用到的程序如下:x=0:5; y=x; for i=1:length(x)

20、 SNR=x(i); sim(yima1); y(i)=mean(BitErrorRate); end semilogy(x,y); hold on; for i=1:length(x) SNR=x(i); sim(yima2); y(i)=mean(BitErrorRate);end semilogy(x,y);3、不同约束长度对卷积码的误码性能影响如下图4-10,对于码率一定的卷积码,当约束长度N 发生变化时,系统的误码性能也会随之发生变化, 我们以码率R = 1/ 2的(2 ,1 ,3)和(2,1,7) 卷积码为例展开分析。上面的曲线是(2,1,3)卷积码的误码性能曲线。下面的曲线是(2

21、,1,7)卷积码的误码性能曲线。从图4-4中的误比特率曲线可以清楚地看到,随着约束长度的逐渐增加,系统的误比特率明显降低,所以说当码率一定时,增加约束长度可以降低系统的误比特率,但是随着约束长度的增加,译码设备的复杂性也会随之增加,所以对于码率为1/ 2 的卷积码,我们在选取约束长度时一般为39 。图4-10 不同约束长度对卷积码误码性能的影响分析不同约束长度对卷积码误码性能影响用到的程序如下:x=0:5; y=x; for i=1:length(x) SNR=x(i); sim(yima); y(i)=mean(BitErrorRate); end semilogy(x,y); hold o

22、n; for i=1:length(x) SNR=x(i); sim(yima1); y(i)=mean(BitErrorRate); end semilogy(x,y);通过上面从(1)回溯长度;(2)码率;(3)约束长度这三个卷积码的重要参数的变化后对译码性能的分析,我们得到在卷积码的编码,译码过程中有很多条件是不可能同时满足的。所以我们要根据具体情况来选择合适的参数。4. 译码过程仿真维特比译码可分为软判决和硬判决两种,下面我们对其分别进行仿真研究。4.1 硬判决译码 硬判决译码即比较汉明距作为累计度量,故直接将接收序列转为0,1序列即可,此时的判决代码为: for j=1:length

23、(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;3 0;1 2;2 1;%储存状态转移时的输出信息。 suropt=zeros(4,leth-2);%使用2维数组保存幸存路径信息。 suroptem=suropt; current=0 0 0 0;%保存到达当前路径的累计汉明距值 current(1)=HMdist(0

24、 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(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; %

25、保存能到达当前状态的前两个状态 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=HMdist(deci2bin(outputs(ls(x*2,1),ls(x*2,2)+1),2),cod(i*2-1 i*2); 计算另外一个状态转移过来时的输出与当前接收码的汉明距。 if (current(ls(x*2-1,1)+c)(current(ls(x*2

26、,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=1 9999; for s=1:4;%找出累计度量最

27、小的路径,即最佳路径 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) 即不判决而将直接将接收电平输入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=-

28、o; end end o=(o+2l)/2(l+1); l为量化比特数,s为输入电平序列。程序将输入电平均匀量化为01之间的一级数。一共2 级电平。 软判决代码如下:function dec=Sviterbi(recv,l); leth=length(recv)/2; for i=1:length(recv); qr(i)=quantization(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

29、;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(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

30、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-1 i*2); d=EUdist(deci2bin(outputs(ls(x*2,1),ls(x*2,3)+1),2),qr(i*2-1 i*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),:); suropt

31、em(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=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

32、); 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=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*sigm

33、a*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);5. 实验心得及总结MATLAB是一种专业的计算机程序,用于工程科学的矩阵数学运算。用于解决各种重要的技术问题。Matlab程序执行MATLAB语言,计算一些数学问题

34、简单高效。具有非常重要的学术价值和工程价值,适合于复杂的数学运算。学习了c语言对我们学习此课有很大帮助,他们有很多东西相通,语句命令比c语言更加简单。通过这次的软件课程设计让我对MATLAB有了更深入的了解,让我从了解到能够熟练的运用MATLAB也让我认识到了它强大的数学运算能力,在本次实验的前期对所涉及到的一些知识没有理解,经过老师的细心讲解和我在课后的学习才初步了解了卷积码和Viterbi译码的基本原理。非常感谢李老师的详细讲解并提供了详细的资料,让我在这次的课程设计中学到了以前书本上没有学到的知识。加深了对本专业的理解,还要感谢我的同学,当我在需要帮助的时候,他们能够放下手中的事帮助我理解不懂的地方,在这里要感谢热心帮助过我的同学们。6.参考文献1. 樊昌信。通信原理第6版。北京:国防工业出版社,2006。(第11章,11.7节)。2. MATLAB在线帮助。3. 钟麟,王峰。Matlab仿真技术与应用教程M。北京:国防工业出版社,2002。4. 信息论与编码(第二版),陈运主编

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备2025010119号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000987号