Вы еще не поняли, что никаких 0,5 нет и в помине. Просто дергайте ногой в начале сортировки и в конце с реальными массивами. И удивляйтесь результату...
Зачем? Я просто знаю результат.... Ну и резонно полагаю, что искать дурее себя не стоит. Очевидно, что ваша "идея" лежит на поверхности для столь изъезженной вдоль и поперек темы сортировки. Не катит, увы. Особенно с учетом скрипучести по проблеме лишнего элемента...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Alex_641, вот мой рабочий пример. Посмотрите его повнимательнее. Пусть у нас 4 элемента. 3-1-10-9. Адресация в цифровой электронике начинается с 0. Он же условно "первый" элемент. Ptr_1 на нулевой 0 "первый" элемент (3). Ptr_2 на 1 "второй" элемент (1). Начинаем двигать. Сколько сдвигов? 3. То есть size - 1. В моем примере вы увидите константу размер массива. В функции вы увидите size - 1.
А что если не сортировать массив, а метить самый маленький из найденных элементов и исключать его из выборки, так первый помеченный будет самым маленьким, второй помеченный - вторым снизу... для меток можно создать отдельный массив, а можно обратимо модифицировать элементы исследуемого массива: т.к. измерение АЦП занимает 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^Х). Получается неплохо
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
перебираем массив "снизу", отсекая поочередно самые маленькие, большие просто останутся неотсеченными, но и в сумматор не попадут...
Добавлено after 1 minute 36 seconds: хотя, если есть желание - можно идти и "сверху", отсекая большие, просто так придется отдельно наличие метки проверять (или переменную сделать знаковой, чтоб метка автоматом число в минуса загоняла)....
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Для полной медианной фильтрации вероятно пойдет, но она не годится в случае с автором темы. останется только один элемент, а это не устранит помехи имеющие линейчатый спектр типа 50 Гц с гармониками. Кроме того, все способы прямого перебора для полной медианы имеют объем вычислений O*N^2 против O*N*logN для быстрых сортировок. Так что коэффициент O тут мало чем поможет для массивов значительной (от нескольких десятков элементов) длины.
Это классический оверсемплинг. Но он точность не повышает. Он повышает разрешающую способность. Интерполяция - это другое. При интерполяции, вставляют нулевые отсчеты и производят обычную фильтрацию. Это и есть передискретизация.
Точность важна для измерителя, а разрешающая способность для обнаружителя. Правда в обнаружителе нужно учитывать неизбежную интермодуляцию связанную с исходной точностью, читайте линейностью.
останется несколько максимальных элементов, т.к. поиск остановится раньше (как только найдётся последний, интересующий нас элемент). количество итераций поиска I = L-N где L- длина массива N- количество элементов, которые искать не надо (один из "хвостов" массива). N=(L-M)/2 M- количество элементов входящих в усреднительный фильтр отсюда I= L-(L-M)/2 = (L+M)/2 количество сравнений: X=L*I=L*(L+M)/2 = (L^2+LM)/2; ...... пожалуй действительно увеличения скорости нет (модификация значения ведь тоже время занимает)... но памяти требуется в 2 раза меньше... т.к. нет сортируемой копии массива. и, я думаю (пока этот вопрос не проанализировал), что флеш сэкономится, т.к. и сортировка и вычисление проходят внутри одного цикла.
но с тем, что останется только один максимальный элемент, я не согласен - сортировку можно остановить сразу после того, как будет найден последний интересующий элемент.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Тут не понял... ну, есть они в массиве, а мне то что с того...? придёт их черёд - затрутся свежим значением...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Циклы поиска всегда ПОЛНЫЕ. Не важно - стоит какая то метка на минимальных или нет. Потому что поиск минимальных ничем не отличается от пропуска отмеченных. То есть циклов будет по прежнему O*N^2. Только О будет равно 0,5.
нет, это внутри итерации цикла перебирается весь массив (и меченые и нет) а количество таких итераций меньше количества элементов массива, оно равно количеству найденных минимальных элементов (равно сумме пропускаемых и суммируемых минимальных элементов)
Добавлено after 1 minute 8 seconds: про квадратичную скорость роста количества расчетов от размера массива я не спорю.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Алгоритм сортировки работает идеально и быстро. И всё остальное в проге. Проблема была в том, что я заштриховал строку в которой были настройки АЦП. И при обращении к нему МК уходил в зависон. Так же почему то не заработал ареф ( ацп всегда показывал 1023) , переназначил источник опорного на внутреннее 2,5 вольта и всё заработало. Но ...
Добавлено after 6 minutes 5 seconds: Показания ИНОГДА прыгают в пределах единицы младшего разряда, и если число ровное например 100 , то прыгают соответственно все 3 его разряда.
_________________ Не спрашивай по ком звонит колокол, он звонит по тебе !
Сейчас этот форум просматривают: Google [Bot] и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения