当前位置:文档之家› 信道编码综合设计与建模

信道编码综合设计与建模

信道编码综合设计与建模摘要以(7,4)线性分组码为例的信道编码译码系统,它对输入的四位信息码进行Hamming编码,对于输入接收到的七位信息码进行译码,当接收到的信息码有一位错误时,可以纠正这一位错误码,进而译出正确的码组。

关键词:编码;译码;纠错;目录信道编码综合设计与建模 (1)目录 (3)1、设计要求 (4)2、设计思路 (4)3、设计原理以及方案 (4)3.1 设计原理 (4)3.2 设计方案 (5)3.2.1主程序流程图 (5)3.2.2编码器程序流程图 (6)3.2.3译码器程序流程图 (7)4、设计实现 (9)4.1 matlaB程序运行代码 (9)5、总结 (11)6、附录:程序代码 (13)1、设计要求以(7,3)或者(7,4)为分组码为例设计信道编码综合系统1.1构造编码器、解码器、信道组成的整个编码系统1.2进行编码理论分析与计算,检错、纠错能力分析与验证1.3调整系统参数,观察各点码速率,功率谱;1.4分析系统性能改善情况;2、设计思路构建一个编码器使实现译码与编码功能并且可供选择,在编码器中在得出代码之后绘制功率谱密度曲线3、设计原理以及方案3.1 设计原理设分组码(n,k)中,k=4,为能纠正一位误码,要求r≥3,现取r=3,则n=k+r=7.我们用a0a1a2a3a4a5a6表示这7个码元,用s0、s1、s2表示有三个校验方正计算得到的校正子,并假设s0、s1、s2校正子码组与五码位置的对应关系如表1所示。

图 1 (7,4)码校正子与误码位置由表可知,当误码位置在时,校正子s0=1;否则s0=0。

因此有s0=a2⊕a4⊕a5⊕a6,同理有S1=a1⊕a3⊕a4⊕a6和S2=a0⊕a3⊕a5⊕a6。

在编码时a6、a5、a4、a3为信息码元,a0、a1、a2为监督码元。

则监督码元可由以下监督方程唯一确定:由上面方程可得到图2所示的16个码组。

在接收端收到每个码组后,计算出s2、s1、s0,如果不全为0,则表示存在错误,可以由表12.2确定错误位置并予以纠正。

例如收到码组为0000011,可算出s1s2s3=011,由图2可知在a3上有一误码。

通过观察可以看出,上述(7,4)码的最小码距为dmin=3,它能纠正一个误码或检测两个误码。

如果超出纠错能力则反而会因“乱纠”出现新的误码。

图2 16个码组上述方法构造的能纠正单个误码的线性分组码又称为汉明码。

它具有以下一些特点:码长n=2m-1,最小码距为d=3,信息码长k=2n-m-1,纠错能力t=1,监督码长r=n-k=m。

这里m为≥2的正整数。

给定m后,就可构造出汉明码(n,k)。

3.2 设计方案3.2.1主程序流程图主程序一开始就有欢迎界面,并对用户显示出了选择提示语句,可以选择编码器、译码器、退出三种选择,当用户做出选择后便会进入各自的子程序,执行相应的功能,整个主程序的流程如下:图 3 主程序流程图3.2.2编码器程序流程图在程序进入编码子程序时,它首先进行清空内存,由已知的监督矩阵求出生成矩阵,接着提示输入信息码组,信息码组与生存矩阵相乘后便会得到相应的Hamming编码序列,其程序流程如下:图 4 编码器流程图3.2.3译码器程序流程图对于译码程序,它同样先对内存进行清零,然后提示用户输入接收码组,输入的接收码组有可能含有误码,故而,程序先进行纠检错,判断程序是否有错,并且有一位错码时对序列进行纠错,输出正确的码组,然后提取出信息码组,流程图如下:图 5 译码器程序流程图4、设计实现4.1 matlaB程序运行代码从程序的一开始运行就显示“(7,4)汉明码编译器:请选择编译器种类: 1:编译器 2:译码器: 0:退出>> ”的一串字样,当你输入“1”时,则又显示“请输入矩阵,不要忘加中括号”。

当输入“2”时,显示“请输入接收码组R:”。

当你输入“0”时,则退出程序。

运行结果如下图:图 6 信道功能提示界面由以上运行结果可以看出刚开始就有,接着提示界面来提示用户选择相关的编译器,来实现相关的功能,当用户做出选择后,系统又提示要输入相关的信息。

整个体系就是按照这中思路联系在了一块,这一块提示程序完成了整个系统的提示功能。

