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

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

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

相关推荐
K 旺仔小馒头7 分钟前
【代码的暴力美学】-- C语言基础编程题_2
c语言·开发语言·刷题
MediaTea14 分钟前
Python 编辑器:Visual Studio Code
开发语言·ide·vscode·python·编辑器
懒羊羊不懒@17 分钟前
C语言指针进阶(进阶)
java·开发语言·面试
前路不黑暗@30 分钟前
Java:代码块
java·开发语言·经验分享·笔记·python·学习·学习方法
Pocker_Spades_A39 分钟前
C++程序设计上机作业(1)
开发语言·c++
乱飞的秋天1 小时前
C++中的特殊成员函数
开发语言·c++
小严家1 小时前
Flutter完整开发指南 | Flutter&Dart – The Complete Guide
开发语言·flutter
宇宙的尽头是PYTHON1 小时前
用生活中的实例解释java的类class和方法public static void main
java·开发语言·生活
道传科技上位机2 小时前
C# 循环和条件用法大全(while dowhile for foreach if Switch try)全站最全
开发语言·c#
寻星探路2 小时前
Java EE初阶启程记04---线程的状态
java·开发语言·jvm·java-ee