第2章(1):线性分组码

第2章(1):线性分组码

本章主要内容如下:

一、通信理论框图与通信仿真框图的对比

二、信道编码是什么?为什么要编码?编码增益是什么及其本质理解?

三、线性分组码,(7,4)汉明码理论仿真

四、BPSK调制解调+(7,4)汉明码的MATLAB仿真

五、总结

一、通信仿真框图与通信理论框图的对比

上一讲《第1章:BPSK调制解调仿真》,我主要介绍通信发端到收端的整个过程。

为了方便你理解,我将MATLAB仿真物理层通信的过程以框图形式,以对比一下通信系统方框图的区别。

来自斯克拉的《数字通信》 典型数字通信系统的方框图

那么捕获和同步加到哪个位置呢?我到后面的章节会说到这个问题。因为解调的方式要分相干解调和非相干解调。

二、信道编码

对于数字通信系统来说,有效性传输速率来衡量,比如码元传输速率、信息传输速率可靠性差错率来衡量,比如误码率,误信率

接下来进入编码,为什么要信道编码呢?信道编码便是提升系统可靠性的。

香农指出,任何一个通信信道都有其确定的信道容量C,如果通信系统所要求的传输速率小于C,则存在一种编码方法,当码长足够大,且接收端采用最大似然译码时,信息的错误概率可以任意小。(慢慢体会,嘿嘿嘿)

结合图6.9,为什么在低信噪比条件下,未编码系统比编码系统的误码率性能好呢?(这个问题是当时我保研面试时,我导师问我的问题之一。)

对于接收机来说,先解调再判决成0和1,然后进行信道解码,这是硬判决形式。

每一种码字都有自己的纠检错能力,当处于低信噪比情况下,解调器产生大量错误,超出了解码器的解码能力,导致其比未编码系统性能差。

三、线性分组码

通信专业的本科或者研究生一般都会开设信道编码的课程,比如我本科上的选修课《纠错码理论》,研究生上的《编码理论》。

线性分组码的理论知识,在网上也可以随便查到,比如(n,k)的表示方式,n表示编码长度,k表示信息比特,生成矩阵,校验矩阵,伴随式,错误图样等概念要有。

本文以(7,4)汉明码这一种线性分组码为例,重点介绍在MATLAB是如何仿真实现的。

首先,看看网上已有的理论仿真,我本科写的和下面也类似,如下:

%%%%%%%%%代码原创来源:CSDN上通信研一狗的《(7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真》

clc
clear
close all
% Title:  (7,4)汉明码在BPSK调制系统中的性能 %
% Data:    2020.01.20 %
% Author:  K.X.Song   % 
L_data = 100000;                       % 原始数据长度
L_code = L_data/4*7;                    % 编码后数据长度
data = round(rand(1,L_data));           % 原始数据
EbN0_dB = 0:10;                         % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10);                % Eb/N0
Eb = 7/4;                               % 每比特能量
N0 = Eb ./ EbN0;                        % 噪声功率
error = zeros(1,length(EbN0_dB));       % 预置错误个数
ber = zeros(1,length(EbN0_dB));         % 预置仿真误比特率
tber_BPSK = zeros(1,length(EbN0_dB));   % 预置BPSK理论误比特率
tber_BPSK_Hamming = zeros(1,length(EbN0_dB));   % 预置BPSK+(7,4)汉明码理论误比特率
% (7,4)汉明码
code = zeros(1,L_code);                  % 预置编码后的序列
for k = 0:L_data/4-1
    code(1,k*7+1) = data(1,k*4+1);      % 编码方法详见技术文档
    code(1,k*7+2) = data(1,k*4+2);
    code(1,k*7+3) = data(1,k*4+3);
    code(1,k*7+4) = data(1,k*4+4);
    code(1,k*7+5) = xor(data(1,k*4+2),xor(data(1,k*4+3),data(1,k*4+4)));    
    code(1,k*7+6) = xor(data(1,k*4+1),xor(data(1,k*4+3),data(1,k*4+4)));
    code(1,k*7+7) = xor(data(1,k*4+1),xor(data(1,k*4+2),data(1,k*4+4)));
end
send = (code - 1/2) * 2;                % BPSK调制
for q = 1:length(EbN0_dB)
    noise = sqrt(N0(q)/2) * randn(1,L_code);    % AWGN
    receive = send + noise;                     % 接收数据
    demod = zeros(1,L_code);                    % 预置解调数据
    decode = zeros(1,L_data);                   % 预置解码数据
    for w = 1:L_code
        if (receive(w) >= 0)
            demod(w) = 1;              % 数轴右侧 ->  1
        else
            demod(w) = 0;              % 数轴左侧 ->  0
        end
    end
    for k = 0:L_data/4-1
        S(1) = xor(demod(1,k*7+2),xor(demod(1,k*7+3),xor(demod(1,k*7+4),demod(1,k*7+5))));    % 校正子详见技术文档
        S(2) = xor(demod(1,k*7+1),xor(demod(1,k*7+3),xor(demod(1,k*7+4),demod(1,k*7+6))));
        S(3) = xor(demod(1,k*7+1),xor(demod(1,k*7+2),xor(demod(1,k*7+4),demod(1,k*7+7))));
        if (S == [0,1,1])
            demod(1,k*7+1) = ~demod(1,k*7+1);
        elseif (S == [1,0,1])
            demod(1,k*7+2) = ~demod(1,k*7+2);
        elseif (S == [1,1,0])
            demod(1,k*7+3) = ~demod(1,k*7+3);
        elseif (S == [1,1,1])
            demod(1,k*7+4) = ~demod(1,k*7+4);
        elseif (S == [1,0,0])
            demod(1,k*7+5) = ~demod(1,k*7+5);
        elseif (S == [0,1,0])
            demod(1,k*7+6) = ~demod(1,k*7+6);
        elseif (S == [0,0,1])
            demod(1,k*7+7) = ~demod(1,k*7+7);
        end
        decode(1,k*4+1) = demod(1,k*7+1);
        decode(1,k*4+2) = demod(1,k*7+2);
        decode(1,k*4+3) = demod(1,k*7+3);
        decode(1,k*4+4) = demod(1,k*7+4);
    end
    for w = 1:L_data
        if (decode(w) ~= data(w))
            error(q) = error(q) + 1;    % 错误比特个数
        end
    end
    ber(q) = error(q) / L_data;         % 仿真误比特率
    tber(q) = qfunc(sqrt(2*EbN0(q)));   % 理论误比特率
