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
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
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]
Run Code Online (Sandbox Code Playgroud)
最初的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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |