我想对数据系列执行快速傅里叶变换。该系列包含 407 天内一致采样的每日地震振幅值。我想在这个数据集中搜索任何周期性周期。
我在这里使用 SciPy 文档进行了初步尝试:https://docs.scipy.org/doc/scipy/reference/tutorial/fftpack.html。类似于这个问题(链接),然后我将 y 的参数从人工正弦函数更改为我的数据集。
但是,我收到以下错误:
ValueError: x and y must have same first dimension, but have shapes (203,) and (407, 1)
Run Code Online (Sandbox Code Playgroud)
我希望能帮助您理解为什么会出现此错误以及如何修复它。
我还希望获得有关 FFT 处理数据集所需的正确频率和采样输入值的帮助。我的数据集中有 407 个值,每个值代表一天。因此,我定义了 N(样本点数)= 407,T(样本间距)= 1 / 84600(1 / 一天的秒数)。那是对的吗?
这是我的完整代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, ifft
import pandas as pd
# Import csv file
df = pd.read_csv('rsam_2016-17_fft_test.csv', index_col=['DateTime'], parse_dates=['DateTime'])
print(df.head())
#plot data
plt.figure(figsize=(12,4))
df.plot(linestyle = '', marker = '*', color='r') …Run Code Online (Sandbox Code Playgroud) 我想要做的是,从具有周期性模式的xy点列表中,计算周期.凭借我有限的数学知识,我知道傅立叶变换可以做到这一点.
我正在编写Python代码.
我在这里找到了一个相关的答案,但是它使用了均匀分布的x轴,即dt固定,这对我来说并非如此.由于我不太了解它背后的数学,我不确定它是否能在我的代码中正常工作.
我的问题是,它有效吗?或者,是否有一些方法numpy可以完成我的工作?或者,我该怎么办?
编辑:所有值都是Pythonic float(即双精度)
我有一组数据。它显然具有一定的周期性。我想通过使用傅里叶变换找出它的频率并将其绘制出来。
这是我的一个镜头,但看起来不太好。
这是相应的代码,我不知道为什么它失败:
import numpy
from pylab import *
from scipy.fftpack import fft,fftfreq
import matplotlib.pyplot as plt
dataset = numpy.genfromtxt(fname='data.txt',skip_header=1)
t = dataset[:,0]
signal = dataset[:,1]
npts=len(t)
FFT = abs(fft(signal))
freqs = fftfreq(npts, t[1]-t[0])
subplot(211)
plot(t[:npts], signal[:npts])
subplot(212)
plot(freqs,20*log10(FFT),',')
xlim(-10,10)
show()
Run Code Online (Sandbox Code Playgroud)
我的问题是:由于原始数据看起来非常周期性,并且我期望看到在频域中峰值非常尖锐;我怎样才能让峰看起来更漂亮?
我有一个样本间隔(时间)不均匀的数据。我怎样才能找到信号的 FFT 并绘制它。
python ×4
fft ×2
scipy ×2
csv ×1
math ×1
numpy ×1
python-2.7 ×1
python-3.x ×1
signals ×1
valueerror ×1