А что если не сортировать массив, а метить самый маленький из найденных элементов и исключать его из выборки, так первый помеченный будет самым маленьким, второй помеченный - вторым снизу...
для меток можно создать отдельный массив, а можно обратимо модифицировать элементы исследуемого массива:
т.к. измерение АЦП занимает 10 бит, то старшие 6 всегда == 0, любой из них можно занять под метку...
кстати такая метка автоматически увеличивает элемент настолько, что он уже точно не станет самым маленьким (таким методом мы убиваем сразу 2х зайцев
)
код получится примерно таким:1) организовываем кольцевой буфер (запись в него нового значения вытесняет самое старое), длина буфера равна 2длинам отсекаемых хвостов и 1 длине усредняемой середины.
2) в цикле находим самый маленький элемент и если i (количество итераций цикла) меньше длины хвоста то просто помечаем его:
X|=0x8000; //под метку отдали самый старший бит.
если i больше длины хвоста, то перед тем, как поставим метку, Х добавим в аккумулятор.
цикл проводим (длина хвоста+длина середины) раз.
затем пробегаем массив вторым циклом, в котором сбрасываем установленные первым циклом метки:
X&=~0x8000;затем делим значение аккумулятора на длину середины и получаем среднемедианное значение - какраз то, что мы и ищем.
Достоинства метода:1) не нарушается порядок элементов - не нарушается работа кольцевого буфера
2) не требуется дополнительная память для хранения и сортировки элементов.
3) высокая скорость вычисления.
Добавлено after 15 minutes 36 seconds:Можно сделать фильтрацию с опорой на предыдущий вычисленный элемент:
- Код:
если новое значение больше предыдущего
{если разница больше уставки гистерезиса {выодим новое значение}иначе{выводим старое+1}}
если новое значение меньше предыдущего
{если разница больше уставки гистерезиса {выодим новое значение}иначе{выводим старое-1}}
так дребезжание значений становится гораздо меньше, но оперативность реакции при этом не страдает.
Добавлено after 31 minute 5 seconds:ещё в копилочку: для увеличения разрядности АЦП можно использовать шумы измерителя, для этого:
рецепт
: для получения
Х дополнительных бит точности - нужно сделать оцифровку 2^(2Х) раз (для 2х бит - это будет 16 раз), все результаты суммировать, а затем сдвинуть вправо на Х позиций (т.е. разделить на 2^Х).
Получается неплохо