1 前言
汉明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。能侦测并更正一个比特的错误;若有两个比特出错,则只能侦测,不能更正;若有三个或更多的比特出错,则不能侦测,更不能更正。
2 过程
本文的主要工作是将发送的数据经过汉明编码后,通过高斯/BSC信道,然后经过译码后,计算误码率,适合刚刚接触matlab仿真的阅读者。
汉明编译码过程
bash
function BER = hamming_code(data_length,p)
Hamming_count = data_length*15/11;
transmmited_date = randi([0 1], data_length, 1); % 发送的数据
temp_1 = zeros(Hamming_count, 1); % 临时存储变量
temp_2 = zeros(Hamming_count, 1); % 临时存储变量
count = 0;
% (15 11 4) 汉明码
% 汉明编码
Window_length = data_length/11;
Eleven_shape = reshape(transmmited_date, 11, Window_length)';
P= [ 1 1 0 0;
0 1 1 0;
0 0 1 1;
1 0 1 0;
1 0 0 1;
0 1 0 1;
1 1 1 0;
0 1 1 1;
1 0 1 1;
1 1 0 1;
1 1 1 1; ]; % 系数矩阵
G = [P eye(11)]; % 生成矩阵
transmmited_hamming = mod(Eleven_shape * G, 2);
transmmited_hamming = reshape(transmmited_hamming', 1, numel(transmmited_hamming))';
Reveice_hamming =BSC(p,transmmited_hamming,Hamming_count);
temp_2 = Reveice_hamming;
%汉明译码
Window_length = numel(temp_2)/15;
Fifteen_shape = reshape(temp_2, 15, Window_length)';
H = [eye(4) P']; % 校验矩阵
S = syndtable(H); % 伴随式
Syndrome = mod(Fifteen_shape*H',2);
S_index = Syndrome*[8; 4; 2; 1];
E = zeros(Window_length, 15); % 错误图像
for q = 1:Window_length
E(q,:) = S(S_index(q)+1,:);
end
temp_2 = mod(Fifteen_shape + E, 2); % 误差校正
temp_2(:,1:4) = []; % 除去校验bit
Receive_data = reshape(temp_2', data_length, 1);
% 计算误码率
for q = 1:data_length
if Receive_data(q)~=transmmited_date(q)
count = count+1;
end
end
BER = count/data_length;
end
2. 1经过BSC信道的代码流程如下:
发送数据 -> 15 11 4汉明编码 -> BSC信道 ->汉明译码 -> 接收数据 -> 计算BER
bsc信道
bash
function Rx_Symbol_array = BSC(p,Tx_Symbol_array,H_Bit_count);
%通过BSC信道
for i = 1:H_Bit_count
if(rand(1)<p)
Rx_Symbol_array(i) = ~Tx_Symbol_array(i);
else
Rx_Symbol_array(i) = Tx_Symbol_array(i);
end
end
end
2.2经过AWGN信道的代码流程如下
发送数据 -> 15 11 4汉明编码 -> BSSK调制-> AWGN信道 -> BPSK解调 ->汉明译码 -> 接收数据 -> 计算BER
3 仿真结果
1'从图中可以看出,理论误码率曲线和经过通信系统后的实际误码率曲线很接近,这说明了仿真的有效性。
2.还可以看出,误码率随着错误转移概率的增加而增加,这是因为,当错误概率越大的时候,传输过程中通信系统发生错误的可能性越大,发送的0变为1,发送的1变为0,从而导致整个系统的误码率变大
1 可以看出 在信噪比低的时候,未经编码的系统信噪比 反而优于 经过汉明编码的系统。这是因为,汉明编码包括信息位和校验位,经过编码后,实际发送的数据长度相比初始数据变长了。当snr很低时,通信系统的性能本来就不好,这时经过编码后 传输错误的bit数反而会多余 不经过编码的,使得系统的误码率变大。
2 当snr变大后,可以看出,经过汉明码的系统的误码率性能明显优于未经过编码的系统,这说明了汉明编码的性能
完整代码获取链接:完整代码
如有定做具体方向的需求,本专栏头像有联系方式,欢迎私聊。也十分欢迎热爱相关技术的朋友们私下交流