Как применить разностное уравнение к массиву numpy внутри цикла for - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь применить простое разностное уравнение к массиву пустышек как часть алгоритма фильтрации. Проблема в том, что python переназначает числовые переменные внутри цикла for и, таким образом, возвращает список нулей. Как мне реструктурировать этот код так, чтобы он передавал пустые массивы по ссылке на цикл for?

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 как есть. Должен быть лучший, питонный способ написать это, я просто не могу решить это.

1 Ответ

1 голос
/ 30 сентября 2019

- Привет, k.munn,

Я полагаю, что ваша проблема связана с присваиванием переменных и копированием.

Эта строка является вашей проблемой:

wold = w

Измените его на:

wold = w.copy()

Он создаст копию вашего numpy.array, который должен решить вашу проблему.

См. Общую документацию здесь: Документы Python - копия , или здесь Numpy docs - скопируйте

Надеюсь, это поможет!


РЕДАКТИРОВАТЬ:

Запуск кода обнаружил проблему с назначением элементавнутри числовых массивов, поскольку они инициализируются как целые нули:

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

Изменение этого значения (для соответственно пустых значений):

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

Должно быть разрешено

w[0] = np.tanh(u)

чтобы правильно ввести значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...