NR 物理层编码: CRC循环冗余码

前言:

     循环码是线性分组码的一个重要分支

  

  1: 线性分组码编解码思考

  2: CRC循环冗余码讲解

  通信原理概论8.6线性分组码和8.7循环码_哔哩哔哩_bilibili

信道编码/差错控制码/编码理论/数字通信/线性分组码、循环码、卷积码_哔哩哔哩_bilibili


一  线性分组码编解码思考

  

  发送方编码

   发送信息为u :1 行k列向量

    c=uG   :       1行 n列向量

   系统编码矩阵为

    G=[I_k,Q_{k,m}] [k,n]矩阵

    m=n-k

    Q主要是编码规则,I 取信息位

    例:

           

 

       p_1=u_1+u_2,p_2=u_2+u_3,p_3=u_3+u_4

       c=[u_1,u_2,u_3,u_4.p_1,p_2,p_3,p_4]

     接收方译码

      接收方收到的信息位

      R=C+E   =>E=R+C

     E: 错误图样,理想值为全0向量

     伴随式,只跟E有关系

     S=RH^T=(C+E)H^T=CH^T+EH^T=EH^T

     当S不全为0,我们解码出E的时候,再根据

      C=R+E 可以解码出发送码字(上面+都是模二加法)

     其中H为校验矩阵

     H=[Q^T,I_m]_{m,n}

     

       原理是

        u_1+u_2+p_1=0,u_2+u_3+p_2=0,u_3+u_4+p_3=0 

       我们要解码出E,本质上就是奇偶校验矩阵H中的

行重除以2种可能,也就是后面LDPC码为什么要强调稀疏

以上面H 为例,E=[e_1,e_2,e_3,e_4,e_5,e_6,e_7]

      e_1+e_2+e_5=0,e_2+e_3+e_6=0,e_3+e_4+e_7=0

   就是解上面的线性方程组,结果可能为0,或1,对应的e组合为

   2^7=128, 可以先做一个码表,比如要使得e_1+e_2+e_5=1,这种组合

相对于整体是一个固定的。

# -*- coding: utf-8 -*-
"""
Created on Thu Sep  1 11:09:22 2022

@author: chengxf2
"""
import torch
import numpy as np
import copy 


Bits =[]
'''
生成N个二进制位的组合
'''
def getBit(k,ret):
    
    retLeft =  copy.deepcopy(ret)
    retRight = copy.deepcopy(ret)
    retLeft.append(0)
    retRight.append(1)
    
    N = len(retRight)
    if N<k:
     
        getBit(k,retLeft)
        getBit(k,retRight)
    else:
       
        Bits.append(copy.deepcopy(retLeft))
        Bits.append(copy.deepcopy(retRight))
        
        
def Check(p1,p2,p3):
    
    N = len(Bits)
    num = 0
    for index in range(N):
        item = Bits[index]
        #print(item)
        
        c1  =  item[0]+item[1]+item[4]
        c2 =   item[1]+item[2]+item[5]
        c3 =   item[1]+item[3]+item[6]
        
        #print(item,"\t  index%d 奇偶校验: "%index,c1%2,c2%2,c3%2,((c3%2)and p3))
        if ((c1%2) == p1)  and ((c2%2) == p2)  and ((c3%2)== p3):
            print("\n index ",item)
            num= num+1
    return num
        
     
            
'''
p1: e1+e2+e5 =0
p2: e2+e3+e6 =0
p3  e3+e4+e7 = 0
'''
def Concomitant( P1,P2, P3):

       num = Check(p1,p2,p3)
     
       print("\n num ",num)

if __name__ =="__main__":    
    ret =[]
    k=7
    getBit(k,ret)
    
    p1 = 1
    p2 = 0
    p3 = 1
    Concomitant(p1,p2,p3)

    #print("\n 所有的bit流组合为 ",Bits)
    
    
    
    
    

 


二  CRC循环冗余码讲解

     2.1 循环除法

           码字转换为生成多项式 ,生成多项式作模二除法,得到的结果转换为码字

       例: 10111 对110的模2除法

           c=[10111],c(x)=x^4+x^2+x+1

          g=[110],g(x)=x^2+x

         

 

2.2 CRC 冗余码

        在发送信息的位数添加长度为m-1个bit 0000,

       然后 得到的码字 mod g(x),得到的余数 替代原来0000

     

 

 

   u=[1101,0110,11],k=10, u(x)=x^{13}+x^{12}+x^{10}+x^8+x^7+x^5+x^4

   g=[10011],g(x)=x^4+x+1

 取余运算用矩阵表示

c=uG, u跟移位后的g(x)做模二加法和

 G=\begin{bmatrix} x^{k}g(x)\\ .... \\ xg(x)\\ g(x) \end{bmatrix}

判断是否传输出错也是用得到的码字mod g(x)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值