bch算法可以分为四步:
第一步:构造扩域
第二部:求最小多项式
第三步:计算bch码生成多项式
第四步:计算bch编码
一、本原bch码构造举例
上图中m(x)代表信息源码,C(x)的结果表示bch编码的结果,前面k位是信息位,后面n-k位位为校验位。
或者也可以直接计算校验位:计算过程如下:
可直接计算上图中的n-k位校验位。
总结:计算bch码需要四步
1)构造扩域GF(2^)
2)计算最小多项式
3)计算bch码生成多项式g(x)
,结果是n-k位校验位的多项式;
二、用m次本原多项式构造扩域
三、求最小多项式
四、例子
五、Matlab仿真
1) Matlab环境-Matlab R2014a
2) Matlab脚本
脚本说明:脚本中m=13,但是信息位只有4096bit,n=8191,校验位m*t=13*8=104。所以前面3991位信息补0;
本原多项式选择:P(X)=X^13+X^4+X^3+X^1+1;
M=13时,本原多项式有630个,脚本中选择的是最小的那个,也是第一个。
校验位位置:encodedData数据写入out1.txt文件,文件中每个0或者1用空格隔开,最后的13*8=104个是校验位。
脚本代码如下:
clc;
clear all;
m = 13;
t = 8;
n = 2^m-1; % Codeword length
k = n-m*t; % Message length
% data = randi([0 1], k, 1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fid=fopen(‘in.txt’,’rt’); %写的方式打开文件(若不存在,建立文件);
data=fscanf(fid,’%d ‘); % %d 表示以整数形式写入数据,这正是我想要的;
fclose(fid); %关闭文件;
%data=mx’;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%disp([‘随机生成的序列为 m= ‘,num2str(mx)])
pr = primpoly(m,’all’);
[r,c]=size(pr);%r就是本原多项式的个数
for i=1:1
enc = comm.BCHEncoder(n,k);
enc.PrimitivePolynomialSource=’Property’;
enc.PrimitivePolynomial=de2bi(pr(i),’left-msb’);
%enc.PrimitivePolynomial=de2bi(pr(i));
encodedData = step(enc, data);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
filename=[‘out’,num2str(i),’.txt’];
fid=fopen(filename,’wt’); %写的方式打开文件(若不存在,建立文件);
fprintf(fid,’%d ‘,encodedData); % %d 表示以整数形式写入数据,这正是我想要的;
fclose(fid); %关闭文件;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
dec = comm.BCHDecoder(n,k);
receivedBits = step(dec, encodedData);
if data==receivedBits
disp(‘译码正确 ‘)
else disp(‘译码错误 ‘)
end
3) 仿真结果与flash中结果比对
Flash中数据存储特点,一个page中存放连续的4个512byte的数据,接着是12个byte的FF,然后是52byte的校验位信息。每一个512byte的数据,产生一个13byte的校验和,4个校验和依次存放。
仿真数据及校验结果如下4个图所示: