Обсуждаем контроллеры компании Atmel.
Ответить

Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 07:57:38

Доброе утро уважаемые ! В общем задача сделать вольтметр на аттини26 с дескретизацией АЦП 10 бит, и что бы минимизировать "прыжки" показаний. Есть два варианта . Первый просто сделать 20 замеров, и найти средне квадратичное значение. Второй считать в массив 20 значений, произвести сортировку массива, отсечь с права и с лева несколько показаний ( к примеру по 5 ) , и затем уже от оставшихся 10-ти найти среднеквадратичный результат. Так вот стоит ли оно того , что бы заморочиться по второму способу ?

Добавлено after 2 minutes 33 seconds:
И да, программа будет на СИ.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:12:51

Вам следует описать конечную задачу.
Что вообще вы измеряете?
Одно могу сказать точно. Для уменьшения уровня шумов нужно накопление сигнала.
Расчет СКЗ таким накоплением не является.
ЗЫ. Язык написания программы для алгоритма безразличен.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:21:35

Я писал что вольты, но если конкретнее то это будет мегаометр, ну соответственно Мк будет высчитывать уже из вольтов мегаомы согласно закону Ома. Там при максимальном напряжении 1000 вольт , на входе мк после делителя получается 1 вольт. Ареф хочу сделать тоже 1 вольт. И замерять сопротивление от 0,1 до 100 Мегоом.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:22:34

https://we.easyelectronics.ru/Theory/ch ... filtr.html

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:25:48

отсечь с права и с лева несколько показаний

Не обязательно отсекать. Классический медианный фильтр - сортировка N значений по возрастанию и выбор значения из середины отсортированного массива. А еще есть фильтр Калмана

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:33:22

метод квадратов...

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 08:53:32

Я писал что вольты, но если конкретнее то это будет мегаометр

То есть речь идёт об измерении постоянного напряжения. Тогда среднеквадратичное значение вам не требуется. СКЗ - это для периодических сигналов.
Ссылку вам привели, но добавлю, что экспоненциальный фильтр - это то, что вас устроит лучше всего. Именно он там и описан - это простейший ФНЧ первого порядка с бесконечной импульсной характеристикой (БИХ). Его иногда называют бета-фильтр. Правда он требует для расчета избыточной к разрядности входного сигнала собственной разрядности. То есть реализован в большинстве случаев в дробных числах с фиксированной точкой. Но зато не требует памяти. Альтернативой будет фильтр с буфером (окном) накопления. Это фильтр с конечной импульсной характеристикой (КИХ). Он требует объема ОЗУ для буфера.
Все это относится к линейной фильтрации.
Озвученный вами ранее способ выбрасывания крайних значений - это нелинейная фильтрация. Упрощение медианного фильтра. Такие фильтры хорошо работают по импульсным помехам. Такие фильтры применяют до линейной фильтрации. Все они очень ресурсоемки для производительности и всегда требуют буфер.

Добавлено after 8 minutes 10 seconds:
Не обязательно отсекать. Классический медианный фильтр - сортировка N значений по возрастанию и выбор значения из середины

Отсекать и выбирать середину - это одно и то же. Сортировать для МК - это бессмысленная избыточная производительность. С учетом применения 8-битника это особо заметно.
Для медианы нужно отбрасывать крайние значения до оставления одного. Оно и будет медианой.
Но можно отбрасывать не все, а остальное фильтровать линейно.
ЗЫ Калмана ему не потянуть. Это перебор.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 09:13:53

Для медианы нужно отбрасывать крайние значения до оставления одного.

Допустим, вы получили значения
9, 11, 7, 3, 16, 8, 10.
Отбросьте крайние: слева 9, 11, 7 и справа 10, 8, 16. Получите 3. Угу.
А если вначале отсортировать по возрастанию: 3, 7, 8, 9, 10, 11, 16 и возьмите из середины (или отбросьте все крайние). Получите 9, что гораздо лучше отражает реальность, поскольку экстремально далекие значения будут находиться далеко на краях отсортированного массива. Эти крайние значения являются случайными выбросами.
Медианный фильтр
Последний раз редактировалось MLX90640 Вс фев 05, 2023 09:18:02, всего редактировалось 1 раз.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 09:16:00

