// forum filter per https://forum.arduino.cc/t/how-to-fix-filtered-value/1275520/20
// code initially from https://docs.openenergymonitor.org/electricity-monitoring/ctac/digital-filters-for-offset-removal.html
int sample = 0;
int last_sample = 0;
double a = -0.10;
float reconstructed = 0;
long shifted_filter = +10000;
void setup()
{
Serial.begin(9600);
}
void loop()
{
static bool initialized = false;
// Generate a test signal
last_sample = sample;
a += 0.1; sample = 512 + sin(a) * 100;
long shiftedFCL = shifted_filter + (long)((sample - last_sample) << 8);
shifted_filter = shiftedFCL - (shiftedFCL >> 8);
long filtered_value = (shifted_filter + 128) >> 8;
static float reconstructed = 0;
static bool filterInitialized = false;
if (filterInitialized) {
reconstructed = ((reconstructed + sample - last_sample) * 256 - reconstructed) / 256;
} else {
reconstructed = 0;
filterInitialized = true;
}
Serial.print(last_sample);
Serial.print(' ');
Serial.print(filtered_value);
Serial.print(' ');
Serial.println(reconstructed + 10);
delay(50);
}