【问题标题】:Discrete fourier transformation from a list of x-y points来自 x-y 点列表的离散傅立叶变换
【发布时间】:2016-03-29 11:42:06
【问题描述】:

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

我正在编写 Python 代码。

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

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

编辑:所有值都是 Pythonic float(即双精度)

【问题讨论】:

  • 你能把这个列表贴出来吗?
  • @Moritz 不是真的......它包含数千个点......当绘制时,视觉上有明显的周期性图案
  • 然后至少发布情节,这样我们就知道你在处理什么......
  • 对数据进行插值和重新采样是一种解决方案。我试图提供一个例子here

标签: python math numpy


【解决方案1】:

对于间隔不均匀的样本,您可以使用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 并生成以下图:

【讨论】:

  • 不确定from __future__ import division 在这里做什么?我似乎不需要它。
  • @MichaelKim 这是我经常使用 Python 2 和 Python 3 所养成的习惯。事实上,这个脚本不需要那个导入,但是如果你以这样的方式更改脚本,比如说,duration 变成一个大于 1 的整数,那么如果没有 division 的导入,则表达式 1/duration 将为 0。“版本校对”代码的另一种方法是将表达式更改为 @ 987654334@,但是我已经习惯了 Python 3 的风格,所以我使用 division 的导入。
  • 我游戏有点晚了,但是y轴的单位是什么?类似于原始单位的平方的功率谱?
【解决方案2】:

作为起点:

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

【讨论】:

  • 什么是坐标范围?
【解决方案3】:

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

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

【讨论】:

  • 这些是均匀分布的样本。
  • 似乎不适用于浮点值,仅适用于整数
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多