filtfilt
शून्य-चरण फ़िल्टरिंग है, जो फ़िल्टर के रूप में सिग्नल को स्थानांतरित नहीं करता है। चूंकि चरण सभी आवृत्तियों पर शून्य है, इसलिए यह रैखिक-चरण भी है। समय में पीछे की ओर फ़िल्टर करने से आपको भविष्य की भविष्यवाणी करने की आवश्यकता होती है, इसलिए इसका उपयोग "ऑनलाइन" वास्तविक जीवन के अनुप्रयोगों में नहीं किया जा सकता है, केवल संकेतों की रिकॉर्डिंग के ऑफ़लाइन प्रसंस्करण के लिए।
lfilter
एक वास्तविक जीवन इलेक्ट्रॉनिक फिल्टर के समान, केवल समय-समय पर फ़िल्टरिंग का कारण है। यह शून्य-चरण नहीं हो सकता। यह रैखिक-चरण (सममित एफआईआर) हो सकता है, लेकिन आमतौर पर ऐसा नहीं होता है। आमतौर पर यह विभिन्न आवृत्तियों पर विलंब की विभिन्न मात्राओं को जोड़ता है।
एक उदाहरण और छवि को स्पष्ट करना चाहिए। यद्यपि फिल्टर की आवृत्ति प्रतिक्रिया का परिमाण समान है (ऊपरी बाएं और ऊपर दाएं), मूल-संकेत के साथ शून्य-चरण वाली निम्नपास लाइनें, बस उच्च आवृत्ति सामग्री के बिना, जबकि न्यूनतम चरण फ़िल्टरिंग कार्य में विलंब का संकेत देता है :
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")