scipy.fft的振幅

时间:2019-12-16 13:54:38

标签: python fft frequency amplitude

为什么在快速傅立叶变换(FFT)之后,我计算出的幅度与原始幅度相距甚远?

我有一个具有1024点的信号,并且采样频率为1/120000。我使用scipy.fftpack在Python中应用了快速傅立叶变换。我仅将正值标出,因此将计算的幅值按箱数进行归一化,然后乘以2。

由于我的初始信号幅度约为64 dB,所以我得到的幅度值小于1。

请查看我的代码。

Signal = well.ReadWellData(SignalNDB)
y, x = Signal.GetData(numpy=np)
N = y.size      # Number of sample points 1024 ...
T = 1/120000    # sampling frequency (sec)
x = np.linspace(0.0, N*T, N)

yf = abs(fft(y)) # Perform fft returning Magnitude
xf = np.linspace(0.0, 1.0/(2.0*T), N//2) # Calculatel frequency bins

freqs = fftfreq(N, T)    

ax1=plt.subplot(211) 
ax1.plot(x,y)
plt.grid()
ax2=plt.subplot(212) 
yf2 = 2/N * np.abs(yf[0:N//2]); # Normalize Magnitude by number of bins and multiply by 2
ax2.semilogy(xf, yf2) # freq vs ampl - positive only freq    
plt.grid()    
ax1.set_title(["check"]) 
#ax2.set_xlim([0,4000])

plt.show()

请查看我的情节:

My plot

编辑:

最后,我在fft之后的信号幅度恰好是我所期望的。我做了什么。

首先,我对mV中的信号做了fft。然后根据以下公式将结果转换为dB:20 * log10(mV)+60;其中60表示工具制造商证明的1 mV。因此,dB值以线性标度格式@底部图而不是对数格式显示。

请在下面查看结果图。 Results

1 个答案:

答案 0 :(得分:1)

对我很好。 FFT(通常称为傅立叶变换)可以在频域中表示时域信号。

通过查看信号,您有两个主要成分:以500Hz左右(0.002s的周期)振荡的信号和偏移(对应于freq = 0Hz)的信号。从FFT的结果来看,我们主要看到两个峰值:一个峰值为0Hz,另一个峰值可能为500Hz(很难确定是否放大信号)。

强度之间的唯一关系是由Parseval定理定义的,但信号在64dB附近振荡并不意味着其FFT值应接近64dB。我建议您看看here