Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab信号工具箱的Python版本';TFS估计值()?_Python_Matlab_Numpy_Scipy - Fatal编程技术网

Matlab信号工具箱的Python版本';TFS估计值()?

Matlab信号工具箱的Python版本';TFS估计值()?,python,matlab,numpy,scipy,Python,Matlab,Numpy,Scipy,是否有Matlab的tfestimate()的Python版本?我查看了控制工具箱,但它只提供线性传递函数。如的“更多信息”部分所示,传递函数的计算或多或少为Txy=Pyx/Pxx,因此,将y和x之间的交叉谱密度除以x的功率谱密度。请注意,对于计算互谱密度,参数的顺序很重要,因为Pyx是(在适当的加窗和归一化后)作为单个窗口上fft(y)*conj(fft(x))的平均值计算的。类似地,PSDPxx被计算为平均fft(x)*conj(fft(x))。我完全忘记了原因,但是有一个很好的理由,为什么

是否有Matlab的tfestimate()的Python版本?我查看了控制工具箱,但它只提供线性传递函数。

如的“更多信息”部分所示,传递函数的计算或多或少为
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在中都可用,因此您可以或多或少地这样计算传递函数(未测试):


遗憾的是,制作TF并不像你提到的Bas那么简单。TF使用您提供的方法,Python的结果给出了“挤压”(较小的dB范围)和穿过Matlab输出x轴的正镜像。Matlab在负空间给出dB,Python在正空间给出dB。我确信算法是正确的,你可以在Matlab中自己检查:对于我来说,
[tf1,f]=tfestestimate(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,fssample);tf2=Pyx./Pxx
对某些测试数据产生完全相同的结果(甚至没有数字错误!)。我可能把Python代码中的一些细节搞砸了,以后还要检查。你尝试交换参数了吗?我只是尝试了上面的方法,得到了tfestimate给出的输出的正镜像(有一些错误,主要在频率范围的低端)。因此,我不确定Matlab的功能在幕后还发生了什么。你确定你没有交换
x
y
?因为在这种情况下,你会得到逆传递函数,所以当以dB为单位测量时,TF的绝对值将是负值。啊!我不小心把它换了。抢手货我用您建议的代码重新编写了python,但结果显示,与Matlab的tfestimate输出相比,python的版本缩小了。我试着使用scipy.signal.welch以不同的方式进行交叉和自动功率谱密度
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)