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