📄 cyclic_redundancy_decode.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 + -