LFSR代码是给错误的结果

问题描述:

我有LFSR并得到错误的结果代码,第8位应该是01110010,但我发现0101111001.LFSR代码是给错误的结果

我谈论伽罗瓦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 
+4

小心解释LFSR的含义?此外,这个问题有点接近于其中一个暂停标准,因为它实质上是在问“为什么这个代码不工作?” – J0HN

+0

LFSR:https://en.wikipedia.org/wiki/Linear-feedback_shift_register,你是什么意思?你不能问有关错误? – neX

+2

该链接应该进入问题主体(我相信你不希望任何人知道每个可能的缩写词,对吧?)。至于第二部分,我的意思是这个问题实际上意味着“请为我调试我的代码”,并且在*中不鼓励这样的问题,因为它们通常不会为社区提供长期利益 - 其他问题不太可能会有确切的结果相同的代码。 – J0HN

我的回答张贴的问题,“任何人都可以看到的问题是这段代码是什么?”,是否定的。该代码是可操作的,实现了一种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 DOWN。顺便说一下,位置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)。

+0

再次检查,我得到01011110这是错误的。 – neX

+0

好的,把这个东西搁置一会儿,直到你解释你的期望。代码运行,我已经证明它做了什么,你说它是错的。证明什么使你的期望正确。 –

+0

我很害怕停下来。原来一个Galois LFSR的运行方式不同,将XOR放在一条线上,因此影响比新移位的位更多(事实上,不一定影响它)。这应该足以告诉你你需要改变什么。当然,如果你试图解释你的期望,你会发现这一点。 –