Maybe there is a filter that removes the DC component.
It is possible to make that in the Arduino (or STM32).
When you have a average value, created by a low pass filter in software, then you can use that as a offset for every sample.
I make such a low pass filter with 'float' variables, but it is faster with integers. I forgot how to do it with integers.
float filtered;
void setup()
{
filtered = analogRead( ... // start with begin value, to get started at the begin.
...
}
void loop()
{
int adcValue = analogRead( ...
filtered = (0.99 * filtered) + (0.01 * float( adcValue)); // 1 percent low pass filter
int sample = adcValue - int( filtered); // use the filtered value as offset
// The 'sample' will now be a value around zero without DC offset.
...
}
I think that the 1% filter is too much, probably a lower value is better.