gpt4 book ai didi

python - 在Python中平滑FFT图

转载 作者:行者123 更新时间:2023-11-30 22:34:51 25 4
gpt4 key购买 nike

我想平滑在 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 次测量并不算多,但这只是为了掌握程序的窍门。这是获得的图表: enter image description here

我想知道:

  1. 如何平滑图形?
  2. 如何去除 0Hz 处的峰值(高通滤波器)?
  3. 从理论角度来看,代表性 FFT 图是否有最低测量次数要求?

感谢您提供的帮助!

L

最佳答案

平滑图:

我想你真正关心的是增加点数。因此,只需指定您想要使其看起来更平滑的点数即可。

例如,这里是与测量具有相同点数的 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])

enter image description here

如果将 fft 点数更改为 4096,即 nfft=2**12,那么您将获得更平滑的图形。 enter image description here

删除 0 Hz 处的峰值

如果您只关心 DC 值,则只需减去平均值即可。根据上面的示例,您可以将第 5 行更改为

yf = fftshift(fft(y - np.mean(y), nfft))

无需基带即可获得 FFT。 enter image description here

最小点数

从理论角度来看,您只需要满足奈奎斯特速率即可。然而对于视觉效果,FFT中的频率间隔是Fs/N。因此,如果您的采样率为 500 Hz 和 500 个点,则点之间的间距为 1 Hz,如果您的带宽为 5 Hz,这可能不够,因此您可以通过对信号进行零填充来增加 FFT 的点数,或者降低采样率(只要高于奈奎斯特)...

关于python - 在Python中平滑FFT图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com