奇偶校验、汉明码(Hamming code)、BCH(Bose Chaudhuri Hocquenghem code)、CRC(循环冗余码, Cyclic Redundancy Check code)、RS码(Reed-Solomon, 里德-所罗门码)
1、奇偶校验
2、汉明码
3、BCH code
clc;
clear;
close all;
% BCH的纠错能力要比CRC好一些
% BCH 常用编码 BCH(7,4) (15,5) (31,16) (31,21) (63,45) 对全0向量编码为全0,对全1向量编码为全1
% 这里以(63,36)为例
% BCH
M = 6;
n = 2^M-1; % Codeword length 总长=校验码+信息
k = 36; % Message length 信息
nwords = 1; % Number of words to encode
watermark = randi([0 1],1,nwords*k); % 产生m行n列随机数矩阵
watermark = reshape(watermark,[nwords,k]);
msg = gf(watermark);
t = bchnumerr(n,k); % 可以纠错的长度
enc = bchenc(msg,n,k);
noisycode = enc + randerr(nwords,n,2*t:4*t); % 噪声
a1 = sum(sum(abs(double(enc.x)-double(noisycode.x))));
msgEx = bchdec(noisycode,n,k); % decode
a2 = sum(sum(abs(msg.x-msgEx.x)));
4、CRC-循环冗余码
clc;
clear;
close all;
% 循环冗余编码CRC Cyclic Redundancy Check编码,也称多项式ploynomial
% code编码,差错校验码,由信息字段和校验字段组成,长度可以任意选定
n = 7; % Codeword length
k = 4; % Messafe length
% 定义生成多项式(这里以(7,4)循环码为例)
genPoly = cyclpoly(n,k);
% 定义待编码的数据
randW2 = rand(1,2*k); % 产生m行n列随机数矩阵
rng(1); % 每次产生的随机数保持不变
data = round(randW2);
% 进行循环码编码
encodedData = encode(data, n, k, 'cyclic', genPoly);
% 定义接收到的编码后的数据(可以模拟添加一些错误比特)
encodedData(4) = ~encodedData(4);
% encodedData(2) = ~encodedData(2);
% 进行循环码解码
decodedData = decode(encodedData, n, k, 'cyclic', genPoly);
disp('解码后的数据:');
disp(decodedData);
error_bits=sum(sum(abs(decodedData-data))); % 错误的bits总个数
5、RS码
后续完善