Ниже предлагается способ фильтрации зашумленных данных, который работает на лету и не требует хранения данных, которые должны обрабатываться как единое целое. Он удаляет до двух выбросов (минимальное и максимальное значения) и усредняет все остальные значения.
С помощью данного метода могут быть обработаны до шестнадцати 12-битных выборок, используя только четыре 16-битных ячейки ОЗУ. При 10 выборках в качестве деление представляет собой сдвиг на 3 разряда.
int16 adcval,sum,max,min;
int8 i;
#define samples 10
max=0;
min=0xFFFF; //Устанавливаем максимум и минимум в качестве границ диапазона
for (i=0;imax) max=adcval; //Обновляем на лету значения максимумов и минимумов
if (adcvalsum+=adcval; //Получаем сумму со всех выборок
}
sum-=max; //Удаляем минимальное и максимальное значения
sum-=min; //как вероятные выбросы
return(sum/(samples-2)); //Усредняем все остальные значения
//Если число выборок = 10, то деление представляет собой sum<<3
Перевод © digitrode.ru