了解通信原理中差错控制的基本概念,差错控制编码及译码的原理,常用的差错控制算法。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)