MATLAB实现(7,4)汉明码的编码解码纠错及BER的分析

背景

本科时信息论与编码的作业

课程为

Information Theory & Coding
Vaibhav Kumar, PhD
School of Electrical & Electronic Engineering
University College Dublin – The Republic of Ireland

下述作业也是老师布置的,如果涉及到版权问题我会删掉该博客。

流程逻辑如下:

数据->汉明编码->BPSK调制->加入AWGN(模拟传输时的噪声)->BPSK解调->汉明解码->输出数据

给定生成矩阵为

G=[1 1 0 1 0 0 0;
   0 1 1 0 1 0 0;
   1 1 1 0 0 1 0;
   1 0 1 0 0 0 1]; %generator matrix

给定的syndrome和coset leader的对应关系为

syndromecoset leader
0000000000
0010010000
0100100000
0110000100
1001000000
1010000001
1100001000
1110000010

代码

clc,clear
Eb_N0_log=0:0.5:10; %dB
Eb_N0=10.^(Eb_N0_log/10);
R_coded=4/7; %R
BER_coded=zeros(1,21); %store BER in different Eb/N0
G=[1 1 0 1 0 0 0;
   0 1 1 0 1 0 0;
   1 1 1 0 0 1 0;
   1 0 1 0 0 0 1]; %generator matrix
H=[1 0 0 1 0 1 1;
   0 1 0 1 1 1 0;
   0 0 1 0 1 1 1]; %parity-check matrix
for i=1:21 %calculate BER in different Eb/N0
    SNR_coded=2*R_coded*Eb_N0(i); %calculate SNR
    message=round(rand(1,1000000)); %generate original data
    px_w=1; %signal's power
    pn_w=px_w/SNR_coded; %noise's power
    error_number=0; %error bit number
    for index=1:250000 %250000 blocks
        m=[message(4*index-3),message(4*index-2),message(4*index-1),message(4*index)]; %one block data
        v=mod(m*G,2); %generate v
        message_modul=1-v*2; %0->1,1->-1 modulation
        r=message_modul+sqrt(pn_w)*randn(1,7); %add white Gaussian noise
        r=r<0; %demodulation
        s=mod(r*H',2); %generate syndrome
        syndrome=char(s+'0'); %find correspond error pattern
        e=zeros(1,7);
        switch syndrome
            case '000'
                e=[0 0 0 0 0 0 0];
            case '001'
                e=[0 0 1 0 0 0 0];
            case '010'
                e=[0 1 0 0 0 0 0];
            case '011'
                e=[0 0 0 0 1 0 0];
            case '100'
                e=[1 0 0 0 0 0 0];
            case '101'
                e=[0 0 0 0 0 0 1];
            case '110'
                e=[0 0 0 1 0 0 0];
            case '111'
                e=[0 0 0 0 0 1 0];
            otherwise
                disp('wrong syndrome')
        end
        signal=mod(r+e,2); %correct recieved data
        error_number=error_number+sum(sum(signal(1,4:7)~=m)); %find the number of error bits
    end
    BER_coded(i)=error_number/1000000;
end
semilogy(Eb_N0_log,BER_coded);
xlabel('Eb/N0 [dB]');
ylabel('BER');
title('BER versus Eb/N0');

BER =0.5*erfc(sqrt(2*Eb_N0)/sqrt(2)); %Q function
hold on;
semilogy(Eb_N0_log,BER);
xlabel('Eb/N0 [dB]');
ylabel('BER');
title('BER versus Eb/N0');

R_uncoded=1; %R
BER_uncoded=zeros(1,18);
for i=1:21 %calculate BER in different Eb/N0
    SNR_uncoded=2*R_uncoded*Eb_N0(i); %SNR
    message=round(rand(1,1000000)); %generate original data
    message_modul=1-message.*2; %0->1,1->-1 modulation
    px_w=1; %signal's power
    pn_w=px_w/SNR_uncoded; %noise's power
    r=message_modul+sqrt(pn_w)*randn(1,1000000); %add white Gaussian noise
    error_number=0;
    r=r<0; %demodulation
    error_number=error_number+sum(sum(r~=message)); %find the number of error bits
    BER_uncoded(i)=error_number/1000000;
end
hold on;
semilogy(Eb_N0_log,BER_uncoded);
xlabel('Eb/N0 [dB]');
ylabel('BER ');
title('BER versus Eb/N0');
legend('Coded(simulation)','Uncoded(theory)','Uncoded(simulation)');

计算BER

1、随机生成1000000比特,分为250000 block,每个block称为m。
2、进行汉明编码。
3、进行BPSK调制。
4、添加高斯白噪声
高斯白噪声
5、BPSK解码。
6、选择coset leader e并计算得出接收到的数据为r+e。计算错误比特的个数。
7、计算BER。
结果:
结果1

计算不使用汉明编码情况时的BER(模拟环境与理论情况)

1、随机生成1000000比特。
2、进行BPSK调制。
3、添加高斯白噪声
4、BPSK解码。
5、计算错误比特的个数。
6、利用第五部分结果计算模拟环境下的BER。
6、使用erfc函数计算理论情况下的BER。
结果:
在这里插入图片描述

总结

可以看到当Eb/N0大于5.8dB的时候汉明编码系统比未编码系统的BER低

  • 16
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值