matlab代码--汉明码通过不同信道的误码率分析

1 前言

汉明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。能侦测并更正一个比特的错误;若有两个比特出错,则只能侦测,不能更正;若有三个或更多的比特出错,则不能侦测,更不能更正。

2 过程

本文的主要工作是将发送的数据经过汉明编码后,通过高斯/BSC信道,然后经过译码后,计算误码率,适合刚刚接触matlab仿真的阅读者。

汉明编译码过程

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信道

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变大后,可以看出,经过汉明码的系统的误码率性能明显优于未经过编码的系统,这说明了汉明编码的性能

完整代码获取链接:完整代码
如有定做具体方向的需求,本专栏头像有联系方式,欢迎私聊。也十分欢迎热爱相关技术的朋友们私下交流

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值