4.1 程序运行编码代码分析对于信道编码程序而言,当看到界面显示“(7,4)汉明码编译器:请选择编译器种类:请选择编译器种类: 1:编译器 2:译码器: 0:退出>> ”的一串字样,输入“1”则会显示“请输入n*4的信息码组:”,然后从提示符后输入:[0 0 0 0;0 0 0 1;0 0 1 0;0 0 1 1;0 1 0 0;0 1 0 1;0 1 1 0;0 1 1 1;1 0 0 0;1 0 0 1;1 0 1 0;1 0 1 1;1 1 0 0;1 1 0 1;1 1 1 0;1 1 1 1]一串信息码组后回车,便会得到编码后的码组。

运行结果如下图:图 7 程序代码过程由所示的结果可以看出编码的结果的十六种情况和设置结果是一致的,可以见得程序的编码过程是正确的。

4.1 程序运行译码代码分析图 8 编码程序分析在译码的过程中出现了顺序倒置的情况,所译码不准确,说明程序在译码这一功能不正确。

分析原因:有可能是信道编码的过程中出现了移位倒置的错误使得编码不正确。

5、总结这次编码器系统的构建在编码方面可以完成要求的功能但是在译码方面和功率谱分析方面还不完善,我又在功率谱分析上做了分析并加入功率谱代码Fs=1000; %采样频率?n=0:1/Fs:1;nfft=1024;cxn=xcorr(code,'unbiased'); %计算序列的自相关函数?CXk=fft(cxn,nfft);Pxx=abs(CXk);index=0:round(nfft/2-1);k=index*Fs/nfft;plot_Pxx=10*log10(Pxx(index+1));plot(k,plot_Pxx);图 9 编码器代码图 10 编码器功率谱密度经过改进使得编码程序得到完善可以实现基本要求功能。

6、附录:程序代码%=========================%线性分组码编译器及译码器%可实现汉明码编译器%----------********-----------*****------%Function: Hammingcodes'encode and decode%programme name:BianYi%----------********-----------*****------function BianYi%------$$$$$--------% Define variables:% H 校验矩阵% G 生成矩阵% I 输入信息序列% F 信道输出码% A 纠错输出码序列% E 差错图案% S 校验子矩阵% M 校验子矩阵的十进制序列%==========================Q=input('(7,4)汉明码编译器:\n 请选择编译器种类:\n 1:编码器 2:译码器 0:退出>>'); while(Q)%信道编码程序if(Q==1)N=7; %N为总长,包括数据位和汉明码位msg=input('请输入矩阵,不要忘加中括号'); %外部输入信号,同行的元素以空白或逗号隔开,不同行以分号隔开。

[m,n]=size(msg); %返回矩阵的行数m(即几组信号),列数n(即数据的位数)code=encode(msg,N,n,'hamming') %直接调用matlab库函数进行汉明编码Fs=1000; %采样频率?n=0:1/Fs:1;nfft=1024;cxn=xcorr(code,'unbiased'); %计算序列的自相关函数?CXk=fft(cxn,nfft);Pxx=abs(CXk);index=0:round(nfft/2-1);k=index*Fs/nfft;plot_Pxx=10*log10(Pxx(index+1));plot(k,plot_Pxx);%信道译码程序elseif(Q==2)clear allclose allH=[1 1 1 0 1 0 0;1 0 1 1 0 1 0;1 1 0 1 0 0 1]; %校验矩阵R=input('请输入接收码组R;');[a,b]=size(R);E=[0 0 0 0 0 0 0;0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];S=rem(R*H',2);i=1;for i=1:1:aM(i,1)=S(i,1).*4+S(i,2).*2+S(i,3); %求校验矩阵子所表示的整数 endfor i=1:1:aswitch(M(i,1))case 0A(i,:)=R(i,:)+E(1,:);case 1A(i,:)=R(i,:)+E(2,:);case 2A(i,:)=R(i,:)+E(3,:);case 4A(i,:)=R(i,:)+E(4,:);case 3A(i,:)=R(i,:)+E(5,:);case 6A(i,:)=R(i,:)+E(6,:);case 5A(i,:)=R(i,:)+E(7,:);case 7A(i,:)=R(i,:)+E(8,:);otherwise'不可能实现'endendA=rem(A,2);disp('纠错后的码组A=');disp(A);j=1;while j<=4I(:,j)=A(:,j);j=j+1;enddisp('译出的信息序列I=');disp(I); %显示原信息码else'对不起,您输入有错误!'endQ=input('继续操作:\n 1:编码器 2:译码器 0:退出>>'); enddisp('结束');。

相关主题