为什么在快速傅立叶变换(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()
请查看我的情节:
编辑:
最后,我在fft之后的信号幅度恰好是我所期望的。我做了什么。
首先,我对mV中的信号做了fft。然后根据以下公式将结果转换为dB:20 * log10(mV)+60;其中60表示工具制造商证明的1 mV。因此,dB值以线性标度格式@底部图而不是对数格式显示。
请在下面查看结果图。 Results
答案 0 :(得分:1)
对我很好。 FFT(通常称为傅立叶变换)可以在频域中表示时域信号。
通过查看信号,您有两个主要成分:以500Hz左右(0.002s的周期)振荡的信号和偏移(对应于freq = 0Hz)的信号。从FFT的结果来看,我们主要看到两个峰值:一个峰值为0Hz,另一个峰值可能为500Hz(很难确定是否放大信号)。
强度之间的唯一关系是由Parseval定理定义的,但信号在64dB附近振荡并不意味着其FFT值应接近64dB。我建议您看看here。