<信息论>[Matlab]-[实验三]线性分组码的编译码

实验三 线性分组码的编译码

线性分组码编解码的基本原理及特点

1.①线性分组码的基本原理及特点:

线性分组码,有两个特点,一个是线性,一个是分组。线性是指校验位和数据位成线性关系,可以通过线性方程直接求得。分组是指校验位由当前码组的数据位唯一确定。比如(n,k)线性分组码,指码长为n,数据位为k的编码方案。汉明码是线性分组码中的一种。

②编码即发送方生成码组

n = k + r n = k + r n=k+r。数据位为k位,冗余的校验位为r位。满足 2 r > = k + r + 1 2^r >=k+r+1 2r>=k+r+1

用kbit数据组成的行向量矩阵m乘以生成矩阵G,即得码组c , c 1 x n = m 1 x k X G k x n c_{1\mathrm{x}n} = m_{1\mathrm{x}k}\mathsf{X}G_{k\mathrm{x}n} c1xn=m1xkXGkxn

③解码即接收方破译码组

将接收到的码组c和校验矩阵H相乘,如果得到0向量,则说明接收是正确的

二、(7,4)汉明码编解码基本步骤

汉明码编码步骤

构建校验矩阵

H 0 = [ 1 1 1 0 1 0 0 0 1 1 1 0 2 0 1 1 0 1 0 0 1 ] H_0=\begin{bmatrix}1&1&1&0&1&0&0\\0&1&1&1&0&2&0\\1&1&0&1&0&0&1\end{bmatrix} H0=101111110011100020001

得到H0,然后生成相应的生成矩阵

G 0 = [ 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 ] G_0 =\begin{bmatrix} 1&0&0&0&1&0&1\\0&1&0&0&1&1&1\\0&0&1&0&1&1&0\\0&0&0&1&0&1&1\end{bmatrix} G0=1000010000100001111001111101

根据 H C T = 0 T HC^T = 0^T HCT=0T

{ C 3 = C 7 + C 6 + C 5 C 2 = C 6 + C 5 + C 4 C 1 = C 7 + C 6 + C 4 \begin{cases}C_3 = C_7 +C_6+C_5\\C_2=C_6+C_5+C_4\\C_1=C_7+C_6+C_4 \end{cases} C3=C7+C6+C5C2=C6+C5+C4C1=C7+C6+C4

根据上述公式生成汉明码编码电路

在这里插入图片描述

汉明码解码步骤

根据接收的码字 R R R计算伴随式 S T = H R T S^T=HR^T ST=HRT

在这里插入图片描述

三、MATLAB实现

本文通过matlab设计APP实现汉明码的编码和解码,程序源码可在文章末尾下载。

编码

在这里插入图片描述

解码

在这里插入图片描述

最小码距计算方法

%%验证汉明码最小码距
clear
clc
[h,g,n,k] = hammgen(3);
for i = 1:2^k
    for j = k: -1 :1
        if rem(i - 1,2^(-j + k + 1)) >= 2^(-j + k)
            u(i,j) = 1;
        else
            u(i,j) = 0;
        end
    end
end
c = rem(u * g,2)            %生成码组
d = min(sum((c(2:2^k,:))')) %取码组中非0码字的数量的最小值就是最小码距,转置的原因是因为sun函数默认是求矩阵列向量的和
x = sum((c(2:2^k,:))')

四、(7,4)汉明码的最小码距与码重及纠错能力的关系

最小码距也称最小汉明码(最小码距是指在一个码组集合中,任意两个码组之前最小值)

最小码重指在一个码组集合重,任意码组非零元素的个数

最小码距d和纠错能力之间的关系

(1)d ≥ e + 1

(2)d ≥ 2t + 1

(3)d ≥ e + t + 1, e>t

其中e指检测的错误,t指纠正的错误

(附加)AWGN信道下的BER曲线

%AWGN信道下的BER曲线
% 输入信息位
H = [1 0 0 1 0 1 1;0 1 0 1 1 1 0;0 0 1 0 1 1 1];
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];
lengh = 10000;
m = round(rand(1,lengh));
% 进行编码
for i = 1:2500
    for k = 1:4
        C(7*(i-1)+1:7*i) = mod(m(4*(i-1)+1:4*i) * G,2);
    end
end
% 进行传输
for cnt = 100:1500
    anr = cnt/100;
    anr_array(cnt-99) = anr;
    % 增加白噪声信号
    out = awgn(C,anr);
    % 进行判决
    I = size(out,2);
    % 接收编码
    for i = 1:I 
        if out(i) >= 0.5
            R(i) = 1;
        else
            R(i) = 0;
        end
    end
    plot(R);
    % 解码
    for i = 1:2500
        S = mod(H * (R(7*(i-1)+1:7*i))',2);
        for j = 1:7
            if S == H(:,j)
                R(7*(i-1)+1:7*i) = ~R(7*(i-1)+1:7*i);
            end
        end
    end
    for i = 1:2500
        dm(4*(i-1)+1:4*i) = R(7*i-3:7*i);
    end
    ber = 0;
    % 求BER
    for i = 1:10000
        if m(i) ~= dm(i)
            ber = ber + 1;
        end
    end
    ber = ber / 10000;
    ber_array(cnt-99) = ber;
end
plot(anr_array,ber_array);
title('AWGN信道下的BER曲线');
xlabel('信噪比/dB');
ylabel('比特出错概率');

在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值