2011-08-05 82 views
1

我該怎麼做一些Python中的音頻效果。例如,最簡單的回波效應公式:如何在大多數係數爲零時進行IIR濾波

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

這是一個IIR濾波器,並且可以通過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()無法實現這一點,並使用所有零係數。

我知道我可以爲這個最簡單的例子編寫一些特定的計算,但我正在尋找一個通用的解決方案。

+0

在numpy/scipy中沒有任何東西可以幫助我(除了lfilter),我不知道任何其他軟件包會這樣做。我認爲cython是最好的選擇。 – user333700

回答

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() 

在我的筆記本電腦:0.61秒方法1,0.13秒的方法2.

注:對於N個樣本的延遲,你必須設置a[N],不a[N-1]

+0

謝謝,我知道python中的循環比lfilter在這種情況下更快。但是循環很慢。我正在尋找一些圖書館來做到這一點。如果沒有,比我會嘗試在cython中做到這一點。 – HYRY