2012-12-06 19 views
10

में एक सिग्नल में फ़िल्टर कैसे लागू करें, किसी दिए गए सिग्नल पर फ़िल्टर (उदाहरण के लिए बटरवर्थ फ़िल्टर) लागू करने के लिए अजगर में कोई तैयार फ़ंक्शन है? मैं 'scipy.signal' में ऐसे फ़ंक्शन की तलाश में हूं लेकिन मुझे फ़िल्टर डिज़ाइन वाले लोगों से अधिक उपयोगी फ़ंक्शन नहीं मिलते हैं। असल में मैं इस फ़ंक्शन को सिग्नल के साथ फ़िल्टर को हल करने के लिए चाहता हूं।पायथन

+1

आपने क्या प्रयास किया है? 'lfilter' किसी भी एलटीआई फ़िल्टर को कार्यान्वित कर सकता है जिसे आप सपना देख सकते हैं। – acjay

+0

यह भी देखें: http://www.scipy.org/Cookbook/ButterworthBandpass, http://www.scipy.org/Cookbook/FiltFilt, http://www.scipy.org/Cookbook/FIRFilter, http : //www.scipy.org/Cookbook/ApplyFIRFilter –

उत्तर

23

हाँ! वहाँ दो हैं:

scipy.signal.filtfilt 
scipy.signal.lfilter 

वहाँ भी घुमाव (convolve और fftconvolve) के लिए तरीके हैं, लेकिन इन शायद आपके आवेदन के लिए उपयुक्त नहीं हैं क्योंकि यह IIR फिल्टर शामिल है।

पूर्ण कोड नमूना:

b, a = scipy.signal.butter(N, Wn, 'low') 
output_signal = scipy.signal.filtfilt(b, a, input_signal) 

आप तर्क और दस्तावेज में उपयोग के बारे में और अधिक पढ़ सकते हैं। एक गोचा यह है कि Wn Nyquist आवृत्ति का एक अंश है (नमूना आवृत्ति आधा)। तो यदि नमूना दर 1000 हर्ट्ज है और आप 250 हर्ट्ज का कटऑफ चाहते हैं, तो आपको Wn=0.5 का उपयोग करना चाहिए।

वैसे, मैं अधिकतर अनुप्रयोगों के लिए lfilter (जिसे मैटलैब में केवल filter कहा जाता है) के उपयोग की अत्यधिक अनुशंसा करता हूं। documentation राज्यों के रूप में:

यह फ़ंक्शन एक बार आगे और एक बार पीछे एक रैखिक फ़िल्टर लागू होता है। संयुक्त फ़िल्टर में रैखिक चरण होता है।

इसका मतलब यह है कि आउटपुट का प्रत्येक मान समान रूप से इनपुट में "पिछले" और "भविष्य" बिंदुओं का एक कार्य है। इसलिए यह इनपुट अंतराल नहीं होगा।

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

+0

धन्यवाद, मेरी समस्या हल हो गई। –