如何解决交叉功率谱密度函数从Matlab到Python的转换
我正在尝试将 MATLAB 程序转换为 python。我在设置交叉功率谱密度函数并使用 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 点的数量,但让我们假设这不是一个错误)。
- 窗口在 MatLab 中定义为整数,但 scipy 的 csd 只允许窗口作为元组、字符串或类似数组的对象;
- 在来自 scipy 的 csd 中,没有允许返回在特定频率的交叉功率谱密度估计的参数。
对于数字 1,我定义了一个窗口,如下所示:
window = hamming(M,sym=False)
我选择汉明窗口,因为它是在 MATLAB 的 csd 中将窗口作为整数传递时指定的默认窗口(“如果窗口是整数,则 cpsd 将 x 和 y 分为长度窗口和窗口的段段具有该长度的汉明窗。”) 并没有使它对称,因为我正在进行频谱分析,因此使用周期窗口是有意义的。
对于 2,我没有解决方案。
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 举报,一经查实,本站将立刻删除。