前言

卷积码是一种重要的纠错编码方式,广泛应用于数字通信系统中,以提高数据传输的可靠性。它通过在发送信息中添加冗余数据来实现错误检测和修正。不同于块码直接处理整个数据块,卷积码对数据流进行连续的处理,以一种滑动窗口的方式逐步编码输入数据流。
卷积码的核心在于使用一组线性反馈移位寄存器(LFSR)来生成冗余数据。这些寄存器根据设定的生成多项式对输入数据进行处理,生成额外的校验位。通过这种方式,即使在传输过程中一部分数据受到干扰或丢失,接收端也能够利用剩余接收到的数据和冗余校验位,通过解码算法(如维特比算法)恢复原始信息。
卷积码的性能由其约束长度(寄存器的大小)、码率(原始数据位与添加的冗余位的比例)和多项式确定。码率越低,冗余度越高,纠错能力越强,但同时也意味着传输效率的降低。因此,在设计通信系统时,需要根据具体的应用需求和信道条件,权衡卷积码的码率和约束长度,以达到最佳的错误纠正性能和数据传输效率的平衡。

个人理解

本章中使用的卷积码不是普通的卷积码,是一种类似IIR的卷积码,这种卷积码的反馈是无穷反馈,这样的结构打破了线性,从而有了更有效的码字距离,更好的纠错能力,更小的误码平台。
这一部分的原理我也不是很清楚,涉及到了高等代数

步骤

img2

图中这些带有十字的结构成为异或门,这些异或门会判断输入的值是否相同,如果相同,输出为0,如果不同,输出为1。
带有D的框框成为寄存器,储存着上次的输入并输出到下级寄存器中。

这么介绍实在是太抽象了 我们举例几个具体例子
初始卷积结构中寄存器的数值都为0(具体为什么会在后面解释)
现在假设我们输入的数据为[1,0,1,1]
初始状态

img2

第一个时刻:
img2
输出为1

第二个时刻:
img2
输出为1

第三个时刻:
img2
输出为1

第四个时刻:
img2
输出为1

经过上面的例子,我们知道了卷积码卷积的过程。但是我们在实际代码中,不仅要对输入的码流进行编码,还要使寄存器在编码后清零,为此我们需要再编码后查询编码器的状态并输入特定的清零码使得寄存器清零,因为寄存器的方式是级联的,所以我们需要我们输入的码流能和反馈回的数据进行异或操作后输出0。寄存器总共有三个,不同的组合是2的三次方为8种,所以我们只需要使用查表的方式来控制输入的数据。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

% 第一编码器
%生成系数 无反馈线
one_G=[1,1,0,1];

%反馈线
one_F=[0,1,1];
%第一类型编码器寄存器个数
one_reg_len=size(one_F,2);

%编码器函数
function [coding,really_input]=get_coding(G,F,input) %输入 无反馈线 反馈线 第一类型编码器寄存器个数 输入

coding=zeros(1,size(input,2)); %初始化输入矩阵
% reg=zeros(1,len);
reg=[0,0,0];
feedback_input=0;
%编码
for input_count=1:40
//进行反馈计算
feedback_input=mod( input(1,input_count)+sum(reg.*F) ,2);
//进行输出计算
coding(1,input_count)=mod(sum(G.*[feedback_input,reg]),2);


% 寄存器更新
reg(2:end)=reg(1:end-1);
reg(1,1)=feedback_input;

end
//清空寄存器
end_data=get_end_data(reg); // 获得清空码
really_input=[input,end_data];
for input_count=41:43

feedback_input=mod( really_input(1,input_count)+sum(reg.*F) ,2);
coding(1,input_count)=mod(sum(G.*[feedback_input,reg]),2);


% 寄存器更新
reg(2:end)=reg(1:end-1);
reg(1,1)=feedback_input;


end


end

%清空寄存器函数
function end_data=get_end_data(input)


if input==[1,0,0]
end_data=[0,1,1];
end
if input==[1,0,1]
end_data=[1,1,1];
end
if input==[1,1,0]
end_data=[1,0,1];
end
if input==[1,1,1]
end_data=[0,0,1];
end
if input==[0,1,0]
end_data=[1,1,0];
end
if input==[0,1,1]
end_data=[0,1,0];
end
if input==[0,0,1]
end_data=[1,0,0];
end
if input==[0,0,0]
end_data=[0,0,0];
end


end

结语

在本章中我们介绍了带有反馈的卷积编码结构,与传统的卷积编码只是多了一个步骤,因为笔者的表达能力太差建议读者阅读本章时先去了解传统的卷积编码

整点二次元

img2