我正在尝试了解 CRC(循环冗余校验)算法,但在识别特定 CRC 实现中使用的多项式时遇到困难。
function[output_data]=ASK_AddCRC(input_data,crc_num)
input_num=length(input_data);
output_data=zeros(1,input_num+crc_num);
crcBit=zeros(1,crc_num);
regOut=zeros(1,crc_num);
switch crc_num
case 0
output_data=input_data;
case 8
for num=1:input_num;
regOut=crcBit;
crcBit(8)=xor(regOut(7),xor(regOut(8),input_data(num)));
crcBit(7)=regOut(6);
crcBit(6)=regOut(5);
crcBit(5)=xor(regOut(4),xor(regOut(8),input_data(num)));
crcBit(4)=xor(regOut(3),xor(regOut(8),input_data(num)));
crcBit(3)=regOut(2);
crcBit(2)=xor(regOut(1),xor(regOut(8),input_data(num)));
crcBit(1)=xor(regOut(8),input_data(num));
end
output_data(1,1:input_num)=input_data(1,1:input_num);
output_data(1,input_num+1:input_num+crc_num)=crcBit;
case 12
for num=1:input_num;
regOut=crcBit;
crcBit(12)=xor(regOut(11),xor(regOut(12),input_data(num)));
crcBit(11)=regOut(10);
crcBit(10)=regOut(9);
crcBit(9)=regOut(8);
crcBit(8)=regOut(7);
crcBit(7)=regOut(6);
crcBit(6)=regOut(5);
crcBit(5)=regOut(4);
crcBit(4)=xor(regOut(3),xor(regOut(12),input_data(num)));
crcBit(3)=xor(regOut(2),xor(regOut(12),input_data(num)));
crcBit(2)=xor(regOut(1),xor(regOut(12),input_data(num)));
crcBit(1)=xor(regOut(12),input_data(num));
end
output_data(1,1:input_num)=input_data(1,1:input_num);
output_data(1,input_num+1:input_num+crc_num)=crcBit;
case 16
for num=1:input_num;
regOut=crcBit;
crcBit(16)=regOut(15);
crcBit(15)=regOut(14);
crcBit(14)=regOut(13);
crcBit(13)=xor(regOut(12),xor(regOut(16),input_data(num)));
crcBit(12)=regOut(11);
crcBit(11)=regOut(10);
crcBit(10)=regOut(9);
crcBit(9)=regOut(8);
crcBit(8)=regOut(7);
crcBit(7)=regOut(6);
crcBit(6)=xor(regOut(5),xor(regOut(16),input_data(num)));
crcBit(5)=regOut(4);
crcBit(4)=regOut(3);
crcBit(3)=regOut(2);
crcBit(2)=regOut(1);
crcBit(1)=xor(regOut(16),input_data(num));
end
output_data(1,1:input_num)=input_data(1,1:input_num);
output_data(1,input_num+1:input_num+crc_num)=crcBit;
case 24
for num=1:input_num;
regOut=crcBit;
crcBit(24)=xor(regOut(23),xor(regOut(24),input_data(num)));
crcBit(23)=regOut(22);
crcBit(22)=regOut(21);
crcBit(21)=regOut(20);
crcBit(20)=regOut(19);
crcBit(19)=regOut(18);
crcBit(18)=regOut(17);
crcBit(17)=regOut(16);
crcBit(16)=regOut(15);
crcBit(15)=regOut(14);
crcBit(14)=regOut(13);
crcBit(13)=regOut(12);
crcBit(12)=regOut(11);
crcBit(11)=regOut(10);
crcBit(10)=regOut(9);
crcBit(9)=regOut(8);
crcBit(8)=regOut(7);
crcBit(7)=xor(regOut(6),xor(regOut(24),input_data(num)));
crcBit(6)=xor(regOut(5),xor(regOut(24),input_data(num)));
crcBit(5)=regOut(4);
crcBit(4)=regOut(3);
crcBit(3)=regOut(2);
crcBit(2)=xor(regOut(1),xor(regOut(16),input_data(num)));
crcBit(1)=xor(regOut(24),input_data(num));
end
output_data(1,1:input_num)=input_data(1,1:input_num);
output_data(1,input_num+1:input_num+crc_num)=crcBit;
otherwise
fprintf('error\n');
end
我不确定此实现中使用的多项式是什么。有人可以帮我识别一下吗?另外,您能解释一下算法原理吗?
了解了手动计算CRC的原理以及找到1后翻转位来实现。
那里有四个 CRC,而不是一个。 CRC 由
crc_num
选择,这也是 CRC 中的位数:8、12、16 或 24。输出是附加了这么多位的 CRC 的输入消息。 (情况 0 不是 CRC。它只是复制输入数据并且不向其附加任何内容。)
可以从表达式中读取 CRC 多项式,其中 0 表示仅复制该位,或者 1 表示将该位与输入位和前一个 CRC 值的高位进行异或。请注意,这些位每次都会上移一位。
这些是
10011011
、100000001111
、0001000000100001
和100000000000000001100011
。每个都可以写成一个多项式,方法是将每个 1 位设为该位置的 x 的幂,并将 x 增加到 crc_num
。所以第一个是 x8+x7+x4+x3+x+1.