Search code examples
crc32gnuradiotelecommunicationusrpgnuradio-companion

why CRC32 is non-linear in gnuradio?


I have a question regarding the non-linearity of the CRC32 in gnuradio.

I am working on a project where i need a linear CRC32 meaning that: crc(a xor b) = crc(a) xor crc(b), where a and b represent a packet.

The implementation of CRC32 in gnuradio is by default non-linear so i had to modify the code to make it linear.

I did some research on the theory behind CRC and i found out 2 reasons behind a non-linear CRC implementation:

1- with a linear CRC, we can have the same CRC for 2 different packets of zeros, for example crc(0000 0000) = crc(00000 00 00000). So if i add additional zeroes to a packet containing only zeros, well, the CRC will nont be able to detect the errors(additional zeros).

2- the second reason is that with a linear CRC, if i add zeros to the beginning of a packet, the CRC won't be able to detect the errors. for example: crc(10010 1101) = crc(0000 1000 1101)

Now my question is: When transmitting packets between two USRPs, bits could have errors(due to bad SNR for example), so a bit "1" could become a bit "0" and vice versa. However, I don't think that bits could be added (like the two cases stated above) to the packets and thus the reasons of implementing a non-linear CRC should not apply to gnuradio.

So why do we have a non-linear CRC in gnuradio by default?

And, if i use a linear CRC when trasmitting between two USRP, would that be a problem?

Thank you,


Solution

  • Such CRCs are still linear, just with an added constant. As an analogy, y = a x is linear, but so is y = a x + b, where b is a non-zero constant.

    In this case, crc(a xor b) xor crc(a) xor crc(b) is a constant for all equal length messages a and b. That constant is crc(0), i.e. the CRC of all zeros of that same message length.

    There is absolutely no problem whatsoever with this sort of linearity, and in fact it has benefits. In particular, a change in the message that adds a prefix of zeros would be detected as an error.