当前位置:文档之家› 线性分组码实验报告(DOC)

线性分组码实验报告(DOC)

综合性设计性实验报告专业:学号:姓名:实验所属课程:信息论与编码实验室(中心):信息技术软件实验室指导教师:2教师评阅意见:签名:年月日实验成绩:一、题目线性分组码编译码实验二、仿真要求1.分别用不同的生成矩阵进行(7,4)线性分组码的编码,经调制解调后译码,并比较两种线性分组码的纠错能力。

2.掌握线性分组码的编码原理、编码步骤和译码方法。

3.熟悉matlab软件的基本操作,学会用matlab软件进行线性分组码的编码和译码。

三、仿真方案详细设计编码:本实验采用的是(7,4)线性分组码,线性分组码的编码由监督矩阵和生成矩阵实现,监督矩阵H为(3×4)的矩阵,由监督方程和(4×4)的单位矩阵构成,生成矩阵G为(4×7)的矩阵,由(4×4)的单位矩阵和监督矩阵的转置矩阵构成。

实现过程为:1、将要编码的序列先整形,整为4列2、如果序列不能被4整除在后边补0使其能被4整除3、将整形后的序列与生成矩阵G相乘即得到编码后的码字在本实验中,分别生成两种生成矩阵,在产生了生成矩阵后根据输入的四位信息位和生成矩阵相乘即可得到编码矩阵。

译码:在译码过程中,我们利用错误图样和伴随式来进行纠错。

1、设一个接收码字矩阵为R,R*H'=S(模2乘),则S为码字对应的伴随式矩阵如果S=0则说明接受码字无差错;2、如果S不为0,查看矩阵S中不为0的那行所在行数,该行即收码字错误所在行i;3、将S转置,将不为0的一列与H每一列进行比较,找到H中相同列,该列的列数即为错误所在列;4、由步骤2和3得到错误具体位置,模2加对应的错误图样就可得到正确码字。

BPSK调制:BPSK调制利用载波的相位变化来传递数字信息,振幅和频率保持不变。

双极性的全占空矩形脉冲序列与正弦载波相乘就得到调制信号。

因此进行调制时首先进行码形变换变为双极性的,再经乘法器与载波相乘得到调制信号。

其具体实现方法如下:1、将0、1序列变为-1、1序列;2、将序列与载波相乘,为‘1’时与载波相位相同,为‘-1’时与载波相位相反。

BPSK解调:解调是产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号,进而通过抽样判决得出原始信号。

解调是调制的逆过程,其作用是从接受信号中恢复出原基带信号。

解调的方法分为两类:相干解调和非相干解调(如包络检波)。

相干解调也称同步检波,适用于所有线性调制信号的解调。

其关键是必须在已调信号的接收端产生与信号载波同频同相的本地载波。

本次仿真实验采用的是相干解调法,调制信号与想干载波相乘,经过低通滤波器,再抽样判决得到原信号。

通过产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号,然后通过低通滤波器滤波器再抽样判决,得出解调后的原始信号。

四、仿真结果及结论实验仿真图如下:通过上面仿真图我们可以看出,通过随机产生30000个数据,再经过重复统计误比特数100次,并取其平均值,得到了误码率曲线,最终生成两条线并可以进行直观的对比。

在仿真过程中,在我发现,随机产生的数据量越大,两条曲线重合的就越紧密,这说明即使是在不同的生成矩阵中,用同一种编码和调制方式产生的误码率曲线都相差不大。

五、总结与体会本次仿真实验是进行不同(7,4)线性分组码的纠错能力的比较,通过进行随机数据的产生、生成矩阵的产生以及信道编码译码等步骤,最终仿真得出实验结果。

刚开始的时候对于线性分组码的编码还不太理解,通过查阅资料以及看老师的课件最终了解了这次编码实验的原理,也有了思路。

之后就是进行matlab 程序的编写和调试,在调试程序时也遇到了许多问题,比如编译码老是出错,最后通过查阅资料和和同学讨论才得到了解决。

-15-14-13-12-11-10-9-8-7-6-510-310-210-110信噪比误码率通过这次仿真实验,我认真地学习了有关线性分组码的编码原理,并且通过对实验的仿真对其有了更加深入的了解。

