【信道编码/Channel Coding】线性分组码

简介:


这是本专栏信道编码/Channel Coding的第二站,想对信道编码有一个系统性的认识可以看本专栏的 信道编码的整体框架 一文。而在本篇文章中,将介绍线性分组码的基本原理。

[信道编码/Channel Coding】信道编码的整体框架_Tomatomatodo的博客-CSDN博客信道编码是通信系统中非常重要的一环,它使我们构建的通信系统在一定条件下拥有检错和纠错的能力。而随着历史的演进,信道编码技术在不断地丰富,诞生了许多值得了解学习的编码技术。本篇文章将梳理信道编码的整体框架,旨在让读者对信道编码有一个系统性的认识。而每项技术的细节将在专栏的其他文章中展现。https://blog.csdn.net/Tomatomatodo/article/details/121902663?spm=1001.2014.3001.5501【信道编码/Channel Coding】纠错编码与差错控制_Tomatomatodo的博客-CSDN博客这是本专栏信道编码/Channel Coding的第一站,想对信道编码有一个系统性的认识可以看本专栏的信道编码的整体框架一文。而在本篇文章中,将介绍如何看一族码字的检错能力以及纠错能力,以及整个传输系统中,我们有什么进行差错控制的方式,这是踏入信道编码的第一步。https://blog.csdn.net/Tomatomatodo/article/details/121903825?spm=1001.2014.3001.5501

目录

简介:

一、线性分组码的性质

1.1 什么是线性

1.2 可用码组和禁用码组

二、矩阵思维看线性分组码

三、生成矩阵

3.1 生成矩阵的系统码

3.2 MATLAB实现生成码字

四、校验矩阵

4.1 校验矩阵的系统码

4.2  校验矩阵和生成矩阵之间的关系【重要】

五、线性分组码的解码

5.1 标准阵列式解码(最大似然估计)

5.2 伴随式译码


一、线性分组码的性质


1.1 什么是线性

在本专栏的信道编码的整体框架 一文中已经介绍了分组码的数学符号表示了,那么什么是线性分组码呢? 用最简单的说法解释就是,所有将k个信息比特映射成n个信息比特的约束关系都是线性的,那么什么是线性的约束关系呢?在二进制的逻辑运算中,异或运算(模二加减)是线性的,但是取反运算是非线性的。

线性分组码有以下重要性质:

  • 全0的信息比特对应的码字也是全0的
  • C(n,k)是一组码,其中每两个码相模二加减得到的码字依然在这组码中

举个栗子:

Message Segment(信息比特段)Codeword (码字)
0011000
0110101
1001110
1100011

上面这个就不是线性分组码。

1.2 可用码组和禁用码组

C(n,k)里,由于k是信息段,而r=n-k的冗余段是用某种约束关系生成的,所以只有 2^k 个可用码, 有 2^n - 2^k 个禁用码。

二、矩阵思维看线性分组码


很重要的一个思想就是将 C(n,k)看成是:1xn 的n维向量=1xk 的k维向量在n维空间的映射,这需要一定的线性代数思维,我尽可能简单地解释一下:

首先我们看9单位长的一条线,他是一维的对吧:

 一维的一条线对应矩阵就是一维向量 [9]。

现在我们想将其映射到二维空间去,怎么映射呢?首先要有映射规则,如下图所示:

 可以看到,我们选择把它放在一个正交二维坐标系中,而9长的一维向量映射到正交二维坐标系中就是进行投影,所以我们找到了映射关系 [ cos45 sin45 ] ,进行映射后得到一个二维向量。

再进一步,假如我们想将其映射到正交三维坐标系中呢?

可以看到,我们上一步先将一维向量映射到x-y平面中,图中对应蓝色向量映射成粉红色向量。此时我们再将二维向量向三维映射,因为粉红向量本来就在正交三维坐标系上,所以对应的映射关系就是    \begin{bmatrix} 0 &1 &0 \\ 1 & 0 &0 \end{bmatrix}

能不能直接从一维映射到三维呢?答案是当然可以:

 则a长一维向量对应三维坐标系中每个轴的投影,这个投影关系组成了映射关系(映射矩阵)

所以再重复一下:将 C(n,k)看成是:1xn 的n维向量=1xk 的k维向量在n维空间的映射,那么映射关系就是一个kxn的矩阵。

三、生成矩阵


根据上面所说的,码字向量C是由消息向量m通过kxn的映射关系矩阵生成的。而我们将这个kxn的映射矩阵叫生成矩阵。数学表示就是:

C=mG

 G就是生成矩阵。

3.1 生成矩阵的系统码

从行列式的基本运算我们可以看到,G的行变换不会改变码字空间(因为没有改变映射关系),所以生成矩阵进行行变换可以变出非常多种G,为了统一,我们引出系统码的说法,也即:将生成矩阵G化简为下面这种形式:

 其中 I_k 是kxk的单位矩阵,P_{kr} 是kxr的矩阵,r=n-k

所以有了这种G,我们通过公式 C=mG 就可以算出码字啦!

3.2 MATLAB实现生成码字

%%
clear;clc;
r=3;k=3;n=k+r; % Initialize the parameter of C(n,k)
msg_buffer=[0 0 0;  % Message segments
    0 0 1;
    0 1 0;
    0 1 1;
    1 0 0;
    1 0 1;
    1 1 0;
    1 1 1];
P=[0 1 1;1 0 1;1 1 0];  % P matrix is pre-defined rule
genmat=[P eye(3)];  % Generation Matrix
for i=1:1:8
    msg=msg_buffer(i,:);
    code=encode(msg,n,k,'linear/binary',genmat);
    disp(['The code of ' num2str(msg) ' is ' num2str(code)]);
end

但是兄弟们,G怎么来?P怎么来?往下看就知道了!

四、校验矩阵


若线性分组码中各个码元之间有约束关系,如:

\left\{\begin{matrix} C_2=C_4\\ C_1=C_3\\ C_0=C_4+C_3 \end{matrix}\right.

 (有人又要问了,约束关系怎么来?这就根据不同的信道编码技术有所不同了,所以我们这里随便写一个线性约束关系)

那么我们进行模二移位之后就会是:

\begin{Bmatrix} C_2\bigoplus C_4=0\\ C_1\bigoplus C_3=0\\ C_0\bigoplus C_3\bigoplus C_4=0 \end{matrix}

这不就可以写成:

 左边的矩阵就是校验矩阵H,表示某位码元的受约束情况。

即:

HC^T=0^T

也即:

CH^T=0

4.1 校验矩阵的系统码

和生成矩阵的系统码生成原理一样,将约束关系矩阵H进行行变换化简,使其变为下面的形式:

H = [ Q_{rk}, I_r]

4.2  校验矩阵和生成矩阵之间的关系【重要】

仍然用上面所述的矩阵思维看待G和H,kxn 的生成矩阵G的每一行都是k维向量映射到n维向量的规则,然而 nxr 的校验矩阵 H^T 的每一列则是将码元的约束条件,所以如若无差错发生的话,约束条件应该是被满足的,也即  GH^T=0

所以:

G=[I_k ,P_{kr}]=[I_k ,Q_{rk}^T]

 所以我们就得到了P和Q的关系!所以生成矩阵的确定就有眉目了,我们通过不同规则下的约束条件,构造校验矩阵的系统码,再通过Q去求P从而求得生成矩阵G。

五、线性分组码的解码


根据上面的叙述,我们已经知道通过某个约束条件,构造出校验矩阵H和生成矩阵G,然后再用公式 C=mG 生成码字。那么我们怎么解码呢?

5.1 标准阵列式解码(最大似然估计)

最大似然估计简单理解就是就近原则,也就是说,接收端收到一串码字和一族码字所有码比较,离谁近就译成谁。原理很简单,但是有时候会出现出错的码字和表里两个码都相邻的情况(比如最小码距等于2时),所以我们有特别的算法:

1. 由于是线性分组码,一定会有全零码字,我们找禁用码组中和全零码字汉明距离最小的,且1在左边的优先。

2.不断用除全零码字的其他可用码字和这个码字异或获得其他禁用码写在下面

举个栗子:可用码字为0000 0111 1010 1101

则:

陪集首
可用码字0000011110101101
禁用码字1000111100100101
0100001111101001
0001011010111100

最左边一列则称为陪集首

比如我接收到了0010,我就会译为1010,接收到1100,我就译为1101

5.2 伴随式译码

假设我们在接收端接收到的码字为 R,则 R = C + E,其中C是码字(无污染),而E是错误图样。打比方说,C=1010001, E=0010000 (意味着第三位错了),那么R=1000001,(经过模二加之后C的第三位变号了,得到R)。

由于:

CH^T=0

则在接收端:

S=RH^T=CH^T+EH^T=0+EH^T=EH^T

我们称S为伴随式(syndromes),可以看到S之和E和校验矩阵H有关,和C是无关的。我们整理一下,比如我们再举个的栗子:

Message

Code Vector

Weights

0000

0000000

0

0001

0110001

3

0010

1100010

3

0011

1010011

4

0100

1110100

4

0101

1000101

3

0110

0010110

3

0111

0100111

4

1000

1011000

3

1001

1101001

4

1010

0111010

4

1011

0001011

3

1100

0101100

3

1101

0011101

4

1110

1001110

4

1111

1111111

7

可以看到它的可用码中,最小码距是3,所以它只能纠正一个错误。所以错误图样很简单,就是一位出错的图样。再根据上面给的S的计算公式计算出S。

S(伴随式)

E(错误图样)

000

0000000

011

0000001

110

0000010

111

0000100

101

0001000

001

0010000

010

0100000

100

1000000

可以看到一个S对应一种错误图样,也就意味着哪个比特错了,由于是二元的,非0则1,检测到错误也可以纠正它。

  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: channel coding是一种用于提高通信系统可靠性的技术,其主要目的是在数据传输过程中引入冗余信息,以便在信道中出现噪声和误码时进行纠正。MATLAB是一种常用的科计算和仿真软件,其中包括许多用于通信系统设计的功能和工具。 在MATLAB中,可以通过使用通信系统工具箱来实现channel coding函数。该工具箱提供了一系列用于通信系统设计和仿真的函数和算法。以下是一些常用的channel coding函数: 1. convenc:这个函数用于实现卷积编码,将输入比特序列编码为输出比特序列。具体来说,该函数使用给定的生成多项式和约束长度对输入序列进行编码。 2. vitdec:这个函数用于实现维特比译码,将接收到的编码序列译码为原始输入序列。维特比译码是一种基于有限状态机的最大概率译码算法,通过在信道传播路径中进行前向和后向传播来估计最佳的编码序列。 3. ldpcenc:这个函数用于实现低密度奇偶校验编码(LDPC编码),将输入比特序列编码为输出比特序列。LDPC编码是一种具有低复杂性的前向纠错编码,通过使用稀疏校验矩阵和迭代解码算法来提高系统性能。 4. ldpcdec:这个函数用于实现LDPC译码,将接收到的编码序列译码为原始输入序列。该函数使用和 ldpcenc 相同的稀疏校验矩阵和迭代解码算法进行译码。 这些函数提供了一个简便的方式来实现常用的channel coding技术,并且可以根据具体的系统需求来选择合适的编码方案。通过MATLAB中的这些函数,设计师可以进行各种通信系统的建模和仿真,以评估系统性能并进行性能优化。 ### 回答2: 在MATLAB中,有几种方法可以实现信道编码函数。其中最常用的一种是使用调制函数,例如convenc。该函数用于将输入二进制序列编码为经过FEC(前向纠错)编码的信号。它可以应用于各种调制方案,例如卷积码、哈达码、RS码等。此函数的语法如下: codedBits = convenc(inputBits, trellis) 其中,inputBits是输入的二进制序列,trellis是描述编码方案的Trellis结构。输出codedBits是经过FEC编码的信号。 另一种常用的方法是使用编码器对象。编码器对象可以使用comm.CodedBitEncoder函数来创建,并通过encode方法来实现信道编码。该方法的语法如下: encoder = comm.CodedBitEncoder(coder, 'TerminationMethod', termination) encodedBits = encode(encoder, inputBits) 其中,coder是编码方案的类型,例如'conv', 'hamm'等,termination是终止方法,例如'Truncated', 'Terminated'等。encodedBits是经过FEC编码的信号。 除了以上两种方法,还可以使用自定义的编码函数来实现信道编码。可以使用for循环和逻辑运算符实现卷积码、海明码等编码方案。例如,对于卷积码,可以使用MATLAB的bitxor 和 bitand函数对输入位进行逻辑操作,并将结果存储在输出序列中。 综上所述,MATLAB提供了多种方法来实现信道编码函数,其中调制函数和编码器对象是最常用的方法。对于特定的编码方案,也可以自定义编码函数来实现信道编码。无论使用哪种方法,都可以根据实际需求选择合适的函数来实现信道编码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值