簡體   English   中英

如何從fft函數獲取頻率軸?

[英]How to get frequency axis from an fft function?

因此,我可能缺少明顯的東西,但是我搜索了許多教程和文檔,但似乎找不到直接的答案。 如何找到在Python中執行fft的函數的頻率軸(特別是scipy庫中的fft)?

我試圖獲取原始的EMG信號,對其執行帶通濾波器,然后執行fft來查看其余的頻率分量。 但是,我不確定如何找到准確的x組件列表。 我目前正在處理的特定信號以1000 Hz采樣,並有5378個采樣。

是否只是創建從0開始到fft'd數據長度的線性x? 我看到很多人在創建從0到采樣點乘以采樣間隔的linspace。 但是在這種情況下我的樣本間距是多少? 只是采樣/采樣率? 還是完全其他的東西?

將樣本窗口輸入FFT調用后,它將返回一個虛點數組...返回數組的每個元素之間的頻率間隔由

freq_resolution =  sampling_freq / number_of_samples

第0個元素是您的DC偏移量,如果您的輸入曲線跨過零交叉點平衡,則DC偏移量將為零...因此,在您的情況下

freq_resolution = 1000 / 5378

通常,為了提高效率,您需要將2個樣本的偶次冪輸入FFT調用,如果您要說將樣本窗口及時向前滑動並在每個窗口上重復調用FFT,則這一點很重要

計算給定freq_bin(返回的虛數數組的元素)中的頻率幅度

X = A + jB

    A on real axis
    B on imag axis

for above formula its

mag = 2.0 * math.Sqrt(A*A+B*B) / number_of_samples

phase  == arctan( B / A )

您遍歷每個元素直到奈奎斯特極限,這就是為什么您將幅度倍增的原因

所以是的,它是每個freq_bin之間具有相同頻率間隔的線性增量

這是一個例子。

首先創建一個具有預定采樣間隔的正弦波。 我們將結合兩個頻率為20和40的正弦波。請記住,如果時間間隔較大,則高頻可能會混疊。

#Import the necessary packages
from scipy import fftpack
import matplotlib.pyplot as plt
import numpy as np

# sampling freq in herts 20Hz, and 40Hz
freq_sampling1 = 10
freq_sampling2 = 20
amplitude1 = 2 # amplitude of first sine wave
amplitude2 = 4 # amplitude of second sine wave
time = np.linspace(0, 6, 500, endpoint=True) # time range with total samples of 500 from 0 to 6 with time interval equals 6/500
y = amplitude1*np.sin(2*np.pi*freq_sampling1*time) + amplitude2*np.sin(2*np.pi*freq_sampling2*time)

plt.figure(figsize=(10, 4))
plt.plot(time,y, 'k', lw=0.8)
plt.xlim(0,6)
plt.show()

在此處輸入圖片說明

注意圖中的兩個正弦波是疊加的。 與頻率一。 10和振幅2,另一個具有頻率。 20和振幅4。

# apply fft function
yf = fftpack.fft(y, time.size)

amp = np.abs(yf) # get amplitude spectrum 
freq = np.linspace(0.0, 1.0/(2.0*(6/500)), time.size//2) # get freq axis

# plot the amp spectrum

plt.figure(figsize=(10,6))
plt.plot(freq, (2/amp.size)*amp[0:amp.size//2])
plt.show()

在此處輸入圖片說明

注意,在幅度頻譜中,兩個頻率被恢復,而在其他頻率處,幅度為零。 振幅值也分別是2和4。

可以使用代替fftpack.fftfreq來獲得頻率軸上由tom10的建議。因此,代碼改變

yf = fftpack.fft(y, time.size)
amp = np.abs(yf) # get amplitude spectrum 
freq = fftpack.fftfreq(time.size, 6/500)
plt.figure(figsize=(10,6))
plt.plot(freq[0:freq.size//2], (2/amp.size)*amp[0:amp.size//2])
plt.show()

我們僅繪制幅度頻譜的正部分[0:amp.size//2]

暫無
暫無

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

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