Python中FFT图的平滑

Python中FFT图的平滑,python,python-3.x,scipy,signal-processing,fft,Python,Python 3.x,Scipy,Signal Processing,Fft,我想平滑我在200Hz下获得的FFT图(我现在捕获500个点),这样代表性的峰值就会显示得很接近 这是我的代码: 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, facecolo

我想平滑我在200Hz下获得的FFT图(我现在捕获500个点),这样代表性的峰值就会显示得很接近

这是我的代码:

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模块的高斯滤波器。试试看:

    首先,我建议您购买500多个样品。这仅仅是2.5个周期

    使用韦尔奇的方法应该有助于得到一个更平滑的图形


    平滑图:

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

    例如,这里是与测量值具有相同点数的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的点数,或降低采样率(只要它在奈奎斯特之上)