Python 中的平滑 FFT 图
Smoothing FFT graph in Python
我想对在 200Hz 下获得的 FFT 图进行平滑处理(我目前捕获了 500 个点),以便在 THIS.
附近显示代表性峰值
这是我的代码:
N = 500
T = 5/1000
y1 = np.array(data_Ax)
yf1 = scipy.fftpack.fft(y1)
xf1 = np.linspace(0.0, 1.0/(2.0*T), N/2)
yfft1 = 2.0/N * np.abs(yf1[:N//2])
plt.figure(figsize=(20, 3), dpi= 100, facecolor='w', edgecolor='k')
plt.plot(xf1, yfft1, 'g-', label ="FFT for Ax")
plt.xlabel('Frequency [Hz]')
plt.legend(loc=1)
为了平滑我尝试使用这个:
rft = np.fft.rfft(yfft1)
y_smooth = np.fft.irfft(rft)
但是没有任何效果
我很清楚 200Hz 是一个低采样频率,500 次测量并不多,但这只是为了掌握程序的窍门。这是获得的图表:
我想知道:
- 如何平滑图形?
- 如何去除 0Hz 处的峰值(高通滤波器)?
- 从理论上讲,一个有代表性的FFT图是否有最小测量次数要求?
感谢您的帮助!
L
您是否尝试过使用scipy模块的高斯滤波器。试一试:https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.ndimage.filters.gaussian_filter.html
首先,我建议您获得明显超过 500 个样本。那只有 2.5 个周期
使用 Welch 的方法应该有助于获得更平滑的图形。
平滑图:
我猜你真正关心的是增加点数。所以只要指定你想要让它看起来更平滑的点数。
例如,这里的 FFT 具有与测量相同的点数:
n = 500
nfft = n
t = np.linspace(0, 0.1, n)
y = 0.5 + np.sin(2*np.pi*60*t)
yf = fftshift(fft(y, nfft))
f = fftshift(fftfreq(nfft, np.mean(np.diff(t))))
pyplot.plot(f, abs(yf))
pyplot.grid()
pyplot.xlim([-100, 100])
如果将 fft 点数更改为 4096,即 nfft=2**12
,那么您将获得更平滑的图形。
移除 0 Hz 处的峰值
如果您只关心 DC 值,那么只需减去平均值即可。根据上面的示例,您可以将第 5 行更改为
yf = fftshift(fft(y - np.mean(y), nfft))
你得到了没有基带的 FFT。
最小点数
从理论上讲,只要满足奈奎斯特速率即可。然而对于视觉效果,FFT中的频率间隔是Fs/N。因此,如果您的采样率为 500 Hz 和 500 个点,则点之间的间距为 1 Hz,如果您的带宽为 5 Hz,这可能不够,因此您通过零填充信号来增加 FFT 的点数,或者降低采样率(只要它高于奈奎斯特)...
我想对在 200Hz 下获得的 FFT 图进行平滑处理(我目前捕获了 500 个点),以便在 THIS.
附近显示代表性峰值这是我的代码:
N = 500
T = 5/1000
y1 = np.array(data_Ax)
yf1 = scipy.fftpack.fft(y1)
xf1 = np.linspace(0.0, 1.0/(2.0*T), N/2)
yfft1 = 2.0/N * np.abs(yf1[:N//2])
plt.figure(figsize=(20, 3), dpi= 100, facecolor='w', edgecolor='k')
plt.plot(xf1, yfft1, 'g-', label ="FFT for Ax")
plt.xlabel('Frequency [Hz]')
plt.legend(loc=1)
为了平滑我尝试使用这个:
rft = np.fft.rfft(yfft1)
y_smooth = np.fft.irfft(rft)
但是没有任何效果
我很清楚 200Hz 是一个低采样频率,500 次测量并不多,但这只是为了掌握程序的窍门。这是获得的图表:
我想知道:
- 如何平滑图形?
- 如何去除 0Hz 处的峰值(高通滤波器)?
- 从理论上讲,一个有代表性的FFT图是否有最小测量次数要求?
感谢您的帮助!
L
您是否尝试过使用scipy模块的高斯滤波器。试一试:https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.ndimage.filters.gaussian_filter.html
首先,我建议您获得明显超过 500 个样本。那只有 2.5 个周期
使用 Welch 的方法应该有助于获得更平滑的图形。
平滑图:
我猜你真正关心的是增加点数。所以只要指定你想要让它看起来更平滑的点数。
例如,这里的 FFT 具有与测量相同的点数:
n = 500
nfft = n
t = np.linspace(0, 0.1, n)
y = 0.5 + np.sin(2*np.pi*60*t)
yf = fftshift(fft(y, nfft))
f = fftshift(fftfreq(nfft, np.mean(np.diff(t))))
pyplot.plot(f, abs(yf))
pyplot.grid()
pyplot.xlim([-100, 100])
如果将 fft 点数更改为 4096,即 nfft=2**12
,那么您将获得更平滑的图形。
移除 0 Hz 处的峰值
如果您只关心 DC 值,那么只需减去平均值即可。根据上面的示例,您可以将第 5 行更改为
yf = fftshift(fft(y - np.mean(y), nfft))
你得到了没有基带的 FFT。
最小点数
从理论上讲,只要满足奈奎斯特速率即可。然而对于视觉效果,FFT中的频率间隔是Fs/N。因此,如果您的采样率为 500 Hz 和 500 个点,则点之间的间距为 1 Hz,如果您的带宽为 5 Hz,这可能不够,因此您通过零填充信号来增加 FFT 的点数,或者降低采样率(只要它高于奈奎斯特)...