基于Python的傅里叶变换分析:提频至100Hz后绘图异常
解决FFT分析100Hz信号异常的问题
哦,这个问题我太熟了——这是典型的采样混叠问题,完全是因为违反了奈奎斯特采样定理导致的!
问题根源分析
先看你原来的采样设置:
x = np.linspace(0,5,100)
总时长5秒,只采了100个点,算下来采样率 Fs = 100/5 = 20Hz。根据奈奎斯特采样定理,采样率必须至少是目标信号频率的2倍,才能准确还原信号。你的目标频率是100Hz,那采样率至少得200Hz才行,但你现在只有20Hz,远低于要求,高频信号会被“折叠”到低频区域,导致FFT结果完全失真。
解决方案:提高采样率
只需要增加采样点数,让采样率满足 Fs > 2*100 = 200Hz 即可。比如我们把采样点数提高到10000个,这样采样率就变成了2000Hz,远高于要求的最低值。
修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt # 5秒内采样10000个点,采样率Fs=2000Hz(满足奈奎斯特准则) x = np.linspace(0, 5, 10000) # 100Hz的正弦信号 y = np.sin(2*np.pi*100*x) # 傅里叶变换 f = np.fft.fft(y) # 计算频率轴 freq = np.fft.fftfreq(len(y), d=x[1]-x[0]) # 只绘制正频率部分(FFT结果对称,正频率足够说明问题) positive_freq_mask = freq > 0 plt.plot(freq[positive_freq_mask], abs(f[positive_freq_mask])**2) plt.xlabel('Frequency (Hz)') plt.ylabel('Power') plt.title('FFT of 100Hz Sine Wave') plt.show()
额外注意事项
- 采样率最好留有余量(比如是信号频率的4-5倍),避免因为信号边缘或采样误差导致的混叠
- FFT的结果是对称的,绘制时只展示正频率部分会更清晰,避免冗余信息
- 如果不能大幅提高采样率,也可以先对信号进行低通滤波,但前提是滤波截止频率低于奈奎斯特频率,不过这只适用于有多余高频噪声的场景,对你这种纯100Hz信号来说,提高采样率是最直接有效的办法
内容的提问来源于stack exchange,提问作者Ayumu Kasugano
相关产品推荐
相关产品推荐

