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

2024-10-02 00:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

MATLAB代码中使用的函数编写如下:

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

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

使用的函数有六个参数,因此我假设:[pxy,f] = cpsd(x,y,window,noverlap,f,fs)是程序员打算从MATLAB库调用的函数,因为文档中只有一个函数有六个参数(请参见here

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

现在,我想使用scipy.signal.csd 转换此函数,但存在两个问题:

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

对于1号,我定义了一个窗口,如下所示: window = hamming(M, sym=False) 我选择hamming窗口,因为它是在MATLAB的csd中将窗口作为整数传递时指定的默认窗口(“如果窗口是整数,则cpsd将x和y划分为长度窗口的段,每个段都有该长度的hamming窗口。”)由于我在做光谱分析,所以没有使它对称,所以使用周期窗口是有意义的

对于第二个问题,我没有解决办法

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

M = 128
fs = 25.0
window = hamming(M, sym=False)
noverlap = np.round(M/2)
f, fxx = signal.csd(x,y,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,y,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

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

有人能帮忙吗? 提前谢谢大家


Tags: 函数代码文档参数window功率fs交叉

热门问题