मुझे पार्क्स-मैकलेलेन इष्टतम एफआईआर फिल्टर डिजाइन एल्गोरिदम का एक खुला स्रोत कार्यान्वयन कहां मिल सकता है?


20

पृष्ठभूमि: अक्सर कई बार मैं सिग्नल प्रोसेसिंग कार्य कर रहा होता हूं जिसके लिए एक यूनिक फिल्टर की आवश्यकता होती है। आमतौर पर इस बिंदु पर मैं MATLAB पर जाता हूं और का उपयोग करके एक नया अनूठा फ़िल्टर उत्पन्न करता । MATLAB फ़ंक्शन पार्क-मैकलीन एल्गोरिथ्म को लागू करता है। अब मेरे पास एक फ़िल्टर है और मैंने फ़िल्टर को एक हार्डकोड सरणी में डाल दिया है। लेकिन यहाँ समस्या मैं अब एक हार्डकोड फ़िल्टर है जो केवल एक परिदृश्य के लिए काम करता है।firpm()firpm()

समस्या: मैं अब अपनी सिग्नल प्रोसेसिंग समस्या डु-पत्रिका को हल कर सकता हूं ... लेकिन केवल एक बहुत ही विशिष्ट एकल नमूना दर या विशिष्ट परिदृश्य के लिए।

लक्ष्य: मैं सी कोड या किसी अन्य भाषा से कॉल करने में सक्षम होना चाहता हूं और अपने सिग्नल प्रोसेसिंग कोड को सामान्य बनाता हूं। मैं का एक खुला स्रोत कार्यान्वयन नहीं मिल रहा है !firpm()firpm()

मैं पार्क-मैक्लेलन इष्टतम एफआईआर फ़िल्टर डिज़ाइन एल्गोरिथ्म (उर्फ MATLAB में) का एक खुला स्रोत कार्यान्वयन कहां से प्राप्त कर सकता हूं ?firpm()

  • PS मुझे पता है कि मैं अलग-अलग विंडो या किसी और चीज़ का उपयोग करके फ़िल्टर डिज़ाइन कर सकता हूं ... टिप्पणी में उन लोगों का उल्लेख करने के लिए स्वतंत्र महसूस करें। लेकिन इस सवाल का मतलब यह नहीं है कि "अन्य फिल्टर डिजाइन तकनीक क्या हैं?" बिंदु बहुत उपयोगी ... या कुछ इसी तरह का एक खुला स्रोत कार्यान्वयन खोजने के लिए है ।firpm()

  • PPS इस प्रश्न का एक लक्ष्य यह सीखना है कि पार्क-मैक्लेलन एल्गोरिथम पहले कोड को देखकर कैसे काम करता है और फिर मैं कुछ पृष्ठभूमि सिद्धांत पढ़ने की योजना बनाता हूं।


क्या यह महत्वपूर्ण है कि समाधान नि: शुल्क है? क्या आपने माटलब सी एपीआई की जांच की है?

2
सर्वोच्च प्राथमिकता यह है कि मैं स्रोत कोड देखना चाहता हूं (अधिमानतः फोरट्रान नहीं है, इसलिए मुझे अपनी आँखें बाहर निकालने की ज़रूरत नहीं है)। मैं यह प्रतिबंध नहीं लगाऊंगा कि यह मुक्त होना चाहिए (हो सकता है कि किसी प्रकार का खुला स्रोत हो लेकिन गैर-मुक्त स्रोत कोड)।
ट्रेवर बॉयड स्मिथ

3
मुझे पता है कि आप Matlab संकलक का उपयोग करके Matlab को संकलित कर सकते हैं और फिर Matlab रनटाइम का उपयोग करके वितरित कर सकते हैं ... इसलिए तकनीकी रूप से आपके ग्राहक को Matlab लाइसेंस के लिए भुगतान नहीं करना होगा। मैं भी Matlab Engine (उर्फ C से मतलाब एपीआई) से अवगत हूँ। ये दोनों अप्रासंगिक हैं क्योंकि मैं आमतौर पर एक एम्बेडेड प्लेटफॉर्म पर चलता हूं, जहां न तो उपलब्ध हैं।
ट्रेवर बॉयड स्मिथ

