LFSR:线性反馈移位寄存器及其应用

2023-11-09

LFSR简介

LFSR(Linear-feedback shift register)是一种特殊的的移位寄存器,他的输入取决于其先前状态。
LFSR的使用异常广泛,可以说涉及到方方面面,以下是Wikipedia列举的一些应用

  • INTELSAT business service (IBS)
  • Intermediate data rate (IDR)
  • SDI (Serial Digital Interface transmission)
  • Data transfer over PSTN (according to the ITU-T V-series recommendations)
  • CDMA (Code Division Multiple Access 码分多址) cellular telephony
  • 100BASE-T2 “fast” Ethernet scrambles bits using an LFSR
  • 1000BASE-T Ethernet, the most common form of Gigabit Ethernet, scrambles - bits using an LFSR
  • PCI Express 3.0
  • SATA
  • Serial attached SCSI (SAS/SPL)
  • USB 3.0
  • IEEE 802.11a scrambles bits using an LFSR
  • Bluetooth Low Energy Link Layer is making use of LFSR (referred to as whitening)
  • Satellite navigation systems such as GPS and GLONASS

事实上LFSR在上述系统中更广为人知的应用是伪随机数的生成与CRC计算。
以下来自Wikipedia的动图展示了LFSR的一个有趣的应用。
在这里插入图片描述
这是一个使用LSFR构建的31位伪随机数发生器,LED充当了其输出。原作者使用了4块74HC565(这个IC查不到,应该是作者看错了)和一块74HC86(异或门)。
对于一个LFSR,其可以看作一个FSM。这个LFSR最多状态数
2 n − 1 2^n -1 2n1

那么对于上面那个31位的LFSR,有多达2,147,483,6487个状态,假如一个状态持续0.2秒,那么需要长达13.61925年这个状态机才能重新回到初始状态

LFSR的实现

LFSR可以使用若干个寄存器和异或门组成,其结构也不同,这里列举其中两个。

Galois型

在这里插入图片描述

Fibonacci型

在这里插入图片描述
当然这两种无论哪一种都是比较方便用HDL语言或者其他语言实现的。

我们以一个简单的3位Galois型LFSR为例。
在这里插入图片描述
注意这里 g 0 = 1 g_0 = 1 g0=1 g 1 = 0 g_1 = 0 g1=0 g 2 = 1 g_2 = 1 g2=1 g 3 = 1 g_3 = 1 g3=1

请注意,无论是何种LFSR, g 0 g_0 g0 g n g_n gn都是不可能为0的。

我们可以写出这样一段C语言代码描述这个3位的LFSR

void lfsr3()
{
	unsigned int temp0, temp1, temp2;
	temp0 = ff0; //拷贝ff0
	temp1 = ff1; //拷贝ff1
	temp2 = ff2; //拷贝ff2
	ff0 = temp2;
	ff1 = temp0 ^ (0 * temp2);
	ff2 = temp1 ^ (1 * temp2);
}

现在我们令三个ff的初值为 f f 0 = 1 ff_0 = 1 ff0=1 f f 1 = 0 ff_1 = 0 ff1=0 f f 2 = 0 ff_2 = 0 ff2=0,运行这段代码20次可以得到如下结果:

//  ff2   ff1   ff0
[1]:    0  0  1
[2]:    0  1  0
[3]:    1  0  0
[4]:    1  0  1
[5]:    1  1  1
[6]:    0  1  1
[7]:    1  1  0
[8]:    0  0  1
[9]:    0  1  0
[10]:   1  0  0
[11]:   1  0  1
[12]:   1  1  1
[13]:   0  1  1
[14]:   1  1  0
[15]:   0  0  1
[16]:   0  1  0
[17]:   1  0  0
[18]:   1  0  1
[19]:   1  1  1
[20]:   0  1  1

很明显可以看到每7次一个循环,我们看到这个LFSR恰好达到了最多的状态数。至于为什么且看下面的分析。

LFSR的行为

LFSR的行为是比较难于分析的。事实上这是一个伽罗华域(Galois Field)上的除法运算。这里同样以上面的那个3位的LFSR为例

