天津理工大学通信原理 实验2.差错控制算法实现

了解通信原理中差错控制的基本概念,差错控制编码及译码的原理,常用的差错控制算法。C或C++, MATLAB、 Python或其他语句编程方法与语句格式,编好实验程序。
学时:10 (5次课)
实验要求:正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确

实验内容
1. 本实验是模拟通信原理中差错编码及译码过程.
2. 编程实现奇偶校验、阵列编码、 CRC编码及海明码的编码及译码后的结果。
3. 随机产生二进制0、1序列,并随机在其中产生多位错误。
4. 使用奇偶校验、CRC及海明码对产生的序列进行编码及译码。
5. 随机产生二进制阵列,使用阵列编码算法进行编码和译码。
6. 对比各种算法的编码及译码结果。

CRC检查

'''
CRC校验
'''

#CRC校验与CRC编码操作过程基本相同

def XorResult(list1,list2):   #先定义异或运算
    result = []
    for i in range(len(list1)):
        if list1[i]==list2[i]:
            result.append('0')
        else:
            result.append('1')
    return result


def Judgebit(Mutifor,Info):    #判断传输是否正确
    Minuend = []#被减数
    Subtrahend = []#减数
    
    for i in range(len(Mutifor)):#初始化减数与被减数
        Minuend.append(Info[i])
        Subtrahend.append(Mutifor[i])
    while (i<len(Info)):
        if Minuend[0]=='1':
            temp = XorResult(Minuend,Subtrahend)
            result = temp[:]
            Minuend = result[:]
        del Minuend[0]
        i=i+1
        if i<len(Info): Minuend.append(Info[i])
    for i in range(len(Minuend)):
        if Minuend[i]=='0':
            continue
        if Minuend[i]=='1':
            print("CRC code is wrong, please retransmit! !")
            return False
    return True


mutifor = input("Please enter the numerical form of the generated polynomial:")   #生成多项式
Crccode = input("Please enter the CRC code:")  #编码的信息
Crccode = list(Crccode)
#info = inf+["0"]*(len(mutifor)-1)  #编码的信息

mutifor = list(mutifor)
print("Judge CRC code:",Judgebit(mutifor,Crccode)) #调用函数并输出,返回Bool变量



CRC校验

‘’’
CRC编码
‘’’
#CRC校验可以分解为不断逐位异或,和右移的操作

def XorResult(list1,list2): #先定义异或运算
result = []
for i in range(len(list1)):
if list1[i]==list2[i]:
result.append(‘0’)
else:
result.append(‘1’)
return result

def Checkbit(Mutifor,Info):#求出校验位
Minuend = []#被减数
Subtrahend = []#减数
for i in range(len(Mutifor)):#初始化减数与被减数
Minuend.append(Info[i])
Subtrahend.append(Mutifor[i])
while (i<len(Info)):
if Minuend[0]==‘1’:
temp = XorResult(Minuend,Subtrahend)
result = temp[:]
Minuend = result[:]
del Minuend[0]
i=i+1
if i<len(Info): Minuend.append(Info[i])
return Minuend

mutifor = input(“Please enter the numerical form of the generated polynomial:”) #生成多项式
inf = input(“Please enter the information code:”) #编码的信息位
inf = list(inf)
info = inf+[“0”]*(len(mutifor)-1) #编码的信息

mutifor = list(mutifor)
info = list(info)
print(“After using CRC code:”,’’.join(inf+Checkbit(mutifor,info))) #调用函数并且输出

HammingCo2

"""
海明编码与解码
"""

def XorBit(list1):     #按位异或
    result = list1[0]
    for i in range(len(list1)-1): 
        if result == list1[i+1]:
            result = '0'
            continue
        if result != list1[i+1]:
            result = '1'
            continue
    return result

def HammingCoding(HammingCode,k):
    t=0
    temp=[]
    while t<k:
        for i in range(len(HammingCode)):
            if ((i+1)//(2**t))%2 == 1:
                temp.append(HammingCode[i])
        del temp[0]
        result = XorBit(temp)
        temp=[]
        HammingCode[(2**t)-1]=result[0]
        t+=1


def DeHammingCoding(HammingCode):
    m=0  
    for i in range(len(HammingCode)):#计算校验位的数量
        if i+1 == (2**m):
            m+=1
    t=0
    temp = []
    result = []
    while t<m: #将每个分组的异或结果保存到result
        for i in range(len(HammingCode)):
            if ((i+1)//(2**t))%2 == 1:
                temp.append(HammingCode[i])
        #print("temp",temp)
        result.append(XorBit(temp))
        temp=[]
        t+=1
    result.reverse()
    #print ("result.reverse",result)
    for i in range(len(result)):#判断result是否有误
        if result[i] != '0':
            print("error !loaction:",result)
            print("correction...")
            result.reverse()
            loaction=0
            for i in range(len(result)):#如果有错误,则找出有误的位置
                if result[i]=='1':
                    loaction += (2**i)
            #print("loaction",loaction) #将有错的位置更正
            if HammingCode[loaction-1] == '1':
                HammingCode[loaction-1] = '0'
            if HammingCode[loaction-1] == '0':
                HammingCode[loaction-1] = '1'
            print ("DeHammingCoding Finished:")
            break


    #去除校验位
    temp = []
    p=0
    for i in range (len(HammingCode)):
            #print("i",i)
            if (2**p) != i+1:
                temp.append(HammingCode[i])

            if (2**p) == i+1:

                p = p+ 1

    HammingCode =temp[:]
    return HammingCode

judge=input("Decoding or coding(0 or 1)")
if judge[0] == '0':
    HammingCode = input("Please input HammingCode:")
    HammingCode = list(HammingCode)
    print("InformationBit:",DeHammingCoding(HammingCode))
if judge[0] == '1':
    InformationBit = input("Please input InformationBit:")#0101011,, ['11001010011']

    InformationBit = list(InformationBit)
    n = len(InformationBit)
    HammingCode = InformationBit[:]
    for k in range(10):
        if (n+k)<=(2**k)-1:
            break
    #print(k)
    for i in range(k):
        HammingCode.insert(2**i-1,'0')
    HammingCoding(HammingCode,k)
    print("Your HammingCode is:",HammingCode)    

阵列偶校验

'''
偶阵列编码
随即产生二进制数组(本实验为6行11列数组),分别在每个存储单元后和每列进行偶校验
'''


import numpy as np                                  #导入numpy模块
myarray= np.random.randint(0,2,10)
print("Random number group:",myarray)
myarray = np.random.randint(0,2,10)
for i in range(5):
    myarray = np.vstack((myarray,np.random.randint(0,2,10)))
print("Generates random numbers\n",myarray)                  #随机数组生成

#每个存储单元进行偶校验
Myarray = np.zeros((i+2,1),dtype=np.int16)
myarray=np.hstack((myarray,Myarray))


result = 0
for i in range(6):
    for j in range(11):
        if j!=10 and myarray[i][j] == 1:
            result += 1
        if j ==10  :
            myarray[i][j] = result%2
            result = 0
Myarray = np.zeros((1,11),dtype=np.int16)
myarray=np.vstack((myarray,Myarray))

#逐列进行偶校验


result = 0
for j in range(11):
    for i in range(7):
        if i!=6 and myarray[i][j] == 1:
            result += 1
        if i ==6  :
            myarray[i][j] = result%2
            result = 0
print("After array parity check:\n",myarray)
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值