NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」

NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」前言在极化码编码时,首先要区分出N个分裂信道的可靠程度,即哪些属于可靠信道,哪些属于不可靠信道。对各个极化信道的可靠性进行度量常用的有三种方法:巴氏参数(BhattacharyyaParameter)法、密度进化(DensityEvolution,DE)法和高斯近似(GaussianApproximation)法:目录漫谈PolarCode编码-知乎极化码的巴氏参数构造算法_不想秃头的男孩的博客-CSDN博客_极化码的构造方法一子信道评估和排序里面的详细推导…

大家好,欢迎来到IT知识分享网。

前言

       在极化码编码时,首先要区分出N个分裂信道的可靠程度,即哪些属于可靠信道,哪些属于不可靠信道。对各个极化信道的可靠性进行度量常用的有三种方法:巴氏参数(Bhattacharyya Parameter)法、密度进化(Density Evolution,DE)法和高斯近似(Gaussian Approximation)法。

目录

漫谈Polar Code编码 – 知乎

极化码的巴氏参数构造算法_不想秃头的男孩的博客-CSDN博客_极化码的构造方法


一  子信道评估和排序

      这个方向也可以结合机器学习或者深度学习去优化.做出很多模型出来。

一方面每个子信道的可靠度通过实际测试得到相应的排序(大数定律),

然后通过回归算法,获得BP,DNN等经典算法就出每个channel的权重系数。

优点是更加灵活

        定义一个(N,K)的Polar码:

       将K个消息比特放在n个子信道最可靠的K个子信道上.

   在子信道集合称为消息比特集合,记作 M

       将剩余(N-K)个子信道放置在固定的冻结比特 记作F

       M\sqcap F=\o

       M\cup F=\begin{Bmatrix} 0,1,...N-1 \end{Bmatrix}

       

      Polar 的性能受到信息比特集合M的影响,确定M首先要对各个子信道

的可靠性进行评估和排序。

   

      子信道的评估和排序主要方法有两种:

      DE 密度演进, PW 权重极化, 查表

  下面的理论详细推导过程,后面我在介绍LDPC 背景知识的时候会讲解一下

,例如SPC

   1.1 DE(Density Evolution)密度演化

        DE 的详细推导过程后面会专门介绍

        这是一种跟踪概率密度在置信传输(BP Belief Propagation)

       定义接收端的对数似然LLR(Log-Likelihood Ratio)

        sgn(u)=log\frac{W(y|u=0)}{W(y|u=1)}

       在接收端收到信息Y的时候,如果NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」1″>

     NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」0″>,那u=0 的概率更高。

       NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」

     

   2 PW 极化权重

      这个可以结合机器学习和深度学习去优化。

    

      这是一种直接追踪子信道经历的极化过程来评估子信道可靠度。

将子信道序号i用二进制表示:

      B_{n-1}B_{n-2}...B_{0}

      B_{n-1}:最高位

      B_0: 最低位

      则信道极化的过程与二进制序号具有一一对应的关系。

      1: 对应于正向极化

      0: 对应反向极化

   如下为N=8 

NR Polar Code_ 六 子信道评估和排序&SSC 伪代码「终于解决」

定义子信道的可靠度为

  V_{i}=\sum_{j=0}^{N-1}B_j*\beta^j

\beta^{j}:代表一次正向极化带来的可靠度权重增加。

对于AWGN 信道

        \beta=2^{\frac{1}{4}}

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 19 09:28:39 2022

@author: chengxf2
"""
import numpy as np

def getv(i,b,n):
    binary = bin(i)[2:]
    binary = binary[::-1] #因为从最低位开始取的
    #print("\n binary ",binary)
    
    N = len(binary)
    
    #从最低位开始计算
    v = 0.0
    for j in range(n):
       if j>=N:
          continue
       else: 
           a = np.power(b,j)
           k = int(binary[j])
           v= v+k*a
    #print("\n v: ",v)
    return v
      

'''
极化权重
'''
def pw(N=8,b=np.power(2,1/4)):
    print("\n b:%f"%b)
    n = np.log2(N)
    for i in range(0,N):
        v= getv(i,b,int(n))
        
        print("\n i: %d"%i, "\t v :%3.2f"%v)
    
pw()

3. 查表

       TS38.212 表 5.3.1.2-1 Polar 序列和对应的可靠度

二  SSC 伪代码

     SC 解码过程本质上跟决策树里面的ID3,C4.5一样的。

里面的beliefs本质上就是某个结点拿到的数据集

g,f函数就是如何划分数据集。

     这边给出伪代码

     至于为神马要用f,g函数,后面会有详细的推导过程、

​
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 14 21:41:01 2022

@author: cxf
"""

import numpy as np

'''
阶梯函数
'''
def sgn(x):
    r = 1
    if x>=0:
       r=1
    else:
        r=-1
    return r


class Polar():
    
    '''
    实现f 函数功能
    '''
    def f(self, r1,r2):
        beliefs = sgn(r1)*sgn(r2)*min(abs(r1),abs(r2))
     
        return beliefs
        
    '''
    实现g 函数功能
    '''
    def g(self, r1,r2,hat_u):
        if hat_u ==0: #作为g 函数
           beliefs= r2+r1
        else:
           beliefs = r2-r1
        return beliefs
    
    
    '''
    叶节点计算
    '''
    def getLeaf(self,tree, beliefs):
        
        is_frozen = tree.isfrozen()
        
        if is_frozen:
            hat_u = 0
    
        elif beliefs>=0:
                hat_u =0
        else:
                hat_u =1
        
        return hat_u
                
        
        

    '''
    左子树计算过程,step_R
    '''          
    def getLeft(self,beliefs, tree, hat_u):
        
     
       
        sub_beliefs =[]
        n = len(beliefs)
        if  tree.isLeaf:#叶节点
             hat_u = self.getLeaf(tree, beliefs)
        else:
             
             for i in range(n):
                 r1=beliefs[i]
                 r2 = beliefs[i+n]
                 u = hat_u[i]
                 belief = self.g(r1,r2,u)
                 sub_beliefs.append(belief)
             hat_u = self.decoder(tree, sub_beliefs)
        
        return hat_u
    
    '''
    右子树的计算过程
    '''
    def getRight(self, beliefs, tree):
        
        sub_beliefs =[]
        n = len(beliefs)
        if tree.isLeaf:
            hat_u = self.getLeaf(tree, beliefs)
        else:
             for i in range(n):
                 r1=beliefs[i]
                 r2 = beliefs[i+n]
                 
                 belief = self.f(r1,r2)
                 sub_beliefs.append(belief)
             hat_u = self.decoder(tree, sub_beliefs)
    
        return hat_u
    
    
    def transfer(self,tree,u1,u2):
        
        n = len(u1)
        
        x= []
        x_2= u2
        
        for i in range(n):
            x1= u1[i]
            x2 = u2[i]
            
            a = x1^x2
            x.append(a)
        x.extend(x_2)
            
            
    
    
    
    def decoder(self, tree,beliefs):

        
        hat_u_1 = self.getLeft(beliefs, tree)
        hat_u_2 = self.getRight(beliefs, tree)
        self.transfer(tree, hat_u_1, hat_u_2)
        
        
        
        
        
        
        
    
    def __init__(self):
        
        self.N = 16
        self.k = 10 

​

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24590.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信