实验目的:
了解数据传输过程中码型的基本概念,基带传输的特点,常用的信道编码方法。
实验工具:
C或C++编程方法、MATLAB、Python或其他语言格式,调试编好实验程序。
实验内容:
1、本实验是模拟物联网通信中信道编码及译码过程。
2、编程实现单极性非归零码(NRZ)、差分码、AMI码、HDB3码的编码算法,显示波形并译码。
3、随机产生二进制0、1序列,根据不同的编码算法,产生对应的码型、并在屏幕上输出相应的波形。
4、对产生的结果进行相应的译码操作,恢复原来产生的二进制序列。
5、对比各种算法的编码及译码结果。
python程序:(使用Pycharm或者Jupyter Notebook)
import matplotlib.pyplot as plt
print('----LINE CODING----')
print("")
print('1.NRZ-UNIPOLAR(单极性非归零码)')
print('2.NRZ-I(差分码)')
print('3.AMI(双极性信号交替反转码)')
print('4.HDB3(高密度双极性3零编码)')
print('')
choice = int(input('Enter your choice:'))
encoding_list = list()
decoding_list = list()
x = list()
y = list()
str = input("Enter Bits:")
num = len(str)
for i in range(num):
y.append(int(str[i]))
"""
1.NRZ-UNIPOLAR(单极性非归零码)
"""
if choice == 1:
# 编码
for i in range(num):
if y[i] == 1:
encoding_list.append(1)
elif y[i] == 0:
encoding_list.append(0)
print('编码结果:', encoding_list)
# 绘制波形图
for j in range(num):
x.append(int(j))
x = x * 2
x.sort()
x.remove(x[0])
x.append(num)
m = []
for k in y:
m.extend([k, k])
y = m
zeros = list()
for i in range(2 * num):
zeros.append(int(0))
l = list()
for i in range(1, num + 1):
l.append(int(i))
plt.figure(figsize=(20, 8))
plt.plot(x, y, linewidth=4.0)
plt.plot(x, zeros, linewidth=2.0)
plt.plot([0, 0], [0, 1.5], linewidth=2.0)
plt.grid()
plt.title("NRZ-UNIPOLAR")
plt.show()
# 译码
for i in range(num):
if encoding_list[i] == 1:
decoding_list.append(1)
elif encoding_list[i] == 0:
decoding_list.append(0)
print('译码结果:', decoding_list)
############
"""
2.NRZ-I(差分码)
"""
if choice == 2:
# 编码
for i in range(num - 1):
if i == 0:
y[i] = 1
if y[i + 1] == 1:
if y[i] == 1:
y[i + 1] = -1
elif y[i] == -1:
y[i + 1] = 1
elif y[i + 1] == 0:
if y[i] == 1:
y[i + 1] = 1
elif y[i] == -1:
y[i + 1] = -1
encoding_list = y
print('编码结果:', encoding_list)
# 绘制波形图
for j in range(num):
x.append(int(j))
x = x * 2
x.sort()
x.remove(x[0])
x.append(num)
m = []
for k in y:
m.extend([k, k])
y = m
zeros = list()
for i in range(2 * num):
zeros.append(int(0))
plt.figure(figsize=(20, 8))
plt.plot(x, y, linewidth=4.0)
plt.plot(x, zeros, linewidth=2.0)
plt.plot([0, 0, 0], [0, 1.5, -1.5], linewidth=2.0)
plt.grid()
plt.title("NRZ-I:-POLAR")
plt.show()
# 译码
for i in range(num):
if i == 0:
decoding_list.append(1)
if i > 0:
if encoding_list[i] != encoding_list[i - 1]:
decoding_list.append(1)
elif encoding_list[i] == encoding_list[i - 1]:
decoding_list.append(0)
print('译码结果:', decoding_list)
##############
"""
3.AMI(双极性信号交替反转码)
"""
if choice == 3:
# 编码
for i in range(len(y)):
if y[i] == 1:
for j in range(i - 1, -1, -1):
if y[j] == 1:
y[i] = -1
break
elif y[j] == -1:
y[i] = 1
break
encoding_list = y
print('编码结果:', encoding_list)
# 绘制波形图
for j in range(num):
x.append(int(j))
x = x * 2
x.sort()
x.remove(x[0])
x.append(num)
m = []
for k in y:
m.extend([k, k])
y = m
zeros = list()
for i in range(2 * num):
zeros.append(int(0))
plt.figure(figsize=(20, 8))
plt.plot(x, y, linewidth=4.0)
plt.plot(x, zeros, linewidth=2.0)
plt.plot([0, 0, 0], [0, 1.5, -1.5], linewidth=2.0)
plt.grid()
plt.title("AMI")
plt.show()
# 译码
for i in range(num):
if encoding_list[i] == 0:
decoding_list.append(0)
elif encoding_list[i] != 0:
decoding_list.append(1)
print('译码结果:', decoding_list)
"""
4.HDB3(高密度双极性3零编码)
"""
if choice == 4:
# 编码
b = -1
v = -1
i = 0
encoding_list = y
while i < num:
if y[i] == 1:
encoding_list[i] = -1 * b
b = encoding_list[i]
i = i + 1
elif y[i + 1] == 1:
encoding_list[i] = 0
encoding_list[i + 1] = -1 * b
b = encoding_list[i + 1]
i = i + 2
elif y[i + 2] == 1:
encoding_list[i] = 0
encoding_list[i + 1] = 0
encoding_list[i + 2] = -1 * b
b = encoding_list[i + 2]
i = i + 3
elif y[i + 3] == 1:
encoding_list[i] = 0
encoding_list[i + 1] = 0
encoding_list[i + 2] = -1 * b
b = encoding_list[i + 3]
i = i + 4
elif b ^ v:
encoding_list[i] = 0
encoding_list[i + 1] = 0
encoding_list[i + 2] = 0
encoding_list[i + 3] = b
v = b
i = i + 4
else:
encoding_list[i] = -1 * b
b = encoding_list[i]
encoding_list[i + 1] = 0
encoding_list[i + 2] = 0
encoding_list[i + 3] = -1 * v
v = encoding_list[i + 3]
i = i + 4
b = -1 * b
v = b
y = encoding_list
print('编码结果: ', encoding_list)
# 绘制波形图
for j in range(num):
x.append(int(j))
x = x * 2
x.sort()
x.remove(x[0])
x.append(len(str))
m = []
for i in y:
m.extend([i, i])
y = m
zeros = list()
for i in range(2 * len(str)):
zeros.append(int(0))
plt.figure(figsize=(20, 8))
plt.plot(x, y, linewidth=4.0)
plt.plot(x, zeros, linewidth=2.0)
plt.plot([0, 0, 0], [0, 1.5, -1.5], linewidth=2.0)
plt.grid()
plt.title("HDB3")
plt.show()
# 译码
count = 0
polarity = 0
init = list()
for i in range(num):
init.append(int(str[i]))
decoding_list = init
for i in encoding_list:
if encoding_list[i] == 0:
count += 1
decoding_list[i] = 0
else:
if encoding_list[i] == polarity and count >= 2:
decoding_list[i] = 0
if count == 2:
decoding_list[i - 3] = 0
else:
decoding_list[i] = 1
if encoding_list[i] == -1:
polarity = -1
else:
polarity = 1
count = 0
print('译码结果: ', decoding_list)
实验结果:(Jupyter Notebook(anaconda3))
)