【问题标题】:LFSR code is giving wrong resultLFSR 代码给出错误的结果
【发布时间】:2016-10-10 16:59:06
【问题描述】:

我有 LFSR 的代码并得到错误的结果,前 8 位应该是 01110010 但我得到的是 0101111001。

我说的是伽罗瓦 LSFR:en.wikipedia.org/wiki/Linear-feedback_shift_register

谁能看出这段代码有什么问题?

def lfsr(seed, taps):
  for i in range(10):
      nxt = sum([ seed[x] for x in taps]) % 2
      yield nxt
      seed = ([nxt] + seed)[:max(taps)+1]



for x in lfsr([0,0,1,1,1,0,0,1],[6,5,1]) :
  print x

【问题讨论】:

  • 想解释一下 LFSR 的含义吗?此外,这个问题有点接近暂停标准之一,因为它本质上是在问“为什么这段代码不起作用?”
  • LFSR: en.wikipedia.org/wiki/Linear-feedback_shift_register 你是什么意思?不能问bug吗?
  • 该链接应该进入问题正文(我相信您不希望任何人知道所有可能的首字母缩写词,对吧?)。从第二部分开始,我的意思是这个问题本质上意味着“请为我调试我的代码”,并且在 StackOverflow 上不鼓励此类问题,因为它们通常不会为社区提供长期利益——其他人不太可能有确切的相同的代码。
  • 寻求帮助是好的,但它是一种很好的形式来展示一些努力来理解问题。你为什么期待 01110010,你从哪里得到 11110111?您的代码生成 0101111001,看起来也不像。
  • @neX 请参阅stackoverflow.com/help/on-topic 中的第 1 点 “寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。” 如果满足这些条件,那么询问错误就可以了。

标签: python lfsr


【解决方案1】:

我对发布的问题“谁能看到这段代码有什么问题?”的回答是否定的。该代码是可操作的,实现了 LFSR(通常用于在硬件中执行伪随机信号的类型,以及流行的 CRC 函数的基础)。我只能猜测你为什么认为它不是。

这种类型的 LFSR 可以可视化为带有抽头的移位寄存器:

pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
    ^-  +       + +

每次迭代,从抽头计算一个值并插入一端,移动其他值。在这种情况下,新位变为 LSB。所以让我们运行这个 LFSR 几个周期:

taps    +       + +
pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
c1    0 0 0 1 1 1 0 0
c2    1 0 0 0 1 1 1 0
c3    0 1 0 0 0 1 1 1
c4    1 0 1 0 0 0 1 1
c5    1 1 0 1 0 0 0 1
c6    1 1 1 0 1 0 0 0
c7    1 1 1 1 0 1 0 0
c8    0 1 1 1 1 0 1 0

请注意,我们从 c1 向下读取第 0 列中产生的输出位。顺便说一句,位置 7 不需要存在,因为后面没有水龙头;代码中的切片删除了这些列。

通过颠倒八个周期的输入和输出,我设法重现了您所说的值。你能解释一下你是如何达到你所说的价值的吗?

我可以想象得到类似值的一种方法是通过另一种方式移位并在一个周期后观察移位寄存器的状态。这需要在活动抽头之后保持其宽度(在 CRC 使用中并不罕见)。

taps    +       + +  -v
pos   0 1 2 3 4 5 6 7
reg   0 0 1 1 1 0 0 1
c1    0 1 1 1 0 0 1 0
c2    1 1 1 0 0 1 0 0
c3    1 1 0 0 1 0 0 0
c4    1 0 0 1 0 0 0 1

但即便如此,输出还是 0001010111(这次在第 7 列中读取)。

【讨论】:

  • 再次检查,我得到的是 01011110,这是错误的。
  • 好的,在你解释你的期望之前,暂时搁置这件事。代码运行,我已经演示了它的作用,你说它是错误的。证明是什么让您的期望正确。
  • 我停下来很臭。事实证明,伽罗瓦 LFSR 的操作方式不同,将 XOR 内联,因此影响的不仅仅是新移位的位(实际上,一开始不一定会影响它)。这应该足以告诉您需要更改的内容。当然,如果您尝试解释您的期望,您就会发现这一点。
  • 对不起,我有一个愚蠢的问题,问题是我以前从未用 python 编程过,但是有人有这个代码,我试过了。我不会在不解释的情况下提出这样的问题。 Tbh 我不完全理解这段代码,但你必须每隔 6、5 和第一位进行异或。所以我不确定你的意思。
  • 它将它们异或在一起。这就是sum([ seed[x] for x in taps]) % 2 所做的,认识到 xor 是模 2 和。伽罗瓦变体以另一种方式进行操作;取大约要旋转的位并将其异或到每个标记的位置。值得注意的是,这意味着经过抽头的长度很重要,因此切片应基于len(seed),而不是max(taps)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2021-09-05
  • 2014-09-16
  • 1970-01-01
  • 2011-11-15
  • 2019-02-06
  • 2014-01-30
相关资源
最近更新 更多