2011-08-05 5 views
1

I 파이썬에서 오디오 효과를 어떻게해야합니까? 예를 들어, 간단한 에코 효과 화학식 : 이것은 IIR 필터이며 scipy.signal에 lfilter()에 의해 계산 될 수대부분의 계수가 0 일 때 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가 0이고 필터가 매우 빠르게 계산 될 수 있지만, 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보다 빠르다는 것을 안다. 하지만 for 루프가 느립니다. 나는 이것을 할 도서관을 찾고있다. 없다면, 나는 cython에서 이것을 시도 할 것입니다. – HYRY

관련 문제