为什么CRC32在gnuradio中是非线性的?

时间:2017-04-10 13:25:39

标签: crc32 gnuradio telecommunication usrp gnuradio-companion

我对gnuradio中CRC32的非线性有疑问。

我正在开发一个项目,我需要一个线性CRC32,意思是:crc(a xor b)= crc(a)xor crc(b),其中a和b代表数据包。

gnuradio中CRC32的实现默认是非线性的,所以我不得不修改代码使其成为线性的。

我对CRC背后的理论做了一些研究,我发现了非线性CRC实现背后的两个原因:

使用线性CRC,我们可以对2个不同的零包具有相同的CRC,例如crc(0000 0000)= crc(00000 00 00000)。因此,如果我向仅包含零的数据包添加额外的零,那么CRC将无法检测到错误(附加零)。

2-第二个原因是,对于线性CRC,如果我在数据包的开头添加零,则CRC无法检测到错误。例如:crc(10010 1101)= crc(0000 1000 1101)

现在我的问题是: 当在两个USRP之间传输数据包时,比特可能有错误(例如由于错误的SNR),所以有一点" 1"可能会变得有点" 0"反之亦然。但是,我不认为可以向数据包添加比特(如上述两种情况),因此实现非线性CRC的原因不应适用于gnuradio。

那么为什么我们默认在gnuradio中有非线性CRC?

而且,如果我在两个USRP之间进行传输时使用线性CRC,那会有问题吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

这样的CRC仍然是线性的,只是增加了一个常量。作为类比,y = a x是线性的,y = a x + b也是线性的,其中b是非零常数。

在这种情况下,crc(a xor b) xor crc(a) xor crc(b)是所有等长消息ab的常量。该常量是crc(0),即相同消息长度的所有零的CRC。

这种线性绝对没有任何问题,事实上它有好处。特别是,添加前缀为零的消息中的更改将被检测为错误。