【问题标题】:Fast Fourier Transform in PythonPython中的快速傅里叶变换
【发布时间】:2020-03-29 01:01:24
【问题描述】:

我是傅立叶理论的新手,我已经看到了关于如何将 fft 应用于信号并绘制它以查看它包含的频率的非常好的教程。不知何故,他们所有人都创建了混合正弦作为他们的数据,我无法适应我的实际问题。

我每天有 242 小时的观察,这意味着我的周期是 24。所以我希望在我的 fft 图中有一个 24 左右的峰值。

我的 data.csv 样本在这里: https://pastebin.com/1srKFpJQ

绘制的数据:

我的代码:

data = pd.read_csv('data.csv',index_col=0)
data.index = pd.to_datetime(data.index)
data = data['max_open_files'].astype(float).values

N = data.shape[0] #number of elements
t = np.linspace(0, N * 3600, N) #converting hours to seconds
s = data

fft = np.fft.fft(s)
T = t[1] - t[0]

f = np.linspace(0, 1 / T, N)
plt.ylabel("Amplitude")
plt.xlabel("Frequency [Hz]")
plt.bar(f[:N // 2], np.abs(fft)[:N // 2] * 1 / N, width=1.5)  # 1 / N is a normalization factor
plt.show()

这会输出一个非常奇怪的结果,似乎每个频率我都得到相同的值。

我想问题出在 N、t 和 T 的定义上,但我在网上找不到任何可以帮助我清楚理解这一点的东西。请帮忙:)

EDIT1:

使用 charles answer 提供的代码,我有一个 0 左右的峰值,这看起来很奇怪。我使用了rfftrfftfreq 来避免频率过高。

我已经读到这可能是因为该系列的直流分量,所以在减去平均值后我得到:

我无法解释这一点,尖峰似乎是周期性发生的,但赫兹的值不能让我获得我的 24 值(总频率)。有人知道如何解释这个吗?我错过了什么?

【问题讨论】:

  • 每 24 小时发生一次事件的周期性意味着频率为 1/(24*3600)=1.15E-5 Hz,因此在 0 到 0.5 的范围内非常接近于零

标签: python numpy fft


【解决方案1】:

您看到的问题是条形太宽,而您只能看到一个条形。您必须将条形的宽度更改为 0.00001 或更小才能看到它们。

不要使用条形图,而是使用 fftfreq = np.fft.fftfreq(len(s)) 制作 x 轴,然后使用绘图函数 plt.plot(fftfreq, fft)

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.read_csv('data.csv',index_col=0)
data.index = pd.to_datetime(data.index)
data = data['max_open_files'].astype(float).values

N = data.shape[0] #number of elements
t = np.linspace(0, N * 3600, N) #converting hours to seconds
s = data

fft = np.fft.fft(s)
fftfreq = np.fft.fftfreq(len(s))

T = t[1] - t[0]

f = np.linspace(0, 1 / T, N)
plt.ylabel("Amplitude")
plt.xlabel("Frequency [Hz]")
plt.plot(fftfreq,fft)
plt.show()

【讨论】:

  • 谢谢你,查尔斯,我很困惑以至于我没有注意到宽度参数。我现在用您提供的解决方案编辑了我的问题。
  • 好的 - 如果这回答了您的问题,请接受答案。否则,让我知道您还缺少什么。我认为这个答案加上@manu190466 的评论(频率峰值应该是一个很小的、接近于零的数字)应该有助于解释你所看到的并回答你的问题。
  • 再想一想 - 一开始您将时间值从小时缩放到秒,因此您可以考虑将 x 值从 Hz(1/秒)缩放到 1/小时
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 2012-12-10
  • 2013-03-31
  • 2014-11-02
  • 2017-09-14
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多