前言
承接前面几篇文章介绍的CRC校验码原理,本文给出CRC校验码的MATLAB仿真代码。
6. 使用MATLAB生成CRC校验码
6.1 使用MATLAB库函数实现CRC
代码如下(示例):
% 本文件以实例形式说明CRC校验码的生成原理。
% 使用CRC8生成多项式 x^8 + x^2 + x + 1对原始信息序列进行CRC8校验编码,
% 得到8为CRC码,附加到原始信息序列后面,形成发送比特序列。
poly = [1 0 0 0 0 0 1 1 1]; % 生成多项式
n = length(poly) - 1;
% 原始信息序列
msg = [1 1 0 1 0 0 1 1];
msg_length = length(msg);
% 消息比特序列左移8位
msg1 = [msg zeros(1, n)];
% 使用多项式除法求CRC校验码,q为商,r为余数
[q,r] = deconv(msg1, poly);
% 余数模2处理
r = mod(abs(r),2);
% CRC校验码
crc = r(msg_length+1:end);
% 将CRC校验码附加到原始信息序列后面
msg_and_crc = [msg, crc];
6.2 不用库函数,按校验原理实现CRC
代码如下(示例):
% 输入数据
data_width = 8; % 数据位宽。进行CRC校验的源数据按字节排列
data_num = 4; % 数据个数。进行CRC校验的源数据包含的字节数
msg0 = randi(2,data_width,data_num) - 1; % 生成源数据
crc = [0 0 0 0 0 0 0 0]'; % crc初值
length = data_num; % 输入数据个数。输入数据按字节格式存储
cnt = 1; % 输入数据索引
msg = msg0; % CRC输入的原始信息序列
% CRC8生成多项式 x^8 + x^2 + x + 1
poly = [0 0 0 0 0 1 1 1]; % 省略最高位
while length > 0
crc = xor(crc,msg(:,cnt));
for C = 1:8
if 0 ~= crc(1)
crc_shift = [crc(2:8);0];
crc = xor(crc_shift , poly');
else
crc = [crc(2:8);0];
end
end
cnt = cnt + 1;
length = length - 1;
end
% 将CRC校验码附加到原始信息序列后面
msg_and_crc_2 = [msg, crc]; % 每列代表一个字节
总结
暂无后加。
后续介绍奇偶校验码和汉明码等。