// 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);
}