Фильтр не портит массив, это позволяет, используя колцевой буфер, использовать результаты работы АЦП повторно (это значит, что результаты фильтрации можно получать с частотой опроса АЦП)
К сожалению исходный алгоритм фильтра остался на жетком диске дома... а это я из готового кода "быстрого АмперВольтВаттОмМетра для ЛБП на меге8" выкусил.
Спойлер
Код написан в кодевижене, прошу понять и проститьКод: Выделить всё
unsigned int filtr (unsigned int inp[], unsigned char Length, unsigned char Median){
//inp[] массив входных данных
//Length длина массива входных данных
//Median количество отбрасываемых крайних элементов с каждой стороны, т.е. мощность медианного фильтра
unsigned int tmp;
unsigned char i,j,k,u; //счетчики и ограничители
unsigned long summ = 0; //аккумулятор для суммирования усредняемых элементов массива
k=Length-Median; //количество итераций поиска
u=k-Median; //определяем, сколько элементов нужно усреднять
while (k) {
tmp=~(1<<15); //0x7FFF - максимально допустимое для алгоритма число
i=Length;
while (i>0) //в цикле перебираем весь массив - ищем минимальный элемент
{
i--;
if (tmp >= inp[i])
{
j = i;
tmp = inp[i];
};
};
if (k<=u) summ+=tmp; //складываем в аккумулятор если обработать осталось <= требуемое для усреднения количество элементов
inp[j]|=(1<<15); //ставим метку на найденном и обработанном элементе, с ней он уже не будет минимальным
k--;
};
//--------------------------------------
k=Length; //убираем все метки
do {inp[--k]&=~(1<<15);}
while (k>0);
//--------------------------------------
tmp=summ/u; //находим среднее арифметическое
return (tmp); //и возвращаем его
}
Вроде всё верно выкусил, там просто ещё автокалибровка и автоподстройка 0 и сохранение этих данных в сжатом виде в служебной области массива реализованы... были...
Наверно и для моей задачи (из массива на 12 элементов отбросить по одному крайнему, а остальные усреднить) можно сделать быстрее, если делать фильтр жёстко под эту задачу, но этот код позволяет менять параметры на лету, подбирая фильтрацию под задачу.
Просто после проверки на железе это оказались оптимальные, а нормально работающий код переделывать не захотелось...
ПС не уверен, что я до среднего уровня тут присутствующих дотягиваюсь, т.к. смотрю, все уже на STMах и ESPхах катаются... а я с ними только в среде ардуино дело имел...