我处理振动,我试图从FFT振幅中获取以下信息:
考虑到汉宁开窗,我正在对简单的正弦波函数执行FFT。 请注意,正弦波函数的“全振幅”为5,在FFT以下运行代码可获得2.5振幅结果。因此,在这种情况下,我从FFT得到了峰值。峰间和均方根值呢?
P.-S。-我对带宽频率的RMS不感兴趣(即parsevallall定理)。我对每个峰值的RMS感兴趣,这在振动软件中通常很常见。
import numpy as np
import matplotlib.pyplot as plt
f_s = 100.0 # Hz sampling frequency
f = 1.0 # Hz
time = np.arange(0.0, 10.0, 1/f_s)
x = 5 * np.sin(2*np.pi*f*time)
N = len(time)
T = 1/f_s
# apply hann window and take the FFT
win = np.hanning(len(x))
FFT = np.fft.fft(win * x)
n = len(FFT)
yf = np.linspace(0.0,1.0/(2.0*T),N//2)
plt.figure(1)
plt.plot(yf,2.0/N * np.abs(FFT[0:N//2]))
plt.grid()
plt.figure(2)
plt.plot(time,x)
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.grid()
plt.show()
答案 0 :(得分:1)
您在频域中获得2.5的峰值,因为这是加窗信号的平均幅度,并且您没有补偿窗重。在将频域结果归一化后,使用以下方法说明窗口:
plt.plot(yf,2.0/win.sum() * np.abs(FFT[0:N//2]))
您应该获得5的振幅,就像在时域中一样。请注意,如果输入信号频率是f_s/N
的精确倍数(在您的情况下为0.1Hz),并且假设输入信号是纯音或包含以下音调的基本假设,则此方法有效在频率上充分分开是有效的。
峰峰值将仅仅是幅度的两倍,因此在您的示例中为10。
对于RMS值,您可能会对相应的时域正弦音调分量的RMS值感兴趣(在这种情况下,输入信号的确是由正弦分量组成,其频率在频率上已充分分开)。振幅为A
的时域正弦波的RMS为A/sqrt(2)
,因此您只需要除以sqrt(2)
即可从振幅值中获得相应的等效RMS值,因此{{1 }}。