前言:
在Polar码SISO Decoder 会涉及到SPC Decoder
LDPC 码Tanner图信息传递的过程中也会涉及到SPC Decoder
SISO SPC Decoder 理论值是一个非线性函数,计算量很大。
所以一般都会通过 min-sum 方法简化。
一 spc (Single parity check code)
通过前面我们知道
intrinsic llr 为
extrinsic llr 为
以为例
其中
两个非线性函数组成,一个siso decoder 最简单要4次非线性函数计算
二 f 函数简化
f函数是一个对称函数,单边单调递减的
我们知道
在数理统计参数估计一章中,我们学过截断式参数估计,这里就运用
了截断式参数估计的思想,上面也看到f值越大,llr越小
所以
一般取最小值,实际值还会小于这个最小值的。
如下为例子:
二 min-sum
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 8 15:53:50 2022
@author: chengxf2
"""
import numpy as np
'''
获取符号sign(ext)
'''
def getsign(llrList):
sign = 1
for llr in llrList:
if llr <0:
sign=-sign
for llr in llrList:
if llr >0:
print("\n sign ",sign)
else:
print("\n sign ",-sign)
'''
f函数
x1+x2+x3=0
x1=x2+x3
ratio= p(x1=0|x2,x3)/1-p(x1=0|x2,x3)
f = log ratio
'''
def f(x):
x = abs(x)/2
a = np.tanh(x)
y = np.log(a)
return abs(y)
'''
通过min sum方法计算得到的llr
arg
llrList
'''
def minsum(llrList:list):
n = len(llrList)
minLLR =[]
llrList = np.abs(llrList)
for i in range(n):
temp =[]
for j in range(n):
if i==j:
continue
intrinsicL= llrList[j]
temp.append(intrinsicL)
minllr = min(temp)
#print("intrinsic LLR %4.2f"%minllr)
minLLR.append(minllr)
print("\t计算方法1:min-sum LLR:\t",minLLR)
return minLLR
'''
spc码siso decoder
'''
def spcdecoder(llrList):
s = 0.0
extrinllrList =[]
for llr in llrList:
intrinsicL = f(llr)
s =s+intrinsicL
for llr in llrList:
ext = s-f(llr)
extrinsicLLR = np.round(f(ext),3)
extrinllrList.append(extrinsicLLR)
print("\t计算方法2:f函数 LLR:\t\t",extrinllrList)
'''
beliefs from the channel, intrinsic llr
'''
def getllr(r,sigma=0.8):
llr = r*(2.0/sigma**2)
return np.round(llr,3)
def getintriLLR(rList):
llrList = []
for r in rList:
llr= getllr(r)
llrList.append(llr)
return llrList
#rList = [0.65,1.27,3.86]
rList =[3.2, -0.07,3.42]
#rList =[0.1,0.15,0.3]
getsign(rList)
llrList = getintriLLR(rList)
print("\tllrList:\t ",llrList)
minsum(llrList)
spcdecoder(llrList)
=========================================
sign -1
sign 1
sign -1
llrList: [10.0, -0.219, 10.687]
计算方法1:min-sum LLR: [0.219, 10.0, 0.219]
计算方法2:f函数 LLR: [0.219, 9.592, 0.219]