⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cyclic_redundancy_code.m

📁 构建CDMA通信系统
💻 M
字号:
<matlab> 实现循环冗余编码<CRC信源检错编码>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                                 %
%  该函数通过输入信号序列和相应选择L阶CRC生成多项式      %
%  生成循环冗余检错码(CRC),返回添加了尾比特码序列        %
%                                                                                 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [crc_coded_sequence] = cyclic_redundancy_code(uncode_sequence,crc_standard)
if nargin < 2               % 如果输入参数不足,则默认为使用16阶的CRC_CCITT生成多项式
    crc_standard = 1;
end
if crc_standard ~= 1 & crc_standard ~= 2 & crc_standard ~= 3    % 限制输入的参数必须为1,2,3之间的一个
    error('crc_standard 参数输入错误!crc_standard = 1,2,3');
end
sequence_length = length(uncode_sequence);                          % 得到原始信号长度
switch crc_standard
    case 1      %CRC_CCITT
        crc_ccitt = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1];                  % 常用的CRC生成多项式
        add_bit = zeros(1,16);                                                    % 添加冗余比特位
        crc_coded_sequence = [uncode_sequence zeros(1,16)];    % 初始化输出检错码序列
        uncode_sequence = [uncode_sequence add_bit];
        remainder_bits = uncode_sequence;                                % 初始化余数数组
        for k = 1:sequence_length                                   % 开始循环计算长除得到最终余数
            add_zeros = zeros(1,sequence_length-k);          % 加入冗余位参与模2运算
            register_bits = [crc_ccitt add_zeros];                 % 构造除数数组
            if remainder_bits(1) == 0                                 % 被除数第一位为0则将除数所有位置0
                register_bits = zeros(1,length(register_bits));
            end
            remainder_bits = bitxor(register_bits,remainder_bits); % 将除数与被除数进行异或操作
            register_bits = crc_ccitt;                                        % 将寄存器恢复为除数数组
            remainder_bits(1) = [];                                          % 去除模2后得到的被除数的第1位
        end
        add_len = length(crc_coded_sequence) - length(remainder_bits);      
                                                                       % 生成余数序列的冗余位以叠加到编码序列
        remainder_bits = [zeros(1,add_len),remainder_bits];                     % 余数序列添加冗余
        crc_coded_sequence = crc_coded_sequence + remainder_bits;     % 合成编码序列
    case 2      %CRC_CIT
        crc_cit = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1];
        add_bit = zeros(1,16);
        crc_coded_sequence = [uncode_sequence zeros(1,16)];
        uncode_sequence = [uncode_sequence add_bit];
        remainder_bits = uncode_sequence;
        for k = 1:sequence_length
            add_zeros = zeros(1,sequence_length-k);
            register_bits = [crc_cit add_zeros];
            if remainder_bits(1) == 0
                register_bits = zeros(1,length(register_bits));
            end
            remainder_bits = bitxor(register_bits,remainder_bits);
            register_bits = crc_cit;
            remainder_bits(1) = [];
        end
        add_len = length(crc_coded_sequence) - length(remainder_bits);
        remainder_bits = [zeros(1,add_len),remainder_bits];
        crc_coded_sequence = crc_coded_sequence + remainder_bits;
    case 3      %CRC_32
        crc_32 = [1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1];
        add_bit = zeros(1,32);
        crc_coded_sequence = [uncode_sequence zeros(1,32)];
        uncode_sequence = [uncode_sequence add_bit];
        remainder_bits = uncode_sequence;
        for k = 1:sequence_length
            add_zeros = zeros(1,sequence_length-k);
            register_bits = [crc_32 add_zeros];
            if remainder_bits(1) == 0
                register_bits = zeros(1,length(register_bits));
            end
            remainder_bits = bitxor(register_bits,remainder_bits);
            register_bits = crc_32;
            remainder_bits(1) = [];
        end
        add_len = length(crc_coded_sequence) - length(remainder_bits);
        remainder_bits = [zeros(1,add_len),remainder_bits];
        crc_coded_sequence = crc_coded_sequence + remainder_bits;
    otherwise
        error('输入参数错误!')
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -