在 maltlab 和 python 中,matplotlib.mlab 包含为与具有相同名称的 MATLAB 命令兼容而编写的数值 python 函数。
但对我来说,我在 MATLAB 和 python 中得到了不同的结果。有谁知道,为什么会这样?
MATLAB mscohere 函数有一个参数 WINDOW 来设置窗口的大小,我在 matplotlib.mlab (python) 中找不到 cohere 函数
Cxy = mscohere(y1,y2,16,0,16)
Cxy = matplotlib.pyplot.cohere(y1, y2,NFFT=16,noverlap=0)
其中 y1 和 y2 在 MATLAB 和 python 中相同,长度为 1024
有什么帮助吗?
代码如下:
MATLAB:
Fs=8000;
y1=zeros(1,1024);
y2=zeros(1,1024);
for f =0:100:1900
for n=0:1023
y1(n+1)=y1(n+1)+sin(2*pi*f*n/Fs);
if mod(f,200)==0
y2(n+1)=y2(n+1)+sin(2*pi*f*n/Fs);
end
end
end
Cxy = mscohere(y1,y2,16,0,16);
display(Cxy);
Cxy =
0.8300
0.0504
0.0006
0.0082
0.1828
0.2562
0.7984
0.9788
0.9884
python :
Fs=8000
sample=1024
frequencys=100 * np.arange(20)
#print(frequencys)
y1=np.zeros(sample)
y2=np.zeros(sample)
for f in range(frequencys.size):
for n in range(sample):
y1[n]=y1[n]+sin(2*pi*frequencys[f]*n/Fs)
if frequencys[f]%200==0:
y2[n]=y2[n]+sin(2*pi*frequencys[f]*n/Fs)
cxy,f = plt.cohere(y1, y2,NFFT=16,noverlap=0)
print(cxy)
Cxy=[ 0.78894285
0.06083255
0.01161213
0.00249976
0.14194519
0.38694284
0.78120729
0.8384586
0.85438165]
请您参考如下方法:
最初 matplotlib.mlab 函数旨在提供与其 MATLAB 等价物类似的功能,但 MATLAB 和 numpy 之间的一些基本方法不同,因此它们并不总是以完全相同的方式做事,并且在某些情况下,由于不同的需求和/或目标,它们会有所不同。如今,mlab 更像是一组数值函数,在 numpy 中不可用,但 matplotlib 需要。
在您的情况下,MATLAB 函数默认使用 hamming 窗口,而 matplotlib 版本默认使用 hanning 窗口。您可以通过简单地传递适当长度的 hamming 窗口来重现 MATLAB 结果。此外,MATLAB 默认使用 Fs=1 而 matplotlib 默认使用 Fs=2,但我认为这只会改变频率,而不是 cxy :
>>> cxy, _ = mlab.cohere(y1, y2, window=np.hamming(16), NFFT=16, noverlap=0, Fs=1)
>>> print(cxy)
[ 8.29985202e-01 5.03649611e-02 5.54167037e-04 8.19190824e-03 1.82760544e-01 2.56179777e-01 7.98391906e-01 9.78827021e-01 9.88429511e-01]
