我有LFSR的代码并得到错误的结果,前8位应该是01110010但我得到的是0101111001。
我在谈论Galois 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
答案 0 :(得分: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
请注意,我们读取了第0列中产生的输出位,从c1开始。顺便提一下,位置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栏中读到)。