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

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 13:08:04

ozonn, вот это как раз знать на фиг не нужно. Нужно знать функцию распределения. А после этого уже можно говорить о фильтрации и о проценте потерь информации, вызванном помехами, шумами и прочими искажениями.
Не важно буквы это или нет. Важно только то, представляет ли сама принимаемая информация белый шум или нет. Для стохастичной информации любая фильтрация бессмысленна, для детерминированной - фильтрация всегда лучше, чем ничего.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 14:16:01

Не важно буквы это или нет.

мне кажется, что важно.

Важно только то, представляет ли сама принимаемая информация белый шум или нет. Для стохастичной информации любая фильтрация бессмысленна

даже вредна

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 14:32:08

ozonn, поясню подробней. Пусть у нас принимается совершенно случайный поток букв. Причем мы точно знаем, что вместо каждой десятой буквы принимаем букву "А". Поможет ли эта информация нам восстановить утерянную букву? Никак.
Теперь пусть мы значем, что буквами передаются слова на русском языке. Тогда, например, обнаружив мягкий знак после этой каждой десятой буквы "А", мы хотя бы сможем утверждать, что там была согласная, а не гласная буква.
Более близкий к жизни пример. Теперь пусть у нас буквы образуют данные в base64, закодированные детерминированным образом. Например, кодом Рида-Соломона. Тогда, за счет детерменированности мы легко восстановим эту каждую десятую букву, даже не зная, как часто возникает ошибка и какая именно буква ошибочная.
Анализ функции распределения в математической статистике позволяет найти эту детерминированность, если она вообще есть. Поэтому я и говорю, что в общем случае, начинать надо с него.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 15:26:38

ozonn, поясню подробней. Пусть у нас принимается совершенно случайный поток букв.

я имел ввиду не случайный поток

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 15:40:40

ozonn, значит детерминированный? Вот и начинаем с поиска функции распределения для нахождения этой детерминированности.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 15:47:33

ozonn, значит детерминированный? Вот и начинаем с поиска функции распределения для нахождения этой детерминированности.

не знаю, как это сделать.

Я бы сделал так, между передающим девайсом и линией связи поставил бы контроллер, который бы формировал контрольную сумму и передавал её и инфу в линию связи. Почему так: потому, что, как я понял, числа приходят с большим периодом, порядка минут, что говорит о том, что все они важны и их нельзя усреднять и фильтровать

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 15:56:19

ozonn, большой период - это тоже детерминированность. Но тут как раз медианная фильтрация достаточна. Пусть мы считаем медиану с измерений, происходящих с частотой в N раз большей частоты изменения информации в окне фильтрации M<N. Тогда, если ошибочное значение на входах существует всегда менее, чем половина окна фильтрации, мы сможем получать правильные значения после фильтрации.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 16:02:01

ozonn, большой период - это тоже детерминированность. Но тут как раз медианная фильтрация достаточна. Пусть мы считаем медиану с измерений, происходящих с частотой в N раз большей частоты изменения информации в окне фильтрации M<N. Тогда, если ошибочное значение на входах существует всегда менее, чем половина окна фильтрации, мы сможем получать правильные значения после фильтрации.

ну вот смотри, допустим девайс выдает температуру наскольких пациентов, у одного 34, у другого 36, у третьего 39. Теперь берем и усредняем - средняя температура - 36.3.

Теперь вопрос, о чем она может сказать доктору?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 16:11:21

ozonn, а кто предлагал усреднять???

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 16:20:35

ozonn, а кто предлагал усреднять???

усреднять, как пример. Любая фильтрация предусматривает отбрасывание части данных, а это не всегда допустимо. Вся зависит от характера данных

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 17:02:51

ozonn, я тут уже битый час Вам про медианную фильтрацию рассказываю, а Вы вдруг про усреднение опять. Линейная фильтрация, частным случаем которой и является усреднение, для устранения импульсных помех не применима! От слова "вообще". Она, в отличии от медианной фильтрации, всегда искажает данные. Результатом медианной фильтрации всегда будет одно из значений выборки. Результатом линейной фильтрации, в общем случае, значение, которого в выборке не было. Разницу ощущаете?

