Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python x-y点列表的离散傅里叶变换_Python_Math_Numpy - Fatal编程技术网

Python x-y点列表的离散傅里叶变换

Python x-y点列表的离散傅里叶变换,python,math,numpy,Python,Math,Numpy,我想做的是,从一系列具有周期模式的x-y点,计算周期。以我有限的数学知识,我知道傅里叶变换可以做这类事情 我正在写Python代码 我找到了一个相关的答案,但它使用了一个均匀分布的x轴,也就是说,dt是固定的,我不是这样。因为我并不真正理解它背后的数学原理,所以我不确定它是否能在我的代码中正常工作 我的问题是,它有效吗?或者,numpy中是否有某种方法已经完成了我的工作?或者,我该怎么做 编辑:所有值都是Pythonicfloat(即双精度)来自Scipy的本页向您展示了离散傅里叶变换工作原理的

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

我正在写Python代码

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

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


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

来自Scipy的本页向您展示了离散傅里叶变换工作原理的基本知识:

它们还提供了使用DFT的API。对于您的案例,您应该了解如何使用fft2。

作为起点:

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

对于间距不均匀的样本,您可以使用来计算。下面是一个例子,有一个信号 主频为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
,并生成以下绘图:


这些用于等距采样。似乎不适用于浮点值,仅适用于整数。您可以发布此列表吗?@Moritz不太适合。。。它包含数千个点。。。当绘制时,有一个清晰的周期性图案,然后张贴该图,至少让我们知道您在处理什么…插值和重新采样数据可以是一个解决方案。我试着提供一个例子。坐标范围是什么?不确定来自未来导入部门的
在这里做什么?我似乎不需要它。@MichaelKim这是我在频繁使用Python 2和Python 3时养成的习惯。实际上,此脚本不需要该导入,但是如果您以某种方式更改脚本,例如,
duration
成为大于1的整数,那么如果不导入
除法,表达式
1/duration
,则表达式将为0。“版本校对”代码的另一种方法是将表达式更改为
1.0/duration
,但我已经习惯了Python 3样式,所以我使用了
分区的导入。