Как сделать БИХ-фильтр, когда большинство коэффициентов равны нулю - PullRequest
2 голосов
/ 05 августа 2011

И что делать с аудио эффектом в Python.Например, простейшая формула эффекта эха:

y[n] = x[n] + k*y[n-1000]

Это БИХ-фильтр, который можно рассчитать с помощью lfilter () в scipy.signal:

import numpy as np
import time
import scipy.signal as signal

pulse = np.zeros(10000)
pulse[0] = 1.0

a = np.zeros(1000)
a[[0,999]] = 1, -0.7

start = time.clock()
out = signal.lfilter([1], a, pulse)
print time.clock() - start

import pylab as pl
pl.plot(out)
pl.show()

Проблема заключается в следующем:большинство коэффициентов a равны нулю, и фильтр может быть вычислен очень быстро, но lfilter () не может этого реализовать и использует все нулевые коэффициенты.

Я знаю, что могу кодировать некоторые конкретные вычисления дляэто самый простой пример, но я ищу общее решение.

1 Ответ

1 голос
/ 05 августа 2011

Попробуйте это:

import scipy
import scipy.signal as sig
import time

# Input signal.
x = scipy.randn(50000)

# Filter coefficients.
a = scipy.zeros(1001)
a[[0,-1]] = [1, -0.7]

# Method using lfilter.
start = time.clock()
y0 = sig.lfilter([1], a, x)
end = time.clock() - start
print end

# Method using for loop.
start = time.clock()
y1 = x
for i in range(1000, y1.size):
    y1[i] += 0.7*y1[i-1000]
end = time.clock() - start
print end

# Check that both outputs are equal.
print scipy.square(y0-y1).sum()

На моем ноутбуке: 0,38 секунды для метода 1, 0,13 секунд для метода 2.

Примечание. Для задержки N выборок необходимо установить a[N], а не a[N-1].

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