1
是否有Matlab的tfestimate()的Python版本?我研究過控制工具箱,但它只提供線性傳遞函數。Python版本的Matlab Signal Toolbox的tfestimate()?
是否有Matlab的tfestimate()的Python版本?我研究過控制工具箱,但它只提供線性傳遞函數。Python版本的Matlab Signal Toolbox的tfestimate()?
如在示出的「更多關於」的help of tfestimate的部分,傳遞函數被計算或多或少Txy = Pyx/Pxx
,所以通過將y
和x
之間的交叉譜密度通過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)
可悲的是製作TF並不像你所提到的巴斯一樣簡單。 TF使用您提供的方法,Python的結果給出了matlab輸出的x軸上的'壓扁'(較小的dB範圍)和正鏡像。 Matlab在負空間中給出了dB,Python在正空間中給出了dB。 – 2015-02-13 15:49:42
我相當肯定算法是正確的,你可以在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
我剛剛嘗試了上面的內容,並獲得了由tfestimate提供的輸出的正面鏡像(帶有一些錯誤,主要是在頻率範圍的低端)。所以我不確定Matlab的函數底下還有什麼內容。 – 2015-02-13 18:35:54