частотный анализ с неравномерно распределенными данными в питоне - PullRequest
4 голосов
/ 09 марта 2012

У меня есть сигнал, сгенерированный программой моделирования.Поскольку решатель в этой программе имеет переменный временной шаг, у меня есть сигнал с неравномерно распределенными данными.У меня есть два списка, список со значениями сигнала и еще один список со временем, когда произошло каждое значение.Данные могут быть примерно такими:

npts = 500
t=logspace(0,1,npts)
f1 = 0.5 
f2 = 0.6
sig=(1+sin(2*pi*f1*t))+(1+sin(2*pi*f2*t))

Я хотел бы иметь возможность выполнять частотный анализ этого сигнала с использованием Python.Кажется, я не могу использовать функцию fft в numpy, потому что это требует равномерно распределенных данных.Существуют ли какие-либо стандартные функции, которые могут помочь мне найти частоты, содержащиеся в этом сигнале?

Ответы [ 3 ]

6 голосов
/ 09 марта 2012

Наиболее распространенный алгоритм для решения таких задач называется спектральным анализом наименьших квадратов частот.Похоже, что это будет в будущем выпуске пакета scipy.signals .Может быть, есть текущая версия, но я не могу ее найти ... Кроме того, есть некоторый код, доступный из Astropython , который я не буду копировать полностью, но он по сути создаеткласс lomb, который вы можете использовать следующий код, чтобы получить некоторые значения .. Что вам нужно сделать, это следующее:

import numpy
import lomb
x = numpy.arange(10)
y = numpy.sin(x)
fx,fy, nout, jmax, prob = lomb.fasper(x,y, 6., 6.)
2 голосов
/ 05 мая 2015

Очень просто, просто найдите формулу для преобразования Фурье и внедрите ее в виде дискретной суммы по значениям ваших данных:

, учитывая набор значений f(x) по некоторому набору x,затем для каждой частоты k,

F(k) = sum_x ( exp( +/-i * k *x ) )

выберите k в диапазоне от 0 до 2*pi / min separation in x.

, и вы можете использовать 2 * pi / max(x) в качестверазмер приращения

Для теста используйте что-то, для чего вы знаете правильный ответ, ср, одиночный cos( k' * x ) для некоторого k' или гауссиан.

0 голосов
/ 06 сентября 2018

Самый простой выход - это интерполировать интервалы времени с равномерным интервалом

...