(7,4)汉明码原理
对于(7,4)汉明码, k = 4 k=4 k=4, n = 7 n=7 n=7,监督元位数 r = 3 r=3 r=3,满足 2 r − 1 = n 2^r-1=n 2r−1=n。如果给定了监督矩阵,例如
则这种汉明码也就确定了,也就是说,对于任意给定的信息码组,都可以由下式求出相应的监督位,即
若用方程组来表示,则可以写成
因此,知道了信息为 X 1 X_1 X1, X 2 X_2 X2, X 3 X_3 X3, X 4 X_4 X4就可以确定监督位 X 5 X_5 X5, X 6 X_6 X6, X 7 X_7 X7,这样就得到了(7,4)汉明码。
译码时,可以用校验矩阵
或者
根据 S 1 S_1 S1, S 2 S_2 S2, S 3 S_3 S3的取值的不同,可以确定错误的位置。如下表所示。
S 1 S_1 S1 | S 2 S_2 S2 | S 3 S_3 S3 | 错误位置 |
---|---|---|---|
0 | 0 | 0 | 无错 |
0 | 1 | 1 | X 1 ′ X_{1} ^{\prime} X1′ |
1 | 0 | 1 | X 2 ′ X_{2} ^{\prime} X2′ |
1 | 1 | 0 | X 3 ′ X_{3} ^{\prime} X3′ |
1 | 1 | 1 | X 4 ′ X_{4} ^{\prime} X4′ |
1 | 0 | 0 | X 5 ′ X_{5} ^{\prime} X5′ |
0 | 1 | 0 | X 6 ′ X_{6} ^{\prime} X6′ |
0 | 0 | 1 | X 7 ′ X_{7} ^{\prime} X7′ |
BPSK发送端星座图:
BPSK相干解调:
最小距离判决准则:
BPSK理论误比特率:
仿真结果:
clc
clear
close all
% Title: (7,4)汉明码在BPSK调制系统中的性能 %
% Data: 2020.01.20 %
% Author: K.X.Song %
L_data = 1000000; % 原始数据长度
L_code = L_data/4*7; % 编码后数据长度
data = round(rand(1,L_data)); % 原始数据
EbN0_dB = 0:10; % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10); % Eb/N0
Eb = 7/4; % 每比特能量
N0 = Eb ./ EbN0; % 噪声功率
error = zeros(1,length(EbN0_dB)); % 预置错误个数
ber = zeros(1,length(EbN0_dB)); % 预置仿真误比特率
tber_BPSK = zeros(1,length(EbN0_dB)); % 预置BPSK理论误比特率
tber_BPSK_Hamming = zeros(1,length(EbN0_dB)); % 预置BPSK+(7,4)汉明码理论误比特率
% (7,4)汉明码
code = zeros(1,L_code); % 预置编码后的序列
for k = 0:L_data/4-1
code(1,k*7+1) = data(1,k*4+1); % 编码方法详见技术文档
code(1,k*7+2) = data(1,k*4+2);
code(1,k*7+3) = data(1,k*4+3);
code(1,k*7+4) = data(1,k*4+4);
code(1,k*7+5) = xor(data(1,k*4+2),xor(data(1,k*4+3),data(1,k*4+4)));
code(1,k*7+6) = xor(data(1,k*4+1),xor(data(1,k*4+3),data(1,k*4+4)));
code(1,k*7+7) = xor(data(1,k*4+1),xor(data(1,k*4+2),data(1,k*4+4)));
end
send = (code - 1/2) * 2; % BPSK调制
for q = 1:length(EbN0_dB)
noise = sqrt(N0(q)/2) * randn(1,L_code); % AWGN
receive = send + noise; % 接收数据
demod = zeros(1,L_code); % 预置解调数据
decode = zeros(1,L_data); % 预置解码数据
for w = 1:L_code
if (receive(w) >= 0)
demod(w) = 1; % 数轴右侧 -> 1
else
demod(w) = 0; % 数轴左侧 -> 0
end
end
for k = 0:L_data/4-1
S(1) = xor(demod(1,k*7+2),xor(demod(1,k*7+3),xor(demod(1,k*7+4),demod(1,k*7+5)))); % 校正子详见技术文档
S(2) = xor(demod(1,k*7+1),xor(demod(1,k*7+3),xor(demod(1,k*7+4),demod(1,k*7+6))));
S(3) = xor(demod(1,k*7+1),xor(demod(1,k*7+2),xor(demod(1,k*7+4),demod(1,k*7+7))));
if (S == [0,1,1])
demod(1,k*7+1) = ~demod(1,k*7+1);
elseif (S == [1,0,1])
demod(1,k*7+2) = ~demod(1,k*7+2);
elseif (S == [1,1,0])
demod(1,k*7+3) = ~demod(1,k*7+3);
elseif (S == [1,1,1])
demod(1,k*7+4) = ~demod(1,k*7+4);
elseif (S == [1,0,0])
demod(1,k*7+5) = ~demod(1,k*7+5);
elseif (S == [0,1,0])
demod(1,k*7+6) = ~demod(1,k*7+6);
elseif (S == [0,0,1])
demod(1,k*7+7) = ~demod(1,k*7+7);
end
decode(1,k*4+1) = demod(1,k*7+1);
decode(1,k*4+2) = demod(1,k*7+2);
decode(1,k*4+3) = demod(1,k*7+3);
decode(1,k*4+4) = demod(1,k*7+4);
end
for w = 1:L_data
if (decode(w) ~= data(w))
error(q) = error(q) + 1; % 错误比特个数
end
end
ber(q) = error(q) / L_data; % 仿真误比特率
tber(q) = qfunc(sqrt(2*EbN0(q))); % 理论误比特率
end
figure
semilogy(EbN0_dB,ber,'M-X',EbN0_dB,tber,'B-O'); % 画图
grid on; % 坐标轴开启
axis([0 10 10^-5 10^-1]) % 限制作图范围
xlabel('Eb/N0 (dB)'); % 横坐标
ylabel('BER'); % 纵坐标
legend('BPSK+(7,4)汉明码仿真误比特率','BPSK理论误比特率'); % 图例