나는 SO 스레드 에서 filtfilt
대신에 뒤로 / 앞으로 필터링을 수행 하는 제안을 보았습니다 lfilter
.
다른 기술에 대해 하나를 사용하는 동기는 무엇입니까?
filtfilt
은 반대 방향으로 동일한 필터를 두 번 수행하므로 lfilter
한 방향으로 두 번 수행하는 것보다 느리지 않으므로 동일한 주파수 응답을 얻는 방법입니다.
나는 SO 스레드 에서 filtfilt
대신에 뒤로 / 앞으로 필터링을 수행 하는 제안을 보았습니다 lfilter
.
다른 기술에 대해 하나를 사용하는 동기는 무엇입니까?
filtfilt
은 반대 방향으로 동일한 필터를 두 번 수행하므로 lfilter
한 방향으로 두 번 수행하는 것보다 느리지 않으므로 동일한 주파수 응답을 얻는 방법입니다.
답변:
filtfilt
제로 위상 필터링은 필터링 할 때 신호를 이동시키지 않습니다. 모든 주파수에서 위상이 0이므로 선형 위상이기도합니다. 시간을 거꾸로 필터링하면 미래를 예측해야하므로 "온라인"실제 응용 프로그램에서는 신호 기록의 오프라인 처리에만 사용할 수 없습니다.
lfilter
실제 전자 필터와 유사한 인과 적 인 타임 필터링입니다. 영상이 될 수 없습니다. 선형 위상 (대칭 FIR) 일 수 있지만 일반적으로 그렇지 않습니다. 일반적으로 다른 주파수에서 다른 양의 지연을 추가합니다.
예와 이미지는 분명해야합니다. 필터의 주파수 응답의 크기는 동일하지만 (왼쪽 위와 오른쪽 위), 제로 위상 저역 통과는 고주파 성분없이 원래의 신호와 일치하며 최소 위상 필터링은 신호를 인과적인 방식으로 지연시킵니다 :
from __future__ import division, print_function
import numpy as np
from numpy.random import randn
from numpy.fft import rfft
from scipy import signal
import matplotlib.pyplot as plt
b, a = signal.butter(4, 0.03, analog=False)
# Show that frequency response is the same
impulse = np.zeros(1000)
impulse[500] = 1
# Applies filter forward and backward in time
imp_ff = signal.filtfilt(b, a, impulse)
# Applies filter forward in time twice (for same frequency response)
imp_lf = signal.lfilter(b, a, signal.lfilter(b, a, impulse))
plt.subplot(2, 2, 1)
plt.semilogx(20*np.log10(np.abs(rfft(imp_lf))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('lfilter')
plt.subplot(2, 2, 2)
plt.semilogx(20*np.log10(np.abs(rfft(imp_ff))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('filtfilt')
sig = np.cumsum(randn(800)) # Brownian noise
sig_ff = signal.filtfilt(b, a, sig)
sig_lf = signal.lfilter(b, a, signal.lfilter(b, a, sig))
plt.subplot(2, 1, 2)
plt.plot(sig, color='silver', label='Original')
plt.plot(sig_ff, color='#3465a4', label='filtfilt')
plt.plot(sig_lf, color='#cc0000', label='lfilter')
plt.grid(True, which='both')
plt.legend(loc="best")
lfilter
최소 위상 필요는 없다,이 필터 계수에 따라 사용할 수 있지만, 어떤 경우에는 인과 있는 filtfilt
아니다. 따라서 filtfilt
지연이 0이고 lfilter
항상 약간의 지연을 추가 하는 비교 결과는 사실이 아니기 때문에 filtfilt
처음에는 원인이 아니기 때문 입니다. 실제로 중요한 것은 filtfilt
위상 왜곡을 유발하지 않는 반면 lfilter
, 선형 위상 FIR 필터로 사용되지 않는 경우 (즉, 분모 = 1 인 경우)입니다.
filtfilt
필터링은 (2N-1) 차수의 필터링에 해당 한다는 점에 주목할 가치가 있습니다 lfilter
.
lfilter
또는로 필터링 할 수 있습니다 filtfilt
. 그림과 같이 그들은 다르게 행동합니다
@endolith 님의 답변이 완전하고 정확합니다! 먼저 그의 게시물을 읽은 다음이 게시물을 읽으십시오. 저의 명성으로 인해 @Thomas Arildsen 과 @endolith가 다음 과 같이 얻은 필터의 효과적인 순서에 대해 논쟁 하는 의견에 응답하지 못했습니다 filtfilt
.
lfilter
주어진 필터를 적용하고 푸리에 공간에서 이것은 필터 전송 기능 ONCE를 적용하는 것과 같습니다.
filtfilt
동일한 필터를 두 번 적용하면 효과는 필터 전송 기능 SQUARED를 적용하는 것과 같습니다. scipy.signal.butter
전달 기능이있는 버터 워스 필터 ( )의 경우
효과적인 이득은