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

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

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

Добавлено after 2 minutes 33 seconds:
И да, программа будет на СИ.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25398
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Вам следует описать конечную задачу.
Что вообще вы измеряете?
Одно могу сказать точно. Для уменьшения уровня шумов нужно накопление сигнала.
Расчет СКЗ таким накоплением не является.
ЗЫ. Язык написания программы для алгоритма безразличен.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Сообщение Alex_641 »

Я писал что вольты, но если конкретнее то это будет мегаометр, ну соответственно Мк будет высчитывать уже из вольтов мегаомы согласно закону Ома. Там при максимальном напряжении 1000 вольт , на входе мк после делителя получается 1 вольт. Ареф хочу сделать тоже 1 вольт. И замерять сопротивление от 0,1 до 100 Мегоом.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

отсечь с права и с лева несколько показаний
Не обязательно отсекать. Классический медианный фильтр - сортировка N значений по возрастанию и выбор значения из середины отсортированного массива. А еще есть фильтр Калмана
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

метод квадратов...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25398
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4366558#p4366558"]Я писал что вольты, но если конкретнее то это будет мегаометр[/uquote]
То есть речь идёт об измерении постоянного напряжения. Тогда среднеквадратичное значение вам не требуется. СКЗ - это для периодических сигналов.
Ссылку вам привели, но добавлю, что экспоненциальный фильтр - это то, что вас устроит лучше всего. Именно он там и описан - это простейший ФНЧ первого порядка с бесконечной импульсной характеристикой (БИХ). Его иногда называют бета-фильтр. Правда он требует для расчета избыточной к разрядности входного сигнала собственной разрядности. То есть реализован в большинстве случаев в дробных числах с фиксированной точкой. Но зато не требует памяти. Альтернативой будет фильтр с буфером (окном) накопления. Это фильтр с конечной импульсной характеристикой (КИХ). Он требует объема ОЗУ для буфера.
Все это относится к линейной фильтрации.
Озвученный вами ранее способ выбрасывания крайних значений - это нелинейная фильтрация. Упрощение медианного фильтра. Такие фильтры хорошо работают по импульсным помехам. Такие фильтры применяют до линейной фильтрации. Все они очень ресурсоемки для производительности и всегда требуют буфер.

Добавлено after 8 minutes 10 seconds:
[uquote="MLX90640",url="/forum/viewtopic.php?p=4366563#p4366563"]Не обязательно отсекать. Классический медианный фильтр - сортировка N значений по возрастанию и выбор значения из середины[/uquote]
Отсекать и выбирать середину - это одно и то же. Сортировать для МК - это бессмысленная избыточная производительность. С учетом применения 8-битника это особо заметно.
Для медианы нужно отбрасывать крайние значения до оставления одного. Оно и будет медианой.
Но можно отбрасывать не все, а остальное фильтровать линейно.
ЗЫ Калмана ему не потянуть. Это перебор.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Для медианы нужно отбрасывать крайние значения до оставления одного.
Допустим, вы получили значения
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 раз.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Есть способ попроще. Среднеарифметическое. Скажем, 100 мс собираем показания. Усредняем. Выводим раз в 200-500 мс текущие показания. Если же действительно есть сильные помехи, тогда уже другие способы.
Нечто подобное есть на промышленных термоконтроллерах. Параметр - период вывода показаний. Пример. Есть термоконтроллер, у которого период 100 мс. В некоторых случаях показания прыгают. На несколько десятых градусов. Это раздражает. Поэтому увеличиваем этот параметр и не паримся.
Контактная информация:
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

нет
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Медианный фильтр работает лучше среднеарифметического, потому как лучше устраняет случайные короткие выбросы. А уж после медианного можно уже и среднеарифметический, коль хочется, поставить.
Выше я показал, как работает медианный фильтр. В показанном примере значения 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 раза.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

MLX90640, сенкс. Запомню.
Контактная информация:
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4366549#p4366549"]что бы минимизировать "прыжки" показаний... программа будет на СИ.[/uquote]
в радиоуправлении
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 КБ) 138 скачиваний
мы теряем разрядность... но зато "прыжки" показаний отсутствуют... от слова совсем))

мы измеряли таким образом ток, напряжение, частоту оборотов двигателя, температуру... и т.д.
:tea:
Друг Кота
Аватара пользователя
Сообщения: 25398
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4366580#p4366580"]
Для медианы нужно отбрасывать крайние значения до оставления одного.
Допустим, вы получили значения][/uquote]
Занятная интепретация. Вообще то речь шла о крайних значениях, а не о крайних адресах... Почувствуйте разницу...
ЗЫ. Вы когда нибудь оценивали требуемые ресурсы для быстрой сортировки?
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

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

Сообщение КРАМ »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4366718#p4366718"]там чётко сказано - выбирается середина из УПОРЯДОЧЕННЫХ, то есть отсортированных данных. Иначе вообще нет смысла[/uquote]
:)
Не расстраивайте меня. Я начинаю подозревать у вас формальный подход к решению задач...
То, о чем я выше написал является КЛАССИЧЕСКИМ МЕДИАННЫМ ФИЛЬТРОМ. Единственная проблема такого метода в том, что диапазон разрешенных чисел должен быть уменьшен на единицу. Но при данных из 10 разрядного АЦП это не является проблемой. Под понятием "выбрасывания" данных понимается присвоение им пустого значения, то есть того самого из отсутствующего в диапазоне принимаемых чисел.
По поводу моего опыта.
Примерно в 50% разработанных мной серийных изделий медианная фильтрация делается именно так. В других изделиях она просто не нужна. Сортировка требует не нативного для МК перемещения чисел. Это очень ресурсоемкая операция.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

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

В сортировке участвуют два числа в один момент времени. И они не перемещаются, а через промежуточную переменную изменяют свои значения методом присвоения.
Друг Кота
Аватара пользователя
Сообщения: 25398
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4366737#p4366737"]Хорошо. Тогда поясните плиз , каким способом определяете, какое значение нужно выкинуть[/uquote]
Пардон, я же вам это СРАЗУ написал. В одном цикле определяется минимальное и максимальное значения (они в русском языке называются крайними) и они заменяются пустыми значениями. В следующем повторяется, а пустые пропускаются. Математически это идентично сортировке, только отсутствует перемещение чисел.
[uquote="MLX90640",url="/forum/viewtopic.php?p=4366737#p4366737"]В сортировке участвуют два числа в один момент времени. И они не перемещаются, а через промежуточную переменную изменяют свои значения методом присвоения.[/uquote]
Вы оперируете понятиями метапрограммирования. В МК есть конкретные доступные инструкции. То, что вы так просто изложили КРАТНО увеличивает время исполнения.
Так, в платформе dsPIC33 есть инструкция обмена значениями двух РОНов. Это очень удобно для сортировки, но сортировка происходит не в РОНах, а в ОЗУ.
ЗЫ. Кстати, при сортировке необходимо довести процесс до конца, однако медианный фильтр очень плохо, а точнее НИКАК, работает по шуму с более-менее нормальным распределением. Поэтому совершенно не требуется находить медиану, достаточно убрать некоторое количество крайних значений (не более 20...25% массива) и таким образом импульсные помехи будут устранены, а остальное подвергается линейной фильтрации.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Сообщение MLX90640 »

Да, спасибо. А тогда скажите, как вы находите эти самые макс и мин? И сколько в цифре - это самое пустое значение? Как вы его обозначаете?
Друг Кота
Аватара пользователя
Сообщения: 25398
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

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

Вернуться в «AVR»