Дискретное трансверсальное преобразование Фурье из списка точек xy

То, что я пытаюсь сделать, состоит в том, что из списка xy точек, которые имеют периодический шаблон, вычисляет период. Имея ограниченное знание математики, я знаю, что преобразование Фурье может делать такие вещи.

Я пишу код Python.

Я нашел здесь соответствующий ответ, но он использует равномерно распределенную ось x, т. dt фиксирован, что для меня не так. Поскольку я действительно не понимаю математику позади нее, я не уверен, что она будет работать правильно в моем коде.

Мой вопрос в том, работает ли он? Или, есть ли какой-то метод в numpy который уже выполняет мою работу? Или, как я могу это сделать?

Заранее спасибо.

EDIT: все значения: Pythonic float (т.е. с двойной точностью)

3 Solutions collect form web for “Дискретное трансверсальное преобразование Фурье из списка точек xy”

Для образцов, которые не равномерно распределены, вы можете использовать scipy.signal.lombscargle для вычисления периодограммы Ломб-Скворгла . Вот пример, с сигналом, чья доминирующая частота составляет 2,5 рад / с.

 from __future__ import division import numpy as np from scipy.signal import lombscargle import matplotlib.pyplot as plt np.random.seed(12345) n = 100 x = np.sort(10*np.random.rand(n)) # Dominant periodic signal y = np.sin(2.5*x) # Add some smaller periodic components y += 0.15*np.cos(0.75*x) + 0.2*np.sin(4*x+.1) # Add some noise y += 0.2*np.random.randn(x.size) plt.figure(1) plt.plot(x, y, 'b') plt.xlabel('x') plt.ylabel('y') plt.grid() dxmin = np.diff(x).min() duration = x.ptp() freqs = np.linspace(1/duration, n/duration, 5*n) periodogram = lombscargle(x, y, freqs) kmax = periodogram.argmax() print("%8.3f" % (freqs[kmax],)) plt.figure(2) plt.plot(freqs, np.sqrt(4*periodogram/(5*n))) plt.xlabel('Frequency (rad/s)') plt.grid() plt.axvline(freqs[kmax], color='r', alpha=0.25) plt.show() 

Сценарий печатает 2.497 и генерирует следующие графики:

график сигнала

график периодограммы Ломб-Скаргеля

В качестве отправной точки:

  • (Я предполагаю, что все координаты являются положительными и целыми, в противном случае сопоставьте их с разумным диапазоном, например 0..4095)
  • найти максимальные координаты xMax, yMax в списке
  • сделать 2D-массив с размерами yMax, xMax
  • заполнить его нулями
  • пройдите через список, установите элементы массива, соответствующие координатам, на 1
  • сделать двумерное преобразование Фурье
  • искать особенности (пики) в результатах FT

Эта страница от Scipy показывает основные знания о том, как работает Discrete Fourier Transform: http://docs.scipy.org/doc/numpy-1.10.0/reference/routines.fft.html

Они также предоставляют API для использования DFT. В вашем случае вы должны посмотреть, как использовать fft2.

  • Как я могу удалить строки массива, если один из элементов строки не удовлетворяет условию?
  • numpy вызов sse2 через ctypes
  • Numpy: распределенный массив случайным образом
  • Перекрестное произведение вектора в NumPy
  • импортировать массив в python
  • Легенда не появляется в участке сложенной площади Матплотлиба
  • Различия в ctypes между Python 2 и 3
  • Как я могу индексировать этот массив numpy?
  • эквивалент использования #include <Numeric / arrayobject.h> в Numpy
  • Эффективный способ вычисления матрицы расстояния для данных широты и долготы в Python
  • Процесс Python с использованием только 1,6 ГБ ОЗУ Ubuntu 32 бит в массиве Numpy
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.