从x-y点列表中进行离散傅里叶变换

时间:2015-12-23 04:55:40

标签: python math numpy

我要做的是,从具有周期性模式的x-y点列表中,计算周期。凭借我有限的数学知识,我知道傅立叶变换可以做到这一点。

我正在编写Python代码。

我找到了一个相关的答案here,但是它使用了均匀分布的x轴,即dt是固定的,对我来说情况并非如此。由于我不太了解它背后的数学,我不确定它是否能在我的代码中正常工作。

我的问题是,它有效吗?或者,numpy中的某些方法是否已经完成了我的工作?或者,我该怎么做?

编辑:所有值均为Pythonic float(即双精度)

3 个答案:

答案 0 :(得分:6)

对于间距不均匀的样本,您可以使用scipy.signal.lombscargle来计算Lomb-Scargle periodogram。这是一个例子,信号为 主频为2.5 rad / s。

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并生成以下图表:

plot of the signal

plot of the Lomb-Scargle periodogram

答案 1 :(得分:1)

Scipy的这一页向您展示了离散傅立叶变换如何工作的基本知识: http://docs.scipy.org/doc/numpy-1.10.0/reference/routines.fft.html

他们还提供使用DFT的API。对于您的情况,您应该看看如何使用fft2。

答案 2 :(得分:1)

作为起点:

  • (我假设所有坐标都是正整数,否则将它们映射到合理的范围,如0..4095)
  • 在列表中找到最大坐标xMax,yMax
  • 制作尺寸为yMax,xMax
  • 的2D数组
  • 用零填充
  • 遍历您的列表,将对应于坐标的数组元素设置为1
  • 进行2D傅立叶变换
  • 在FT结果中查找特性(峰值)