这次实验不仅使我巩固了理论知识,也锻炼了自己对编码问题的解决能力。

六、主要仿真代码主函数:clear all;clc;N=300;alter=100;datarate=1000;fc=datarate;fs=fc*16;G1=eye(4,4); %产生4*4的单位矩阵g2=[0,1,1;1,1,0;1,1,1;0,1,0];G2=[1,0,1;1,1,1;1,1,0;0,1,1];G=[G1,G2]; %设置生成矩阵为Gg=[G1,g2];H2=eye(3,3); %产生3*3的单位矩阵作为监督矩阵H和h的后三列H=[G2',H2]; %监督矩阵Hh=[g2',H2]; %监督矩阵h BER1=[]; %初始化误码率BER1,用来统计监督矩阵为H时的误码率BER2=[];for snr=-15:0.5:-5 %信噪比err1=0;err2=0;for i=1:alter[ensignal_1,X1]=information(N,G)%编码后数据X1为编码后生成的码组signal_1=ensignal_1*2-1; %变为双极性[ensignal_2,X2]=information(N,g)signal_2=ensignal_2*2-1;modusignal_1=modu(signal_1,datarate,fc, fs); %BPSK调制modusignal_2=modu(signal_2,datarate,fc, fs);y1=awgn(modusignal_1,snr,'measured'); %加噪y2=awgn(modusignal_2,snr,'measured');demosignal_1=bpskdemo(datarate,fc,fs,y1); %BPSK解调demosignal_2=bpskdemo(datarate,fc,fs,y2);[error1,signal_yima]=yima(demosignal_1,H); %译码[error2,signal_yima]=yima(demosignal_2,h);s1=[];s2=[];[m,n]=size(X1);for i=1:m %遍历每一行s1=[s1,X1(i,:)];s2=[s2,X2(i,:)];enderr1=err1+sum(abs(error1-s1)) %error1为H下纠错后得到数据err2=err2+sum(abs(error2-s2))endBER1=[BER1,err1/(alter*N/4*7)] %误码率计算BER2=[BER2,err2/(alter*N/4*7)]endfigure(1)semilogy(-15:0.5:-5,BER1,'r');hold onsemilogy(-15:0.5:-5,BER2,'g');xlabel('信噪比');ylabel('误码率');grid on功能函数:function [signal,X]=information(N,G)m=randint(1,N);x=reshape(m,length(m)/4,4);%分组编码X=mod(x*G,2); %进行编码n=length(m)/4*7;signal=reshape(X,1,n); %把编码后的码字信息转变为一维数组function modusignal=modu(signal, dataRate,fc, fs) %采用BPSK调制方式t=linspace(0,1,fs/fc);carrier=sin(2*pi*fc*t);modusignal=[];for i=1:length(signal)modusignal=[modusignal,carrier*signal(i)];endendfunction demosignal=bpskdemo(datarate,fc,fs,signal) %BPSK解调t=linspace(0,1,fs/fc);c=sin(2*pi*fc*t);l=length(signal)/length(c);for i=1:lsignal((i-1)*length(c)+1:i*length(c))=signal((i-1)*length(c)+1:i*length(c)).*c; ends=signal;load lowpass1 %载入低通滤波器s=[s,zeros(1,fix(length(lowpass1)/2))];spa=filter(lowpass1,1,s);lpfs=spa(fix(length(lowpass1)/2)+1:end);demosignal=[];for i=0:length(c):length(lpfs)-length(c)if (lpfs(i+length(c)/2)>0)demosignal=[demosignal,1];elsedemosignal=[demosignal,0];endendendfunction [error,signal_yima]=yima(demosignal,H)signal_yima=reshape(demosignal,length(demosignal)/7,7)error=[];for j=1:length(demosignal)/7E=[1,1,1,1,1,1,1]; %初始化错误图样R=signal_yima([j],:)S=mod(R*(H'),2); %S为伴随矩阵for i=1:7 %用for循环取出H中每一列,然后与S相加T=H(:,[i]);B=mod(S+T',2);if all(B(:)==0)E(1,i)=1;elseE(1,i)=0;end;end;E %得到错误图样if E==0err=R; %纠错后得到七个数据elseerr=mod(R+E,2)enderror=[error,err]; %最终得到纠错后的数据end。

相关主题