Такое банально отбрасыванием крайних значений при стат-усреднении
делается. Как на лабах. Период измерений чуть больше, чем
длительность провала. Причем даже не нужно нечетное количество отсчетов в окне - просто не менее 3
что-то типа такого говнокода
#define WSIZE 4
uint6_t wnd[WSIZE]={0};
int idx = -1;
uint6_t stat(uint16_t adc_res){
uint16_t min, max;
uint32_t sum;
if(idx < 0){idx= 1; for(int i= 0;i<WSIZE;i++){wnd[i]= adc_res;} adc_res; return adc_res;}//init at first call
wnd[idx] = adc_res; idx++; if(idx >= WSIZE) idx = 0;//idx &= 2;
for(int i=0; i <WSIZE; i++){
sum+= wnd[i];
if(wnd[i] < min) min = wnd[i];
if(max < wnd[i]) max = wnd[i];
}
sum-= min; sum-=max;
return (uint16_t)(sum/(WSIZE-2);//sum>>=2;
}