无线移动新技术实验课
实验报告
实验名称:CRC 冗余校验码的 Matlab 仿真实现
姓名:
学号:
导师:
日期:2015 年 7 月 9 日
CRC 冗余校验码的 Matlab 仿真实验
一、实验目的
了解循环冗余检验码的编码、检错的基本原理及其特点;掌握循环冗余检
验码编码、检错的方法与步骤。
二、实验内容
(1).学习循环冗余检验码的原理。
(2)使用 Matlab 编写 CRC 校验码生成程序。
三、实验原理
CRC 即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中
最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并
将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的
正确性和完整性。
循环冗余校验码(CRC)的基本原理是:在 K 位信息码后再拼接 R 位的校
验码,整个编码长度为 N 位,因此,这种编码也叫(N,K)码。对于一个给定
的(N,K)码,可以证明存在一个最高次幂为 N-K=R 的多项式 G(x)。根据 G(x)
可以生成 K 位信息的校验码,而 G(x)叫做这个 CRC 码的生成多项式。 校验码
的具体生成过程为:假设要发送的信息用多项式 C(X)表示,将 C(x)左移 R 位(可
表示成 C(x)*xR),这样 C(x)的右边就会空出 R 位,这就是校验码的位置。用
C(x)*xR 除以生成多项式 G(x)得到的余数就是校验码。
CRC 码生成
第一步:在数据单元(k 位)的末尾加上 r 个 0。R 是一个比预定除数的比
特位数(r+1)少 1 的数。
第二步:采用二进制除法将新的加长的数据单元(k+r 位)除以除数。由此
除法产生的余数就是循环冗余校验码。
第三步:用从第二步得到的 r 个比特的 CRC 码替换数据单元末尾附加的 r 个
0.如果余数小于 r,最左的缺省位数为 0.如果除法过程根本未产生余数,那么以
r 个 0 作为 CRC 码替换余数所在的位置。产生的比特模式正好能被除数整除。
CRC 码校验
到达接收方的数据单元首先到达的是数据,然后是 CRC 校验码。接收方将
整个数据传当作一个整体去除以用来产生循环冗余校验余数的同一个除数。
如果数据串无差错地到达接收方,循环冗余校验器将产生余数 0。因此数据
单元将通过检验。如果在传输中数据单元被改变,除法将产生非零余数,因此
数据单元将不通过检验。
四、实验源程序及仿真(Matlab 源程序)
程序流程图
% CRC 编码主程序
clear;clc;close all;
uncode_sequence=randint(1,10)
sequence_length = length(uncode_sequence);
crc_ccitt = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1];
add_bit = zeros(1,16);
crc_coded_sequence = [uncode_sequence zeros(1,16)];
uncode_sequence = [uncode_sequence add_bit];
% 得到原始信号长度
% 常用的 CRC 生成多项式
% 添加冗余比特位
% 初始化输出检错码序列
remainder_bits = uncode_sequence;
for k = 1:sequence_length
add_zeros = zeros(1,sequence_length-k);
register_bits = [crc_ccitt add_zeros];
if remainder_bits(1) == 0
% 初始化余数数组
% 开始循环计算长除得到最终余数
% 加入冗余位参与模 2 运算
% 构造除数数组
% 被除数第一位为 0 则将除数所有位置 0
register_bits = zeros(1,length(register_bits));
end
remainder_bits = bitxor(register_bits,remainder_bits);
register_bits = crc_ccitt;
remainder_bits(1) = [];
end
add_len = length(crc_coded_sequence) - length(remainder_bits);
% 将除数与被除数进行异或操作
% 将寄存器恢复为除数数组
% 去除模 2 后得到的被除数的第 1 位
remainder_bits = [zeros(1,add_len),remainder_bits];
crc_coded_sequence = crc_coded_sequence + remainder_bits
sequence_length = length(crc_coded_sequence);
original_sequence = crc_coded_sequence;
% 生成余数序列的冗余位以叠加到编码序列
% 余数序列添加冗余
% 合成编码序列
% 得到冗余编码的长度
% 初始化输出序列
% 常用的 CRC 生成多项式
% 初始化余数数组
crc_ccitt = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1];
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);
register_bits = [crc_ccitt add_zeros];
if remainder_bits(1) == 0
% 加入冗余位参与模 2 运算
% 构造除数数组
% 被除数第一位为 0 则将除数所有位置 0
register_bits = zeros(1,length(register_bits));
end
remainder_bits = bitxor(register_bits,remainder_bits);
register_bits = crc_ccitt;
remainder_bits(1) = [];
end
if sum(remainder_bits) == 0
% 将除数与被除数进行异或操作
% 将寄存器恢复为除数数组
% 去除模 2 后得到的被除数的第 1 位
% 传输码元中没有发生奇数个错误
original_sequence = crc_coded_sequence(1:cycle_length)
else
err = 1
end
MATLAB 的运行结果
uncode_sequence =
% 码元传输发生错误
1
1
0
1
0
0
1
1
0
1
crc_coded_sequence =
1
0
1
1
0
1
1
0
0
0
0
0
1
0
1
1
0
1
1
1
1
0
1
1
0
0
original_sequence =
1
1
0
1
0
0
1
1
0
1