Я работаю с вибрацией и пытаюсь получить следующую информацию из амплитуды БПФ:
Я выполняю БПФ на простой синусоидальной волновой функции, учитывая оконное управление Хэннинга. Обратите внимание, что «полная амплитуда» синусоидальной волновой функции равна 5, и выполнение кода под БПФ дает мне результат амплитуды 2,5. Итак, в этом случае я получаю пик от БПФ. А как насчет от пика до пика и RMS?
П.-С. - меня не интересует 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()
RMS, является корнем из среднего квадрата x [i]. RMS одиночного пика на i
, следовательно, будет sqrt(mean(x[i]**2)) = x[i]
. Уточните пожалуйста свой вопрос.
Привет, Хосе. Не могли бы вы пояснить, по какой причине вы используете множитель 2,0 в следующем выражении: plt.plot(yf,2.0/N * np.abs(FFT[0:N//2]))
Вы получаете пик 2,5 в частотной области, потому что это средняя амплитуда оконного сигнала, и вы не компенсируете веса окна. После нормализации результатов в частотной области, чтобы учесть окно, используя следующее:
plt.plot(yf,2.0/win.sum() * np.abs(FFT[0:N//2]))
вы должны получить амплитуду 5, как и во временной области. Обратите внимание, что это работает при условии, что частота входного сигнала является точным кратным f_s/N
(что в вашем случае составляет 0,1 Гц), и при условии, что исходное предположение, что входной сигнал является либо чистым тоном, либо состоит из тонов, которые достаточно разделены в частота действительна.
Значение размаха просто будет в два раза больше амплитуды, поэтому в вашем примере 10.
Что касается среднеквадратичного значения, вас, вероятно, интересует среднеквадратичное значение соответствующей синусоидальной тональной составляющей во временной области (в предположении, что входной сигнал действительно состоит из синусоидальной составляющей, частоты которой достаточно разделены по частотам). Среднеквадратичное значение синусоиды амплитуды во временной области A
равно A/sqrt(2)
, поэтому вам просто нужно разделить на sqrt(2)
, чтобы получить соответствующее эквивалентное среднеквадратичное значение из ваших значений амплитуды, поэтому в вашем примере это 5/sqrt(2) ~ 3.53
.
Спасибо за ответ!
В чем будет разница в использовании функции "win.sum ()" вместо простого использования 4 / N -> "plt.plot (yf, 4.0 / N * np.abs (FFT [0: N // 2 ])) "?
Уточните, пожалуйста:
x
имеет амплитуду 5. Что вы подразумеваете под "полной амплитудой"?