[英]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 附近有一個尖峰,這看起來很奇怪。 我已經使用rfft
和rfftfreq
來避免頻率過多。
我讀過這可能是因為該系列的直流分量,所以在減去平均值后我得到:
我無法解釋這一點,尖峰似乎周期性地發生,但以 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.