Добавлено after 29 minutes 51 second:
ozonn, попробую на пальцах показать.
Пусть передается последовательность букв CFLLX. Пусть есть только импульсные помехи, причем длительности не более 1/4 длительности передачи. То есть, если мы будем считывать данные в шесть раз (N) чаще, чем они изменяются, то окне фильтрации из пяти (M<N) элементов у нас будет не более двух ошибочных считываний.
Например, получаем на входе такую последовательность:
CACCCE EFFFZZ LLLMNL LLLMNL XXXMNX
Вот что происходит в нашем окне. Последняя буква - медиана окна:
Код:
1   CACCC   C
2   ACCCE   C
3   CCCEE   C
4   CCEEF   E
5   CEEFF   E
6   EEFFF   F
7   EFFFZ   F
8   FFFZZ   F
9   FFZZL   F
10   FZZLL   L
11   ZZLLL   L
12   ZLLLM   L
13   LLLMN   L
14   LLMNL   L
15   LMNLL   L
16   MNLLL   L
17   NLLLM   L
18   LLLMN   L
19   LLMNL   L
20   LMNLX   M
21   MNLXX   N
22   NLXXX   X
23   LXXXM   X
24   XXXMN   X
25   XXMNX   X

Как видим, если три (M-[M/2]) значения подряд неизменны - это результат медианной фильтрации потока. Если K*6+3 (K*N+M-[M/2]) значения неизменны, то значит К символов подряд во входном потоке повторяются.
Таким образом, получим восстановленную последовательность CFLLX

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 18:29:46

baron_P, от импульсных помех избавляются медианный фильтром, а не усреднением. То бишь, формируем скользящее окно из N показаний. N - нечётное. Окно лучше формировать списком. В списке держим N последних показаний в отсортированном порядке. Среднее показание - наша медиана. При поступлении нового показания удаляем из списка самое старое показание и вставляем в список, сохраняя сортировку по значениям показаний, новое показание. Средний элемент списка снова наша медиана.

Спасибо, почитал по медианный фильтр, выглядит подходящим, но пока времени не было запрограмить. У меня на входе число 0..4095. Меняться может произвольно, но точное значение не важно - ошибка в десятки проблем не несет. А вот сотни и тысячи - уже плохо. Сигнал меняется не чаще 100 Гц. Сочетание RC-цепочки на входе и медианного фильтра, думаю, будет достаточным.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн июн 10, 2019 18:35:57

baron_P, если скорость изменения сигнала может быть различной, то есть смысл рассмотреть вариант адаптивного изменения величины окна медианного фильтра, в зависимости от скорости изменения сигнала.
Если много значительных коротких выбросов, то в медианном фильтре лучше предварительно учесть дисперсию. Например, посчитать не сразу медиану, а значения второго и третьего квартиля. Затем отсечь все выбросы, находящиеся вне диапазона между значением второго квартиля минус сигма и третьего квартиля плюс сигма, где сигма подбирается экспериментально. Например, 20. И уже по оставшимся после отсечения выбросов значений считаем медиану.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 07:29:10

ozonn, я тут уже битый час Вам про медианную фильтрацию рассказываю, а Вы вдруг про усреднение опять. Линейная фильтрация, частным случаем которой и является усреднение, для устранения импульсных помех не применима! От слова "вообще". Она, в отличии от медианной фильтрации, всегда искажает данные. Результатом медианной фильтрации всегда будет одно из значений выборки. Результатом линейной фильтрации, в общем случае, значение, которого в выборке не было. Разницу ощущаете?

нет. Потому, что часть данных теряется, а это не всегда допустимо

ozonn, попробую на пальцах показать.
Пусть передается последовательность букв CFLLX. Пусть есть только импульсные помехи, причем длительности не более 1/4 длительности передачи. То есть, если мы будем считывать данные в шесть раз (N) чаще, чем они изменяются, то окне фильтрации из пяти (M<N) элементов у нас будет не более двух ошибочных считываний.

