【BCH码2】BCH码简化的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数)
作者:互联网
关注公号【逆向通信猿】更精彩!!!
校验矩阵 H \boldsymbol{H} H
零空间的定义:
H
\boldsymbol H
H的零空间或核记为
N
(
H
)
≜
{
x
∈
R
n
:
H
x
=
0
}
\mathcal{N}(\boldsymbol{H}) \triangleq\left\{\boldsymbol{x} \in \mathbb{R}^{n}: \boldsymbol{H} \boldsymbol{x}=\mathbf{0}\right\}
N(H)≜{x∈Rn:Hx=0}
所以,BCH码空间是 H \boldsymbol H H的零空间。
译码原理
具体的原理推导不再赘述,请参考文献[1],在此仅归纳总结出其核心思想。
译码思想
1 方程组的建立
根据伴随式
S
i
S_i
Si与错误图样
e
(
X
)
e(X)
e(X)的关系
S
i
=
e
(
α
i
)
S_i=\boldsymbol e(\alpha ^i)
Si=e(αi)
得到错误位置
j
1
,
j
2
,
…
,
j
v
j_1,j_2,\ldots,j_v
j1,j2,…,jv和
2
t
2t
2t个伴随式的关系方程组:
解方程组得到错误位置即可进行纠错译码,然而方程为非线性的,直接求解不可行,因此采用间接求解方法。
2 牛顿恒等式
定义
观察上面的式子,可以看到,利用完全平方展开式,这个构造能够将伴随式分量与错误位置多项式的系数联系起来,得到牛顿恒等式
通过牛顿恒等式解方程,得到错误位置多项式
σ
(
X
)
\sigma(X)
σ(X)及其系数,进而得到
σ
(
X
)
\sigma(X)
σ(X)的根,而根的倒数正是错误位置。由此得到译码过程如下。
3 译码过程
4 牛顿恒等式的迭代求解(BM算法核心)
译码过程(2)中牛顿恒等式的求解,可通过Berlekamp Massey迭代算法(BM算法)进行求解。
BM算法通过 2 t 2t 2t次迭代求解出错误位置多项式 σ ( X ) \sigma(X) σ(X),有点类似归纳法。
第 k k k次得到一个次数最小的 σ ( k ) ( X ) \sigma^{(k)}(X) σ(k)(X),满足前 k k k个方程。第 k + 1 k+1 k+1次,基于 σ ( k ) ( X ) \sigma^{(k)}(X) σ(k)(X)找到下一个次数最小的错误位置多项式 σ ( k + 1 ) ( X ) \sigma^{(k+1)}(X) σ(k+1)(X),使其满足前 k + 1 k+1 k+1个方程。
首先,检查
σ
(
k
)
(
X
)
\sigma^{(k)}(X)
σ(k)(X)的系数是否满足第
k
+
1
k+1
k+1个方程,如果满足,则
σ
(
k
+
1
)
(
X
)
=
σ
(
k
)
(
X
)
\sigma^{(k+1)}(X)=\sigma^{(k)}(X)
σ(k+1)(X)=σ(k)(X)
否则,对 σ ( k ) ( X ) \sigma^{(k)}(X) σ(k)(X)添加校正项得到 σ ( k + 1 ) ( X ) \sigma^{(k+1)}(X) σ(k+1)(X)。具体如下:
计算
译码算法描述
q q q元BCH码BM迭代算法的简化
二元BCH码BM迭代算法的简化
用一个实例还原BM迭代译码过程
以(15,5,3)BCH码为例,码长为15,纠错能力
t
=
3
t=3
t=3。域生成多项式为
p
(
X
)
=
X
4
+
X
+
1
p(X)=X^4+X+1
p(X)=X4+X+1(用次数表示为[1 0 0 1 1]
,用八进制数表示为23
,下文中统一用八进制表示多项式),码生成多项式用八进制数表示为2467
。
生成的域
G
F
(
2
4
)
GF(2^4)
GF(24)如下表
首先进行初始化,如下
i
i
i的初始值为-1,
i
−
l
i
=
−
1
i-l_i=-1
i−li=−1,开始迭代:
①
k
=
1
k=1
k=1时,由于
d
0
=
1
≠
0
d_0=1\ne0
d0=1=0,所以计算校正项为
d
0
d
−
1
−
1
X
0
−
(
−
1
)
σ
(
−
1
)
(
X
)
=
X
d_0d_{-1}^{-1}X^{0-(-1)}\sigma^{(-1)}(X)=X
d0d−1−1X0−(−1)σ(−1)(X)=X,所以
σ
(
1
)
(
X
)
=
1
+
X
\sigma^{(1)}(X)=1+X
σ(1)(X)=1+X,由此得到
d
1
=
S
1
+
1
+
σ
1
(
1
)
S
1
=
S
2
+
1
⋅
S
1
=
0
d_1=S_{1+1}+\sigma_1^{(1)}S_1=S_2+1\cdot S_1=0
d1=S1+1+σ1(1)S1=S2+1⋅S1=0,所以
l
1
=
1
l_1=1
l1=1,
1
−
l
1
=
0
1-l_1=0
1−l1=0,
i
=
0
i=0
i=0,
i
−
l
i
=
0
i-l_i=0
i−li=0。
表格更新为
②
k
=
2
k=2
k=2时,由于
d
1
=
0
d_1=0
d1=0,所以
σ
(
2
)
(
X
)
=
σ
(
1
)
(
X
)
=
1
+
X
\sigma^{(2)}(X)=\sigma^{(1)}(X)=1+X
σ(2)(X)=σ(1)(X)=1+X,由此得到
d
2
=
S
2
+
1
+
σ
1
(
2
)
S
2
=
S
3
+
1
⋅
S
2
=
α
10
+
1
=
α
5
d_2=S_{2+1}+\sigma_1^{(2)}S_2=S_3+1\cdot S_2=\alpha^{10}+1=\alpha^5
d2=S2+1+σ1(2)S2=S3+1⋅S2=α10+1=α5,所以
l
2
=
1
l_2=1
l2=1,
2
−
l
2
=
1
2-l_2=1
2−l2=1,
i
=
0
i=0
i=0,
i
−
l
i
=
0
i-l_i=0
i−li=0。
表格更新为
③
k
=
3
k=3
k=3时,由于
d
2
=
α
5
≠
0
d_2=\alpha^5\ne0
d2=α5=0,所以计算校正项为
d
2
d
0
−
1
X
2
−
0
σ
(
0
)
(
X
)
=
α
5
X
2
d_2d_{0}^{-1}X^{2-0}\sigma^{(0)}(X)=\alpha^5X^2
d2d0−1X2−0σ(0)(X)=α5X2,所以
σ
(
3
)
(
X
)
=
σ
(
2
)
(
X
)
+
α
5
X
2
σ
(
0
)
(
X
)
=
1
+
X
+
α
5
X
2
\sigma^{(3)}(X)=\sigma^{(2)}(X)+\alpha^5X^2\sigma^{(0)}(X)=1+X+\alpha^5X^2
σ(3)(X)=σ(2)(X)+α5X2σ(0)(X)=1+X+α5X2,由此得到
d
3
=
S
3
+
1
+
σ
1
(
3
)
S
3
+
σ
2
(
3
)
S
2
=
S
4
+
1
⋅
S
3
+
α
5
S
2
=
1
+
α
10
+
α
5
=
0
d_3=S_{3+1}+\sigma_1^{(3)}S_3+\sigma_2^{(3)}S_2=S_4+1\cdot S_3+\alpha^5S_2=1+\alpha^{10}+\alpha^5=0
d3=S3+1+σ1(3)S3+σ2(3)S2=S4+1⋅S3+α5S2=1+α10+α5=0,所以
l
3
=
2
l_3=2
l3=2,
3
−
l
3
=
1
3-l_3=1
3−l3=1,
i
=
2
i=2
i=2,
i
−
l
i
=
1
i-l_i=1
i−li=1。
表格更新为
④以此类推,最后得到
2
t
2t
2t次的迭代结果如下:
简化的BM算法的结果为:
仿真性能与分析
仿真结果
主程序代码
文件名:bch_codec.m
clear; close all; clc
%% (15,11,1) BCH码
% px=[1 0 0 1 1]; % 23本原多项式
% p = length(px)-1;
% [a,a_dec,log_a] = sub_gf_gen( px ); % 有限域
% gx=[1 0 0 1 1]; % 23
% t=1;
%% (15,7,2) BCH码
% gx=[1 1 1 0 1 0 0 0 1]; % 721
% t=2;
%% (31,26,1) BCH码
% px=[1 0 0 1 0 1]; % 45
% p = length(px)-1;
% [a,a_dec,log_a] = sub_gf_gen( px ); % 有限域
% gx=[1 0 0 1 0 1]; % 45
% t=1;
%% (31,21,2) BCH码
% gx=[1 1 1 0 1 1 0 1 0 0 1]; % 3551
% t=2;
%% (63,57,1) BCH码
px=[1 0 0 0 0 1 1]; % 103
p = length(px)-1;
[a,a_dec,log_a] = sub_gf_gen( px ); % 有限域
% gx=[1 0 0 0 0 1 1]; % 103
% t=1;
%% (63,51,2) BCH码
gx=[1 0 1 0 1 0 0 1 1 1 0 0 1]; % 12471
t=2;
m = length(px)-1;
n=2^m-1; % 码长
pg = length(gx) -1; % 生成多项式次数
k=n-pg; % 信息长
codnum = 100000;
snr = 5:0.5:10;
snrlen = length(snr);
num_bef = zeros(1,snrlen);
num_aft = zeros(1,snrlen);
tic
parfor i = 1:snrlen
SNRi = snr(i);
for j = 1:codnum
% rng('shuffle');
u = randi([0,1],1,k);
v = sub_encod_bch(u,gx,0);
vn = awgn(1-2*v,SNRi,'measured');
r = double(vn<0);
num_bef(i) = num_bef(i)+biterr(r,v);
[rdec,pos_err,flag]=sub_decod_bch(r,t,a,log_a,p);
num_aft(i) = num_aft(i)+biterr(rdec,v);
end
disp(['信噪比 ',num2str(SNRi),' 完成']);
end
toc
ber_bef = num_bef/n/codnum;
ber_aft = num_aft/n/codnum;
画图代码
文件名:plot_bch_dec.m
clear; clc; close all;
snr=5:0.5:10;
len = length(snr);
lw = 2;
%% 译码前误码率
load('ber_bef.mat');
figure;semilogy(snr,ber_bef,'Marker','x','color',[0.49 0.18 0.56],'LineWidth',lw);hold on;
%% (15,11,1)BCH码
load('ber_aft_bch_15_11_1.mat');
semilogy(snr,ber_aft,'Marker','s','color',[0 161/255 59/255],'LineWidth',2);hold on;
%% (15,7,2)BCH码
load('ber_aft_bch_15_7_2.mat');
semilogy(snr,ber_aft,'o-b','LineWidth',lw);hold on;
%% (31,26,1)BCH码
load('ber_aft_bch_31_26_1.mat');
semilogy(snr,ber_aft,'Marker','d','color',[0.85 0.33 0.10],'LineWidth',lw);hold on;
%% (31,21,2)BCH码
load('ber_aft_bch_31_21_2.mat');
semilogy(snr,ber_aft,'^-r','LineWidth',lw);hold on;
%% (63,57,1)BCH码
load('ber_aft_bch_63_57_1.mat');
semilogy(snr(4:end),ber_aft(4:end),'Marker','v','color',[0 0 0],'LineWidth',lw);hold on;
%% (63,51,2)BCH码
load('ber_aft_bch_63_51_2.mat');
semilogy(snr,ber_aft,'Marker','p','color',[0 0.4470 0.7410],'LineWidth',lw);hold on;
xlabel('SNR (dB)');ylabel('译码BER'); grid on;
legend('译码前','(15,11,1)','(15,7,2)','(31,26,1)','(31,21,2)','(63,57,1)','(63,51,2)');
set(gca,'FontSize',13,'Fontname', '微软雅黑');
部分子程序代码
有限域乘法子程序
文件名:sub_gf_mul.m
function [ z ] = sub_gf_mul( x, y, n )
% 伽罗华域元素乘法,参数含义:
%% input:
% x y: 表示两个元素的幂次,取值范围-inf或[0,n-1]
% n:2^m-1
%% output:
% z:表示乘积的幂次
if x>=0 && y>=0
z = mod(x+y,n);
else
z=-inf;
end
有限域加法子程序
文件名:sub_gf_add.m
function [ z ] = sub_gf_add( x, y, a, log_a )
% 伽罗华域元素加法,参数含义:
%% input:
% x y: 表示两个元素的幂次,取值范围-inf或[0,n-1]
% n:2^m-1
%% output:
% z:表示两个元素和的幂次,和为0时规定幂次为-inf,方便计算
if x<0
z=y;
elseif y<0
z=x;
elseif x==y
z=-inf;
else
sum=mod(a(x+1,:)+a(y+1,:),2);
sum_deci = bi2de(sum, 'left-msb');
z = log_a(sum_deci);
end
所有代码下载
文件名 | 功能 |
---|---|
bch_codec.m | 主程序 |
sub_gf_gen.m | 有限域生成子程序 |
sub_gf_add.m | 有限域加法子程序 |
sub_gf_mul.m | 有限域乘法子程序 |
sub_poly_div.m | 多项式除法子程序 |
sub_encod_bch.m | BCH编码子程序 |
sub_decod_bch.m | BCH码简化的BM迭代译码子程序 |
plot_bch_dec.m | 画图子程序 |
ber_aft_bch_15_7_2.mat | (15,7,2)码译码误码率数据文件 |
ber_aft_bch_15_11_1.mat | (15,11,1)码译码误码率数据文件 |
ber_aft_bch_31_26_1.mat | (31,26,1)码译码误码率数据文件 |
ber_aft_bch_31_21_2.mat | (31,21,2)码译码误码率数据文件 |
ber_aft_bch_63_57_1.mat | (63,57,1)码译码误码率数据文件 |
ber_aft_bch_63_51_2.mat | (63,51,2)码译码误码率数据文件 |
a)土豪请随意
直接点击以下链接,到博主资源中进行下载所有代码(带注释) 和画图数据
所有代码下载:https://download.csdn.net/download/wlwdecs_dn/45111931
还可订阅《信道编码》专栏,查阅各子程序的详解
【BCH码1】系统BCH码编码原理及MATLAB实现(不使用MATLAB库函数)
b)支持博主的好心人请看这
关注公号【逆向通信猿】,口令:BCH
,简单支持一波即可获取
c)伸手白嫖党
无
参考文献
[1]William E Ryan, Shu Lin. 信道编码:经典与现代[M]. 电子工业出版社, 2017.
标签:BCH,译码,aft,MATLAB,ber,bch,sigma,库函数 来源: https://blog.csdn.net/wlwdecs_dn/article/details/121325352