Scipy.signal में फ़िल्टर लगाना: lfilter या filtfilt का उपयोग करें?


21

मैंने SO थ्रेड में देखा filtfiltजो उपयोग करने के लिए एक सुझाव है जो इसके बजाय पीछे की ओर / आगे की ओर फ़िल्टरिंग करता है lfilter

एक को दूसरी तकनीक के खिलाफ इस्तेमाल करने की प्रेरणा क्या है?


फिल्टफिल्ट धीमा है
हारून


1
@ एरोन filtfiltदो बार एक ही फिल्टर विपरीत दिशाओं में करता है, इसलिए यह lfilterएक दिशा में दो बार करने की तुलना में कोई धीमा नहीं है , यही कारण है कि आपको एक ही आवृत्ति प्रतिक्रिया मिलेगी।
14

हाँ, यह सब मेरा मतलब है। यह दोगुनी धीमी है।
हारून

मैं इस के लिए नया हूँ और filtfilt का उपयोग करने के लिए चारों ओर देख रहा था। @endolith ने कहा कि scipy.signal मूल सिग्नल का उपयोग करता है। मुझे यकीन नहीं है कि मूल संकेत का मतलब क्या है और हम इसे कैसे प्राप्त करते हैं। मेरे पास एक wav फ़ाइल है जिसे मैं अपने सिस्टम पर लोड करता हूं लेकिन मुझे नहीं लगता कि यह मूल संकेत है क्योंकि यह एक खस्ता सरणी और नमूनों की संख्या में टूट गया है। कृपया अगर कोई मदद कर सकता है। धन्यवाद!
अरुणिमा पठानिया

जवाबों:


30
  • 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")

4
lfilterजरूरी नहीं कि यह न्यूनतम-चरण है, यह फिल्टर गुणांक के आधार पर कुछ भी हो सकता है, लेकिन किसी भी मामले में यह कारण है , जो filtfiltनहीं है। तो तुलना के परिणाम filtfiltमें शून्य विलंब होता है, और lfilterहमेशा कुछ देरी जोड़ता है यह बिल्कुल सच नहीं है, क्योंकि filtfiltपहली जगह में गैर-कारण है। जो वास्तव में मायने रखता है वह filtfiltयह है कि कोई भी चरण विकृतियों का कारण नहीं बनता है, जबकि lfilterकरता है (जब तक कि इसे रैखिक चरण एफआईआर फिल्टर के रूप में उपयोग नहीं किया जाता है, अर्थात हर 1 = के साथ)।
मैट एल।

यह भी ध्यान देने योग्य है कि Nth ऑर्डर filtfiltको फ़िल्टर करना (2N-1) वें ऑर्डर के साथ फ़िल्टर करने से मेल खाती है lfilter
थॉमस अरिल्डसन 10

@ThomasArildsen क्या यह सिर्फ 2N नहीं है? यही मैंने स्क्रिप्ट में प्रदर्शित किया
एंडोलिथ

@ अरुणिमाथन आप मेरे जवाब के तहत टिप्पणी करें, सवाल के नीचे नहीं। "मूल सिग्नल" का अर्थ केवल उस सिग्नल से है जिसे आप फ़िल्टर कर रहे हैं। आप lfilterया तो के साथ फ़िल्टर कर सकते हैं filtfilt। वे अलग तरह से व्यवहार करते हैं, जैसा कि दिखाया गया है
एंडोलिथ

7

@Endolith द्वारा उत्तर पूर्ण और सही है! कृपया उसकी पोस्ट पहले पढ़ें, और फिर इसके अलावा यह एक। मेरी कम प्रतिष्ठा के कारण मैं उन टिप्पणियों पर प्रतिक्रिया नहीं दे पाया जहां @Thomas Arildsen और @endolith द्वारा प्राप्त फिल्टर के प्रभावी क्रम के बारे में तर्क देते हैं filtfilt:

  • lfilter दिया फिल्टर लागू करता है और फूरियर अंतरिक्ष में यह फिल्टर ट्रांसफर फ़ंक्शन ONCE लागू करने जैसा है।

  • filtfiltएक ही फ़िल्टर को दो बार लागू करें और प्रभाव फ़िल्टर स्थानांतरण फ़ंक्शन को लागू करने जैसा है। बटरवर्थ फ़िल्टर के मामले में ( scipy.signal.butter) ट्रांसफर फ़ंक्शन के साथ

जी(n)=11-ω2nकहा पे n फ़िल्टर का क्रम है

प्रभावी लाभ होगा

जी(n)मैंएलटीमैंएलटी=जी(n)2=11-ω2n

और इसकी व्याख्या रूप में नहीं की जा सकती है2n2n-1

जी(n)मैंएलटीमैंएलटीजी(2n)

1
कृपया उत्तर के रूप में टिप्पणियों को न जोड़ने का प्रयास करें। हालाँकि, SE.DSP में आपका स्वागत है, और मेरी ओर से +1 है। मुझे लगता है कि यह जवाब में जोड़ता है ... कम से कम टिप्पणी के लिए पर्याप्त प्रतिनिधि प्राप्त करने का प्रयास करें! :-)
पीटर के.एच.

मुझे नहीं लगता कि यह सच है। जी (एन) फिल्टर का आयाम लाभ है। अगर आपको लगता है कि कॉम्प्लेक्स ट्रांसफर फंक्शन को कैस्केड किया जाए तो मुझे लगता है कि यह 2n पर काम करेगा।
माइक

मैंने एक त्वरित अनुकार के साथ पुष्टि की है कि आ 6 वां ऑर्डर बटरवर्थ समान G (as) को 2 x (3rd ऑर्डर बटरवर्थ) के रूप में देता है लेकिन कैस्केड किया गया है लेकिन 1.6 द्वारा स्केल किए गए 3rd ऑर्डर की कटऑफ आवृत्ति के साथ। परिणाम कटऑफ आवृत्ति के स्केलिंग को छोड़कर समान हैं। इसलिए, ऑर्डर 2n के साथ बड़े पैमाने पर होता है, लेकिन ध्यान दें कि जब आप झरना और क्षतिपूर्ति की आवश्यकता होती है तो पासबैंड कम हो जाएगा। कोई व्यक्ति सिद्धांत की व्याख्या करने के लिए स्वतंत्र महसूस करता है, लेकिन मैं वास्तव में सभी गणित से नहीं गुजरना चाहता हूं।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.