scipy.fft的幅度

问题描述 投票:0回答:2

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

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

由于我的初始信号幅度约为64 dB,所以我得到的low幅度值小于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()

请查看我的情节:

“我的情节”

python fft frequency amplitude
2个回答
1
投票

对我很好。 FFT或通常的傅立叶变换可为您提供时域信号在频域中的表示。

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

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


0
投票

谢谢@CsuGouv的评论,您给了我挖掘方向。

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

最后,我在fft之后的信号幅度正是我所期望的。

请参阅下面的结果图。

Final fft Amplitude Plot

© www.soinside.com 2019 - 2024. All rights reserved.