2016-10-10 54 views
-1

我有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

該鏈接應該進入問題主體(我相信你不希望任何人知道每個可能的縮寫詞,對吧?)。至於第二部分,我的意思是這個問題實際上意味着「請爲我調試我的代碼」,並且在StackOverflow中不鼓勵這樣的問題,因爲它們通常不會爲社區提供長期利益 - 其他問題不太可能會有確切的結果相同的代碼。 – J0HN

回答

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 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放在一條線上,因此影響比新移位的位更多(事實上,不一定影響它)。這應該足以告訴你你需要改變什麼。當然,如果你試圖解釋你的期望,你會發現這一點。 –