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

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

问题描述:

我有一个关于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,那会是一个问题吗?

谢谢

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

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

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