伪随机序列:LFSR Sequence、m-Sequence和Gold Code/Sequence
线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)
LFSR是一种移位寄存器电路,其中间步骤的两个或多个输出的线性组合会反馈到输入值。这就是为什么LFSR被称为线性反馈移位寄存器,如下图1所示 [1]。从图1中可以看出,LFSR主要由作为寄存器的D触发器和作为反馈运算的异或门组成。
图1. LFSR示例 [1]
更一般地,一个nnn阶的LFSR由nnn个D触发器和若干个异或门组成,如图2所示。其中,gng_ngn为反馈系数,其值只能为0或1。1表示存在反馈回路,0表示不存在反馈回路,且g0g_{0}g0总为1。以上图1中LFSR为例,其反馈系数为g0=1g_0=1g0=1,g1=0g_1=0g1=0,g2=0g_2=0g2=0,g3=1g_3=1g3=1,g4=1g_4=1g4=1。反馈系数决定了哪些中间D触发器的比特会反馈到输入位(D1D_1D1),也即决定了随机数的产生算法。LFSR最右边是输出位(DnD_nDn),输出的序列相应称为LFSR序列(X0,X1,⋯X_0,X_1,\cdotsX0,X1,⋯)。LFSR的工作流程也很简单,每次时钟信号触发,D触发器内寄存的数据会整体位移一位(D1→D2D_1 \rightarrow D_2D1→D2,D2→D3D_2 \rightarrow D_3D2→D3,…,Dn−1→DnD_{n-1} \rightarrow D_nDn−1→Dn),同时一些中间结果的线性组合会反馈到输入位D1D_1D1,而输出位DnD_nDn会输出DnD_nDn寄存的比特值XkX_kXk。
图2. n阶LFSR示例 [2]
更深入点,我们看一下如何数学地描述LFSR序列 [3]:
Xn+k=(∑i=0n−1gn−iXk+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]。我们在这里将抽头形象(但是可能不严谨)地理解为反馈系数(但实际上g0g_0g0并不表示一个比特位),所以抽头序列就是反馈系数的序列。
以图1为例,图1中的LFSR对应的抽头序列是[1 0 0 1 1](注意是按照递增的顺序,即序列从左往右依次对应g0,g1,⋯,gng_0,~g_1,~\cdots,~g_ng0, g1, ⋯, gn)。
(2)特征多项式
以图1为例,图1中的LFSR对应的特征多项式为f(x)=x4+x3+1f(x) = x^4+x^3+1f(x)=x4+x3+1,或者更简单的表示为[4 3 0](1相当于x0x^0x0)。我们只要记住D触发器或者反馈系数是按照从左往右,序号依次递增的方式来标号即可(所以我又在图上标了D触发器的序号,这样帮助理解),这样就很容易写出LFSR对应的特征多项式,或者根据特征多项式画出LFSR。
图3. LFSR的表示 [1]
(3)递归公式
以图1为例,图1中的LFSR对应的递归公式为
Xk+4=(Xk+1+Xk)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寄存器的序号规则正好相反。我们从右往左,将图最右边标上XkX_{k}Xk,再依次类推。
最后,我们说一下LFSR的性质 [1]:
- 如果初始状态相同,那么我们将始终得到相同的输出序列(即输出序列是确定的)。
- 输出序列趋向于随机序列(伪随机)。
- 经过一定次数的迭代后,我们将得到与初始状态相同的状态值(最大重复间隔可由2n−1\mathbf{2^{n}-1}2n−1计算得到,其中nnn为D触发器的数目,这里减去的1表示全0态)。
下图4给出了图1中LFSR在初始状态为[1,1,1,1][1,1,1,1][1,1,1,1]的情况下,状态变化和输出序列计算的整个过程。
图4. LFSR序列计算过程示例 [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拥有最长的非重复序列,即其重复间隔为2n−1\mathbf{2^{n}-1}2n−1 [2]。
如果一个LFSR序列为MLS,那么其对应的特征多项式必须是一个本原多项式,即为不可约多项式。必要不充分条件为:
- 抽头数必须为偶数。
- 抽头之间不能成对出现,必须是互质的。
一些比较典型的MLS如下表1中所示。
表1. 一些典型的m-Sequence [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. LTE中使用的31阶Gold Code生成器电路 [7]
上面图5中的31阶Gold Code生成器电路输出的伪随机序列对应的就是下面的这个式子。这个式子我们在通信中,包括LTE和5G NR中会经常碰到,我们会在相应的文章中再具体解释。
Reference
[1]: http://www.sharetechnote.com/html/Handbook_Communication_LFSR.html [2]: http://blog.sina.com.cn/s/blog_62d9edac01015lsd.html [3]: https://wenku.baidu.com/view/38a4fb1aff00bed5b9f31d7a.htm [4]: https://bk.tw.lvfukeji.com/wiki/LFSR [5]: http://www.sharetechnote.com/html/Handbook_Communication_mSequence.html [6]: http://www.sharetechnote.com/html/Handbook_Communication_GoldCode.html [7]: LTE - The UMTS Long Term Evolution: From Theory to Practice, 2nd Edition
伪随机序列:LFSR Sequence、m-Sequence和Gold Code/Sequence相关推荐
- Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的.它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小.由于这种特性(较小的相关性),它被广泛地用作各种无线 ...
- matlab:Invalid character code sequence detected
在运行别人的工具包时,出现了如下的错误: Invalid character code sequence detected 百度得到的答案都是说路径中有中文.但是我的所有环境都是英文路径的来着.后来通 ...
- oracle 批量导出sequence,Oracle中批量導出Sequence
Java代碼 select'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_value|| ...
- oracle sequence 应用,oracle应用之使用sequence批量写数据
本博客是对之前写的博客Oracle批量新增更新数据的补充,oracle的知识真是多,其实要学精任何一门知识都是要花大量时间的,正所谓: 学如逆水行舟,不进则退 先介绍oracle sequence的一 ...
- oracle sequence 不同 会话 不连续_序列 Sequence
Sequence是一个数据库对象,多个用户可以从中生成唯一的整数,可以使用序列自动生成主键值. 生成序列号时,序列号将递增,独立于事务提交或回滚; 如果两个用户同时递增同一序列,因为序列号是由另一个用 ...
- Mysql sequence使用_基于Mysql的Sequence实现
团队更换新框架.新的业务全部使用新的框架,甚至是新的数据库--Mysql. 这边之前一直是使用oracle,各种订单号.流水号.批次号啥的,都是直接使用oracle的sequence提供的数字序列号. ...
- Oracle自增主键的添加[sequence]--表数据已存在
--增加主键ID alter table CLERK_COMPARE add id number(16);--设置sequence使ID自增 create sequence SEQ_IDminvalu ...
- java sequencer_UVM学习笔记--sequence和sequencer(转)
1. UVM sequence机制的意义 ======================= UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言, ...
- The 2022 ICPC Asia Regionals Online Contest - A 01 Sequence
01 Sequence 题目 Given a binary cyclic sequence S of length n, whose elements are either 0 or 1, you c ...
最新文章
- 自动化早已不是那个自动化
- OKR和KPI有什么区别?
- 西安python培训班多少钱-西安Python培训班哪个好
- Python 程序员经常犯的 10 个错误
- [机器学习]AutoML---谷歌开源AdaNet:基于TensorFlow的AutoML框架
- [css] 使用css实现气泡框的效果
- mysql dump工具升级_MySQL数据库升级
- LeetCode-----二维数组中的查找
- java.lang.NoClassDefFoundError: javax/mail/internet/AddressException解决
- 【Swing/文本组件】定义自动换行的文本域
- 数据库,可不只是 CRUD!
- DevOps使用教程 华为云(5)迭代计划 进度管理
- win10手柄测试软件,win10系统如何校准和设置游戏手柄?windows10校准和设置游戏手柄的方法...
- ubuntu下 端口映射
- 研究生必备的文献翻译软件知云文献翻译替代品--Mac monterey
- matlab使用hough变换函数进行车道检测
- GRE难句典型结构1
- 如何快速对比两个文件夹的文件的不同
- GOOGLE 真实地图模型和瓦片图下载
- 电脑GIF制作软件哪个好 怎么做QQ表情包