Python中的平滑FFT图

2024-09-30 22:18:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想平滑我的FFT图,它是在200Hz下获得的(我现在捕捉到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)

为了平滑,我尝试使用以下方法:

^{pr2}$

但没有任何效果。在

我很清楚200Hz是一个低采样频率,500次测量并不多,但这只是为了获得程序的窍门。以下是获得的图表: enter image description here

我想知道:

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

谢谢你的帮助!在


Tags: 代码fftdatanppltscipyaxthis
3条回答

平滑图形:

我想你真正关心的是增加分数。所以只需指定要使其看起来更平滑的点数。在

例如,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行更改为

^{pr2}$

你可以得到没有基带的FFT。 enter image description here

最小点数

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

首先,我建议你得到超过500个样本。只有2.5个周期

使用韦尔奇的方法应该有助于获得更平滑的图形。在

doc scipy

相关问题 更多 >