% disp('输入3行4列矩阵')
% A=input('A=');%这个是汉明码的固定的矩阵
A=[1 1 1 0; 0 1 1 1; 1 1 0 1];
H=[A eye(3)];%校验矩阵,eye()是单位矩阵
G=[eye(4) A'];% 生成矩阵
M=[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];%信息位矩阵,也可以自己换成其他的来输入
C=mod(M*G,2);%输出码字,mod函数是模2和的函数
disp('输入接收序列')
R=input('R=');%输入书上P88页的1010011
S=mod(H*R',2);%生成伴随矩阵S
disp('伴随式S')
S=mod(H*R',2)
disp('一致校验矩阵H')
H=[A eye(3)]
if S'==[0 0 0]
disp('传输无错,译码结果为:')
disp(R(1:4))%译码输出
else
disp('传输有错')
end
for i=1:7
if S==H(:,i)%将产生的伴随矩阵和H的每一列进行比较
if R(1,i)==0
R(1,i)=1;
else R(1,i)=0;
end
disp('错误位为')
i
disp('改正结果如下')
R
end
end
disp('最小码距为');
d=min(sum((C(2:16,:))'))
disp('输出码字为');
C=mod(M*G,2)
第一部分和第二部分代码如上:
%AWGN信道下的BER曲线
% 输入信息位
H = [1 0 0 1 0 1 1;0 1 0 1 1 1 0;0 0 1 0 1 1 1];
G = [1 1 0 1 0 0 0;0 1 1 0 1 0 0;1 1 1 0 0 1 0;1 0 1 0 0 0 1];
lengh = 10000;
m = round(rand(1,lengh));
% 进行编码
for i = 1:2500
for k = 1:4
C(7*(i-1)+1:7*i) = mod(m(4*(i-1)+1:4*i) * G,2);
end
end
% 进行传输
for cnt = 100:1500
anr = cnt/100;
anr_array(cnt-99) = anr;
% 增加白噪声信号
out = awgn(C,anr);
% 进行判决
I = size(out,2);
% 接收编码
for i = 1:I
if out(i) >= 0.5
R(i) = 1;
else
R(i) = 0;
end
end
plot(R);
% 解码
for i = 1:2500
S = mod(H * (R(7*(i-1)+1:7*i))',2);
for j = 1:7
if S == H(:,j)
R(7*(i-1)+1:7*i) = ~R(7*(i-1)+1:7*i);
end
end
end
for i = 1:2500
dm(4*(i-1)+1:4*i) = R(7*i-3:7*i);
end
ber = 0;
% 求BER
for i = 1:10000
if m(i) ~= dm(i)
ber = ber + 1;
end
end
ber = ber / 10000;
ber_array(cnt-99) = ber;
end
plot(anr_array,ber_array);
title('AWGN信道下的BER曲线');
xlabel('信噪比/dB');
ylabel('比特出错概率');
第三部分实验代码如上:
实验总结:编码部分:公式 c=m*G;译码部分:s=R*(H的转置);阅读信息论书本P79-92
参考文档<信息论>[Matlab]-[实验三]线性分组码的编译码_matlab线性分组码-CSDN博客线性分组码编码与译码(MATLAB实现)_循环码快速阵列译码和标准阵列译码对比-CSDN博客