python - Python 中的快速傅立叶变换

标签 python numpy fft

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

我每小时有 242 个观测值,每天都有周期性,这意味着我的周期是 24。因此,我预计我的 fft 图上会在 24 左右出现峰值。

我的 data.csv 示例如下: https://pastebin.com/1srKFpJQ

绘制的数据:

The Series

我的代码:

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()

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

The result

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

编辑1:

根据查尔斯回答提供的代码,我在 0 附近出现了一个峰值,这看起来很奇怪。我使用 rfftrfftfreq 来避免频率过高。

frequencies

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

minusDCcomponentFrequencies

我在解释这一点时遇到了困难,尖峰似乎会定期发生,但以 Hz 为单位的值不允许我获得 24 值(总体频率)。有人知道如何解释这一点吗?我缺少什么?

最佳答案

您看到的问题是因为条形图太宽,而您只能看到一个条形图。您必须将条形的宽度更改为 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()

关于python - Python 中的快速傅立叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59172407/

相关文章:

python - Plotly 无法在 Python 中的 Latex 标签中显示文本

python - 将二进制数据插入pymongo中的Mongo字段

signal-processing - 计算功率谱密度时归一化

audio - 为什么 librosa 中的情节不同?

python - __init__() 得到了一个意外的关键字参数 'user'

python - 值错误 : cannot reshape array of size 1251936 into shape (1118, 1118)

python - 从相反的矢量坐标创建 3D 网格

python - numpy.linalg.pinv() 挂起一些无限值(但不是其他人)

python - 使用 PIL 和 Imageio 正确加载二进制掩码/GIF

signal-processing - WebAudio API/javascript 中低频信号的快速傅里叶变换