图中的3位数按照从高到低的顺序,即( f f 2 , f f 1 , f f 0 ff_2 ,ff_1 ,ff_0 ff2,ff1,ff0)的顺序。

在这里插入图片描述

我们将每一个ff的值看作一个多项式中某一项,例如

100 = ( 1 × x 0 ) + ( 0 × x 1 ) + ( 0 × x 2 ) = x 0 100 = (1\times x^0)+(0\times x^1)+(0\times x^2)=x^0 100=(1×x0)+(0×x1)+(0×x2)=x0

于是这个状态转移图可以描述为一个多项式结果的转换,特别地,这里x=2

在这里插入图片描述
这样做有什么意义呢?
前面说到,这样一个LFSR的行为可以视作一个伽罗华域的除法。对于伽罗华域而言,其四则运算封闭,则结果必然是这个域中的一个元素。这个域我们记作 G F ( 2 3 ) GF(2^3) GF(23)
在这里插入图片描述
这里 R ( x ) R(x) R(x)是ff的值, M ( x ) M(x) M(x)是输入多项式, G ( x ) G(x) G(x)是抽头多项式。

注意这个是在伽罗华域中的除法运算,本质上是一个模二除法

这里给出 M ( x ) M(x) M(x)的值,列出下表(当 G ( x ) = x 3 + x 2 + x 0 G(x)=x^3+x^2+x^0 G(x)=x3+x2+x0时)

M ( x ) M(x) M(x) R ( x ) R(x) R(x)
x 0 x^0 x0 x 0 x^0 x0
x 1 x^1 x1 x 1 x^1 x1
x 2 x^2 x2 x 2 x^2 x2
x 3 x^3 x3 x 2 + x 0 x^2+x^0 x2+x0
x 4 x^4 x4 x 2 + x 1 + x 0 x^2+x^1+x^0 x2+x1+x0
x 5 x^5 x5 x 1 + x 0 x^1+x^0 x1+x0
x 6 x^6 x6 x 2 + x 1 x^2+x^1 x2+x1

对照上面的状态转移图,我们可以看到实际上这个LFSR的行为就是一个模二除法的输出,除法表达式受抽头表达式的控制

