微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

交叉功率谱密度函数从Matlab到Python的转换

如何解决交叉功率谱密度函数从Matlab到Python的转换

我正在尝试将 MATLAB 程序转换为 python。我在设置交叉功率谱密度函数并使用 Matlab 获得匹配结果时遇到问题。

MATLAB代码中用到的函数写成如下:

[Pxy,f] = cpsd(x,y,M,round(M/2),fs);

在我的代码中可用的文档中,我读到:M = 128(FFT 点数)和 fs = 25.0(采样频率 [Hz])。 x 和 y 是加速度数据的行向量 1x751。

所使用的函数有六个参数,因此我假设:[pxy,window,noverlap,f,fs) 是程序员打算从 MATLAB 库中调用函数,这是文档中唯一可用的具有六个参数的函数(请参阅 { {3}})

函数返回 f 中指定频率处的互功率谱密度估计值。 (让我感到困惑的是,f 没有被定义为频率,但变量 M 被传递到那里,它是 FFT 点的数量,但让我们假设这不是一个错误)。

现在想用here来转换这个函数,但是有两个问题:

  1. 窗口在 MatLab 中定义为整数,但 scipy 的 csd 只允许窗口作为元组、字符串或类似数组的对象;
  2. 在来自 scipy 的 csd 中,没有允许返回在特定频率的交叉功率谱密度估计的参数。

对于数字 1,我定义了一个窗口,如下所示: window = hamming(M,sym=False) 我选择汉明窗口,因为它是在 MATLAB 的 csd 中将窗口作为整数传递时指定的认窗口(“如果窗口是整数,则 cpsd 将 x 和 y 分为长度窗口和窗口的段段具有该长度的汉明窗。”) 并没有使它对称,因为我正在进行频谱分析,因此使用周期窗口是有意义的。

对于 2,我没有解决方案。

这是我在我的python代码中设置的函数

M = 128
fs = 25.0
window = hamming(M,sym=False)
noverlap = np.round(M/2)
f,fxx = signal.csd(x,fs=fs,window=window,noverlap=noverlap

结果在 Pxy(交叉功率谱密度)方面不匹配,但在频率方面是完美的。 这些是 matlab 结果中的第一个元素:

1.3590e-05
3.4354e-05
4.5282e-05
6.2549e-05
5.7965e-05
4.9697e-05
5.5413e-05

虽然这是我从 Python 中得到的:

2.04688576e-06
3.37540142e-05
4.51821900e-05
6.19997501e-05
5.78926181e-05
5.00058106e-05
5.53681683e-05

我尝试在 matlplotlib(此处记录)中使用简单的交叉谱密度函数,如下所示:

fxx,f = mlab.csd(x,nfft=M,Fs=fs,noverlap=noverlap)

而且我得到了更多的匹配结果,但仍然不完美。

1.18939608e-05
3.45206717e-05
4.56902859e-05
6.45083475e-05
5.73594952e-05
5.01539145e-05
5.34534933e-05

目标不是消除转换中可能存在的数值误差,而是使用匹配输入操作交叉功率谱密度

有人可以帮忙吗? 非常感谢提前!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。