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

📄 cyclic_redundancy_decode.m

📁 构建CDMA通信系统
💻 M
字号:
<matlab> 实现循环冗余编码<CRC>解码检错
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                                                   %
%  该函数通过输入信源编码序列和相应选择L阶CRC生成多项式以及输入      %
%   编码的长度,验证原始信号在传输过程中是否发生误码,如果信道           %
%  噪声和干扰造成误码则输出err错误标志,否则即解码得到原始信号         %
%                                                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [original_sequence,err] = cyclic_redundancy_decode(crc_coded_sequence,seq_length,crc_standard)
if nargin < 2               % 如果输入参数不足,显示出错信息
    error('参数不足! 必须输入CRC编码序列的长度 seq_length 和 CRC编码的多项式标准(1 - CRC_CCITT,2 - CRC_CIT,3 - CRC_32)');
end
if crc_standard ~= 1 & crc_standard ~= 2 & crc_standard ~= 3    % 限制输入的参数必须为1,2,3之间的一个
    error('crc_standard 参数输入错误!crc_standard = 1,2,3');
end
if seq_length ~= length(crc_coded_sequence)
    error('输入序列长度参数有误!');
end
sequence_length = length(crc_coded_sequence);                     % 得到冗余编码的长度
original_sequence = crc_coded_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生成多项式
        remainder_bits = crc_coded_sequence;                            % 初始化余数数组
        cycle_length = sequence_length-length(crc_ccitt)+1;        % 计算长除法的循环周期        
        for k = 1:cycle_length                                         % 开始循环计算长除得到最终余数
            add_zeros = zeros(1,cycle_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
        if sum(remainder_bits) == 0                             % 传输码元中没有发生奇数个错误
            original_sequence = crc_coded_sequence(1:cycle_length);
        else
            err = 1;                                                     % 码元传输发生错误
        end
    case 2      %CRC_CIT
        crc_cit = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1];
        remainder_bits = crc_coded_sequence;                        % 初始化余数数组
        cycle_length = sequence_length-length(crc_cit)+1;       % 计算长除法的循环周期
        for k = 1:cycle_length                                       % 开始循环计算长除得到最终余数
            add_zeros = zeros(1,cycle_length-k);              % 加入冗余位参与模2运算
            register_bits = [crc_cit 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_cit;                                % 将寄存器恢复为除数数组
            remainder_bits(1) = [];                               % 去除模2后得到的被除数的第1位
        end
        if sum(remainder_bits) == 0                            % 传输码元中没有发生奇数个错误
            original_sequence = crc_coded_sequence(1:cycle_length);
        else
            err = 1;                                                    % 码元传输发生错误
        end        
    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];
        remainder_bits = crc_coded_sequence;                        % 初始化余数数组
        cycle_length = sequence_length-length(crc_32)+1;       % 计算长除法的循环周期        
        for k = 1:cycle_length                                        % 开始循环计算长除得到最终余数
            add_zeros = zeros(1,cycle_length-k);               % 加入冗余位参与模2运算
            register_bits = [crc_32 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_32;                              % 将寄存器恢复为除数数组
            remainder_bits(1) = [];                             % 去除模2后得到的被除数的第1位
        end
        if sum(remainder_bits) == 0                          % 传输码元中没有发生奇数个错误
            original_sequence = crc_coded_sequence(1:cycle_length);
        else
            err = 1;                                                  % 码元传输发生错误
        end
    otherwise
        error('输入参数错误!');
end

⌨️ 快捷键说明

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