【问题标题】:How to apply a difference equation to a numpy array inside for loop如何将差分方程应用于for循环内的numpy数组
【发布时间】:2020-01-29 12:11:50
【问题描述】:

我正在尝试将一个简单的差分方程应用于 numpy 数组作为过滤算法的一部分。问题是python在for循环中重新分配了numpy变量,因此返回了一个零列表。如何重构此代码以通过引用 for 循环来传递 numpy 数组?

def resonant_ladder_filter(vector_in, fc, res):

    fs = 44100 
    fs2 = 2*fs 



    in2 = signal.decimate(vector_in, 2)

    h = signal.firwin(10, 0.5)

    in2 = signal.lfilter(h,1,in2)

    g = 2*np.pi*fc/fs2 

    Gres = res; 

    h0 = g/1.3; h1 = g*0.3/1.3; 

    w = np.array([0, 0, 0, 0, 0])

    wold = np.array([0, 0, 0, 0, 0])

    Gcomp = 0.5; 

    out = np.zeros(len(vector_in))

    out2 = np.zeros(len(in2))

    for n in range(0,len(in2)):
        u = in2[n] - 4*Gres*(wold[4] - Gcomp*in2[n])

        w[0] = np.tanh(u) 


        w[1] = h0*w[0] + h1*wold[0] + (1-g)*wold[1]
        w[2] = h0*w[1] + h1*wold[1] + (1-g)*wold[2]
        w[3] = h0*w[2] + h1*wold[2] + (1-g)*wold[3]
        w[4] = h0*w[3] + h1*wold[3] + (1-g)*wold[4]

        out2[n] = w[4]

        wold = w

    out2 = signal.lfilter(h,1,out2)

    out = signal.decimate(out2, 2)

    return out

这段代码本质上是用matlab 风格编写的,不能像python 那样即插即用。必须有一个更好的、pythonic 的方式来写这个,我只是无法解决这个问题。

【问题讨论】:

  • 嗨 K.Numm,我认为可能有一个非常简单的答案可以跳过整个 for 循环,使用 numpy 矢量化差异运算符。如果您提供带有“掩码”矩阵或过滤器的“之前”矩阵和“之后”矩阵,我可以向您展示如何在没有 for 循环的情况下使用 numpy 执行此操作。我现在很难找出你的样本。 :-)
  • in2 = np.zeros(2*len(vector_in)) 看起来没有必要,因为您立即拥有in2 = signal.decimate(vector_in, 2)
  • @gboffi 这是正确的,谢谢,但不影响手头的问题。
  • @JenniferE.Yoon 我认为你是对的,我在发布之前查看了 numpy vectorize 但无法弄清楚如何在这种情况下应用它

标签: python numpy filter scipy signal-processing


【解决方案1】:

-- 嗨,k.munn,

我相信您的问题与可变分配与复制有关。

这条线是你的问题:

wold = w

将其更改为:

wold = w.copy()

它将创建一个Numpy.Array的副本,应该解决您的问题。

请参阅此处的一般文档:Python docs - copy,或这里Numpy docs - copy

希望这会有所帮助!


编辑:

在NumPy阵列中运行代码浮出的元素分配问题,因为它们被初始化为整数零:

w = np.array([0,0,0,0,0])

将其更改为(分别为wold):

w = np.zeros(5, dtype=np.float64)

应该允许

w[0] = np.tanh(u)

要正确插入值。

【讨论】:

  • 谢谢joe ernst,问题最初发生在此之前。据我所知,当应用W [0] = np.tanh(u)时,创建一个新列表。当我打算 span>时,不修改numpy数组
  • 嘿k.munn好吧,所以在运行代码后,我意识到它可能会有一个不同的问题。您将W和WOLD阵列初始化为整数零。然后,您尝试分配它的NP.float64标量,这些标量是NP.Tanh(U)呼叫的输出。将初始化更改为:w = np.zeros(4,dtype = np.float64)wold = np.zeros(4,dtype = np.float64)让我知道这是否解决了您的问题。我会更新上面的答案以包括这个。 span>
  • miscounted ...应该是np.zeros(5,dtype = np.float64)。相应地改变了答案。 span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2017-07-26
  • 1970-01-01
  • 2020-02-15
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多