天津理工大学 信息论与编码实验4 离散信道编码-线性分组码

一、实验目的
信道编码也叫差错控制编码,指在将要传输的信息序列中人为的添加一些保护成分(监督码元),从而在接收端译码时可以进行自动纠错,从而增强了信号的抗干扰能力。
掌握线性分组码编码原理;
二、实验仪器及材料
计算机
三、实验原理
汉明码是1950年由汉明提出的一种能纠正单个错误的线性分组码
它不仅性能好而且编译码电路非常简单,易于工程实现,因此是工程中常用的一种纠错码
二元汉明码的参数n,k和d分别为
码长:n=2r-1
信息位数:k=2r-r-1
监督位数:r=n-k
最小码距:dmin=3
由于dmin=3,因此能纠正1个随机错误或检测2个错误
汉明码的监督矩阵H的列为所有非零的r维向量组成,所以一旦r给定,就可构造出具体的(n,k)汉明码

四、实验内容
写出实验内容中的程序并附上实现结果。

1、构造一个二元(7,4,3)汉明码并编程给出该码的标准阵列译码表。

  1. 掌握线性分组码的详细算法步骤。
    某(5,2)线性分组码的生成矩阵是
    G=[■(■(1&0&■(1&1&1))@■(0&1&■(1&0&1)))]
    假设接收的码字为R=(10101),试构造该码的标准阵列译码表并进行译码。
import numpy as np
import random

#这个函数,输出标准型监督矩阵H,标准生成矩阵G:(返回数组是为了下面调用)

def hannim(n,k,d):
    r=n-k
    p = np.zeros((1,r ),dtype = int)
    a = []
    b = []
    for i in range(1,2**r):
        p = np.zeros((1,r ),dtype = int)
        m = i
        q = 0
        for j in range(r):
            p[0,r-1-j] = m%2
            if  m%2 == 1:
                q += 1
            m = m // 2 
        if q == 0:
            continue
        elif q == 1:
            a.append(p)

        elif q != 1:
            b.append(p)
    a.reverse()
    random.shuffle(b)
    a = b+a
    
    
    c = a[0] 
    tp = 0
    for i in a:
        tp += 1
        if tp != 1:
            c = np.concatenate([c, i], axis=0) 
    
    print("标准型监督矩阵H:\n",c.T)
    c = b[0] 
    tp = 0
    for i in b:
        tp += 1
        if tp != 1:
            c = np.concatenate([c, i], axis=0) 
    
    m = np.zeros((len(c),len(c)),dtype = int)
    for i in range(len(c)):
        m[i][i]=1
    g = np.hstack((m,c))
    print("标准生成矩阵G:\n",g)
    return g

hannim(7,4,3)

#这个函数输出标准阵列译码表(也方便上面第二题调用)

天津理工大学 信息论与编码实验4 离散信道编码-线性分组码_第1张图片
天津理工大学 信息论与编码实验4 离散信道编码-线性分组码_第2张图片
天津理工大学 信息论与编码实验4 离散信道编码-线性分组码_第3张图片
天津理工大学 信息论与编码实验4 离散信道编码-线性分组码_第4张图片
第四位错,故译码10

相关代码

a =np.array([[1,0,1,1,1],[0,1,1,0,1]])
def decodertable(a):
    shape = a.shape
    l = shape[1]
    w = shape[0]
    z = []
    for i in range(2**w):
        m =i
        p = np.zeros((1,w ),dtype = int)
        for j in range(w):
            p[0,w-1-j] = m%2
            m = m // 2 
        z.append(p)
    for i in z:
        re =i.dot(a)
        for j in range(len(re[0])):
            while (re[0,j]>1):
                re[0,j] = re[0,j]%2
        print("消息:",re,"译码",i)
decodertable(a) 
a =np.array([[1,1,1,0,0],
             [1,0,0,1,0],
             [1,1,0,0,1]])
b = np.array([1,0,1,0,1])
z = a.dot(b.T)
for i in range(len(z)):
    z[i] = z[i]%2
z

你可能感兴趣的:(信息论与编码,矩阵,线性代数,机器学习)