为什么matplotlib(python)中的cohere函数给出的答案与MATLAB中的mscohere函数不同?
在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:为什么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
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]