2015-02-11 50 views

回答

0

如在示出的「更多關於」的help of tfestimate的部分,傳遞函數被計算或多或少Txy = Pyx/Pxx,所以通過將yx之間的交叉譜密度通過x功率譜密度。請注意,爲了計算交叉頻譜密度,自變量的順序很重要,因爲Pyx(在適當的窗口化和歸一化之後)計算爲各個窗口上的平均值fft(y) * conj(fft(x))。類似地,PSD Pxx計算爲平均值fft(x) * conj(fft(x))。我完全忘了爲什麼,但有一個很好的理由,你爲什麼要計算這兩個平均值之間的比率,而不是直接對fft(y)/fft(x)進行平均。

兩個CPSD和PSD是matplotlib.mlab,所以你可以計算的傳遞函數或多或少像這樣(未經):

from matplotlib.mlab import psd, csd 

def tfe(x, y, *args, **kwargs): 
    """estimate transfer function from x to y, see csd for calling convention""" 
    return csd(y, x, *args, **kwargs)/psd(x, *args, **kwargs) 
+0

可悲的是製作TF並不像你所提到的巴斯一樣簡單。 TF使用您提供的方法,Python的結果給出了matlab輸出的x軸上的'壓扁'(較小的dB範圍)和正鏡像。 Matlab在負空間中給出了dB,Python在正空間中給出了dB。 – 2015-02-13 15:49:42

+0

我相當肯定算法是正確的,你可以在Matlab中檢查自己:對於我'[tf1,f] = tfestimate(x,y,hann(nfft),nfft/2,nfft,fsample)'和' [Pyx,f] = cpsd(y,x,hann(nfft),nfft/2,nfft,fsample); [Pxx,f] = pwelch(x,hann(nfft),nfft/2,nfft,fsample); tf2 = Pyx ./Pxx'對於某些測試數據準確地(甚至不是數字錯誤!)產生相同的結果。我可能已經搞砸了Python代碼中的一些細節,將不得不稍後檢查。你是否試圖交換這些論點? – 2015-02-13 16:20:45

+0

我剛剛嘗試了上面的內容,並獲得了由tfestimate提供的輸出的正面鏡像(帶有一些錯誤,主要是在頻率範圍的低端)。所以我不確定Matlab的函數底下還有什麼內容。 – 2015-02-13 18:35:54