1
@TrevorBoydSmith चूंकि आप सिर्फ सोर्स कोड देखना चाहते हैं, क्या आपने type firpm.mMATLAB में कोशिश की है? यह आपको MATLAB के फ़ंक्शन के कार्यान्वयन को दिखाएगा।
लोरेम इप्सम

1
एफआईआर फ़िल्टर डिजाइन सिग्नल प्रोसेसिंग और पार्कों के लिए बहुत उपयोगी है-मैकलेलन एक गैर-तुच्छ विषय है। और फिर भी मुझे एक विषय के बारे में पूछने के लिए बार-बार वोट दिया जा रहा है कि IMO dsp.stackexchange चार्टर में स्क्वायर फिट बैठता है। कृपया अपने पतन की व्याख्या करें।
ट्रेवर बोयड स्मिथ

जवाबों:


5

यहां रिमेज़ एक्सचेंज एल्गोरिदम का एलजीपीएल संस्करण है। ऑक्टेव कोड इससे प्राप्त होता है। इसे विकिपीडिया पृष्ठ पार्क्स मैकक्लेन पृष्ठ से जोड़ा गया था ।
मूल Janovetz कोड आपकी परियोजना में अधिक आसानी से उपयोग करने योग्य हो सकता है, क्योंकि इसमें ऑक्टेव कॉल नहीं है, लेकिन रिमेज़.सीसी फ़ाइल में बगफिक्स या स्पीडअप के बारे में किसी भी जानकारी के लिए ऑक्टेव-फोर्ज svn चेंगलॉग के माध्यम से खुदाई करना बुद्धिमान होगा। ।


मैं सहमत हूँ कि किसी परियोजना में Janovetz कोड का उपयोग करना आसान होगा क्योंकि यह सीधा है। मैं यह भी निश्चित रूप से सहमत हूँ कि ऑक्टेव कार्यान्वयन के परिवर्तन लॉग की जाँच करना बहुत स्मार्ट होगा।
ट्रेवर बोयड स्मिथ

Janovetz कोड IMO संभवतः पहला या दूसरा ड्राफ्ट है ... लेकिन इसका उपयोग ऑक्टेव कोड की तरह भारी नहीं किया गया है।
ट्रेवर बोयड स्मिथ

बहुत महत्वपूर्ण ध्यान दें: Janovetz कोड LGPL है ताकि आप इसे व्यावसायिक सेटिंग में उपयोग कर सकें।
ट्रेवर बोयड स्मिथ

उत्तर से पहला लिंक टूट गया है इसलिए यहां एक पुस्तकालय का लिंक है जहां उसी कार्यान्वयन का उपयोग किया जाता है।
मटका १

11

जीएनयू ऑक्टेव में पार्क-मैक्कलीन (जिसे रेमेज़ एक्सचेंज एल्गोरिदम के रूप में भी जाना जाता है) का एक ओपन-सोर्स कार्यान्वयन है, जो MATLAB जैसे वातावरण का एक फ्री-सॉफ्टवेयर कार्यान्वयन है। फ़ंक्शन, जिसे "रिमेज़" कहा जाता है, "सिग्नल" पैकेज में निहित है , जिसे ऑक्टेव-फोर्ज में होस्ट किया गया है । यदि आप पैकेज डाउनलोड करते हैं, तो आपको "remez.cc" मिलेगा, एल्गोरिथ्म का C ++ कार्यान्वयन।

ऑक्टेव के बारे में एक अच्छी बात यह है कि यह MATLAB के साथ लगभग कोड-संगत है, इसलिए यदि आप चाहें तो आप आसानी से उपयोग करने के लिए कोड को पोर्ट कर सकते हैं। यह MATLAB में MEX रूप में प्रदान किए गए एल्गोरिदम के कार्यान्वयन पर हुड के नीचे झांकने का एक अच्छा तरीका है।