ты не можешь считывать данные ни в шесть раз чаще, ни в шесть раз реже, поскольку передача данных синхронизирована импульсоми в специальном разряде. И то, что ты будешь считывать в промежутках между этими импульсами не имеет к действительности никакого отношения

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 07:50:03

хлопцы, тема вашего обсуждения к Си не имеет отношения... уважайте труд уборщиц, в конце концов!

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 08:08:34

ARV, вообще-то имеет, хоть и не прямое. Просто до реализации медианной фильтрации на C еще не дошли, застряв на этапе разработки алгоритма. Или Вы настаиваете на обсуждение алгоритма и кода его реализации в разных темах? Так кросс-ссылки между темами делать не удобно...
ozonn, опишите тогда именно Вашу задачу. Потому что у baron_P, сигнал меняется не чаще, чем 100 раз в секунду. Поэтому любой МК в состоянии считать его сигнал между синхроимпульсами по несколько сот раз, не то что 6, как в моем примере. Не следует так же забывать, что помеха может быть и в синхроимпульсе, что мой пример медианной фильтрации учитывает.
Кстати, можете посмотреть на алгоритм работы аппаратного USART в AVR. Каждый бит RxD считывается 16 или 8 раз, а Data Recovery Unit, благодаря этому, обеспечивает очень примитивную фильтрацию и детектирование ошибок. Почему то, что можно на USART нельзя делать в Вашем случае?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 08:20:20

ozonn, опишите тогда именно Вашу задачу.

не могу, Заратустрамодер не позволяет :))

Потому что у baron_P, сигнал меняется не чаще, чем 100 раз в секунду.

это он сейчас так написал. а ранее было:
в данном случае - частота входного сигнала очень низкая.
. Понимай, как хочешь :)

Поэтому любой МК в состоянии считать его сигнал между синхроимпульсами по несколько сот раз, не то что 6, как в моем примере.

читать-то между синхроимпульсами может, конечно, но, только то, что он в этих промежутках прочитает не имеет никакого отношения к действительности. Там мусор :)

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 08:41:07

ozonn, естественно, я не могу утверждать, что во всем промежутке между синхроимпульсами у Вас на входе сигнал содержит нужную информацию. Но если длительность стабильного значения этой информации на входе МК меньше, чем шесть операций чтения из порта у этого МК, то может быть Вы выбрали не тот МК? Или, может быть, фиксировать несколько выборок со входа надо аппаратно сдвиговым регистром? Сколько времени информация на входе у Вас стабильна? 100нс? 10нс?

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 08:52:39

ozonn, естественно, я не могу утверждать, что во всем промежутке между синхроимпульсами у Вас на входе сигнал содержит нужную информацию.

во-первых, почему у меня? :shock: Во-вторых было сказано, что есть специальный разряд, который сообщает, что на линии связи присутствуют полезные данные. или отсутствуют.

Но если длительность стабильного значения этой информации на входе МК меньше, чем шесть операций чтения из порта у этого МК, то может быть Вы выбрали не тот МК? Или, может быть, фиксировать несколько выборок со входа надо аппаратно сдвиговым регистром? Сколько времени информация на входе у Вас стабильна? 100нс? 10нс?

я никакого МК не выбирал и никакой задачи передо мной не стоит. Я просто пытался выяснить, что за данные имярек пытается фильтровать.. Из всего написанного понял, что он и сам не знает. Хотя пределя значений он обозначил, как и пределы точности.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт июн 11, 2019 08:58:15

ozonn, для ТС мое предложение подходит и он сам это подтвердил. Чего же Вы от меня хотите? Озвучьте все же свою задачу с наносекундной стабильностью входного сигнала. Только тогда можно будет что-то посоветовать. У ТС же миллисекунды, даже не микросекунды. Тут уж любой МК справится с несколькими чтениям, как AVR на USART.
Ответить