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

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

完整代码获取链接:完整代码

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

相关推荐
2202_754421542 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热9 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
懷淰メ19 分钟前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm33 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
宁静@星空39 分钟前
006-自定义枚举注解
java·开发语言
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
武子康1 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
每天吃饭的羊1 小时前
python里的数据结构
开发语言·python
码农飞飞1 小时前
详解Rust枚举类型(enum)的用法
开发语言·rust·match·枚举·匹配·内存安全