Sería posible profundizar en las técnicas de procesamiento de señales y las matemáticas complejas, pero debe preguntarse si es realmente necesario.
Si esta pantalla es una simple salida numérica instantánea, utilizada para "indicación solamente" en lugar de decir un gráfico continuo o registro de datos (es decir, no es necesario reconstruir la señal), entonces sería perfectamente aceptable, simplemente tome un promedio periódico en lugar de una media móvil. Como eso no requiere almacenamiento de historial, puede promediar tantas muestras como desee, y esto estaría determinado por la frecuencia requerida de actualización de la pantalla. No es inteligente, pero a menudo es adecuado para la tarea. Aquí hay un ejemplo y una simulación de prueba de su uso.
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) ;
}
}
Un refinamiento de esta técnica que producirá la salida aún más suave pero generan resultados a la misma frecuencia sería utilizar la salida media periódica como entrada para el filtro de media móvil. Si tuviera que usar mi ejemplo de 100 muestras por segundo con el período de 100 muestras y luego ponerlo en su promedio móvil de 15 muestras, habrá utilizado 15 segundos de datos de muestreo mientras sigue obteniendo un resultado cada segundo, con poca memoria adicional uso.
Obviamente, puede cambiar el período, la longitud promedio móvil y la frecuencia de muestreo para obtener los resultados que necesita con la frecuencia de actualización que necesita. Le sugiero que tome tantas muestras como pueda para el período para el que necesita una actualización, luego haga la media móvil todo el tiempo que desee.
Este era perfecta. Rápido, fácil de calcular. Tomó un poco para descubrir mi coeficiente, pero funciona muy bien. –
@Mike: herramientas como Matlab (y sus clones gratuitos como FreeMat y Octave) tienen instalaciones para calcular coeficientes de filtro IIR para requisitos de ancho de banda específicos. Aunque en este caso con un solo coeficiente, probablemente sea suficiente un enfoque empírico (y probablemente más rápido que aprender Matlab). Su método de promedio móvil es un ejemplo simple de un filtro FIR (con todos los coeficientes iguales a 1). – Clifford
gracias, exactamente lo que estaba buscando, este es mi función en base a este para Arduino: // COMPRESOR int compresor (int señal, int lastSignal) { int resultado = lastSignal + 0,2 * (señal - lastSignal) ; resultado de devolución; } – Macumbaomuerte