如何将差分方程应用于for循环中的numpy数组

2024-04-25 22:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试将一个简单的差分方程应用到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进行即插即用。一定有更好的方法写这个,我就是想不出来。你知道吗


Tags: 代码innumpyforsignallennp数组
1条回答
网友
1楼 · 发布于 2024-04-25 22:32:20

你知道吗 你好,k.munn

我相信你的问题与变量赋值和复制有关。你知道吗

这条线是你的问题:

wold = w

更改为:

wold = w.copy()

它将创建您的numpy.数组解决你的问题。你知道吗

请参阅此处的常规文档: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)

正确插入值。你知道吗

相关问题 更多 >