文章目录
- 前言
- 一、什么是信道编码?
- 二、信道编码的基本逻辑—冗余数据
- 1、奇偶检验码
- 2、重复码
- 三、编码率
- 四、4G 和 5G 的信道编码
- 1、卷积码
- 2、维特比译码(Viterbi)—— 概率译码
- 3、LTE 的咬尾卷积码
- 4、LTE 的 turbo 码
- 五、MATLAB 仿真
- 1、卷积码 ploy2trellis 函数
- ①、无负反馈的函数调用方法
- ②、有负反馈的函数调用方法
- 2、生成卷积码,维特比译码(简述)
前言
本文对数字通信技术中的信道编码及译码进行学习记录。
数字通信,就是把一切声音,图像,文字,都变成 0,1 这种二进制代码,这种转换过来的数据,我们可以称之为原始数据 bit 那么,这种原始的 bit,是否可以直接调制,转换成电磁波发送出去呢?答案是不可以,因为电磁波传输过程中,一定会存在于扰和噪声,从而产生差错
下图为数字通信系统模型
一、什么是信道编码?
首先引用书上的定义对信道编码进行一下讲解:
信道编码(Channel Coding)的作用是进行差错控制。数字信号在传输过程中会受到噪声等影响而发生差错。为了减小差错,信道编码器对传输的信息码元按一定的规则加入保护成分(监督码元),组成所谓“抗干扰编码”。接收端的信道译码器按相应的逆规则进行解码,从中发现错误或纠正错误,提高通信系统的可靠性。
下面我们举个例子形象描述一下。
假设,我们把 “你好” 这两个字转换成 0,1 代码,比如用 00 和 01 分别代表你和好,在我们发送 00 时,因干扰原因,导致我们发送的数据变成了 01,那么我们发送的信息本来应该是“你”,而被接收端识别成了“好”,如下图所示:
我们为了抗干扰,就需要增加一个步骤,来让我们的数据具备“一定程度上的纠正干扰产生的差错的能力”,这个步骤就叫信道编码。
二、信道编码的基本逻辑—冗余数据
在进行信道编码时,需要增加冗余数据来达到抗干扰的效果,以下图为例,在运输花瓶时,为避免花瓶运输路途中破碎,我们增加一个泡沫箱子,再打包后通过快递进行发送,这里面的泡沫箱子及顺丰快递箱子就可以类似于冗余数据。
我们这里列举一些常用的冗余数据。
1、奇偶检验码
原始数据 100101100
- 奇校验:1001011001,校验位为 1,让 1 的总数变成奇数 5
- 偶校验:1001011000,校验位为 0,让 1 的总数保持为偶数 4
增加的 1bit 位,为校验位,也就是冗余 bit
假设使用奇校验:1001011001
- 传输过程中,错 1 位:1011011001,可以发现错误
- 传输过程中,错 2 位:0011011001,发现不了错误
奇偶校验码只具备检错的能力,而不具备纠错能力
2、重复码
原始信息 1 或者 0
编码
- 1 ——> 111
- 0 ——> 000
当受到干扰导致错 1 位的时候,可以达到纠错的效果
当受到干扰导致错 2 位的时候,不可以达到纠错的效果
三、编码率
R
=
K
/
N
R=K/N
R=K/N
K
K
K:有用 bit 数据
N
N
N:编码后的 bit 数据
以前面的码为例,原始数据 100101100 共 9 bit,奇校验: 1001011001 共 10 bit,编码率 R = 9 / 10 = 0.9 R=9/10=0.9 R=9/10=0.9
重复码编码率 R = 1 / 3 R=1/3 R=1/3
- 1/3 编码,表示 3 个编码后的比特中,包含 1 个有效比特;
- 1/4 编码,表示 4 个编码后的比特中,包含 1 个有效比特;
编码率越低,包含的几余信息越多,纠错的能力越强,抗干扰的能力越强,传输的有效数据越小
四、4G 和 5G 的信道编码
4G 的信道编码包括卷积码和 turbo 码,5G 的信道编码包括 polar 和 ldpc 码。
1、卷积码
卷积码一般使用( n , K , N n,K,N n,K,N)表示卷积编码器。
- K K K 表示:输入的 K 个 bit (需要编码的原始 bit 数)
- n n n 表示:输出的 n n n 个 bit 编码后的 bit 数
- 编码率 R = K / n R=K/n R=K/n
- N N N:编码约束度 (实际上就是寄存器的个数)
卷积码将 K K K 个信息码元编为 n n n 个码元时,这 n n n 个码元不仅与当前的 K K K 个信息有关,也与前面的 N − 1 N-1 N−1 段信息有关
参考下面的例子:
2、维特比译码(Viterbi)—— 概率译码
维特比译码是根据接收序列,在网格图上找出一条与接收序列汉明距离最小的一种算法
汉明距离 Hamming:两个码组对应码位上具有不同二进制码元的位数,为两码组的距离,简称码距
举个例子:
码 1:000
码 2:101
这两个码的码距为 2
下面我们继续举个例子:
- 假设发送信息位是 1101
- 编码后发送的序列为 111 110 010 100
- 接收序列:111 010 010 110
注意:上面接收序列由于干扰导致出现了差错,现在我们看一下维特比译码是如何纠错的
每一种序列,都是网格图上的一条路径,0 用实线,1 用虚线
因此,最后解码序列为:111 110 010 100,达到了纠错的效果
如果更复杂的,可能会出现有两个汉明距离,那么我们就会随机选作为它的译码,导致出现错了,这也就是为什么维特比译码叫做概率译码
3、LTE 的咬尾卷积码
4、LTE 的 turbo 码
五、MATLAB 仿真
1、卷积码 ploy2trellis 函数
ploy2trellis 函数有两种调用形式:
trellis=poly2trellis(ConstraintLength,CodeGenerator);
trellis=poly2trellis(ConstraintLength,CodeGenerator,...FeedbackConnection)
后者应用于有负反馈的情形
ploy2treliis 顾名思义:多项式 ploy 到网格图 trellis
卷积码的生成多项式可以由一系列多项式描述,我们将多项式转化为 trellis 结构,这种结构又可以作为 matalb 中线形卷积编码函数 convenc 和或者其解码(如 Viterbi 解码函数 vitdec)的输入。
①、无负反馈的函数调用方法
- (3,2,4)卷积码,2 进 3 出,记忆长度(约束长度)L=max{4,3}+1=5
- 输入数据共两个对应两行寄存器,第一行有 4 个移位寄存器,第二行 3 个,分别对应约束长度(4+1,3+1)=(5,4)。那么 ConstraintLength 就应该是[5,4]。
- 第一位输出由第一行寄存器的“贡献”(生成序列)为(10,011)=23
- 第二位输出由第一行寄存器的“贡献”(生成序列)为(11,101)=35
- 第三位输出由第一行寄存器的“贡献”(生成序列)为(00,000)=0
==========================================================
- 第一位输出由第二行寄存器的“贡献”(生成序列)为(0,000)=0
- 第二位输出由第二行寄存器的“贡献”(生成序列)为( 0,101)=5
- 第三位输出由第二行寄存器的“贡献”(生成序列)为( 1,011)=13
那么 CodeGenerator 就是[23,35,0; 0,5,13]
运行
trellis=poly2trellis([5,4],[23,35,0;0,05,13])
输出如下:
trellis =
包含以下字段的 struct:
numInputSymbols: 4
numOutputSymbols: 8
numStates: 128
nextStates: [128×4 double]
outputs: [128×4 double]
- numInputSymbols: 4
- 输入状态数
- 表示两路输入共有 4( 2 k 2^k 2k, k k k为输入的路数)种状态分别为 00,01,10,11
- numOutputSymbols: 8
- 输出状态数
- 表示输出共有 8( 2 n 2^n 2n, n n n为输出的路数)种状态分别为 000,001,010,011,100,101,110,111
- numStates: 128
- 寄存器状态数
- 当前状态数是 128( 2 7 2^7 27,7 是寄存器的总个数) 状态是 7 为二进制数
- nextStates: [128x4 double]
- 下一个状态
- nextState 是 numStates-by-2k 的矩阵。他表示所有当前状态和当前输入组合所产生的下一状态。相当于马尔科夫链的状态转移表。行表示各种不同的当前状态,依次表示从全 0 状态到全 1 状态。
- outputs: [128x4 double]
- 输出
- outputs 也是 numStates-by-2k 的矩阵。他表示所有当前状态和当前输入组合所产生的输出(8进制表示)。行和列的意义的nextState相同。
>> trellis.nextStates(1:5,:)
ans =
0 64 8 72
0 64 8 72
1 65 9 73
1 65 9 73
2 66 10 74
上面我们列出了nextStates的 1-5 行
- (1,1)的元素表示在全 0 状态(0000000)时,输入 00 时的下一个状态还是全 0(0000000),即所有的寄存器的结果还都是 0;
- (1,2)的元素表示在全 0 状态(0000000)时,输入 01 时的下一个状态是 64(1000000)
…… - (2,1)的元素表示在 1 状态(0000001)时,输入为 00 时的下一个状态时全 0(0000000)
……
②、有负反馈的函数调用方法
考虑如下卷积码生成图
- 同理,记忆长度(约束长度)L=4+1=5,生成
- 第一位输出由寄存器的“贡献”(生成序列)为(11,111)=37
- 第二位输出由寄存器的“贡献”(生成序列)为(11,011)=33
- 那么 CodeGenerator 就是 [37,33]
- 负反馈多项式为为(11,111)=37
运行
trellis = poly2trellis(5,[37 33],37)
输出如下:
trellis =
包含以下字段的 struct:
numInputSymbols: 2
numOutputSymbols: 4
numStates: 16
nextStates: [16×2 double]
outputs: [16×2 double]
结构体中的变量含义与第一节一致。
2、生成卷积码,维特比译码(简述)
%编码部分
data = randi([0 1],70,1);%产生一段二进制信息序列
code_data=convenc(data,trellis);%trellis是我们在一或二节产生的网格图,得到卷积码
%译码部分
tbdepth = 34; % 维特比解码器的回溯深度
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');
%验证解码数据是否有错误。
numOfErrorBit=biterr(data,decodedData)
本文学习记录参考:
1、【小白也能看懂】信道编码—卷积码等相关内容
2、卷积码matlab实现之ploy2trellis函数
我的qq:2442391036,欢迎交流!