Skip to main content
 首页 » 编程设计

python之为什么 matplotlib(python)中的 cohere 函数给出的答案与 MATLAB 中的 mscohere 函数不同

2025年05月04日42myhome

在 maltlab 和 python 中,matplotlib.mlab 包含为与具有相同名称的 MATLAB 命令兼容而编写的数值 python 函数。

  1. 但对我来说,我在 MATLAB 和 python 中得到了不同的结果。有谁知道,为什么会这样?

  2. 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]