我处理振动,因此尝试从FFT振幅中获取以下信息:
峰到峰
峰
均方根值
考虑到汉宁开窗,我正在对一个简单的正弦波函数执行FFT。
请注意,正弦波函数的“全振幅”为5,在FFT以下运行代码可获得2.5振幅结果。因此,在这种情况下,我从FFT得到了峰值。峰间和RMS如何?
P.-S. -我对带宽频率的均方根值不感兴趣(即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()
最佳答案
您会在频域中获得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值,因此在示例中为5/sqrt(2) ~ 3.53
。关于python - FFT-峰峰值,峰峰值,RMS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52243955/