कभी-कभी जो सरल दिखता है वह उतना सरल नहीं है। आपके पास करने के लिए काफी जटिल माप है, लेकिन आप एक सरल परिणाम चाहते हैं। आप जो मापना चाहते हैं वह स्थिर नहीं है, यह समय के हिसाब से अलग है। अपनी आवश्यकता के स्तर के आधार पर, आप वर्तमान खपत के एक या कई गुणों की गणना कर सकते हैं। ये गुण आपको सिस्टम की बेहतर निगरानी करने में मदद करेंगे। मैं आपको 3 विभिन्न समाधानों का प्रस्ताव देता हूं, आरोही जटिलता में।
समाधान 1: औसत
आप एक-मूल्य परिणाम प्राप्त करना चाहते हैं -> समय में औसत प्राप्त करें। जैसा कि @akellyirl द्वारा पहले से ही प्रस्तावित है, कम-पास फिल्टर का उपयोग करें। float y = alpha*input + (1-alpha)*y
प्रत्येक नमूने के लिए गणना , जहां alpha
चौरसाई कारक है। विवरण के लिए विकिपीडिया देखें ।
समाधान 2: अधिकतम + औसत
आप औसत और अधिकतम मूल्य प्राप्त करने में दिलचस्प हैं। अधिकतम मान की निगरानी करना उदाहरण के लिए घटक आयाम के लिए दिलचस्प हो सकता है।
if (y > max)
max = y;
समाधान 3: मानक विचलन + अधिकतम + औसत
क्यों?
नीचे दिए गए चार्ट देखें। विभिन्न आकृतियों के 3 संकेत हैं। एक त्रिकोण , एक साइन और एक स्पाइक सिग्नल। वे सभी समान अवधि, समान आयाम , समान औसत और समान मिनट और अधिकतम अवधि वाले होते हैं । लेकिन, उनके पास अलग-अलग आकार हैं, और वास्तव में उनके पास एक पूरी तरह से अलग कहानी है ...
अंतर में से एक मानक विचलन है। इसलिए मैं आपको सुझाव देता हूं कि आप अपने माप को बढ़ाएं, और मानक विचलन को शामिल करें। समस्या यह है कि यह गणना करने का मानक तरीका सीपीयू खपत है। उम्मीद है, एक समाधान है।
कैसे?
हिस्टोग्राम विधि का प्रयोग करें । सभी मापों का एक हिस्टोग्राम बनाएं, और डेटासेट के सांख्यिकी (न्यूनतम, अधिकतम, औसत, मानक विचलन) को कुशलतापूर्वक निकालें। हिस्टोग्राम समूह एक साथ मूल्य जो एक ही मूल्य, या समान श्रेणी मान है। फायदा यह है कि सभी नमूनों को संग्रहीत करने से बचें (समय में गिनती बढ़ रही है), और सीमित संख्या में डेटा पर तेजी से गणना करना है।
माप प्राप्त करना शुरू करने से पहले, हिस्टोग्राम को स्टोर करने के लिए एक सरणी बनाएं। यह 1 आयाम पूर्णांक सरणी है, उदाहरण के लिए 32 का आकार :
int histo[32];
एमीटर की सीमा के आधार पर, फ़ंक्शन के नीचे अनुकूलित करें। उदाहरण के लिए, यदि सीमा 256mA है, तो इसका मतलब है कि हिस्टोग्राम के बिन 0 को 0 और 8 mA के बीच के मूल्य से बढ़ाकर, बिन 1 को 8 और 16 mA आदि के बीच के मूल्य द्वारा बढ़ाया जाएगा ... इसलिए, आपको प्रतिनिधित्व करने के लिए पूर्णांक की आवश्यकता होगी हिस्टोग्राम बिन संख्या:
short int index;
हर बार जब आप एक नमूना प्राप्त करते हैं, तो संबंधित बिन सूचकांक खोजें:
index = (short int) floor(yi);
और इस बिन वेतन वृद्धि:
histo[index] += 1;
माध्य की गणना करने के लिए, इस लूप को चलाएं:
float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
mean = i * histo[i]; // sum along the histogram
N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.
मानक विचलन की गणना करने के लिए, इस लूप को चलाएं:
float std_dev = 0;
for (i=0; i < 32 ; i++) {
std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.
हिस्टोग्राम विधि की रणनीति सभी अधिग्रहीत सिग्नल नमूनों के बजाय, डिब्बे की कुछ संख्या पर धीमी गति से संचालन करना है। नमूना आकार जितना लंबा होगा, उतना बेहतर होगा। यदि आप अधिक विवरण चाहते हैं, तो इस दिलचस्प पृष्ठ को द हिस्टोग्राम, Pmf और Pdf पढ़ें ।