БПФ - от пика до пика, от пика до пика, среднеквадратичного значения

Я работаю с вибрацией и пытаюсь получить следующую информацию из амплитуды БПФ:

  • От пика до пика
  • Пик
  • RMS

Я выполняю БПФ на простой синусоидальной волновой функции, учитывая оконное управление Хэннинга. Обратите внимание, что «полная амплитуда» синусоидальной волновой функции равна 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()

Уточните, пожалуйста: x имеет амплитуду 5. Что вы подразумеваете под "полной амплитудой"?

MaxPowers 09.09.2018 13:57

RMS, является корнем из среднего квадрата x [i]. RMS одиночного пика на i, следовательно, будет sqrt(mean(x[i]**2)) = x[i]. Уточните пожалуйста свой вопрос.

MaxPowers 09.09.2018 14:02

Привет, Хосе. Не могли бы вы пояснить, по какой причине вы используете множитель 2,0 в следующем выражении: plt.plot(yf,2.0/N * np.abs(FFT[0:N//2]))

Mike 16.07.2021 09:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
2 975
1

Ответы 1

Вы получаете пик 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.

Спасибо за ответ!

Jose Guilherme 25.09.2018 14:36

В чем будет разница в использовании функции "win.sum ()" вместо простого использования 4 / N -> "plt.plot (yf, 4.0 / N * np.abs (FFT [0: N // 2 ])) "?

Jose Guilherme 25.09.2018 14:55

Другие вопросы по теме