了解通信原理数据传输过程中码型的基本概念,基带传输的特点,常用的信道编码方法。C或C++编程方法、MATLAB、Python或其他语言格式,调试编好实验程序。
学时:10(5次课)
实验要求:正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确
实验内容
1. 本实验是模拟通信原理中信道编码及译码过程.
2. 编程实现单极性非归零码、差分码、AMI码、HDB3码的编码算法显示波形并译码。
3. 随机产生二进制0、1序列,根据不同的编码算法,产生对应的码型、并在屏幕上输出相应的波形。
4. 对产生的结果进行相应的译码操作,恢复原来产生的二进制序列。
5. 对比各种算法的编码及译码结果。
单极性非归零码
"""
单极性非归零码及解码
"""
import turtle
import numpy as np
myarray= np.random.randint(0,2,10)
print("Random number group:",myarray)
print("Unipolar non-return to zero code:")
turtle.setup(width=0.6,height=0.6)
turtle.forward(50)
flag = 0
decoderesult = [0]
for i in range(1,10):
if myarray[i-1]==myarray[i]:
turtle.forward(50)
decoderesult.append(flag)
if myarray[i-1]==0 and myarray[i]==1:
turtle.left(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)
flag = 1
decoderesult.append(flag)
if myarray[i-1]==1 and myarray[i]==0:
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
flag = -1
decoderesult.append(flag)
for i in range(0,10):
if decoderesult[i] != 0:
break
#print(i)
flag2 = 0
if decoderesult[i] == 1:
flag2 = -1
if decoderesult[i] == -1:
flag2 = 1
for k in range(0,i):
decoderesult[k]=flag2
for i in range(0,10):
if decoderesult[i]==-1:
decoderesult[i]=0
print("decoderesult:",decoderesult)
turtle.exitonclick()
差分码
"""
差分码
"""
import turtle
import numpy as np
myarray = np.random.randint(0,2,10)
flag = 0
decoderesult = []
def LevelJump():
global flag
if flag ==0:
turtle.left(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)
flag = 1
decoderesult.append(1)
return 0
if flag ==1:
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
flag = 0
decoderesult.append(1)
return 0
print("Random number set (initial value is zero):",myarray)
print("differential code:")
turtle.setup(width=1.0,height=0.4)
turtle.forward(50)
for i in range(10):
if myarray[i] == 1:
LevelJump()
if myarray[i] == 0:
turtle.forward(50)
decoderesult.append(-1)
for i in range(0,10):
if decoderesult[i]==-1:
decoderesult[i]=0
print(decoderesult)
turtle.exitonclick()
AMI码
"""
AMI
"""
import turtle
import numpy as np
myarray= np.random.randint(0,2,10)
print("随机数组:",myarray)
print("AMI:")
turtle.setup(width=0.6,height=0.6)
flag = 0 #表示波形图电平
flag2 = False #表示高低电平
decoderesult = []
def Level1():
global flag
global flag2
if flag == 0 and not flag2:
turtle.left(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)
flag = 1
flag2 = True
return 0
if flag == 0 and flag2:
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
flag = -1
flag2 = False
return 0
if flag == 1:
turtle.right(90)
turtle.forward(100)
turtle.left(90)
turtle.forward(50)
flag = -1
flag2 = False
return 0
if flag == -1:
turtle.left(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(50)
flag2 = True
flag =1
return 0
def Level0():
global flag
if flag == 0:
turtle.forward(50)
return 0
if flag == 1:
turtle.right(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
return 0
if flag == -1:
turtle.left(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)
return 0
turtle.forward(50)
decoderesult.append(myarray[0])
flag = myarray[0]
if myarray[0]==1:
flag2 = True
for i in range(1,10):
if myarray[i] == 1:
Level1()
decoderesult.append(1)
if myarray[i] == 0:
Level0()
decoderesult.append(0)
flag = 0
print("decoderesult",decoderesult)
turtle.exitonclick()
HDB3
"""
HDB3
"""
import turtle
import numpy as np
#myarray= np.array([1,0,0,0,1,0,1,1,1,0,0,0,0,1,0,0,1,1,1,1])#测验使用
myarray= np.random.randint(0,2,20)#产生随机数
print("随机数组:",myarray)
print("HDB3:")
turtle.setup(width=0.6,height=0.6)
flag = 0 #电平
flag2 = False #传输比特1时,目前的电平高低,true==+1,false=-1
flag3 = False #记录转换之间的比特1个数,false==偶数个,true==奇数个
decoderesult=[]
def LevelHigh():
global flag
global flag2
if flag == 0 and not flag2:
turtle.left(90)
turtle.forward(10)
turtle.right(90)
turtle.forward(10)
flag = 1
flag2 = True
return 0
if flag == 0 and flag2: #传输比特1时,目前的电平高低,true==+1
turtle.right(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
flag = -1
flag2 = False#传输比特1时,目前的电平高低,false=-1
return 0
if flag == 1:
turtle.right(90)
turtle.forward(20)
turtle.left(90)
turtle.forward(10)
flag = -1
flag2 = False
return 0
if flag == -1:
turtle.left(90)
turtle.forward(20)
turtle.right(90)
turtle.forward(10)
flag2 = True
flag =1
return 0
def LevelLower():
global flag
if flag == 0:
turtle.forward(10)
flag = 0
return 0
if flag == 1:
turtle.right(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
flag = 0
return 0
if flag == -1:
turtle.left(90)
turtle.forward(10)
turtle.right(90)
turtle.forward(10)
flag = 0
return 0
def HDB3():
global flag,flag3
if flag3 == True:
if flag == 1:
LevelLower()
LevelLower()
LevelLower()
turtle.left(90)
turtle.forward(10)
turtle.right(90)
turtle.forward(10)
flag =1
flag2 = True
flag3 = False
return 0
if flag == -1:
LevelLower()
LevelLower()
LevelLower()
turtle.right(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
flag = -1
flag2 = False
flag3 = False
return 0
if flag3 == False:
if flag == 1:
turtle.right(90)
turtle.forward(20)
turtle.left(90)
turtle.forward(10)
flag = -1
flag2 = False
flag3 = False
LevelLower()
LevelLower()
turtle.right(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
flag = -1
flag2 = False
flag3 = False
return 0
if flag == -1:
turtle.left(90)
turtle.forward(20)
turtle.right(90)
turtle.forward(10)
flag =1
flag2 = True
LevelLower()
LevelLower()
turtle.left(90)
turtle.forward(10)
turtle.right(90)
turtle.forward(10)
flag =1
flag2 = True
flag3 = False
return 0
i=0
while i<20:
if i>=20:
break
if myarray[i] == 1:
LevelHigh()
i+=1
flag3 = not flag3
decoderesult.append(1)
if i<17 and myarray[i]==0 and myarray[i+1]==0 and myarray[i+2]==0 and myarray[i+3]==0:
#消除索引溢出的问题,可根据具体情况修改,默认长度20
HDB3()
i+=4
decoderesult.append(0)
decoderesult.append(0)
decoderesult.append(0)
decoderesult.append(0)
continue
try:
if myarray[i] == 0:
LevelLower()
i+=1
decoderesult.append(0)
except IndexError:
pass
print(decoderesult)
turtle.exitonclick()