【问题标题】:Why is cohere function in matplotlib (python) give answer different from mscohere function in MATLAB?为什么 matplotlib (python) 中的 cohere 函数给出的答案与 MATLAB 中的 mscohere 函数不同?
【发布时间】:2015-08-05 10:16:51
【问题描述】:

在 maltlab 和 pythonmatplotlib.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]

【问题讨论】:

  • 注意:这个问题很快就会结束,因为:“寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误和在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。 Check this link 了解如何改进问题并获得一些好的答案。
  • 您需要提供能够完全重现问题的示例代码,以及真实输出和预期输出。不知道 y1 和 y2 是什么,也不知道 MATLAB 和 Python 为您提供了 Cxy 什么,我们无法为您提供帮助。
  • matplotlib.mlab.coherematplotlib.pyplot.cohere 都有一个参数 window
  • @StewieGriffin 对不起。添加实际代码
  • @A.Donda pyplot中的窗口参数只是设置窗口类型。不是窗口的大小

标签: python matlab matplotlib


【解决方案1】:

最初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]

【讨论】:

  • 感谢您的回答。有用。还有一个问题“他们并不总是以完全相同的方式做事”是指使用不同的逻辑还是只是参数配置的不同?
  • 有时一个,有时另一个。 mlab 中的 window 参数采用函数或向量,而在 MATLAB 中,它采用向量或长度。 mlab 的 specgram 默认提供 PSD,但可以更改为各种类型的 STFT(复数、幅度、角度或相位),而 MATLAB 则根据输出使用复数 STFT 或复数 STFT 和 PSD,没有其他选项。 mlab 的cohere 使用默认的Fs 2 而matlab 使用1。简而言之,您不能只假设它们是相同的。您确实需要查看文档。
猜你喜欢
  • 2017-01-25
  • 2020-10-03
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2014-12-28
相关资源
最近更新 更多