将 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
这给了我下面的情节
这是我根据 MATLAB 代码编写的 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
一切都变糟了。
简单的解决方案打破s
和z
之间的关系,通过设置
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()
抱歉,我知道有很多这样的问题,但我似乎无法解决为什么我没有得到相同结果的生活。
以下是摘自 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
这给了我下面的情节
这是我根据 MATLAB 代码编写的 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
一切都变糟了。
简单的解决方案打破s
和z
之间的关系,通过设置
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()