线性分组码实验报告

更新时间:2023-08-25 01:26:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

综合性设计性实验报告

专 业:

学 号:

姓 名:

实验所属课程:

实验室(中心): 信息技术软件实验室

指 导 教 师 :

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解调:

解调是产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号,进而通过抽样判决得出原始信号。解调是调制的逆过程,其作用是从接受信号中恢复出原基带信号。解调的方法分为两类:相干解调和非相干解调(如包络检波)。相干解调也称同步检波,适用于所有线性调制信号的解调。其关键是必须在已调信号的接收端产生与信号载波同频同相的本地载波。 本次仿真实验采用的是相干解调法,调制信号与想干载波相乘,经过低通滤波器,再抽样判决得到原信号。通过产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号,然后通过低通滤波器滤波器再抽样判决,得出解调后的原始信号。

四、仿真结果及结论

实验仿真图如下:

10

10误码率

-1

10

-2

10

-3

-15-14-13-12-11

-10信噪比

-9-8-7-6-5

通过上面仿真图我们可以看出,通过随机产生30000个数据,再经过重复统计误比特数100次,并取其平均值,得到了误码率曲线,最终生成两条线并可以进行直观的对比。在仿真过程中,在我发现,随机产生的数据量越大,两条曲线重合的就越紧密,这说明即使是在不同的生成矩阵中,用同一种编码和调制方式产生的误码率曲线都相差不大。

五、总结与体会

本次仿真实验是进行不同(7,4)线性分组码的纠错能力的比较,通过进行随机数据的产生、生成矩阵的产生以及信道编码译码等步骤,最终仿真得出实验结果。刚开始的时候对于线性分组码的编码还不太理解,通过查阅资料以及看老师的课件最终了解了这次编码实验的原理,也有了思路。之后就是进行matlab程序的编写和调试,在调试程序时也遇到了许多问题,比如编译码老是出错,最后通过查阅资料和和同学讨论才得到了解决。

通过这次仿真实验,我认真地学习了有关线性分组码的编码原理,并且通

过对实验的仿真对其有了更加深入的了解。这次实验不仅使我巩固了理论知识,也锻炼了自己对编码问题的解决能力。

六、主要仿真代码

主函数: 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]; %设置生成矩阵为G g=[G1,g2];

H2=eye(3,3); %产生3*3的单位矩阵作为监督矩阵H和h的后三列 H=[G2',H2]; %监督矩阵H h=[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,:)]; end

err1=err1+sum(abs(error1-s1)) %error1为H下纠错后得到数据 err2=err2+sum(abs(error2-s2)) end

BER1=[BER1,err1/(alter*N/4*7)] %误码率计算 BER2=[BER2,err2/(alter*N/4*7)] end figure(1)

semilogy(-15:0.5:-5,BER1,'r'); hold on

semilogy(-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)]; end end

function 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:l

signal((i-1)*length(c)+1:i*length(c))=signal((i-1)*length(c)+1:i*length(c)).*c; end s=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]; else

demosignal=[demosignal,0];

end end

function [error,signal_yima]=yima(demosignal,H) signal_yima=reshape(demosignal,length(demosignal)/7,7) error=[]; for j=1:length(demosignal)/7

E=[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; else E(1,i)=0; end; end;

E %得到错误图样 if E==0

err=R; %纠错后得到七个数据

err=mod(R+E,2) end

error=[error,err]; %最终得到纠错后的数据 end

本文来源:https://www.bwwdw.com/article/mali.html

Top