簡體   English   中英

Python 中的快速傅立葉變換

[英]Fast Fourier Transform in Python

我是傅立葉理論的新手,我看過關於如何將 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 的定義上,但我在網上找不到任何可以幫助我清楚地理解這一點的內容。 請幫忙 :)

編輯1:

使用查爾斯回答提供的代碼,我在 0 附近有一個尖峰,這看起來很奇怪。 我已經使用rfftrfftfreq來避免頻率過多。

頻率

我讀過這可能是因為該系列的直流分量,所以在減去平均值后我得到:

減去直流分量頻率

我無法解釋這一點,尖峰似乎周期性地發生,但以 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM