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

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

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

相关推荐
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸1 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农1 小时前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
可峰科技1 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
全栈开发圈1 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
面试鸭1 小时前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展
小白学大数据2 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