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

为什么matplotlib(python)中的cohere函数给出的答案与MATLAB中的mscohere函数不同?,python,matlab,matplotlib,Python,Matlab,Matplotlib,在maltlab和pythonmatplotlib.mlab中,包含为与同名MATLAB命令兼容而编写的数值python函数 但对我来说,我在MATLAB和python中得到了不同的结果。有人知道吗,为什么会这样 MATLAB mscohere函数有一个参数窗口来设置窗口的大小,我在matplotlib.mlab python中找不到用于cohere函数的参数窗口 Cxy=mscoherey1,y2,16,0,16 Cxy=matplotlib.pyplot.coherey1,y2,NFFT=1

在maltlab和pythonmatplotlib.mlab中,包含为与同名MATLAB命令兼容而编写的数值python函数

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

MATLAB mscohere函数有一个参数窗口来设置窗口的大小,我在matplotlib.mlab python中找不到用于cohere函数的参数窗口

Cxy=mscoherey1,y2,16,0,16

Cxy=matplotlib.pyplot.coherey1,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函数默认使用汉明窗口,而matplotlib版本默认使用汉宁窗口。您可以通过简单地传递适当长度的汉明窗口来重现MATLAB结果。另外,MATLAB默认使用Fs=1,matplotlib默认使用Fs=2,但我认为这只会改变频率,而不会改变cxy:

最初,matplotlib.mlab函数旨在提供与MATLAB等效函数类似的功能,但MATLAB和numpy之间的一些基本方法有所不同,因此它们并不总是以完全相同的方式进行操作,在某些情况下,它们由于不同的需求和/或目标而有所不同。如今,mlab更多的是一组数值函数,它们在numpy中不可用,但matplotlib需要它们

在您的例子中,MATLAB函数默认使用汉明窗口,而matplotlib版本默认使用汉宁窗口。您可以通过简单地传递适当长度的汉明窗口来重现MATLAB结果。另外,MATLAB默认使用Fs=1,matplotlib默认使用Fs=2,但我认为这只会改变频率,而不会改变cxy:


提醒:这个问题很快就会结束,因为:寻求调试帮助的问题为什么这个代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。要了解如何改进该问题并可能得到一些好的答案,您需要提供能够完全重现该问题的示例代码,以及实际输出和预期输出。如果不知道y1和y2是什么,也不知道MATLAB和Python为Cxy提供了什么,我们就无法帮助您。两者都有一个参数窗口。@Studiegriffin抱歉。添加了实际的code@A.Dondapyplot中的窗口参数仅用于设置窗口类型。不是窗口头的大小:这个问题将在不太长的时间内结束,因为:寻求调试帮助的问题为什么这个代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。要了解如何改进该问题并可能得到一些好的答案,您需要提供能够完全重现该问题的示例代码,以及实际输出和预期输出。如果不知道y1和y2是什么,也不知道MATLAB和Python为Cxy提供了什么,我们就无法帮助您。两者都有一个参数窗口。@Studiegriffin抱歉。添加了实际的code@A.Dondapyplot中的窗口参数仅用于设置窗口类型。不是窗户那么大谢谢你的回答。它起作用了。还有一个问题是,它们并不总是以完全相同的方式做事,这是指使用不同的逻辑,还是只是参数配置的不同?有时是一个,有时是另一个。mlab中的窗口参数采用函数或向量,而MATLAB中的窗口参数采用向量或长度。mlab的specgram默认提供PSD,但可以更改为各种类型的STFT复数、幅值、角度或相位,而MATLAB根据输出使用复数STFT或复数STFT和PSD,没有其他选项。mlab的cohere使用默认的Fs 2,而matlab使用1。简言之,你不能假设它们是一样的。你真的需要看看文档。谢谢你的回答。它起作用了。还有一个问题是,它们并不总是以完全相同的方式做事,这是指使用不同的逻辑,还是只是参数配置的不同?有时是一个,有时是另一个。这个 mlab中的窗口参数采用函数或向量,而MATLAB中的窗口参数采用向量或长度。mlab的specgram默认提供PSD,但可以更改为各种类型的STFT复数、幅值、角度或相位,而MATLAB根据输出使用复数STFT或复数STFT和PSD,没有其他选项。mlab的cohere使用默认的Fs 2,而matlab使用1。简言之,你不能假设它们是一样的。您确实需要查看文档。
>>> 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]