2017-04-07 60 views
1

大家好,我是數據科學的新手,想知道使用abs()函數的意義並將接收的值平方Python的scipy的fft()函數的輸出。 fftpack庫,在嘗試繪製數據集的功率譜密度時使用。我發現很多繪製功率譜密度的代碼示例都使用abs(),然後將之後獲得的值平方。任何人都可以請給我一個這樣做的理由嗎?我們不能直接在python的scipy中繪製從fft()函數獲得的值。 fftpack庫?在繪製給定數據集的功率譜密度時需要abs()方法

這裏是我已經寫到現在通過參照一些代碼的例子來繪製的功率譜密度的代碼,

import scipy.io as sio 
import numpy as np 
Import matplotlib.pyplot as plt 
import pandas as pd 

df = pd.read_csv("denoised.csv") 
data = df.values 
x = data[:,0] 

from scipy.fftpack import fft,fftfreq 
dft= fft(data)   
PSD = np.abs(dft) ** 2 
+0

您的問題更適合交叉驗證或信號處理堆棧交換。 – Stelios

+0

你的意思是'fft(x)',而不是'fft(data)'? –

+0

嘿,你知道了嗎?如果是這樣,你能發表一個答案並關閉它嗎?或者如果我的答案有幫助,你能接受嗎? –

回答

0

的通用FFT消耗的複數值數據(即,實部和虛)並返回複數值數據。即使你的輸入是真實的,我熟悉的所有FFT程序(FFTW,Numpy的FFT,Scipy的FFTPACK,Matlab等)都有返回複數值數據的fft()

所以。要繪製一個複數矢量,我們必須以某種方式將其轉換爲真實的。一種選擇是單獨繪製真實的圖像組件,但通常不如幅度/實際平方加圖像平方那麼有趣:真實與圖像可以告訴我們信號的階段的行爲,其中對於真實的信號通常是隨機的,無趣的,而幅度結合了真實和圖像分量,並以直接的方式告訴我們給定頻率的能量數量 - 有用!

如果一個複數的幅度是它的能量,幅度平方就是它的能量。通常工程師喜歡看到幅度平方,因爲他們可以交叉引用這個數字,比如他們正在使用的硬件的額定功率。這只是一個慣例。一些附帶說明:如果您的數據是真實的,則真實複雜的FFT將運行得更快。它被稱爲rfft,但它的輸出有點令人困惑:它將複雜輸出格式化爲[real,imag,real,imag,...]。 (社區已經在這個Scipy issue中通過FFTPACK引起了這種不尋常和非標準慣例的擔憂。)如果可能,我通常嘗試並使用numpy.fft.rfft,因爲它會像預期的那樣返回複數值數據。 (這實到複雜rfft返回一半儘可能多的復值輸出作爲複雜到複雜fft,這就是運行時改進得來的。)

另一個側面說明:這個問題是不是真正與數據科學有關,只是數字信號處理。考慮下次在http://dsp.stackexchange.com上提問這樣的問題(儘管你在這裏問過這個問題沒什麼大不了的)。