"पार्क-मैक्लेलन एल्गोरिथ्म रेमेज़ एल्गोरिथ्म या रेमेज़ एक्सचेंज एल्गोरिथ्म का एक बदलाव है, इस बदलाव के साथ कि यह विशेष रूप से एफआईआर फ़िल्टर के लिए डिज़ाइन किया गया है और एफआईआर फ़िल्टर डिज़ाइन के लिए एक मानक तरीका बन गया है।" इसके अलावा SciPy में: docs.scipy.org/doc/scipy/reference/generated/…
endolith


2

यहाँ सी में पार्क्स मैकक्लेलन एल्गोरिथ्म के लिए एक और स्रोत है। यह कोड ऊपर उल्लिखित SciPy कोड से अलग है, इसमें मूल 69 गोटो बयानों में से 61 हटा दिए गए हैं (SciPy कोड अभी भी लगभग 37 गोटो का है)। यह 3 जगहों पर कोड को भी ठीक करता है जहां शून्य से विभाजित हो सकता है और इसमें कुछ अतिरिक्त कोड होते हैं जो रेंज बैंड किनारे के मूल्यों की जांच करते हैं।

http://www.iowahills.com/A7ExampleCodePage.html


1

शायद आप यह पहले से ही जानते हैं, लेकिन अगर आपके पास matlab है तो आप matlab कोडर का उपयोग कर सकते हैं, और एक साधारण फ़ंक्शन बना सकते हैं जो उस सुविधा का उपयोग करता है जिसे आप जांचना चाहते हैं। फिर इसे चलाएं और बनाए गए सी कोड को देखें। मैंने एफएफटी के साथ, और क्यूआर अपघटन के साथ प्रयास किया, और जबकि यह थोड़ा गड़बड़ है, इसे ठीक समझा जा सकता है।


1

यहां एक पेपर है जो "कोर" रिमेज़ एल्गोरिथ्म का एक वास्तविक मैटलैब संस्करण करता है। "एक MATLAB आधारित मल्टीमैंड एफआईआर फ़िल्टर डिजाइन प्रोग्राम रिमझिम मल्टीपल एक्सचेंज एल्गोरिदम के मूल विचार का अनुसरण करते हुए" -2011 सर्किट और सिस्टम पर ISEE अंतर्राष्ट्रीय संगोष्ठी (ISCAS) - लेखक (अहसान, सरमाकी)

यह पेपर बुनियादी एल्गोरिदम को समझाने में एक अच्छा काम करता है। पेपर का लक्ष्य मूल फोरट्रान कोड का उपयोग करने से बचना था - जो एल्गोरिथ्म को बहुत अच्छी तरह से नहीं समझाता है और अक्सर सीधे विभिन्न भाषाओं में अनुवाद किया जाता है।

एक बात मैं इस पर टिप्पणी करूंगा। एल्गोरिथ्म के मुख्य विचारों में से एक वक्र को फिट करना और फिर चरम बिंदुओं को खोजना है। आमतौर पर एक Lagrange Interpolation का उपयोग इस विचार को समझाने के लिए किया जाता है, लेकिन Lagrange Interpolation में खराब संख्यात्मक गुण हैं। मूल एल्गोरिथ्म में लैग्रेंज इंटरपोलेशन के बेरेंट्रिक इम्प्लीमेंटेशन का उपयोग किया जाता है - जो लैरेंजियन इंटरपोलेशन से जुड़े कई नुकसानों से बचा जाता है। इसलिए यदि आप कोड को पूरी तरह से समझने की कोशिश कर रहे हैं, तो आप Barycentric Interpolation को देखना चाह सकते हैं।


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

1

मतलाब के firpm और Scipy.signal के रिमेज़ के बीच के अंतरों से सावधान रहें। उदाहरण के लिए, ये दो कथन समतुल्य हैं:

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.