2017-04-10 64 views
0

我有一個關於CRC32在gnuradio中的非線性的問題。爲什麼CRC32在gnuradio中是非線性的?

我正在研究一個項目,我需要一個線性CRC32的含義:crc(a xor b)= crc(a)xor crc(b),其中a和b代表一個數據包。

在gnuradio中CRC32的實現默認是非線性的,所以我不得不修改代碼使其線性化。

我做了CRC背後的理論一些研究,我發現後面的非線性CRC實現2個原因:

1與線性CRC,我們可以有相同的CRC零2個不同的數據包,例如crc(0000 0000)= crc(00000 00 00000)。因此,如果我將附加零添加到僅包含零的數據包中,那麼CRC將無法檢測到錯誤(附加零)。第二個原因是,對於線性CRC,如果我將零添加到數據包的開頭,則CRC將無法檢測到錯誤。例如:crc(10010 1101)= crc(0000 1000 1101)

現在我的問題是: 當在兩個USRP之間傳輸數據包時,位可能有錯誤(例如由於SNR不好),所以有點「1 「可能會變成」0「,反之亦然。但是,我不認爲可以將這些比特添加到數據包中(如上所述的兩種情況),因此實施非線性CRC的原因不適用於gnuradio。

那麼爲什麼默認情況下我們在gnuradio中有一個非線性CRC?

而且,如果我在兩個USRP之間傳輸時使用線性CRC,那會是一個問題嗎?

謝謝

回答

1

這樣的CRC仍然是線性的,只是增加了一個常數。作爲類比,y = a x是線性的,但y = a x + b也是如此,其中b是非零常數。

在這種情況下,crc(a xor b) xor crc(a) xor crc(b)是所有等長消息ab的常數。該常數是crc(0),即該相同消息長度的所有零的CRC。

這種線性絕對沒有問題,事實上它有好處。特別是,添加零前綴的消息更改會被檢測爲錯誤。

相關問題