Есть способ попроще. Среднеарифметическое. Скажем, 100 мс собираем показания. Усредняем. Выводим раз в 200-500 мс текущие показания. Если же действительно есть сильные помехи, тогда уже другие способы.
Нечто подобное есть на промышленных термоконтроллерах. Параметр - период вывода показаний. Пример. Есть термоконтроллер, у которого период 100 мс. В некоторых случаях показания прыгают. На несколько десятых градусов. Это раздражает. Поэтому увеличиваем этот параметр и не паримся.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 09:19:59

нет

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 09:21:00

Медианный фильтр работает лучше среднеарифметического, потому как лучше устраняет случайные короткие выбросы. А уж после медианного можно уже и среднеарифметический, коль хочется, поставить.
Выше я показал, как работает медианный фильтр. В показанном примере значения 3 и 16 были случайными выбросами, и они были полностью отфильтрованы. В противоположность этому, среднеарифметическое учтет эти выбросы, и тем сильнее, чем сильнее был выброс в одну сторону.
Допустим, получили измеренные 8, 10, 9, 25, 22, 11, 12. Выбросы - 25, 22. После сортировки: 8, 9, 10, 11, 12, 22, 25. Медиана - 11. Среднеарифметическое: 13,9, почти 14 даже. Выброс повлиял, хоть и был уменьшен.

Без предварительной сортировки отбрасывать крайние значения - это, извините, всё равно, что не делать тех измерений вовсе, надеясь, что выброс будет именно там, где измерения были пропущены. :))) А вот предварительная сортировка по возрастанию как раз и выявит эти экстремальные отклонения и их можно отбрасывать.
Да, и если кто там беспокоится за сортировку, то есть быстрая сортировка - встроенная в Си qsort. Или же можете написать самостоятельно.
Последний раз редактировалось MLX90640 Вс фев 05, 2023 10:13:05, всего редактировалось 4 раз(а).

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 09:26:57

MLX90640, сенкс. Запомню.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 11:45:21

что бы минимизировать "прыжки" показаний... программа будет на СИ.

в радиоуправлении
https://www.radiokot.ru/forum/viewtopic ... 8&t=185219
мы использовали фильтр-гистерезис...
Код:
int a;             
int u, ub;       
ADCSRA=0b10000101; // вкл. ADC // 8 МГц/32=250.000 Hz
//////////////////////////////////////////// ADC:
ADMUX=0b01000101;                // канал 5
delay_us(10);                            // стабилизация входа...
ADCSRA|=0b01000000;             // Старт преобразования.
while (ADCSRA & 0b01000000);  // При завершении преобразования этот бит сбрасывается аппаратно.
//////////////////////////////////////////// ADC:
a=ADCW/2;   
if (a>ub+1) {u=a/2; ub=a;};   
if (a<ub-1) {u=a/2; ub=a;};

//u - выход

программа на СИ.

фильтр-гистерезис устраняет шум квантования АЦП...
ацп.jpg
(30.67 KiB) Скачиваний: 53

мы теряем разрядность... но зато "прыжки" показаний отсутствуют... от слова совсем))

мы измеряли таким образом ток, напряжение, частоту оборотов двигателя, температуру... и т.д.
:tea:

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 12:13:19

Для медианы нужно отбрасывать крайние значения до оставления одного.

Допустим, вы получили значения]

Занятная интепретация. Вообще то речь шла о крайних значениях, а не о крайних адресах... Почувствуйте разницу...
ЗЫ. Вы когда нибудь оценивали требуемые ресурсы для быстрой сортировки?

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 12:28:59

