将 MATLAB 翻译成 Python

Translating MATLAB to Python

抱歉,我知道有很多这样的问题,但我似乎无法解决为什么我没有得到相同结果的生活。

以下是摘自 here

的 MATLAB 脚本
M = 33;          % window length
R = (M-1)/2;     % hop size
N = 3*M;         % overlap-add span
w = hamming(M);  % window
z = zeros(N,1);  
% plot(z,'-k');  
hold on;  
s = z;
for so=0:R:N-M
  ndx = so+1:so+M;        % current window location
  s(ndx) = s(ndx) + w;    % window overlap-add
  wzp = z; 
  wzp(ndx) = w;           % for plot only
  plot(wzp,'--ok');       % plot just this window
end
plot(s,'ok');  hold off;  % plot window overlap-add 

这给了我下面的情节

这是我根据 MA​​TLAB 代码编写的 python 代码。

M = 33        # window length
R = (M-1)/2     # hop size
N = 3*M         # overlap-add span
w = signal.windows.hamming(M)  # window
w = np.expand_dims(w, axis = 1)
z = np.zeros((N,1)) 
plt.plot(z,'-k')  
  
s = z
for so in np.arange(0,N-M+1,R):
    s[int(so):int(so+M)] = np.add(s[int(so):int(so+M)],w )   # window overlap-add
    wzp = z
    wzp[int(so):int(so+M)] = w # for plot only
    plt.plot(wzp,'--ob')       # plot just this window

plt.plot(s,'or')    # plot window overlap-add 

这给了我下面的图像

快速回答。 Matlib 使用值,而 Python 使用值名称的引用。对你来说有问题的代码是看起来无伤大雅的行

s = z

在 Python 中,这使 s 成为对 z 的引用,而不是 zeros 的副本。所以当你也去的时候

wzp = z

一切都变糟了。

简单的解决方案打破sz之间的关系,通过设置

s=np.zeros((N,1))

此外,我认为您不需要将所有数组都设为二维。我将代码简化为 1D

import scipy.signal
import matplotlib.pyplot as plt


M = 33        # window length
R = (M-1)/2     # hop size
N = 3*M         # overlap-add span
w = scipy.signal.windows.hamming(M)  # window
#w = np.expand_dims(w, axis = 1)
z = np.zeros(N)
plt.plot(z,'-k')

s = np.zeros(N)
for so in np.arange(0,N-M+1,R):
    s[int(so):int(so+M)] +=w   # window overlap-add
    wzp = np.zeros(N)
    wzp[int(so):int(so+M)] = w # for plot only
    plt.plot(wzp,'--ob')       # plot just this window

plt.plot(s,'or')    # plot window overlap-add
plt.show()