सिग्नल प्रोसेसिंग तकनीकों और जटिल गणित में बहुत गहरा होना संभव होगा, लेकिन आपको खुद से पूछना होगा कि यह वास्तव में आवश्यक है या नहीं?
यदि यह डिस्प्ले एक साधारण तात्कालिक संख्यात्मक आउटपुट है, जो लगातार ग्राफ या डेटा लॉग (यानी आपको सिग्नल का पुनर्निर्माण करने की आवश्यकता नहीं है) के बजाय "संकेत केवल" के लिए उपयोग किया जाता है, तो यह अक्सर पूरी तरह से स्वीकार्य होगा बस एक चलती औसत की बजाय आवधिक औसत लें। चूंकि इसके लिए कोई इतिहास संग्रहण की आवश्यकता नहीं है, इसलिए आप जितनी चाहें उतने नमूने औसत कर सकते हैं, और यह प्रदर्शन अद्यतन की आवश्यक आवृत्ति द्वारा निर्धारित किया जाएगा।
यह चालाक नहीं है, लेकिन यह अक्सर कार्य के लिए पर्याप्त है। यहां एक उदाहरण और इसके उपयोग का परीक्षण सिमुलेशन है।
class cPeriodicMean
{
public :
cPeriodicMean(int period) : m_mean(0),
m_period(period),
m_count(0),
m_sum(0)
{
// empty
}
void addSample(int sample)
{
m_sum += sample ;
m_count++ ;
if(m_count == m_period)
{
m_mean = m_sum/m_period ;
m_count = 0 ;
m_sum = 0 ;
}
}
int getMean()
{
return m_mean ;
}
private :
int m_mean ;
int m_period ;
int m_count ;
int m_sum ;
} ;
// Test Simulation
#include <cstdlib>
#include <cstdio>
#include <windows.h> // for Sleep to simulate sample rate
int main()
{
// Average over 100 samples
cPeriodicMean voltage_monitor(100) ;
for(;;)
{
// Simulate 4000mV +/- 50mV input
int sample = 4000 + (std::rand() % 100) - 50 ;
voltage_monitor.addSample(sample) ;
// Simulate 100Hz sample rate
Sleep(10) ;
// Current output
int millivolts = voltage_monitor.getMean() ;
printf("\r%d millivolts ", millivolts) ;
}
}
इस तकनीक भी है कि चिकनी उत्पादन का उत्पादन लेकिन एक ही आवृत्ति पर परिणाम उत्पन्न अपने चलती औसत फिल्टर करने के लिए इनपुट के रूप में समय-समय पर मतलब उत्पादन का उपयोग किया जाएगा होगा की एक शोधन। यदि आप 100 नमूना अवधि के साथ अपने दूसरे नमूने प्रति 100 उदाहरणों का उपयोग करना चाहते थे, और फिर इसे अपने 15 नमूना चलने वाले औसत के माध्यम से रखें, तो आप 15 सेकंड के नमूने डेटा का उपयोग करेंगे जबकि अभी भी हर सेकेंड परिणाम प्राप्त होगा, थोड़ी अतिरिक्त मेमोरी के साथ उपयोग।
स्पष्ट रूप से आप अपनी आवश्यक आवृत्ति पर आवश्यक परिणामों को प्राप्त करने के लिए अवधि, चलती औसत लंबाई और नमूना दर बदल सकते हैं। मेरा सुझाव है कि आप उस अवधि के लिए जितने नमूने ले सकते हैं, जिसके लिए आपको अपडेट की आवश्यकता है, फिर जब तक आप बर्दाश्त करना चाहते हैं तब तक चलती औसत बनाएं।
यह एकदम सही था। गणना करने के लिए तेज़, आसान। मेरे गुणांक को समझने के लिए थोड़ा सा लगा, लेकिन महान काम करता है। –
@ माइक: मैटलैब जैसे टूल (और फ्रीमैट और ऑक्टेव जैसे फ्री क्लोन) में विशिष्ट बैंडविड्थ आवश्यकताओं के लिए आईआईआर फ़िल्टर गुणांक की गणना करने की सुविधा है। यद्यपि इस मामले में केवल एक गुणांक के साथ, एक अनुभवजन्य दृष्टिकोण संभवतः पर्याप्त है (और शायद मैटलैब सीखने से तेज़)। आपकी चलती औसत विधि एफआईआर फ़िल्टर का एक साधारण उदाहरण है (सभी गुणांक बराबर 1 के साथ)। – Clifford
धन्यवाद, मैं वास्तव में क्या देख रहा था, यह मेरा समारोह Arduino के लिए इस आधार पर है: // compresor पूर्णांक कंप्रेसर (पूर्णांक संकेत, पूर्णांक lastSignal) { पूर्णांक परिणाम = lastSignal + 0.2 * (संकेत - lastSignal) ; वापसी परिणाम; } – Macumbaomuerte