filtfilt
sıfır fazlı filtreleme olup, filtreyi filtreledikçe sinyali değiştirmez. Faz tüm frekanslarda sıfır olduğundan, aynı zamanda lineer fazdır. Zamanda geriye doğru filtrelemek, geleceği tahmin etmenizi gerektirir, bu nedenle "çevrimiçi" gerçek yaşam uygulamalarında, yalnızca sinyal kayıtlarının çevrimdışı işlenmesi için kullanılamaz.
lfilter
nedensel ileri-zaman filtrelemesidir, gerçek hayattaki elektronik filtreye benzer. Sıfır faz olamaz. Doğrusal faz (simetrik FIR) olabilir, ancak genellikle değildir. Genellikle farklı frekanslarda farklı miktarlarda gecikme ekler.
Bir örnek ve resim bunu açıkça ortaya koymalıdır. Filtrelerin frekans tepkisinin büyüklüğü aynı olsa da (üst sol ve sağ üst), sıfır faz düşük geçişi, yüksek frekans içeriği olmadan, orijinal sinyal ile aynı hizada olurken, minimum faz filtreleme sinyali nedensel bir şekilde geciktirir :
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")