【问题标题】:FFT - Peak to Peak, Peak, RMSFFT - 峰峰值、峰值、RMS
【发布时间】:2019-02-14 01:42:58
【问题描述】:

我处理振动,我试图从 FFT 幅度中获取以下信息:

  • 峰到峰
  • 峰值
  • 有效值

考虑到汉宁窗,我正在对简单的正弦波函数执行 FFT。 请注意,正弦波函数的“全幅度”为 5,运行 FFT 下方的代码会得到 2.5 幅度的结果。所以,在这种情况下,我从 FFT 中得到了峰值。那么峰峰值和 RMS 呢?

P.-S. - 我对带宽频率的 RMS(即 parsevall 定理)不感兴趣。我对每个峰值的 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()

【问题讨论】:

  • 请澄清:x 的幅度为 5。“全幅度”是什么意思?
  • RMS,是平方 x[i] 的均值的根。因此,i 处的单个峰值的 RMS 将为sqrt(mean(x[i]**2)) = x[i]。请澄清您的问题。
  • 嗨,何塞。请您澄清一下您在以下表达式中使用 2.0 乘数的原因是什么:plt.plot(yf,2.0/N * np.abs(FFT[0:N//2]))

标签: python signal-processing fft vibration


【解决方案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 值,因此在您的示例中为5/sqrt(2) ~ 3.53

【讨论】:

  • 感谢您的回答!
  • 使用 "win.sum()" 函数有什么不同,而不是仅仅使用 4/N --> "plt.plot(yf,4.0/N * np.abs( FFT[0:N//2]))"?
猜你喜欢
  • 1970-01-01
  • 2014-12-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2016-02-19
相关资源
最近更新 更多