end
figure
semilogy(EbN0_dB,ber,'M-X',EbN0_dB,tber,'B-O');     % 画图
grid on;                                        % 坐标轴开启
axis([0 10 10^-5 10^-1])                        % 限制作图范围
xlabel('Eb/N0 (dB)');                           % 横坐标
ylabel('BER');                                  % 纵坐标
legend('BPSK+(7,4)汉明码仿真误比特率','BPSK理论误比特率');   % 图例

上面的代码来自CSDN上通信研一狗的《(7,4)汉明码在BPSK系统下的性能-MATLAB基带仿真》,我运行了下,应该是没有问题。

尤其是我在上一章中提到的下图:

举个例子来说,(7,4)汉明码+BPSK调制,1个符号是1个信道比特,而1个信道比特有4/7个是信息比特,所以 \[k = \frac{4}{7}{\log _2}2\]

若是(7,4)汉明码+QPSK调制,1个符号是2个信道比特,1个信道比特,有4/7个是信息比特,所以 \[k = \frac{4}{7}{\log _2}4\]

信道比特是指信息比特经过信道编码后的比特,信道编码产生的校验比特是不带信息量的。

这和以上代码段是相对应的:

EbN0_dB = 0:10;                         % Eb/N0 dB形式
EbN0 = 10.^(EbN0_dB/10);                % Eb/N0
Eb = 7/4;                               % 每比特能量
N0 = Eb ./ EbN0;                        % 噪声功率

总而言之,一定要理解编码前后比特(bit)的关系,即信息比特和校验比特的关系,这取决于编码方式,比特与符号(symbol)的关系,这取决于调制方式。

采用信道编码后,增加了冗余,提升了系统的可靠性。同时,也增加了信号传输所需的带宽,怎么理解增加带宽呢?

四、BPSK调制解调+(7,4)汉明码的MATLAB仿真

在上面的代码实现中,是没有发送端的基带成型、接收端的匹配滤波、低通滤波等过程,因此结合《第1章:BPSK调制解调器仿真》,注意编码的时候只对数据比特进行编码,数据比特之前的帧头部分,之后的帧尾部分,都不对其进行编码

至于帧头部分和帧尾部分有什么用?比如帧头作为信道估计、捕获和同步等作用,当我自己能完全搞清楚的时候,再讲,就是这么扎心了。

结合前面一章《第1章:BPSK调制解调器仿真》,便可以画出(7,4)汉明码+BPSK调制的误码率曲线图。

同时,你可以将解调器输出的结果与译码之后的结果作对比,可以验证我在之前讲的“每一种码字都有自己的纠检错能力,当处于低信噪比情况下,解调器产生大量错误,超出了解码器的解码能力,导致其比未编码系统性能差。”

(7,4)汉明码与未编码系统的误码率对比图

下面介绍编码增益,编码增益便是在相同的误码率条件下,未编码系统所需要的比特信噪比与编码系统所需要的比特信噪比之差,当然说“差值”的前提是比特信噪比用dB来表示

举个例子来说,在上面的结果图中,比如当误码率在 \[{10^{ - 4}}\] 时,编码系统所需比特信噪比是8dB,未编码系统所需比特信噪比是8.2dB,那么(8.2-8=)0.2dB便是编码增益。

那么编码增益有什么用,实际的通信系统不可能就恰好让(7,4)汉明码系统在接收端比特信噪比是8dB,一般会有链路余量,比如2dB的余量,即让接收端比特信噪比是10dB。

编码增益在链路预算、通信系统的设计是非常有用的,详见《数字通信——基础与应用》的第5章的通信链路分析和第9.7节的数字通信系统的定义、设计和评估。

那么编码增益的本质是什么呢?

以上两张图,来自我非常喜欢的另外一本书, @杨学志 的《通信之道——从微积分到5G》,无论是保研考研面试,还是求职找工作,读一读这本书相信你会有所收获。

五、总结

线性分组码这种信道编码本身并不难理解,在通信专业本科的《信息论与编码》也会讲解,因此本文不对线性分组码的理论知识做过多的介绍。如果你还不了解线性分组码的相关知识,建议你自行查阅相关资料。

请你也别忘了把这篇文章分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。这是《陈老湿·通信MATLAB仿真》的第2章,下次更新见!

编辑于 2021-12-29 14:18