Python x-y点列表的离散傅里叶变换
我想做的是,从一系列具有周期模式的x-y点,计算周期。以我有限的数学知识,我知道傅里叶变换可以做这类事情 我正在写Python代码 我找到了一个相关的答案,但它使用了一个均匀分布的x轴,也就是说,Python x-y点列表的离散傅里叶变换,python,math,numpy,Python,Math,Numpy,我想做的是,从一系列具有周期模式的x-y点,计算周期。以我有限的数学知识,我知道傅里叶变换可以做这类事情 我正在写Python代码 我找到了一个相关的答案,但它使用了一个均匀分布的x轴,也就是说,dt是固定的,我不是这样。因为我并不真正理解它背后的数学原理,所以我不确定它是否能在我的代码中正常工作 我的问题是,它有效吗?或者,numpy中是否有某种方法已经完成了我的工作?或者,我该怎么做 编辑:所有值都是Pythonicfloat(即双精度)来自Scipy的本页向您展示了离散傅里叶变换工作原理的
dt
是固定的,我不是这样。因为我并不真正理解它背后的数学原理,所以我不确定它是否能在我的代码中正常工作
我的问题是,它有效吗?或者,numpy
中是否有某种方法已经完成了我的工作?或者,我该怎么做
编辑:所有值都是Pythonic
float
(即双精度)来自Scipy的本页向您展示了离散傅里叶变换工作原理的基本知识:
它们还提供了使用DFT的API。对于您的案例,您应该了解如何使用fft2。作为起点:
- (我假设所有坐标都是正数和整数,否则将它们映射到合理的范围,如0..4095)
- 在列表中查找最大坐标xMax,yMax
- 使用尺寸yMax、xMax制作二维数组
- 用零填充它
- 遍历列表,将对应于坐标的数组元素设置为1
- 进行二维傅里叶变换
- 在FT结果中查找特性(峰值)
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
,并生成以下绘图:
这些用于等距采样。似乎不适用于浮点值,仅适用于整数。您可以发布此列表吗?@Moritz不太适合。。。它包含数千个点。。。当绘制时,有一个清晰的周期性图案,然后张贴该图,至少让我们知道您在处理什么…插值和重新采样数据可以是一个解决方案。我试着提供一个例子。坐标范围是什么?不确定来自未来导入部门的
在这里做什么?我似乎不需要它。@MichaelKim这是我在频繁使用Python 2和Python 3时养成的习惯。实际上,此脚本不需要该导入,但是如果您以某种方式更改脚本,例如,duration
成为大于1的整数,那么如果不导入除法,表达式1/duration
,则表达式将为0。“版本校对”代码的另一种方法是将表达式更改为1.0/duration
,但我已经习惯了Python 3样式,所以我使用了分区的导入。