前言:
循环码是线性分组码的一个重要分支
1: 线性分组码编解码思考
2: CRC循环冗余码讲解
通信原理概论8.6线性分组码和8.7循环码_哔哩哔哩_bilibili
信道编码/差错控制码/编码理论/数字通信/线性分组码、循环码、卷积码_哔哩哔哩_bilibili
一 线性分组码编解码思考
发送方编码
发送信息为u :1 行k列向量
: 1行 n列向量
系统编码矩阵为
[k,n]矩阵
m=n-k
Q主要是编码规则,I 取信息位
例:
接收方译码
接收方收到的信息位
E: 错误图样,理想值为全0向量
伴随式,只跟E有关系
当S不全为0,我们解码出E的时候,再根据
可以解码出发送码字(上面+都是模二加法)
其中H为校验矩阵
原理是
我们要解码出E,本质上就是奇偶校验矩阵H中的
行重除以2种可能,也就是后面LDPC码为什么要强调稀疏
以上面H 为例,
就是解上面的线性方程组,结果可能为0,或1,对应的e组合为
, 可以先做一个码表,比如要使得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除法
2.2 CRC 冗余码
在发送信息的位数添加长度为m-1个bit 0000,
然后 得到的码字 mod g(x),得到的余数 替代原来0000
取余运算用矩阵表示
, u跟移位后的g(x)做模二加法和
判断是否传输出错也是用得到的码字mod g(x)