基于matlab线性分组码实验设计.docx
《基于matlab线性分组码实验设计.docx》由会员分享,可在线阅读,更多相关《基于matlab线性分组码实验设计.docx(17页珍藏版)》请在冰点文库上搜索。
基于matlab线性分组码实验设计
重庆交通大学
信息论与编码综合设计实验报告
班级:
级班
姓名:
学号:
实验项目名称:
线性分组码编译码实验
实验项目性质:
设计性实验
实验所属课程:
信息论与编码理论
实验室(中心):
网络实验中心
指导教师:
实验完成时间:
年月日
教师评阅意见:
签名:
年月曰
实验成绩:
一、设计题目
线性分组码编译码实验
二、实验目的:
1.掌握线性分组码的编码原理、编码步骤和译码方法
2.熟悉matlab软件的基本操作,学会用matlab软件进行线性分组码的编码和译码
三、实验主要内容及要求:
设计(15,11)或(255,247)线性分组码,利用随机生成的二进制序
列及BPSK调制方式,比较使用信道编码与未使用信道编码的误比特率曲线
四、实验设备及软件:
PC机一台、Matlab软件
该实验系统框图如上图所示,其中信源编码在本实验不做讨论,编号①采用线性分组码编码和译码,编号②为不采用信道编译码,通过这两种方法的对比,得出误码率曲线。
1.线性分组码编码
本实验采用的是(15,11)的线性分组码,线性分组码的编码由监督矩阵和生成矩阵实现,监督矩阵H为(4X11)的矩阵,由监督方程和(4X4)的单位矩阵构成,生成矩阵G为(11X15)的矩阵,由(11X11)的单位矩阵和监督矩阵的转置矩阵构成。
具体实现方法如下:
1将要编码的序列先整形,整为11列
2如果序列不能被11整除在后边补0使其能被11整除
3将整形后的序列与生成矩阵G相乘即得到编码后的码字其实现代码如下:
function[n,C]=xxbm(n)
a=randint(1,n);%生成01随机序列
disp('编码序列:
');
disp(a);
subplot(3,2,1);
stairs(a);
axis([1length(a)-0.51.5])
title('编码序列');
%判断生成的随机序列个数是否是11的整数倍
if
length(a)/11==fix(length(a)/11)
%随机序列个数是11的整数倍,直接编码b=reshape(a,11,(length(a)/11));
M=b';
F=eye(11);
S=[0011;0101;0110;0111;1001;1010;1011;1
100;1101;1110;1111];
K=eye(4);
G=[F,S];
H=[S',K];
C=rem(M*G,2);
disp('生成矩阵G:
');disp(G);
disp('监督矩阵H:
');
disp(H);
disp('码字:
');
disp(C);
else
%随机序列个数不是11的整数倍,补0后编码
s1=[a,zeros(1,(fix(length(a)/11)+1)*11-length(a))];
%补0b=reshape(s1,11,(length(s1)/11));
M=b';
F=eye(11);
S=[0011;0101;0110;0111;1001;1010;1011;1100;1101;1110;1111];
K=eye(4);
G=[F,S];
H=[S',K];%督矩阵
C=rem(M*G,2);
disp('生成矩阵G:
');disp(G);
disp('监督矩阵H:
');
disp(H);
disp('码字:
');disp(C);
end
subplot(3,2,2);
stairs(C);
axis([1length(C)-0.51.5]);
title('编码后的码字');
2.BPSK调希9
BPSK调制实现方法为:
1将0、1序列变为-1、1序列;
2将序列与载波相乘,为‘1'时与载波相位相同,为‘-1'时与载波相位相反。
其实现代码如下:
function[fc,fs,datarate,modusignal]=BPSKmodu(bits,datarate)fc=datarate*2;
fs=fc*8;
modusignal=[];
t=linspace(0,2,16);
carriar=cos(2*pi*t);
bits=bits*2-1;
fori=1:
length(bits)modusignal=[modusignal,bits(i)*carriar];
end
subplot(3,2,3);plot(modusignal);
title('BPSK调制后的波形');
3.信道加噪
使用awgn函数对调制信号进行加噪,其实现代码如下:
functioncs=channel(modusignal,bits)
cs=awgn(modusignal,1);
subplot(3,2,4);plot(cs);
title('相乘后信号频谱');
title('加噪后的波形');
4.BPSKS调
产生一个与载波频率相同的本地载波,与经信道加噪后的调制信号相乘,得到解调信号。
然后通过低通滤波器滤波器再抽样判决,得出解调后的原始信号。
(要减去滤波器的延时时间t,t=(滤波器长度+1)/2)
其实现代码如下:
functionk=designal(modusignal)
designal=[];
t=linspace(0,2,16);
carrier=cos(2*pi*t);
fori=1:
16:
length(modusignal)
designal=[designal,modusignal(i:
i+15).*carrier];
end
subplot(3,2,5);plot(designal);
title('解调后的波形');
loadlppass
L=(length(lppass)+1)/2;
y=filter(lppass,1,designal);
fori=1:
length(y);
ify(i)<0
y(i)=-1;
else
y(i)=1;
end
end
subplot(3,2,6);
plot(y);
axis([Llength(y)+L-1.51.5]);
title('抽样判决后的波形');
%
%抽样判决
fori=1:
1:
length(y)/16
k(i)=0;
forj=1:
16
k(i)=k(i)+y((i-1)*16+j);
end
k(i)=k(i)/16;
ifk(i)<0
k(i)=0;
else
k(i)=1;
end
end
5.信道译码(线性分组码译码)译码原理:
利用错误图样和伴随式纠错。
本实验所采用的为(15,11)线性分组码,最小汉明距离为3,所以具有纠错1位检错两位的功能。
设一个接收码字矩阵为R,R*H'=S(模2乘),则S为码字对应的伴随式矩阵如果S=0则说明接受码字无差错;
如果S不为0,查看矩阵S中不为0的那行所在行数,该行即收码字错误所在行i;
将S转置,将不为0的一列与H每一列进行比较,找到H中相同列,该列的列数即为错误所在列;
4由步骤得到错误具体位置,模2加对应的错误图样就可得到正确码字。
functionI=xxym(n,C)
[a,b]=size(C);
S=[0011;0101;0110;0111;1001;1010;1011;1100;1101;1110;1111];
K=eye(4);
H=[S',K];
A=[000000000000000];
B=eye(15);
E=[A;B];%生成错误图样
S=rem(C*H',2);
Q=H';m=zeros(1,a);fori=1:
a
在错误的位置给出提示并纠错
forj=1:
b
ifS(i,:
)==Q(j,:
)%m(i)=j;%
end
end
end
fori=1:
a%switch(m(i))
case0
找出出错的位置
数组m记录出错的位置
disp('没有出现错误!
');
G(i,:
)=C(i,:
)+E(1,:
);
case1
disp('注意:
第1位出现一个错误!
已纠错!
');
G(i,:
)=C(i,:
)+E(2,:
);
case2
disp('注意:
第G(i,:
)=C(i,:
)+E(3,:
);
case3
disp('注意:
第G(i,:
)=C(i,:
)+E(4,:
);
case4
disp('注意:
第G(i,:
)=C(i,:
)+E(5,:
);
case5
disp('注意:
第G(i,:
)=C(i,:
)+E(6,:
);
case6
disp('注意:
第G(i,:
)=C(i,:
)+E(7,:
);
case7
disp('注意:
第G(i,:
)=C(i,:
)+E(8,:
);
case8
disp('注意:
第G(i,:
)=C(i,:
)+E(9,:
);
case9
disp('注意:
第G(i,:
)=C(i,:
)+E(10,:
);
case10
disp('注意:
第G(i,:
)=C(i,:
)+E(11,:
);
case11
disp('注意:
第
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
位出现一个错误!
已纠错!
');
G(i,:
)=C(i,:
)+E(12,:
);
2
3
4
5
6
7
7
7
7
7
case12
disp('注意:
第7位出现一个错误!
已纠错!
');
G(i,:
)=C(i,:
)+E(13,:
);
case13
disp('注意:
第7位出现一个错误!
已纠错!
');
G(i,:
)=C(i,:
)+E(14,:
);
case14
disp('注意:
第7位出现一个错误!
已纠错!
');
G(i,:
)=C(i,:
)+E(15,:
);
case15
disp('注意:
第7位出现一个错误!
已纠错!
');G(i,:
)=C(i,:
)+E(16,:
);
end
end
disp('检错并纠错后的码组:
');
j=1;
whilej<=11%提取信息位
I(:
j)=G(:
j);
j=j+1;
end[m1,n1]=size(I);
I=I';
I=reshape(I,1,m1*n1);
fori=1:
n
C1(i)=I(i);
end
disp('译出的序列:
');
disp(C1);
显示原信息码
六、测试结果及说明:
1.信噪比为1时,结果如图:
编码序列
1.5■■
1
0.5-
0—
-0.5
246810
解调后的波形
编码后的码字
1.5■■
1■■
0.5,
0—II—
-0.5
51015
5
0
-5
0100200300
2.信噪比为5时,结果如图:
编码序列
编码后的码字
5
0
-5
加噪后的波形
解调后的波形
0100200300
1
0
-1
抽样判决后的波形
50100150200
3.信噪比为10时,结果如图:
4.译码时,当检测到误码时,结果如图:
0:
L00
1
1
0
]
0
01
I
1
>5£=[<11L]Q
]
1
Q
]
a
0I
J
1
]]
C=
□)1)Q
I
]
0
]
0
0I
J
1
i
I皿吓血口
空总:
裏4忆狀映r■能區!
己虬褚!
01100
1
1
0
]
0
01
1
1
1
oiiai
I
]
0
]
0
i-
□llqa
1
1
0
]
D
Q
实验结果分析:
由以上实验结果可知,该程序基本完成了线性分组码的编码、调制、加噪、解调、译码(包括检错纠错)等一系列操作。
随着信噪比的降低解调信号错误率越高,由于(15,11)线性分组只能纠正一位错误,对于大于等于2位的错误不能纠正,所以信噪比低低的情况下,会出现教的误码。
需要采取纠错能力更强的信道编码方法进行编码。
七、实验体会:
该实验是综合了matlab编程,信息论与编码的知识,实验中涉及到编码与译码、调制与解调、检错与纠错等内容,对初学者难度较大。
对于实验中的难点,要经过仔细分析思考,反复实验,最终才可能取得理想的效果。
该程序中编码采用生成矩阵才获得码字,所以具有一定的局限性,解调中用到的滤波器由自己设计,由于滤波器的参数对实验结果影响较大,所以滤波器的设计也是非常重要的。
通过实验,让我明白一个道理,理论的学习远远不能满足实际需要,即使课本上的知识掌握了,那也只能通过考试而已,而通过实验设计,自己深入研究以后,才会真正掌握其中的原理,而且重点难点才能理解清楚,也不会轻易忘记。