实验三 线性分组码的编译码
线性分组码编解码的基本原理及特点
1.①线性分组码的基本原理及特点:
线性分组码,有两个特点,一个是线性,一个是分组。线性是指校验位和数据位成线性关系,可以通过线性方程直接求得。分组是指校验位由当前码组的数据位唯一确定。比如(n,k)线性分组码,指码长为n,数据位为k的编码方案。汉明码是线性分组码中的一种。
②编码即发送方生成码组
n = k + r n = k + r n=k+r。数据位为k位,冗余的校验位为r位。满足 2 r > = k + r + 1 2^r >=k+r+1 2r>=k+r+1。
用kbit数据组成的行向量矩阵m乘以生成矩阵G,即得码组c , c 1 x n = m 1 x k X G k x n c_{1\mathrm{x}n} = m_{1\mathrm{x}k}\mathsf{X}G_{k\mathrm{x}n} c1xn=m1xkXGkxn
③解码即接收方破译码组
将接收到的码组c和校验矩阵H相乘,如果得到0向量,则说明接收是正确的
二、(7,4)汉明码编解码基本步骤
汉明码编码步骤
构建校验矩阵
H 0 = [ 1 1 1 0 1 0 0 0 1 1 1 0 2 0 1 1 0 1 0 0 1 ] H_0=\begin{bmatrix}1&1&1&0&1&0&0\\0&1&1&1&0&2&0\\1&1&0&1&0&0&1\end{bmatrix} H0=⎣⎡101111110011100020001⎦⎤
得到H0,然后生成相应的生成矩阵
G 0 = [ 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 ] G_0 =\begin{bmatrix} 1&0&0&0&1&0&1\\0&1&0&0&1&1&1\\0&0&1&0&1&1&0\\0&0&0&1&0&1&1\end{bmatrix} G0=⎣⎢⎢⎡1000010000100001111001111101⎦⎥⎥⎤
根据 H C T = 0 T HC^T = 0^T HCT=0T
{ C 3 = C 7 + C 6 + C 5 C 2 = C 6 + C 5 + C 4 C 1 = C 7 + C 6 + C 4 \begin{cases}C_3 = C_7 +C_6+C_5\\C_2=C_6+C_5+C_4\\C_1=C_7+C_6+C_4 \end{cases} ⎩⎪⎨⎪⎧C3=C7+C6+C5C2=C6+C5+C4C1=C7+C6+C4
根据上述公式生成汉明码编码电路
汉明码解码步骤
根据接收的码字 R R R计算伴随式 S T = H R T S^T=HR^T ST=HRT
三、MATLAB实现
本文通过matlab设计APP实现汉明码的编码和解码,程序源码可在文章末尾下载。
编码
解码
最小码距计算方法
%%验证汉明码最小码距
clear
clc
[h,g,n,k] = hammgen(3);
for i = 1:2^k
for j = k: -1 :1
if rem(i - 1,2^(-j + k + 1)) >= 2^(-j + k)
u(i,j) = 1;
else
u(i,j) = 0;
end
end
end
c = rem(u * g,2) %生成码组
d = min(sum((c(2:2^k,:))')) %取码组中非0码字的数量的最小值就是最小码距,转置的原因是因为sun函数默认是求矩阵列向量的和
x = sum((c(2:2^k,:))')
四、(7,4)汉明码的最小码距与码重及纠错能力的关系
最小码距也称最小汉明码(最小码距是指在一个码组集合中,任意两个码组之前最小值)
最小码重指在一个码组集合重,任意码组非零元素的个数
最小码距d和纠错能力之间的关系
(1)d ≥ e + 1
(2)d ≥ 2t + 1
(3)d ≥ e + t + 1, e>t
其中e指检测的错误,t指纠正的错误
(附加)AWGN信道下的BER曲线
%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('比特出错概率');