use*_*441 1 python matlab matplotlib
在maltlab和pythonmatplotlib.mlab中包含为了与具有相同名称的MATLAB命令兼容而编写的Numerical python函数.
但对我来说,我在MATLAB和python中获得了不同的结果.有谁有任何想法,为什么会这样?
MATLAB mscohere函数有一个参数WINDOW来设置窗口的大小,我找不到matplotlib.mlab中的cohere函数(python)
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
蟒蛇:
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窗口.您可以MATLAB通过简单传递适当加长的hamming窗口来重现结果.此外,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]
| 归档时间: | 
 | 
| 查看次数: | 736 次 | 
| 最近记录: |