一、简介
调幅 (Amplitude Modulation, AM)
通过改变信号的幅度(信号强度)来表示数据,同时载波的频率和相位保持不变
调频 (Frequency Modulation, FM)
通过改变信号的频率来表示数据,而载波的幅度和相位保持不变
调相 (Phase Modulation, PM)
通过改变载波的相位来表示数据,幅度和频率保持不变
曼彻斯特编码 (Manchester Encoding)
是一种用电平跳变来表示1或0的编码方法
规则:上0下1(常用)、上1下0
差分曼彻斯特编码 (Differential Manchester Encoding)
曼彻斯特编码的变体,通过差分变化而不是绝对电平变化来表示数据
规则:数据由信号是否翻转决定:1无翻转;0有翻转
二、源代码
注意:下载图片那段代码被注释了,如若需要,取消注释即可
import numpy as np
import matplotlib.pyplot as plt
import os
"""
目的:该文件用于生成编码、调制后的图像
输入:01字符串
输出:图片
"""
def generate_signals(data, bit_duration=1, high_amp=1, low_amp=0.2, high_freq=10, low_freq=5):
time = np.linspace(0, len(data) * bit_duration, len(data) * 100) # 用于生成一个时间数组,用于绘制信号随时间变化的图
DME_time=np.linspace(-1, len(data) * bit_duration, (len(data)+1) * 100)
am_signal = []
fm_signal = []
pm_signal = []
manchester_signal = []
diff_manchester_signal = []
prev_phase = 0
prev_diff_signal = 1
diff_manchester_signal.extend([1 - prev_diff_signal]*50 + [1 - prev_diff_signal] * 50) # 初始前面一小段
for bit in data:
t = np.linspace(0, bit_duration, 100, endpoint=False)
if bit == '1':
# 调幅
am_signal.extend(high_amp*np.sin(2 * np.pi * low_freq * t))
# 调频
fm_signal.extend(np.sin(2 * np.pi * high_freq * t))
# 调相
prev_phase = np.pi # 反转相位
pm_signal.extend(np.sin(2 * np.pi * low_freq * t + prev_phase))
# 曼彻斯特编码
manchester_signal.extend([high_amp] * 50 + [low_amp] * 50)
# 差分曼彻斯特编码
diff_manchester_signal.extend([1 - prev_diff_signal] * 50 + [prev_diff_signal] * 50)
prev_diff_signal = 1 - prev_diff_signal # 边界跳变
else:
# 调幅
am_signal.extend(low_amp*np.sin(2 * np.pi * low_freq * t))
# 调频
fm_signal.extend(np.sin(2 * np.pi * low_freq * t))
# 调相
pm_signal.extend(np.sin(2 * np.pi * low_freq * t))
# 曼彻斯特编码
manchester_signal.extend([low_amp] * 50 + [high_amp] * 50)
# 差分曼彻斯特编码
diff_manchester_signal.extend([prev_diff_signal] * 50 + [1 - prev_diff_signal] * 50)
return time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal
def plot_signals(time, DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal):
x_ticks = np.arange(0, len(time) // 100, 1)
plt.figure(figsize=(12, 10))
# 绘制调幅
plt.subplot(5, 1, 1)
plt.plot(time, am_signal, label="AM")
plt.title("AM")
plt.xticks(x_ticks)
plt.ylim(-0.5, 1.5)
plt.grid(True)
# 绘制调频
plt.subplot(5, 1, 2)
plt.plot(time, fm_signal, label="FM")
plt.title("FM")
plt.xticks(x_ticks)
plt.ylim(-1.5, 1.5)
plt.grid(True)
# 绘制调相
plt.subplot(5, 1, 3)
plt.plot(time, pm_signal, label="PM")
plt.title("PM")
plt.xticks(x_ticks)
plt.ylim(-1.5, 1.5)
plt.grid(True)
# 绘制曼彻斯特编码
plt.subplot(5, 1, 4)
plt.plot(time, manchester_signal, label="Manchester Encoding", drawstyle='steps-pre')
plt.title("Manchester Encoding")
plt.xticks(x_ticks)
plt.ylim(-0.5, 1.5)
plt.grid(True)
# 绘制差分曼彻斯特编码
DME_x_ticks=[]
DME_x_ticks.append(-1)
DME_x_ticks.extend(x_ticks)
plt.subplot(5, 1, 5)
plt.plot(DME_time, diff_manchester_signal, label="Differential Manchester Encoding", drawstyle='steps-pre')
plt.title("Differential Manchester Encoding")
plt.xticks(DME_x_ticks)
plt.ylim(-0.5, 1.5)
plt.grid(True)
# 调整布局
plt.tight_layout()
# file_name = f"ModulationImages/{input_data}.png"
# if not os.path.exists(file_name):
# plt.savefig(file_name)
# print(f"图像已保存为 {file_name}")
# else:
# print(f"图像已存在")
plt.show()
# 示例输入字符串
input_data = "1010110011"
# 生成信号
time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal = generate_signals(input_data)
# 绘制信号图
plot_signals(time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal)