我在Python中做些什么音效。例如,最简单的回声效果公式:
y[n] = x[n] + k*y[n-1000]
这是一个IIR过滤器,可以通过scipy.signal中的lfilter()计算:
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()无法实现这一点,并使用所有零系数。
我知道我可以为这个最简单的例子编写一些特定的计算代码,但我正在寻找一个通用的解决方案。
答案 0 :(得分:1)
试试这个:
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()
在我的笔记本电脑上:方法1为0.38秒,方法2为 0.13 秒。
注意:对于N个样本的延迟,您必须设置a[N]
,而不是a[N-1]
。