如何用Python绘制ASK调制音频信号的包络图?
ASK调制音频信号的包络图绘制(Hilbert变换正确实现方案)
问题说明
我正在处理ASK调制音频信号,用Tkinter读取.wav文件并通过阈值完成简单滤波,已实现ASK解调与信号绘制,但尝试用Hilbert变换生成包络图时失败,需要正确的实现方法。目标是得到原始ASK信号上叠加平滑包络的可视化效果。
错误原因
你之前的Hilbert变换误用在了解调后的数字信号上,而包络提取必须针对原始的ASK调制音频信号:解调后的信号是0/1的离散电平,无法提取出有意义的调制包络;同时代码未导入scipy.signal模块的hilbert函数,也会导致执行失败。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile from scipy.signal import hilbert # 必须导入该模块 from tkinter import Tk from tkinter.filedialog import askopenfilename Tk().withdraw() audioFileName = askopenfilename() # 读取ASK调制音频信号 sample_rate, audio_data = wavfile.read(audioFileName) # 处理双声道情况(若为双声道,取单声道数据) if len(audio_data.shape) > 1: audio_data = audio_data[:, 0] # 参数设置 threshold = 16000 # ASK解调 demodulated_signal = (audio_data > threshold).astype(int) # 用Hilbert变换提取原始信号的包络 analytic_signal = hilbert(audio_data) envelope = np.abs(analytic_signal) # 生成时间轴 time_axis = np.arange(len(audio_data)) / sample_rate # 绘图 plt.figure(figsize=(16, 9)) # 子图1:原始信号+包络 plt.subplot(3, 1, 1) plt.plot(time_axis, audio_data, color="#AD2523", alpha=0.6, label='原始ASK信号') plt.plot(time_axis, envelope, color="#2B77AD", linewidth=2, label='包络') plt.title('ASK调制信号与包络') plt.xlabel('时间 (s)') plt.ylabel('幅度') plt.legend() # 子图2:解调后的数字信号 plt.subplot(3, 1, 2) plt.plot(time_axis, demodulated_signal, color="#2B77AD") plt.title('解调后的数字信号') plt.xlabel('时间 (s)') plt.ylabel('比特值') # 子图3:包络单独展示(可选) plt.subplot(3, 1, 3) plt.plot(time_axis, envelope, color="#2B77AD") plt.title('ASK信号包络') plt.xlabel('时间 (s)') plt.ylabel('幅度') plt.tight_layout() plt.show()
关键说明
- Hilbert变换的处理对象:必须对原始的ASK调制信号(
audio_data)进行变换,而非解调后的0/1信号,这样才能提取出载波被调制后的幅度包络。 - 双声道处理:部分.wav文件为双声道格式,需先转换为单声道数据,避免Hilbert变换因维度问题报错。
- 包络可视化:将包络与原始信号叠加展示,能直观呈现调制信号的幅度变化趋势,匹配目标效果。
内容的提问来源于stack exchange,提问作者Alecsander Lima
相关产品推荐
相关产品推荐