对于一个 n n n位的LFSR,可用的抽头至少有 n n n个(第0个抽头是必须的,不算数
虽然一个 n n n位的LFSR可以有很多种不同的抽头配置,但不是所有抽头都能使其达到最长输出序列。下表给出一些能够使LFSR达到最长反馈的抽头配置

LFSR位数 状态周期 抽头配置 LFSR位数 状态周期 抽头配置
2 3 2,1 17 131,071 17, 14
3 7 3, 2 18 262,143 18, 11
4 15 4, 3 19 524, 287 19, 6, 2, 1,
5 31 5, 3 20 1,048,575 20, 17
6 63 6, 5 21 2,097,151 21, 19
7 127 7, 6 22 4,194,303 22, 21
8 255 8, 6, 5, 4, 23 8,388,607 23, 18
9 511 9, 5 24 16,777,215 24, 23, 22, 17,
10 1,023 10, 7 25 33,554,431 25, 22
11 2,047 11, 9 26 67,108,963 26, 6, 2, 1,
12 4,095 12, 6, 4, 1, 27 134,217,727 27, 5, 2, 1,
13 8,191 13, 4, 3, 1, 28 268,435,455 28, 25
14 16,383 14, 5, 3, 1, 29 536,870,911 29, 27
15 32,767 15, 14 30 1,073,741,823 30, 6, 4, 1,
16 65,535 16, 15, 13, 4, 31 2,147,483,646 31, 28
32 4,294,967,294 32, 22, 2, 1,

这里抽头对应的多项式 G ( x ) G(x) G(x)均为 G F ( 2 n ) GF(2^n) GF(2n)域上的本原多项式

需要注意的是一个确定域上的本原多项式可能不止一个,例如 G F ( 2 3 ) GF(2^3) GF(23)上的本原多项式除了 x 3 + x + 1 x^3+x+1 x3+x+1还有 x 3 + x 2 + 1 x^3+x^2+1 x3+x2+1,这个大家可以验证以下,这俩多项式构造的LFSR序列长度都是7。

本原多项式可以通过查表获得,也可以通过特定算法生成,这些生成算法在某些领域非常有用

LFSR应用

PRBS(随机序列)发生器

在通信系统经常会用到一些PRBS,这些发生器可以使用一定长度的LFSR构建。由上面的结论可知,当抽头表达式恰好为本原多项式时,LFSR由最长PRBS输出。即使抽头表达式不为本原多项式,足够位数的LFSR产生的PRBS长度依然非常可观!

我们可以使用一些经典的分立器件构造LFSR,例如D触发器74HC574。

需要注意的是,如果使用移位寄存器构造LFSR,则要使用斐波那契型的LFSR。

值得关注的是Fibonacci型提高工作频率的时候容易出现误码(可以观察反馈抽头和移位寄存器),因此Galois型设计可以有更高的码率。

利用HDL在CPLD或FPGA上实现LFSR也是非常方便的。

在这里插入图片描述
这个就是一个32位的LFSR,抽头表达式为 x 32 + x 22 + x 2 + x + 1 x^{32 }+ x^ {22} + x^ 2 + x + 1 x32+x22+x2+x+1,是一个本原多项式。

白噪声发生器

白噪声是在其频率范围内频谱平坦的噪声,功率谱密度和每单位带宽的功率在噪声带宽上是恒定的。

假若将PRBS发生器输出接入一个权电阻网络,就可以构成一个速度还不错的DAC,DAC的输出经过低通滤波,可以在一定带宽内得到不错的白噪声。

在这里插入图片描述
图片来源:Digi-Key

补充:另外几种低成本的白噪声产生方法

1.利用电阻的约翰逊噪声产生白噪声
这个方法比较简单,噪声电压密度为
V N O I S E = 4 k B T R V_{NOISE} = \sqrt{4k_{B}TR} VNOISE=4kBTR
其中 k B k_B kB为玻尔兹曼常数。
2.利用PN结的齐纳击穿
可以使用二极管或者BJT或者JFET有PN结的东西产生白噪声,这个容易在版图上实现。目前intel CPU内部的真随机数发生器是这个原理。

PRBS设计白噪声发生器的缺点
滤波器难以设计
带宽受限

**传说白噪声煲耳机不错,博主改天得弄个玩玩
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LFSR:线性反馈移位寄存器及其应用 的相关文章

  • LeetCode 刷题记录14. 最长公共前缀

    题目描述 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 说明 示例 1 输入 strs flower flow flight 输出 fl 示例 2 输入 strs dog racecar car 输出 解释

随机推荐

  • 修改网页logo图片

    在html的head代码区加入以下代码 保存刷新页面即可
  • Lua基础之字符串(string)

    1 计算字符串长度 2 返回字符串s的n个拷贝 3 返回字符串全部字母大写 4 返回字符串全部字母小写 5 返回一个类似printf的格式化字符串 6 根据下标截取字符串 7 在字符串中查找 8 在字符串中替换 9 返回字符的整数形式 10
  • 二叉树系列(1)已知二叉树的中序遍历和前序遍历,如何求后序遍历

    一道HULU的笔试题 How I wish yesterday once more 假设有棵树 长下面这个样子 它的前序遍历 中序遍历 后续遍历都很容易知道 PreOrder GDAFEMHZ InOrder ADEFGHMZ PostOr
  • nlp-如何实现编写BERT模型

    致谢 本文主要由浙江大学李泺秋撰写 前言 建议通过pycharm vscode等工具对bert源码进行单步调试 调试到对应的模块再对比看讲解 涉及到的jupyter可以在代码库 篇章3 编写一个Transformer模型 BERT 下载 本
  • Spring MVC 使用JSR303校验表单

    导入JSR303相关JAR包 Spring MVC 使用JSR303校验表单 创建registerForm jsp
  • 英伟达合作伙伴选择RTX 2080Ti作为深度学习-人工智能解决方案

    Scientific在9月6日发布新闻称 英伟达 Nvidia 全球服务器供应商之一AMAX将最新的GeForce RTX 2080 Ti图形卡集成到深度学习 人工智能以及HPC高性能计算服务器的解决方案阵容中 新的GeForce RTX
  • matplotlib.pyplot.hist绘制直方图函数

    matplotlib pyplot hist x bins 10 range None normed False weights None cumulative False bottom None histtype u bar align
  • 小程序点击复制功能制作

    在wxml文件中添加一个按钮或需要点击的元素 并绑定点击事件监听器2
  • RabbitMQ报错Error: unable to connect to node rabbit@xxx: nodedown的解决方式

    RabbitMQ报错Error unable to connect to node rabbit xxx nodedown的解决方式 环境 Win10x64 erlang otp 19 1x64 RabbitMQ3 6 6 刚开始研究Rab
  • 【前端领域】3D旋转超美相册(HTML+CSS)

    世界上总有一半人不理解另一半人的快乐 爱玛 目录 一 前言 二 本期作品介绍 3D旋转相册 三 效果展示 四 详细介绍 五 编码实现 index html style css img 六 获取源码 公众号获取源码 获取源码 私信 关注 点赞
  • KVM内核代码结构

    KVM内核代码结构 因为KVM的源代码已经包含在了Linux的内核树中 因此我们只需直接从www kernel org下载代码即可 内核源码包打开较大 解开后目录结构大概是这个样子 涉及KVM的主要有两个目录 virt和arch x86 k
  • [游戏开发]Unity业务代码自动生成工具

    前言 项目里有非常多的重复代码 例如UI业务逻辑 一般来说都会生成Manager Module View层代码 这是基本的MVC架构 Manger层 负责数据维护 对照Proto把CS和SC通信代码都写上 Module层 如果有变化则从Ma
  • 《Java基础篇》JavaBean的生命周期·作用域·通俗易懂

    1 基本概念 bean 就是由IOC 容器初始化 装配及管理的对象 Spring中的bean默认都是单例的 那么单例Bean在多线程程序下如何保证线程安全呢 Spring的单例是基于BeanFactory也就是Spring容器的 单例Bea
  • 西门子PLC入门-PLC介绍

    PLC全名 可编程逻辑控制器 Programmable Logic Controller 一种具有微处理器的用于自动化控制的数字运算控制器 可以将控制指令随时载入内存进行储存与执行 PLC由CPU 指令及数据内存 输入 输出接口 电源 数字
  • Java并发编程面试题

    基础知识 并发编程的优缺点 为什么要使用并发编程 并发编程的优点 充分利用多核CPU的计算能力 通过并发编程的形式可以将多核CPU的计算能力发挥到极致 性能得到提升 方便进行业务拆分 提升系统并发能力和性能 在特殊的业务场景下 先天的就适合
  • Hive中not in函数的小坑 :含null时的判断

    Hive中的not in函数有一个隐藏的陷阱 当not in 中的数值包含NULL 匹不上的数据会返回NULL而不是True 所以当在where中使用not in子查询进行筛选 一定要记得去除NULL值 样例代码 not in的原始结果 s
  • 打开文件,读取TXT

  • 通过HttpURLConnection连接上传文件和参数并接收

    网上使用HttpURLConnection通过get或post请求传递参数或者传递文件的例子有很多 但是同时传递参数和文件 服务的并接收参数和文件的例子很少 此文将介绍同时发送参数和文件并接收 1 HttpURLConnection简介 任
  • 产品经理的思考-我们是技术的主人吗?

    思考的起源 最近在准备公司内部的研发大会的汇报时 发现我们组的成员都跟我一样 是技术出身 在努力或者被迫努力的往技术产品经理的维度转变 晚上准备PPT到凌晨三点多 在最后收尾的时候 脑海里突然有几个疑问 在技术维 我们是技术的主人还是技术的
  • LFSR:线性反馈移位寄存器及其应用

    LFSR简介 LFSR Linear feedback shift register 是一种特殊的的移位寄存器 他的输入取决于其先前状态 LFSR的使用异常广泛 可以说涉及到方方面面 以下是Wikipedia列举的一些应用 INTELSAT
Powered by Hwhale