1.1译码公式理解
译码公式的证明很多书籍里边已有介绍,这里不做证明直接引用。介绍Gallager概率译码公式之前先介绍引理:二进制序列长度为m且相互独立,第i个bit为1的概率为 P i P_{i} Pi,那么整个序列为偶数个1的概率为:
P e = 1 2 + 1 2 ∏ i = 1 m ( 1 − 2 P i ) P_{e} = \frac{1}{2} + \frac{1}{2}\prod_{i = 1}^{m}\left( 1 - 2P_{i} \right) Pe=21+21i=1∏m(1−2Pi)
为奇数个1的概率为:
P o = 1 2 − 1 2 ∏ i = 1 m ( 1 − 2 P i ) P_{o} = \frac{1}{2} - \frac{1}{2}\prod_{i = 1}^{m}\left( 1 - 2P_{i} \right) Po=21−21i=1∏m(1−2Pi)
Gallager概率译码公式:
式中, P ( c d = 0 ∣ y , S ) P(c_{d} = 0|y,S) P(cd=0∣y,S)、 P ( c d = 1 ∣ y , S ) P(c_{d} = 1|y,S) P(cd=1∣y,S),在接收码字为 y y y,校验方程组S的条件下发送码字 c d c_{d} cd为0、1的概率。 P d P_{d} Pd发送码字独立,接收判决为1的概率(和信道的信噪比、调制方式、码率等有关)。 P i j P_{ij} Pij,第 i i i个校验方程中,第 j j j个bit为1的概率。 i ∈ c i ∏ , _{i \in c_{i}}^{\prod\ }, i∈ci∏ ,校验节点概率相乘,位置在H矩阵中列非零校验节点。 j ∈ R j \ i j \in R_{j}\backslash i j∈Rj\i,第 i i i个校验方程中去掉第 i i i个变量节点的其他所有变量节点,具体位置在H矩阵中每个校验方程去掉 i i i以外其他非零节点的位置。
1.2译码步骤
1.2.1 Gallager概率译码
一、变量节点初始化
5x10校验的矩阵H,行重为4,列重为2,本文中所有例子以该矩阵为依据,如下图所示,初始化公式推导不做介绍。假设接收的的序列
y
y
y={
y
0
y_{0}
y0,
y
1
y_{1}
y1,
y
2
.
.
.
.
,
y
9
y_{2}....,y_{9}
y2....,y9},信号采样BPSK调制,高斯信道下的初始化公式如下:
-
校验节点更新
校验方程方程的计算规则是二元求和运算,因此,校验方程中校验节点为’1’的概率就是,校验结果奇数个’1’;校验方程中校验节点为’0’的概率就是,校验结果为偶数个1。
由5x10的校验矩阵可知,共5个校验方程,每个校验方程有4个校验节点。各个校验节点的详细计算过程如下:
-
变量节点更新
变量节点公式更新如下, a i j a_{ij} aij为校正因子,使 q i j ( t ) ( 0 ) q_{ij}^{(t)}(0) qij(t)(0)+ q i j ( t ) ( 1 ) q_{ij}^{(t)}(1) qij(t)(1)= 1。本文实例中校验矩阵H,有10列,每列有2个变量节点需要更新。
q i j ( t ) ( 0 ) = a i j P i ( 0 ) ∏ j ∈ C i \ j ( r i j ( t ) ( 0 ) ) q_{ij}^{(t)}(0) = a_{ij}P_{i}(0)\prod_{j \in C_{i}\backslash j}^{}\left( r_{ij}^{(t)}(0) \right) qij(t)(0)=aijPi(0)j∈Ci\j∏(rij(t)(0))
q i j ( t ) ( 1 ) = a i j P i ( 1 ) ∏ j ∈ C i \ j ( r i j ( t ) ( 1 ) ) q_{ij}^{(t)}(1) = a_{ij}P_{i}(1)\prod_{j \in C_{i}\backslash j}^{}\left( r_{ij}^{(t)}(1) \right) qij(t)(1)=aijPi(1)j∈Ci\j∏(rij(t)(1)) -
后验概率计算
后验概率计算之后便可进行译码处理,概率计算公式如下。
q
i
(
t
)
(
0
)
=
a
i
P
i
(
0
)
∏
j
∈
C
i
(
r
i
j
(
t
)
(
0
)
)
q_{i}^{(t)}(0) = a_{i}P_{i}(0)\prod_{j \in C_{i}}^{}\left( r_{ij}^{(t)}(0) \right)
qi(t)(0)=aiPi(0)j∈Ci∏(rij(t)(0))
q
i
(
t
)
(
1
)
=
a
i
j
P
i
(
1
)
∏
j
∈
C
i
(
r
i
j
(
t
)
(
1
)
)
q_{i}^{(t)}(1) = a_{ij}P_{i}(1)\prod_{j \in C_{i}}^{}\left( r_{ij}^{(t)}(1) \right)
qi(t)(1)=aijPi(1)j∈Ci∏(rij(t)(1))
-
译码判决和码字校验
q i ( t ) ( 0 ) q_{i}^{(t)}(0) qi(t)(0) < q i ( t ) ( 1 ) q_{i}^{(t)}(1) qi(t)(1),判决为’1’,否则判决为’0’。译码判决后的码字与H矩阵相乘为0,则译码成功,否则译码失败转为下一次迭代。
1.2.2对数译码算法
对数译码算法实质上是对Gallager概率译码公式等号两边取对数,将多个乘法变成对数域加法计算,减少计算量。
-
变量节点初始化
对数域的初始化将概率译码的初始化公式取对数得到,此处省略公式推导,计算公式如下:
本文例子中,H矩阵初始化后变量节点如下图:
-
校验节点计算
校验节点计算是对概率译码校验节点计算公式取对数得到,引入双曲正切函数,此处省略公式推导,计算公式如下:
L
(
t
)
(
r
j
i
)
=
2
t
a
n
h
−
1
(
∏
i
∈
R
j
\
i
t
a
n
h
(
L
(
t
−
1
)
(
q
i
j
)
)
)
L^{(t)}(r_{ji}) = {2tanh}^{- 1}\left( \prod_{i \in R_{j}\backslash i}^{}{tanh\left( L^{(t - 1)}(q_{ij}) \right)} \right)
L(t)(rji)=2tanh−1
i∈Rj\i∏tanh(L(t−1)(qij))
3. 变量节点计算
变量节点计算是对概率译码变量节点计算公式取对数得到,将乘法运算转换成了对数域的加法计算,计算公式如下:
L
(
t
)
(
q
i
j
)
=
L
(
P
i
)
+
∑
j
∈
C
i
\
j
L
(
t
)
(
r
j
i
)
L^{(t)}(q_{ij}) = L(P_{i}) + \sum_{j \in C_{i}\backslash j}^{}L^{(t)}(r_{ji})
L(t)(qij)=L(Pi)+j∈Ci\j∑L(t)(rji)
四、后验概率计算
L
(
t
)
(
q
i
)
=
L
(
P
i
)
+
∑
j
∈
C
i
L
(
t
)
(
r
j
i
)
L^{(t)}(q_{i}) = L(P_{i}) + \sum_{j \in C_{i}}^{}L^{(t)}(r_{ji})
L(t)(qi)=L(Pi)+j∈Ci∑L(t)(rji)
五、码判决和码字校验
L
(
t
)
(
q
i
)
L^{(t)}(q_{i})
L(t)(qi)>0译码输出0,否则译码输出为’1’。码字校验方法同概率译码。
1.2.3归一化最小和译码
归一化最小和译码利用了双曲正切函数的性质:1、奇函数 f ( − x ) = − f ( x ) f( - x) = - f(x) f(−x)=−f(x),将双曲正切函数改写成符号函数和绝对值函数的乘积;2、值域 ∈ \in ∈[-1,1],多个双曲正切函数相乘的积<最小的乘数。将双曲正切函数的乘积简化成符号函数的计算和最小值的选取函数。
-
变量节点初始化同对数译码算法。
-
校验节点更新
计算公式如下: a a a为归一化系数, s g n sgn sgn为符号函数, i ∈ R j \ i m i n , _{i \in R_{j}\backslash i}^{min\ \ }, i∈Rj\imin ,取最小值。
L ( t ) ( r j i ) = a ∗ ( j ∈ R j \ i ∏ s g n ( L ( t − 1 ) ( q i j ) ) ) ∗ i ∈ R j \ i m i n ∣ L ( t − 1 ) ( q i j ) L^{(t)}(r_{ji}) = a \ast \left(_{j \in R_{j}\backslash i}^{\prod\ \ }{sgn\left( L^{(t - 1)}(q_{ij}) \right)} \right) \ast_{i \in R_{j}\backslash i}^{min\ \ }{|L^{(t - 1)}}(q_{ij}) L(t)(rji)=a∗(j∈Rj\i∏ sgn(L(t−1)(qij)))∗i∈Rj\imin ∣L(t−1)(qij)|
本文例子中H矩阵校验节点的详细计算步骤如下 : L r j i Lr_{ji} Lrji对应相应的校验节点,sgn是符号函数, L q i j Lq_{ij} Lqij对应相应的变量节点。
校验方程0校验节点计算。
Lr00 =a*sgn({Lq05,Lq06,Lq09})*min|({Lq05,Lq06,Lq09})|,计算不包含Lq00节点
Lr05 =a*sgn({Lq00,Lq06,Lq09})*min|({Lq00,Lq06,Lq09})|,计算不包含Lq05节点
Lr06 =a*sgn({Lq00,Lq05,Lq09})*min|({Lq00,Lq05,Lq09})|,计算不包含Lq06节点
Lr09 =a*sgn({Lq00,Lq05,Lq06})*min|({Lq00,Lq05,Lq06})|,计算不包含Lq09节点
校验方程1校验节点计算。
Lr11 = a*sgn({Lq12,Lq15,Lq18})*min|({Lq12,Lq15,Lq18})|,计算不包含Lq11节点
Lr12 = a*sgn({Lq11,Lq15,Lq18})*min|({Lq11,Lq15,Lq18})|,计算不包含Lq12节点
Lr15 =a*sgn({Lq11,Lq12,Lq18})*min|({Lq11,Lq12,Lq18})|,计算不包含Lq15节点
Lr18 =a*sgn({Lq11,Lq12,Lq15})*min|({Lq11,Lq12,Lq15})|,计算不包含Lq18节点
校验方程2校验节点计算。
Lr20 =a*sgn({Lq24,Lq28,Lq29})*min|({Lq24,Lq28,Lq29})|,计算不包含Lq20节点
Lr24 =a*sgn({Lq20,Lq28,Lq29})*min|({Lq20,Lq28,Lq29})|,计算不包含Lq24节点
Lr28 =a*sgn({Lq20,Lq24,Lq29})*min|({Lq20,Lq24,Lq29})|,计算不包含Lq28节点
Lr29 =a*sgn({Lq20,Lq24,Lq28})*min|({Lq20,Lq24,Lq28})|,计算不包含Lq29节点
校验方程3校验节点计算。
Lr32 =a*sgn({Lq33,Lq34,Lq37})*min|({Lq33,Lq34,Lq37})|,计算不包含Lq32节点
Lr33 =a*sgn({Lq32,Lq34,Lq37})*min|({Lq32,Lq34,Lq37})|,计算不包含Lq33节点
Lr34 =a*sgn({Lq32,Lq33,Lq37})*min|({Lq32,Lq33,Lq37})|,计算不包含Lq34节点
Lr37 =a*sgn({Lq32,Lq33,Lq34})*min|({Lq32,Lq33,Lq34})|,计算不包含Lq37节点
校验方程4校验节点计算。
Lr41 =a*sgn({Lq43,Lq46,Lq47})*min|({Lq43,Lq46,Lq47})|,计算不包含Lq41节点
Lr43 =a*sgn({Lq41,Lq46,Lq47})*min|({Lq41,Lq46,Lq47})|,计算不包含Lq43节点
Lr46 =a*sgn({Lq41,Lq43,Lq47})*min|({Lq41,Lq43,Lq47})|,计算不包含Lq46节点
Lr47 =a*sgn({Lq41,Lq43,Lq46})*min|({Lq41,Lq43,Lq46})|,计算不包含Lq47节点 -
变量节点更新
变量节点更新公式同对数概率译码。本文中H矩阵详细计算过程如下: L q i j Lq_{ij} Lqij对应相应的变量节点, L p i ∈ {Lp}_{i} \in Lpi∈{ 2 y 0 σ 2 \frac{2y0}{\sigma^{2}} σ22y0, 2 y 1 σ 2 \frac{2y1}{\sigma^{2}} σ22y1, 2 y 0 σ 2 \frac{2y0}{\sigma^{2}} σ22y0, 2 y 9 σ 2 \frac{2y9}{\sigma^{2}} σ22y9},对应的初始化对数似然概率, L r j i Lr_{ji} Lrji对应相应的校验节点。
第一列变量节点更新
Lq00 = Lp0+sum({Lr30});不包含Lr00节点
Lq30 = Lp0+sum({Lr00});不包含Lr30节点
第二列变量节点更新
Lq11 = Lp1+sum({Lr41});不包含Lr11节点
Lq41 = Lp1+sum({Lr11});不包含Lr41节点
第三列变量节点更新
Lq12 = Lp2+sum({Lr32});不包含Lr12节点
Lq32 = Lp2+sum({Lr12});不包含Lr32节点
第四列变量节点更新
Lq33 = Lp3+sum({Lr43});不包含Lr33节点
Lq43 = Lp3+sum({Lr33});不包含Lr43节点
第五列变量节点更新
Lq24 = Lp4+sum({Lr34});不包含Lr24节点
Lq34 = Lp4+sum({Lr24});不包含Lr34节点
第六列变量节点更新
Lq05 = Lp5+sum({Lr15});不包含Lr05节点
Lq15 = Lp5+sum({Lr05});不包含Lr15节点
第七列变量节点更新
Lq06 = Lp6+sum({Lr46});不包含Lr06节点
Lq46 = Lp6+sum({Lr06});不包含Lr46节点
第八列变量节点更新
Lq37 = Lp7+sum({Lr47});不包含Lr37节点
Lq47 = Lp7+sum({Lr37});不包含Lr47节点
第九列变量节点更新
Lq18 = Lp8+sum({Lr28});不包含Lr18节点
Lq28 = Lp8+sum({Lr18});不包含Lr28节点
第十列变量节点更新
Lq09 = Lp9+sum({Lr29});不包含Lr09节点
Lq29 = Lp9+sum({Lr09});不包含Lr29节点 -
后验概率计算
后验概率计算公式同对数概率译码算法,本文中的H矩阵后验概率的详细计算过程如下:
Lq0 = Lp0+sum({Lq00,Lq30})
Lq1 = Lp0+sum({Lq11,Lq41})
Lq2 = Lp0+sum({Lq12,Lq32})
Lq3 = Lp0+sum({Lq33,Lq43})
Lq4 = Lp0+sum({Lq24,Lq34})
Lq5 = Lp0+sum({Lq05,Lq15})
Lq6 = Lp0+sum({Lq06,Lq46})
Lq7 = Lp0+sum({Lq37,Lq47})
Lq8 = Lp0+sum({Lq18,Lq28})
Lq9 = Lp0+sum({Lq09,Lq29})
五、译码判决和码字校验同对数概率译码算法