SISO Decoder for min-sum(补充章节2)

前言:

       在Polar码SISO Decoder 会涉及到SPC Decoder 

       LDPC 码Tanner图信息传递的过程中也会涉及到SPC Decoder

       SISO SPC Decoder 理论值是一个非线性函数,计算量很大。

       所以一般都会通过 min-sum 方法简化。


 一 spc (Single parity check code)

 通过前面我们知道

  L_1=L_1+L_{ext,1}

  L_2=L_2+L_{ext,2}

 L_3=L_3+L_{ext,3}

intrinsic llr 为

  L_i=\frac{2}{\sigma^2}r_i

extrinsic llr 为

 以L_{ext.1}为例

 sgn(L_{ext,1})=sgn(L_2)sgn(L_3)

|L_{ext,1}|=f(f(L_1)+f(L_2))

            =min\begin{Bmatrix} {|L_2|,|L_3|} \end{Bmatrix}

其中

   f(x)=|logtan\frac{|x|}{2}|

  两个非线性函数组成,一个siso decoder 最简单要4次非线性函数计算

 


  二 f 函数简化

      f函数是一个对称函数,单边单调递减的

   我们知道

   f(L_{ext,1})=f(L_2)+f(L_3)

  f(L_{ext,1})\geq max\begin{Bmatrix} f(L_2),f(L_3) \end{Bmatrix}

  在数理统计参数估计一章中,我们学过截断式参数估计,这里就运用

了截断式参数估计的思想,上面也看到f值越大,llr越小 

所以

   L_{ext,1}\leq min \begin{Bmatrix} {L_2,L_3} \end{Bmatrix}

   一般取最小值,实际值还会小于这个最小值的。

如下为例子:

  

二  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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值