Как извлечь пик на определенной частоте в python

Я хочу знать, сколько энергии находится на определенной частоте в сигнале. Я использую БПФ для получения спектра, а шаг частоты определяется длиной моего сигнала.

Мой спектр выглядит, например, так: Спектр, красная линия - это то место, где мне нужно значение, но оно находится между двумя частотами

Я хочу получить пик спектра на определенной частоте, -0,08. Однако дискретизация спектра дает мне только пики при -0,0729 и -0,0833.

Есть ли способ сдвинуть спектр, чтобы убедиться, что точка данных находится на нужной мне частоте? Или способ получить значение без обязательного использования fft?

Большое тебе спасибо!


person FunkySheep    schedule 15.03.2016    source источник


Ответы (2)


Что вы на самом деле делаете, когда используете ДПФ (или любое преобразование Фурье), так это измеряете, какая часть вашего сигнала «пересекается» с синусоидами определенных частот. Это делается путем суммирования произведения вашего сигнала с комплексным сопряжением волны любой частоты. Технически это называется внутренним продуктом, который представляет собой обобщение скалярного произведения и измеряет, насколько «близок» сигнал к другому. Поэтому, если вас интересует только одна частота, не берите все ДПФ, просто посмотрите на ту, которая вам нужна.

Я не уверен, какие у вас единицы измерения, поэтому я предполагаю, что вам нужен пик на частоте f0 = -0,08 Гц (если ваши единицы измерения другие, например, нормализованные по частоте дискретизации, вам нужно будет это учитывать) . Это соответствует комплексной экспоненте exp(2*pi*j*f0*t). Поскольку вы производите семплирование, ваше t является дискретным, поэтому t = n/fs, где fs — частота дискретизации (в Гц).

# assuming you're using numpy arrays
w = exp(-2*pi*1j*f0*arange(len(signal))/fs)
peak = abs(sum(signal*w))

Существуют разные определения ДПФ; Я почти уверен, что numpy соответствует тому, что у меня есть выше. Дополнительный минус в экспоненте потому, что это комплексное сопряжение.

Обратите внимание, маловероятно, что w на самом деле является периодическим. Если количество выборок достаточно велико, это не имеет большого значения. Хорошая эвристика — не менее 10 периодов.

person jpkotta    schedule 15.03.2016
comment
Большое спасибо, это именно то, что я искал! Вы правы, здесь не нужно брать весь спектр. - person FunkySheep; 16.03.2016
comment
измерение того, насколько ваш сигнал пересекается с синусоидами определенных частот - только теперь я наконец понял это, 5 лет назад в школе - person Pavol Hanzel; 01.04.2018

Если у вас есть дискретные данные, но вам нужен вывод для непрерывной переменной, вам обязательно понадобится какая-то функция интерполяции. Для значения по стилю запроса я бы посоветовал Scipy interp1d (пример использования функция interp1d). Я считаю, что это самый быстрый способ достичь желаемых результатов.

person armatita    schedule 15.03.2016