2011-08-05 13 views
1

私はPythonで何らかのオーディオエフェクトを実行する必要があります。例えば、最も単純なエコー効果式:これはIIRフィルタであり、scipy.signalにlfilter()により算出することができる係数の大部分がゼロのときにIIRフィルタを行う方法

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

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

ここで(lfilterのほかに)役立つnumpy/scipyには何もありません。これを行う他のパッケージについてはわかりません。 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() 

:メソッドのための方法1のために0.38秒、0.13秒2.

注:Nサンプルの遅延のために、あなたはa[N]を設定する必要があり、されていませんa[N-1]

+0

ありがとう、私はこの場合のlfilterよりも速いpythonのforループを知っています。 forループは遅いです。私はこれを行うためのライブラリを探しています。もしそうでなければ、私はcythonでこれをやろうとします。 – HYRY

関連する問題