Можно было бы углубиться в методы обработки сигналов и сложную математику, но вы должны спросить себя, действительно ли это необходимо?
Если этот дисплей представляет собой простой мгновенный числовой вывод, используемый для «только индикации», а не для непрерывного графика или журнала данных (т. Е. Вам не нужно восстанавливать сигнал), то он часто будет вполне приемлемым, просто взять периодическое среднее вместо скользящего среднего.Поскольку для этого не требуется хранения истории, вы можете усреднить столько сэмплов, сколько пожелаете, и это будет определяться требуемой частотой обновления дисплея.
Это не умный , но эточасто достаточно для этой задачи.Вот пример и тестовое моделирование его использования.
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 секунд, в то же время получая результат каждую секунду с небольшим объемом дополнительной памяти.использование.
Очевидно, что вы можете изменить период, длину скользящей средней и частоту выборки, чтобы получить нужные вам результаты с необходимой частотой обновления.Я предлагаю вам взять как можно больше выборок за период, для которого вам нужно обновление, а затем сделать скользящую среднюю так долго, как вы хотите.