使用Python绘制正弦信号的困惑:不同频率信号图为何一致?
问题原因与解决方案
你的问题核心是**采样定理(奈奎斯特准则)**和时间范围设置不合理导致的信号混叠:
为什么两个信号看起来完全一致?
你设置的时间范围是0到100秒,采样点共1000个,计算下来采样率仅为 1000/100 = 10Hz。根据奈奎斯特准则,要正确还原信号,采样率必须至少是信号最高频率的2倍。对于10MHz(10^7 Hz)的信号,需要至少20MHz的采样率,但你的采样率只有10Hz,远低于要求,因此高频信号发生严重混叠,最终呈现出和10Hz信号一样的伪波形。
同时,100秒的时间范围对于10MHz的信号来说太长了——这个信号在100秒内会振荡10亿次,你的1000个采样点完全无法捕捉它的变化,只能得到随机的采样值,而这些值在视觉上和低频信号重合。
修正后的代码示例
要正确绘制10MHz的正弦信号,你需要缩小时间窗口,只截取几个周期的时间,同时保证采样率足够:
import numpy as np import matplotlib.pyplot as plt # 对于10MHz信号,取10个周期的时间:周期T=1/10e6=1e-7秒,10个周期就是1e-6秒 t = np.linspace(0, 1e-6, 1000) # 时间范围0到1微秒,1000个采样点,采样率1e9Hz,远高于奈奎斯特频率 # 生成信号 signal1 = np.sin(2 * np.pi * 10 * t) # 10Hz信号,在1微秒内几乎是一条直线 signal2 = np.sin(2 * np.pi * 10e6 * t) # 10MHz信号,能看到完整的10个周期 # 绘图 plt.figure() plt.plot(t, signal1, c='r', label='S1 (10Hz)') plt.plot(t, signal2, c='b', label='S2 (10MHz)') plt.ylabel('信号强度') plt.xlabel('时间 (s)') plt.legend() plt.show()
如果想同时对比低频和高频信号的差异,可以分别设置合适的时间范围:
- 对于10Hz信号,用0到1秒的时间范围就能看到完整的10个周期
- 对于10MHz信号,用0到1e-6秒的时间范围看到10个周期
额外提醒
- 绘制高频信号时,永远不要用过长的时间范围,否则采样点无法捕捉信号细节
- 时刻牢记奈奎斯特采样准则:采样率 ≥ 2×信号最高频率,否则必然出现混叠失真
内容的提问来源于stack exchange,提问作者Apinorr
相关产品推荐
相关产品推荐