Не только оценивал, но и делал. А вы когда-нибудь пробовали отфильтровать импульсные помехи? ну и как вы это делали?
Я там специально далл ссылку на медианный фильтр. там чётко сказано - выбирается середина из УПОРЯДОЧЕННЫХ, то есть отсортированных данных. Иначе вообще нет смысла че-то там выкидывать, ибо можно выкинуть нужное, а оставить ненужное.
При том, что qsort является одним из самых быстрых алгоритмов сортировки. Ну и есть его улучшения

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 12:48:18

там чётко сказано - выбирается середина из УПОРЯДОЧЕННЫХ, то есть отсортированных данных. Иначе вообще нет смысла

:)
Не расстраивайте меня. Я начинаю подозревать у вас формальный подход к решению задач...
То, о чем я выше написал является КЛАССИЧЕСКИМ МЕДИАННЫМ ФИЛЬТРОМ. Единственная проблема такого метода в том, что диапазон разрешенных чисел должен быть уменьшен на единицу. Но при данных из 10 разрядного АЦП это не является проблемой. Под понятием "выбрасывания" данных понимается присвоение им пустого значения, то есть того самого из отсутствующего в диапазоне принимаемых чисел.
По поводу моего опыта.
Примерно в 50% разработанных мной серийных изделий медианная фильтрация делается именно так. В других изделиях она просто не нужна. Сортировка требует не нативного для МК перемещения чисел. Это очень ресурсоемкая операция.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 12:53:23

Хорошо. Тогда поясните плиз , каким способом определяете, какое значение нужно выкинуть (заменить на пустое значение). И пустое - это сколько в числах?

В сортировке участвуют два числа в один момент времени. И они не перемещаются, а через промежуточную переменную изменяют свои значения методом присвоения.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 13:11:06

Хорошо. Тогда поясните плиз , каким способом определяете, какое значение нужно выкинуть

Пардон, я же вам это СРАЗУ написал. В одном цикле определяется минимальное и максимальное значения (они в русском языке называются крайними) и они заменяются пустыми значениями. В следующем повторяется, а пустые пропускаются. Математически это идентично сортировке, только отсутствует перемещение чисел.
В сортировке участвуют два числа в один момент времени. И они не перемещаются, а через промежуточную переменную изменяют свои значения методом присвоения.

Вы оперируете понятиями метапрограммирования. В МК есть конкретные доступные инструкции. То, что вы так просто изложили КРАТНО увеличивает время исполнения.
Так, в платформе dsPIC33 есть инструкция обмена значениями двух РОНов. Это очень удобно для сортировки, но сортировка происходит не в РОНах, а в ОЗУ.
ЗЫ. Кстати, при сортировке необходимо довести процесс до конца, однако медианный фильтр очень плохо, а точнее НИКАК, работает по шуму с более-менее нормальным распределением. Поэтому совершенно не требуется находить медиану, достаточно убрать некоторое количество крайних значений (не более 20...25% массива) и таким образом импульсные помехи будут устранены, а остальное подвергается линейной фильтрации.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 13:53:44

Да, спасибо. А тогда скажите, как вы находите эти самые макс и мин? И сколько в цифре - это самое пустое значение? Как вы его обозначаете?

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 14:10:59

Для 12-разрядных чисел (у меня в основном такая разрядность входящих массивов) я беру +32767. Это допускает как знаковое, так и беззнаковое предствление.
По поводу определения макс и мин.
Определяем две пары локальных переменных. Одна для нахождения максимума, а вторая для нахождения минимума. Каждая пара содержит одну переменную текущего значения и вторую - текущий индекс-указатель на это значение.
В текущие значения на старте цикла записываем границы диапазона чисел (для минимума - максимальное, для максимума минимальное). Значения индексных переменных можно не определять. Бежим по массиву и при условии обновления текущего максимального или текущего минимального значения вписываем текущий индекс массива в соответствующий индекс-указатель. В конце цикла получаем два значения индекса-указателя для "вычеркивания". При переборе массива так же проверяется пустое значение и тогда значение по этому индексу пропускается.
Делаем N таких проходов и убираем 2*N значений массива.
Ответить