जैसा कि दूसरों ने उल्लेख किया है, आपको उस एफआईआर (परिमित आवेग प्रतिक्रिया) के बजाय एक आईआईआर (अनंत आवेग प्रतिक्रिया) फिल्टर पर विचार करना चाहिए जिसे आप अभी उपयोग कर रहे हैं। इसमें और भी बहुत कुछ है, लेकिन पहली नज़र में एफआईआर फ़िल्टर स्पष्ट संकल्प और समीकरणों के साथ IIR फ़िल्टर के रूप में लागू किए जाते हैं।
विशेष रूप से IIR फ़िल्टर जो मैं माइक्रोकंट्रोलर्स में बहुत उपयोग करता है, वह एकल पोल कम पास फिल्टर है। यह एक साधारण आर सी एनालॉग फ़िल्टर के डिजिटल समकक्ष है। अधिकांश अनुप्रयोगों के लिए, आपके पास उपयोग किए जा रहे बॉक्स फ़िल्टर की तुलना में बेहतर विशेषताएं होंगी। मेरे द्वारा सामना किए गए एक बॉक्स फ़िल्टर के अधिकांश उपयोग डिजिटल सिग्नल प्रोसेसिंग क्लास में किसी पर ध्यान नहीं देने के परिणामस्वरूप होते हैं, न कि उनके विशेष विशेषताओं की आवश्यकता के परिणामस्वरूप। यदि आप केवल उच्च आवृत्तियों को देखना चाहते हैं जो आप जानते हैं कि शोर है, तो एक एकल पोल कम पास फिल्टर बेहतर है। एक माइक्रोकंट्रोलर में डिजिटल रूप से लागू करने का सबसे अच्छा तरीका है:
FILT <- FILT + FF (NEW - FILT)
FILT लगातार स्थिति का एक टुकड़ा है। यह एकमात्र स्थिर चर है जिसे आपको इस फ़िल्टर की गणना करने की आवश्यकता है। नया नया मान है कि फ़िल्टर को इस पुनरावृत्ति के साथ अद्यतन किया जा रहा है। एफएफ फिल्टर अंश है , जो फिल्टर के "भारीपन" को समायोजित करता है। इस एल्गोरिथ्म को देखें और देखें कि एफएफ = 0 के लिए फ़िल्टर असीम रूप से भारी है क्योंकि आउटपुट कभी नहीं बदलता है। FF = 1 के लिए, यह वास्तव में कोई फिल्टर नहीं है क्योंकि आउटपुट केवल इनपुट का अनुसरण करता है। बीच में उपयोगी मान हैं। छोटे सिस्टम पर आप 1/2 N होने के लिए FF चुनेंताकि एफएफ द्वारा गुणा को एन बिट्स द्वारा एक सही बदलाव के रूप में पूरा किया जा सके। उदाहरण के लिए, FF 1/16 हो सकता है और FF द्वारा गुणा किया जा सकता है इसलिए 4 बिट्स की एक सही शिफ्ट। अन्यथा इस फिल्टर को केवल एक घटाव और एक ऐड की आवश्यकता होती है, हालांकि संख्याओं को आमतौर पर इनपुट मूल्य (नीचे एक अलग अनुभाग में संख्यात्मक परिशुद्धता पर अधिक) से व्यापक होने की आवश्यकता होती है।
मैं आमतौर पर ए / डी रीडिंग को बहुत तेजी से लेता हूं, जब वे जरूरत से ज्यादा होते हैं और इनमें से दो फिल्टर कैस्केड करते हैं। यह श्रृंखला में दो RC फ़िल्टर का डिजिटल समतुल्य है, और रोलऑफ़ आवृत्ति के ऊपर 12 dB / ऑक्टेव द्वारा क्षीणन करता है। हालांकि, ए / डी रीडिंग के लिए आमतौर पर इसके चरण प्रतिक्रिया पर विचार करके समय डोमेन में फ़िल्टर को देखना अधिक प्रासंगिक है। यह बताता है कि जब आप जिस चीज को माप रहे हैं, उस बदलाव को आपका सिस्टम कितनी तेजी से देखेगा।
इन फिल्टरों को डिजाइन करने की सुविधा के लिए (जिसका अर्थ केवल एफएफ चुनना और यह तय करना है कि उनमें से कितने को कैस्केड करना है), मैं अपने प्रोग्राम FILBBITS का उपयोग करता हूं। आप फिल्टर की कैस्केड श्रृंखला में प्रत्येक एफएफ के लिए शिफ्ट बिट्स की संख्या निर्दिष्ट करते हैं, और यह चरण प्रतिक्रिया और अन्य मूल्यों की गणना करता है। वास्तव में मैं आमतौर पर अपनी आवरण स्क्रिप्ट PLOTFILT के माध्यम से इसे चलाता हूं। यह FILTBITS चलाता है, जो CSV फ़ाइल बनाता है, फिर CSV फ़ाइल प्लॉट करता है। उदाहरण के लिए, यहां "PLOTFILT 4 4" का परिणाम है:
PLOTFILT के दो मापदंडों का मतलब है कि ऊपर वर्णित प्रकार के दो फिल्टर कैस्केड होंगे। 4 के मान एफएफ द्वारा गुणा का एहसास करने के लिए शिफ्ट बिट्स की संख्या को इंगित करते हैं। इस मामले में दो FF मान 1/16 हैं।
लाल ट्रेस इकाई चरण प्रतिक्रिया है, और देखने के लिए मुख्य बात है। उदाहरण के लिए, यह आपको बताता है कि यदि इनपुट तुरंत बदल जाता है, तो संयुक्त फ़िल्टर का आउटपुट 60 पुनरावृत्तियों में नए मूल्य के 90% पर आ जाएगा। यदि आप 95% बसने के समय की परवाह करते हैं तो आपको लगभग 73 पुनरावृत्तियों की प्रतीक्षा करनी होगी, और 50% निपटाने के लिए केवल 26 पुनरावृत्तियों के लिए।
हरे रंग का निशान आपको एकल पूर्ण आयाम स्पाइक से आउटपुट दिखाता है। यह आपको यादृच्छिक शोर दमन का कुछ विचार देता है। ऐसा लगता है कि आउटपुट में 2.5% परिवर्तन से अधिक एकल नमूना नहीं होगा।
नीला ट्रेस एक व्यक्तिपरक एहसास देने के लिए है कि यह फिल्टर सफेद शोर के साथ क्या करता है। यह एक कठोर परीक्षा नहीं है क्योंकि इस बात की कोई गारंटी नहीं है कि PLOTFILT के इस रन के लिए व्हाइट नॉइज़ इनपुट के रूप में चुना गया रैंडम नंबरों का वास्तव में क्या कंटेंट था। यह आपको केवल एक मोटा एहसास देने के लिए है कि इसे कितना स्क्वैश किया जाएगा और यह कितना चिकना है।
PLOTFILT, शायद FILTBITS और बहुत सारे अन्य उपयोगी सामान, विशेष रूप से PIC फर्मवेयर विकास के लिए PIC विकास उपकरण सॉफ़्टवेयर रिलीज़ में मेरे सॉफ़्टवेयर डाउनलोड पृष्ठ पर उपलब्ध है ।
संख्यात्मक परिशुद्धता के बारे में जोड़ा गया
मैं टिप्पणियों से देखता हूं और अब एक नया उत्तर है कि इस फिल्टर को लागू करने के लिए आवश्यक बिट्स की संख्या पर चर्चा करने में रुचि है। ध्यान दें कि एफएफ द्वारा गुणा बाइनरी पॉइंट के नीचे लॉग 2 (एफएफ) नए बिट्स बनाएगा । छोटी प्रणालियों पर, एफएफ को आमतौर पर 1/2 एन चुना जाता है, ताकि यह वास्तव में एन बिट्स की एक सही शिफ्ट द्वारा महसूस किया जा सके।
FILT इसलिए आमतौर पर एक निश्चित बिंदु पूर्णांक होता है। ध्यान दें कि यह प्रोसेसर के दृष्टिकोण से किसी भी गणित को नहीं बदलता है। उदाहरण के लिए, यदि आप 10 बिट ए / डी रीडिंग और एन = 4 (एफएफ = 1/16) फ़िल्टर कर रहे हैं, तो आपको 10 बिट पूर्णांक ए / डी रीडिंग के नीचे 4 अंश बिट्स की आवश्यकता होती है। सबसे अधिक प्रोसेसर, आप 10 बिट ए / डी रीडिंग के कारण 16 बिट पूर्णांक ऑपरेशन कर रहे हैं। इस स्थिति में, आप अभी भी एक ही 16 बिट पूर्णांक opertions कर सकते हैं, लेकिन 4 बिट्स द्वारा स्थानांतरित ए / डी रीडिंग के साथ शुरू करें। प्रोसेसर अंतर नहीं जानता है और इसकी आवश्यकता नहीं है। पूरे 16 बिट पूर्णांक पर गणित करना यह काम करता है कि क्या आप उन्हें 12.4 निश्चित बिंदु मानते हैं या सही 16 बिट पूर्णांक (16.0 अंक)।
यदि आप संख्यात्मक प्रतिनिधित्व के कारण शोर नहीं जोड़ना चाहते हैं तो सामान्य तौर पर, आपको प्रत्येक फिल्टर पोल में एन बिट्स जोड़ने की आवश्यकता होती है। ऊपर के उदाहरण में, दो के दूसरे फिल्टर में जानकारी न खोने के लिए 10 + 4 + 4 = 18 बिट्स होने चाहिए। 8 बिट मशीन पर अभ्यास करने का मतलब है कि आप 24 बिट मूल्यों का उपयोग करेंगे। तकनीकी रूप से केवल दो के दूसरे पोल के लिए व्यापक मूल्य की आवश्यकता होगी, लेकिन फर्मवेयर सादगी के लिए मैं आमतौर पर एक ही प्रतिनिधित्व का उपयोग करता हूं, और इस तरह एक ही कोड, एक फिल्टर के सभी ध्रुवों के लिए।
आमतौर पर मैं एक फिल्टर पोल ऑपरेशन करने के लिए एक सबरूटीन या मैक्रो लिखता हूं, फिर प्रत्येक पोल पर लागू होता है। क्या सबरूटीन या मैक्रो इस बात पर निर्भर करता है कि उस विशेष परियोजना में साइकिल या प्रोग्राम मेमोरी अधिक महत्वपूर्ण है या नहीं। किसी भी तरह से, मैं सबरूटीन / मैक्रो में नया पास करने के लिए कुछ स्क्रैच स्टेट का उपयोग करता हूं, जो कि FILT को अपडेट करता है, लेकिन यह भी लोड करता है कि एक ही स्क्रैच स्टेट में NEW था। इससे एक पोल के अपडेटेड FILT के बाद से कई पोल लगाना आसान हो जाता है। अगले एक का नया। जब एक सबरूटीन होता है, तो रास्ते में FILT पर एक पॉइंटर पॉइंट होना उपयोगी होता है, जो कि रास्ते में FILT के ठीक बाद में अपडेट किया जाता है। यदि कई बार कॉल किया जाता है तो स्मृति में लगातार फ़िल्टर पर सबट्रीन स्वचालित रूप से काम करता है। मैक्रो के साथ आपको एक सूचक की आवश्यकता नहीं है क्योंकि आप प्रत्येक पुनरावृत्ति पर संचालित करने के लिए पते में पास करते हैं।
कोड उदाहरण
यहाँ एक मैक्रो का उदाहरण दिया गया है जैसा कि पीआईसी 18 के लिए ऊपर वर्णित है:
////////////////////////////////////////////////// //////////////////////////////
//
// मैक्रो फिल्टर फिल्म
//
// NEWVAL में नए मान के साथ एक फ़िल्टर पोल अपडेट करें। NEWVAL को अपडेट किया गया है
// में नए फ़िल्टर किए गए मान हैं।
//
// FILT फ़िल्टर राज्य चर का नाम है। इसे 24 बिट माना जाता है
// विस्तृत और स्थानीय बैंक में।
//
// फिल्टर को अपडेट करने का सूत्र है:
//
// FILT <- FILT + FF (NEWVAL - FILT)
//
// FF द्वारा गुणा करने से FILTBITS बिट्स की एक सही शिफ्ट होती है।
//
/ मैक्रो फ़िल्टर
/लिखो
dbankif lbankadr
Movf [arg 1] +0, w; NEWVAL <- NEWVAL - FILT
उपवाक्य newval + 0
Movf [arg 1] +1, w
उपविभाजन newval + 1
मूव [arg 1] +2, w
उपविभाजन newval + 2
/लिखो
/ लूप एन filtbits; एक बार प्रत्येक बिट के लिए NEWVAL सही स्थानांतरित करने के लिए
rlcf newval + 2, w; शिफ्ट NEWVAL को एक बिट सही करें
rrcf newval + 2
rrcf newval + 1
rrcf newval + 0
/ endloop
/लिखो
movf newval + 0, w, फ़िल्टर में स्थानांतरित मूल्य जोड़ें और NEWVAL में सहेजें
addwf [arg 1] +0, w
मूव [आर्गे 1] +0
मूव न्यूवेल + ०
Movf newval + 1, w
addwfc [arg 1] +1, w
Movwf [arg 1] +1
मूव न्यूवेल + 1
मूव न्यूवेल + 2, डब्ल्यू
addwfc [arg 1] +2, w
मूवेफ [arg 1] +2
मूव न्यूवेल + 2
/ endmac
और यहां PIC 24 या dsPIC 30 या 33 के लिए एक समान मैक्रो है:
////////////////////////////////////////////////// //////////////////////////////
//
// मैक्रो फ़िल्टर ffbits
//
// एक कम पास फिल्टर की स्थिति को अपडेट करें। नया इनपुट मान W1: W0 में है
// और अद्यतन की जाने वाली फ़िल्टर स्थिति W2 द्वारा इंगित की जाती है।
//
// अद्यतन फ़िल्टर मान W1: W0 और W2 में भी वापस आ जाएगा
/ / फिल्टर राज्य के पहले स्मृति के लिए। यह स्थूल इसलिए हो सकता है
// कैस्केड कम पास फिल्टर की एक श्रृंखला को अद्यतन करने के लिए उत्तराधिकार में आह्वान किया गया।
//
// फ़िल्टर सूत्र है:
//
// FILT <- FILT + FF (NEW - FILT)
//
// जहां एफएफ द्वारा गुणा किया जाता है, एक अंकगणितीय दाएं शिफ्ट द्वारा किया जाता है
// FFBITS।
//
// चेतावनी: W3 को ट्रैश किया गया है।
//
/ मैक्रो फ़िल्टर
/ var नए ffbits पूर्णांक = [arg 1]; बिट्स की संख्या को स्थानांतरित करने के लिए प्राप्त करें
/लिखो
/ लिखना "; एक पोल कम पास फ़िल्टरिंग, शिफ्ट बिट्स =" ffbits करना
/लिखो " ;"
उप w0, [w2 ++], w0; नया - FILT -> W1: W0
सब्ब w1, [w2--], w1
lsr w0, # [v ffbits], w0; परिणाम को W1 में स्थानांतरित करें: W0 सही
sl w1, # [- 16 ffbits], w3
ior w0, w3, w0
asr w1, # [v ffbits], w1
जोड़ें W0, [w2 ++], w0; W1 में अंतिम परिणाम बनाने के लिए FILT जोड़ें: W0
addc w1, [w2--], w1
mov w0, [w2 ++]; फ़िल्टर स्थिति के लिए परिणाम लिखें, अग्रिम सूचक
Mov w1, [w2 ++]
/लिखो
/ endmac
इन दोनों उदाहरणों को मेरे PIC असेंबलर प्रीप्रोसेसर का उपयोग करके मैक्रोज़ के रूप में कार्यान्वित किया जाता है , जो कि अंतर्निहित मैक्रो सुविधाओं में से अधिक सक्षम है।