Matlab 中一个奇怪的 CRC(循环冗余校验)算法

问题描述 投票:0回答:1

我正在尝试了解 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后翻转位来实现。

algorithm encoding verilog communication crc
1个回答
0
投票

那里有四个 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.

© www.soinside.com 2019 - 2024. All rights reserved.