filtfilt
เป็นการกรองแบบ zero-phase ซึ่งไม่เปลี่ยนสัญญาณในขณะที่มันทำการกรอง เนื่องจากเฟสเป็นศูนย์ที่ความถี่ทั้งหมดจึงเป็นเฟสเชิงเส้น การกรองย้อนกลับไปในเวลานั้นกำหนดให้คุณต้องทำนายอนาคตดังนั้นจึงไม่สามารถใช้ในแอปพลิเคชันในชีวิตจริง "ออนไลน์" ได้เฉพาะสำหรับการประมวลผลการบันทึกสัญญาณแบบออฟไลน์
lfilter
เป็นสาเหตุการกรองล่วงหน้าในเวลาซึ่งคล้ายกับตัวกรองอิเล็กทรอนิกส์ในชีวิตจริง มันไม่สามารถเป็นศูนย์ได้ มันสามารถเป็นเฟสเชิงเส้น (symmetrical FIR) ได้ แต่โดยทั่วไปแล้วไม่ใช่ โดยปกติจะเพิ่มจำนวนความล่าช้าที่แตกต่างกันที่ความถี่ที่แตกต่างกัน
ตัวอย่างและรูปภาพควรทำให้ชัดเจน แม้ว่าขนาดของการตอบสนองความถี่ของตัวกรองจะเหมือนกัน (บนซ้ายและขวาบน), low-zero lowpass ขึ้นกับสัญญาณดั้งเดิมโดยไม่มีเนื้อหาความถี่สูงในขณะที่การกรองเฟสขั้นต่ำทำให้สัญญาณล่าช้าในลักษณะที่เป็นสาเหตุ :
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")