线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)
LFSR是一种移位寄存器电路,其中间步骤的两个或多个输出的线性组合会反馈到输入值。这就是为什么LFSR被称为线性反馈移位寄存器,如下图1所示 [1]。从图1中可以看出,LFSR主要由作为寄存器的D触发器和作为反馈运算的异或门组成。
更一般地,一个 n n n阶的LFSR由 n n n个D触发器和若干个异或门组成,如图2所示。其中, g n g_n gn为反馈系数,其值只能为0或1。1表示存在反馈回路,0表示不存在反馈回路,且 g 0 g_{0} g0总为1。以上图1中LFSR为例,其反馈系数为 g 0 = 1 g_0=1 g0=1, g 1 = 0 g_1=0 g1=0, g 2 = 0 g_2=0 g2=0, g 3 = 1 g_3=1 g3=1, g 4 = 1 g_4=1 g4=1。反馈系数决定了哪些中间D触发器的比特会反馈到输入位( D 1 D_1 D1),也即决定了随机数的产生算法。LFSR最右边是输出位( D n D_n Dn),输出的序列相应称为LFSR序列( X 0 , X 1 , ⋯ X_0,X_1,\cdots X0,X1,⋯)。LFSR的工作流程也很简单,每次时钟信号触发,D触发器内寄存的数据会整体位移一位( D 1 → D 2 D_1 \rightarrow D_2 D1→D2, D 2 → D 3 D_2 \rightarrow D_3 D2→D3,…, D n − 1 → D n D_{n-1} \rightarrow D_n Dn−1→Dn),同时一些中间结果的线性组合会反馈到输入位 D 1 D_1 D1,而输出位 D n D_n Dn会输出 D n D_n Dn寄存的比特值 X k X_k Xk。
更深入点,我们看一下如何数学地描述LFSR序列 [3]:
X
n
+
k
=
(
∑
i
=
0
n
−
1
g
n
−
i
X
k
+
i
)
mod
2
,
k
=
0
,
1
,
⋯
(1)
X_{n+k} = \left( \sum \limits_{i=0}^{n-1} g_{n-i} X_{k+i} \right) \text{mod}~2,~k=0,1,\cdots \tag{1}
Xn+k=(i=0∑n−1gn−iXk+i)mod 2, k=0,1,⋯(1)
我发现,这里很多文章都搞错了,或者搞不明白,所以我一开始也是被绕晕了,因为看了几份资料,说法不一。还好我死磕下去,按照自己理解和逻辑给理顺了。比如[2]中,将LFSR序列标号弄反了,虽然不能说是错误,但是不严谨,所以我将图2做了修改。
搞清楚上面这个式子,接下来我们再说一下如何去“表示”或“读”一个LFSR。关于这点,我看了一圈,很少有说明白的,甚至大名鼎鼎的sharetechnote都写错了。我这里总结大概有以下几种方法:
(1)抽头序列
什么叫抽头?维基百科的解释是“影响下一个状态的比特位叫做抽头”[4]。我们在这里将抽头形象(但是可能不严谨)地理解为反馈系数(但实际上 g 0 g_0 g0并不表示一个比特位),所以抽头序列就是反馈系数的序列。
以图1为例,图1中的LFSR对应的抽头序列是[1 0 0 1 1](注意是按照递增的顺序,即序列从左往右依次对应 g 0 , g 1 , ⋯ , g n g_0,~g_1,~\cdots,~g_n g0, g1, ⋯, gn)。
(2)特征多项式
以图1为例,图1中的LFSR对应的特征多项式为 f ( x ) = x 4 + x 3 + 1 f(x) = x^4+x^3+1 f(x)=x4+x3+1,或者更简单的表示为[4 3 0](1相当于 x 0 x^0 x0)。我们只要记住D触发器或者反馈系数是按照从左往右,序号依次递增的方式来标号即可(所以我又在图上标了D触发器的序号,这样帮助理解),这样就很容易写出LFSR对应的特征多项式,或者根据特征多项式画出LFSR。
(3)递归公式
以图1为例,图1中的LFSR对应的递归公式为
X
k
+
4
=
(
X
k
+
1
+
X
k
)
mod
2
,
k
=
0
,
1
,
⋯
(2)
X_{k+4} = \left(X_{k+1}+X_{k}\right) \text{mod}~2,~k=0,1,\cdots \tag{2}
Xk+4=(Xk+1+Xk)mod 2, k=0,1,⋯(2)
这个对照公式(1)或者图1也很好理解,只要记住图中的输出序列的序号,是从左往右依次递减的,这点和上面的反馈系数和D寄存器的序号规则正好相反。我们从右往左,将图最右边标上
X
k
X_{k}
Xk,再依次类推。
最后,我们说一下LFSR的性质 [1]:
- 如果初始状态相同,那么我们将始终得到相同的输出序列(即输出序列是确定的)。
- 输出序列趋向于随机序列(伪随机)。
- 经过一定次数的迭代后,我们将得到与初始状态相同的状态值(最大重复间隔可由 2 n − 1 \mathbf{2^{n}-1} 2n−1计算得到,其中 n n n为D触发器的数目,这里减去的1表示全0态)。
下图4给出了图1中LFSR在初始状态为 [ 1 , 1 , 1 , 1 ] [1,1,1,1] [1,1,1,1]的情况下,状态变化和输出序列计算的整个过程。
注释:
这里只是概要形象地解释了通信中常遇到的LFSR,实际的LFSR概念要更宽泛,也更复杂。比如,上述介绍的LFSR中,异或门可以替换为同或门 [4];LFSR一般分外接LFSR(即IE型LFSR或者Fibonacci LFSR)和内接LFSR(EE型LFSR或者Galois LFSR)[2] [4],但是我们在此不再深入。
最大长度序列(Maximum Length Sequence,MLS)
MLS也叫m-Sequence,其是LFSR序列的一种。m-Sequence区别于一般LFSR序列的地方在于,在D触发器数目相同的情况下,m-Sequence拥有最长的非重复序列,即其重复间隔为 2 n − 1 \mathbf{2^{n}-1} 2n−1 [2]。
如果一个LFSR序列为MLS,那么其对应的特征多项式必须是一个本原多项式,即为不可约多项式。必要不充分条件为:
- 抽头数必须为偶数。
- 抽头之间不能成对出现,必须是互质的。
一些比较典型的MLS如下表1中所示。
Gold Code
Gold Code是以Robert Gold命名的。Gold Code是指一组特殊的二进制随机(伪随机)序列,该组序列中每个成员/序列之间的相关性很小。由于这种特性(成员序列之间的相关性小),Gold Code被广泛地用作各种无线通信系统的扰码 [6]。
我们可以非常简单地利用m-Sequence来生成Gold Code:选择两个m-Sequence,且这两个序列的移位寄存器的数量相同,然后将这2个序列按位进行异或操作,就会产生Gold Code。下图5给出了LTE中常见的31阶Gold Code生成器电路,其常用于信道编码的加扰、参考信号、循环冗余校验(CRC)。
上面图5中的31阶Gold Code生成器电路输出的伪随机序列对应的就是下面的这个式子。这个式子我们在通信中,包括LTE和5G NR中会经常碰到,我们会在相应的文章中再具体解释。