Python 版本的 Matlab Signal Toolbox 的 tfestimate()?
Python version of Matlab Signal Toolbox's tfestimate()?
是否有 Python 版本的 Matlab 的 tfestimate()?我查看了控制工具箱,但它只提供线性传递函数。
如 help of tfestimate 的 'more about' 部分所示,传递函数的计算结果大致为 Txy = Pyx / Pxx
,因此通过将交叉谱密度除以 y
和 x
通过 x
的功率谱密度。请注意,为了计算交叉光谱密度,参数的顺序很重要,因为 Pyx
被计算(在适当的窗口化和归一化之后)作为 fft(y) * conj(fft(x))
在个体 windows 上的平均值.同样,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)
是否有 Python 版本的 Matlab 的 tfestimate()?我查看了控制工具箱,但它只提供线性传递函数。
如 help of tfestimate 的 'more about' 部分所示,传递函数的计算结果大致为 Txy = Pyx / Pxx
,因此通过将交叉谱密度除以 y
和 x
通过 x
的功率谱密度。请注意,为了计算交叉光谱密度,参数的顺序很重要,因为 Pyx
被计算(在适当的窗口化和归一化之后)作为 fft(y) * conj(fft(x))
在个体 windows 上的平均值.同样,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)