【问题标题】:Translating MATLAB to Python将 MATLAB 翻译成 Python
【发布时间】:2020-07-30 17:03:42
【问题描述】:

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

以下是取自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 

这给了我下面的图片

【问题讨论】:

    标签: python matlab signal-processing


    【解决方案1】:

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

    s = z

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

    wzp = z

    一切顺利。

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

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

    另外,我认为您不需要将所有数组都设为 2D。我将代码简化为一维

    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()
    

    【讨论】:

    • 谢谢!我确实认为这个答案很有用,但我没有足够的声誉来展示它的变化。这几乎完美地工作,但我仍然得到以红色绘制的数据的奇怪不连续性。我也没有意识到 MATLAB 和 python 引用值/变量名的方式不同,所以就是这样:-)
    • 侧面应该有一个空心复选标记,可以让您“选择”最佳答案。你看到了什么不连续性?您知道颜色是从 Matlab 图中切换的。红色 蓝色。在.plot 语句中修复更改.plot(...ob) or
    • 我看到的不连续性与我原来的图中用红色表示的相同 -o 其余的图看起来还不错,并且与 matlab 图相匹配
    • 嗯。我不认为零情节很重要,但要修复,你有同样的错误。 wzp =z。我在上面将其编辑为 ...=np.zeros(N)。如果这有帮助,请接受解决方案(复选标记)
    猜你喜欢
    • 2017-10-12
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多