Фильтрация ошибки младшего бита АЦП

Тема в разделе "WASM.ZEN", создана пользователем Y_Mur, 11 ноя 2010.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В мануалах по аналогово-цифровым преобразователям (АЦП) обычно честно говорится что младший бит может быть ошибочным.
    Допустим есть 10 битный АЦП с ошибкой в младшем бите, а нужен 8 битный результат, то вроде бы при запасе точности в 2 бита можно рассчитывать что нужные 8 бит будут точными, но если просто отбросить младшие биты, то числа:
    0001111111
    0010000000
    отличающиеся на один превратятся в
    00011111
    00100000
    также отличающиеся на один.

    Если использовать округление (при отбрасывани 11 или 10 прибавлять единицу, а 01 и 00 просто отбрасывать) тогда числа:
    0001111101
    0001111110
    отличающиеся на единицу опять округлятся до:
    00011111
    00100000

    Т.е. в обоих случаях оказывается возможным что два числа отличающиеся младшим из 10 битов (а он может быть ошибочным) и в 8 битном варианте тоже будут отличаться одним битом, но теперь уже младшим из 8.

    Так как всё-таки использовать этот 2х битный запас точности и из 10 битного числа с ошибкой в 1/1023 диапазона получить _точное_ 8 битное число, а не число с ошибкой увеличенной до 1/255 диапазона?

    PS: Чем дольше над этим медитирую, тем больше склоняюсь к мысли что эта простейшая на первый взгляд задача на самом деле решения не имеет и ошибка равная величине младшего бита неизбежна сколько бы младших разрядов ни отбрасывалось. Она "отращивается" как второй полюс магнита сколько его ни отрезай...
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Y_Mur
    А нельзя продублировать младший бит , добавили 1 старший разряд (дополнительный). Тогда будет + 1 бит, но начальный разряд можно сразу заменять самым верхним.
    Пришло число
    1000011110
    Допуская что 0 разряд - с ошибкой. Чекаем самый верхний. И видим, что да, пришел с ошибкой. В итоге будет число:
    000011111
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    А что надо то? Надо начать с формализации задачи.
    Например так: пускай есть a,b прочитанные с АЦП. Нам нужна функция f, такая что, если abs(a-b)<2, то f(a)==f(b).
    Я правильно понял? Но такой функции не существует: по-моему, я даже доказательство этого вижу.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    TermoSINteZ
    Ничего не понял в #2.
    Задача на округление - как получить из 10 битного числа 8 битное так чтобы возможная ошибка в младшем бите отбросилась вместе с младшими битами, а не увеличилась в 4 раза.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    r90
    Такая формулировка похожа на то что нужно - если ещё и доказательство сможешь сформулировать то хотя-бы станет понятно почему это не получится.
    Хотя на уровне "интуитивных образов" всё таки есть смутное ощущение возможности отфильтровать слабую помеху на фоне большого сигнала.
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Y_Mur
    Я всего лишь предложил без округления. Допустим есть 10 бит. из них 9 значимых, а 10ый - дублирующий. В 10ый бит дублировать нулевой. При приеме на другом конце - восстанавливаем из 10ого бита в нулевой.
    Вам даже один бит будет лишним ) (так как их 9 , а требуется 8).
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    TermoSINteZ
    Нет ошибка возникает не при передаче куда-то а уже исходно содержится в данных (например одно и то же входное напряжение может оцифроваться допустим один раз как 517, другой как 518 и т.п.), но есть запас по точности, т.е. мне достаточно дипазона 0-255 вместо 0-1023, и я хотел бы чтобы при этом преобразовании связанном с отбрасыванием не значащих младших бит отбросилась бы и ошибка в 1/1023, а она вместо этого упорно превращается в 1/255.
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Y_Mur
    Понятно. Помехи фильтруются если известна их природа. Если вы можете задетектить помеху в вашем сигнале - то можете придумать функцию которую предположил r90. Считайте обратно пропорциональна помехе. Но вы скорее всего не знаете ничего о помехе и даже о том была ли она. Следовательно - ничего не выйдет - разве что посылать сигнал несколько раз (хотя тоже не факт, что поможет, помеха может быть стабильной).
     
  9. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Сдвиг в право на 2 разряда с сохранением знака(если таковой имеется)(фактически является уменьшением чуствительности АЦП),
    но это не решит вашу проблему.
    Стандартным решением устранения "дребезга" является использование цифрового(или аналогового(что хуже), если "вычислительная мощь" не позволяет) фильтра(для некоторого числа выборок вычисляется среднее значение, и выполняется "обрезка пиков"(то есть если предполагается что сигнал инертен(что обычно и бывает) и внезапно одна или несколько из вборок значительно отличаются от предыдущих - это помеха)), недостатком такого ришения является некототарая задержка сигнала.

    ADD: Ещё возможное решение - петля гистерезиса в цифровом исполнении(для чего вам понадобятся два отброшеных бита):
    Допустим сигнал растёт а затем спадает колебаясь на один бит:
    \\Нарастание
    ...
    1.1~1.2=1
    1.2~1.3=1
    1.3~2.0=2 \\Когда становится равным перключается на 2
    2.0~2.1=2
    2.1~2.2=2
    2.2~2.3=2
    2.3~3.0=3 \\Аналогично на 3
    2.0~3.1=3
    ...
    \\Спад
    ...
    3.1~3.0=3
    3.0~2.3=3
    2.3~2.2=3
    2.2~2.1=3
    2.1~2.0=2 \\Переключается назад
    2.0~1.3=2
    1.3~1.2=2
    1.2~1.1=2
    ...
    Както так.
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Y_Mur
    Могу. Только там условие на f слабое. Под то условие вполне покатит функция f(x)=const. Надо так:
    пускай есть a,b прочитанные с АЦП. Нам нужна функция f, такая что:
    1. если abs(a-b)<2, то f(a)==f(b);
    2. если abs(a-b)>=2, то f(a)!=f(b).

    Надо предположить, что такая функция уже есть, и рассмотреть три числа: 0, 1, 2. По определению f, мы имеем:
    f(0) == f(1), f(1) == f(2), следовательно (== у нас транзитивная операция) f(0) == f(2). Но по определению же f: f(0)!=f(2). Противоречие.
     
  11. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    По вопросам точности чифровых приборов могу сказать, что не зависимо от выбраного числа разрядов Вы всегда будете иметь ошибку в мадшем разряде. Такова правда, и от этого Вы никуда не денетесь.
    Если Вам нужна точность, то используйте 10 разрядов для измерения и всех расчетов.
    Ибо ничто никуда не девается, и ниоткуда не берется. Выбросил пару бит - вот и результат.
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Я чего-то не понимаю, или Вы хотите не терять точности, округляя (АЦП с его ошибкой — вообще иррелевантные данные)?
    Звучит примерно так: у меня есть число пи с погрешностью 10^-25. Я хочу округлить его до целых, но чтобы погрешность так и осталась 10^-25.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TermoSINteZ
    В данном случае помехи совершенно нипричём. При квантовании сигнала уровень его округляется пока не сработает триггерная схема. Тоесть например в последовательном АЦП(Счётчик -> ЦАП -> Компаратор) на каждой итерации напряжение на выходе ЦАП будет иметь дискретные значения. Нужно увеличить разрядность, либо использовать корректировку(используя есчо один ацп).
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    AlexCab
    Нахождение среднего не годится, т.к. не борется с равновероятной помехой, в этом случае получается тот же самый пограничный случай что и с отбрасываением/округлением.

    Гистерезис не совсем то что хочется (хочется всё-таки всё сделать на основе текущей выборки), но как один из вариантов в принципе пойдёт, только мой мозг упорно отказывается выдать его программную реализацию...

    r90 доказательство не осмыслилось ;)

    S_Alex
    Похоже что это действительно так, хотя на первый взгляд и кажется невероятным и поэтому остаётся надежда что всё-таки существует хитрый "ход конём".

    l_inc
    Я хочу чтобы вместе с потерей точности на два бита потерялась и помеха, которая заведомо меньше этих двух бит - и это действительно происходит когда помеха находится в середине уровня квантования, но не происходит когда она на границе уровней - в этом случае она не пропадает а "усиливается". Чем больше уровень квантования (меньше значимых бит) тем больше вероятность отсева помехи, но "пограничные" помехи всё равно остаются.

    В #1 описано два способа повышения уровня квантования, которые пропускают эту пограничную помеху на разных значениях входного напряжения, т.е. применяем отбрасывание - находим входное напряжение с помехой, заменяем отбрасывание округлением и о чудо - помеха исчезла, но она опять появится на другом уровне напряжения, где её опять можно устранить возвращением к отбрасыванию. Это даёт призрачную надежду на существование единого алгоритма, работающего для любых уровней.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Y_Mur
    Во-первых, конечно можно, но ес-но не для каждого единичного отсчета, а только для серии из нескольких отсчетов, поскольку фильтрация всегда подразумевает тот или иной вид усреднения. По одному числу 517 нельзя определить является ли оно "истинным" или содержит ошибку на +-1, и только взяв второй, третий и т.д. отсчеты, можно "сузить интервал неопределенности".

    Во-вторых, в данном случае речь идет не только и не столько о помехах, сколько об "ошибках" квантования, которые носят "принципиальный" характер и не зависят от уровня помехи (поскольку при любом сигнале, "абсолютно точно" соответствующем некоторому уровню срабатывания АЦП, любое ничтожное "дрожание" может приводить к переходу на другой уровень). Соотв-но, никакое загрубление\округление и даже усреднение серии измерений не может полностью устранить ошибки квантования, т.к. всегда останется погрешность (неопределенность) в младшем разряде итогового значения. Например, если уровень сигнала таков, что АЦП с равной вероятностью выдает значения 517 и 518, значит истинное значение равно 517.5, однако при его округлении к целому по любому будут с равной вероятностью получаться те же 517 или 518. Если же увеличить разрядность и брать в кач-ве рез-та число 517.5 или 517.5*10=5175, то относительная точность при этом будет выше, однако рез-ты по прежнему могут "болтаться" в младших разрядах увеличенной сетки. Уж такова природа аналоговых сигналов = вещественных чисел, что их невозможно абсолютно точно представить в ограниченной разрядной сетке.
     
  16. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Очень много лет назад мы пытались решить эту проблему так: следили за дрожанием 2 младших битов АЦП и вычисляли условные вероятности появления: 0 после 0, 1 после 0 и т.п. - т.е всех возможных значений после всех возможных предыдущих. А потом пытались предсказывать ошибку на 1 отсчет вперед и вычитали ее. Правда, тогда было подозрение, что ошибка не равновероятная, а какая-то коррелированная наводка от работающего за стенкой оборудования.
    Потом прямо в таком виде сдали продукт заказчику: по желанию, он мог вкл/выкл эту коррекцию.
     
  17. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Y_Mur

    Код (Text):
    1. \\Var
    2. In   VAR ?[w]              \\Сюда поступают значения от АЦП (10 бит).
    3. Out  VAR ?[b]              \\От сюдова можно читать результат(но изменять нельзя - должна хранить предыдущий)(8 бит).
    4. \\Code(Обработка одной выборки)
    5. << Out = W ?[w]            \\Востанавливаем пержний результат до 10 бит путём сдвига влево, и помещаем в перменную "W"
    6. (>> In)[:b] = Out          \\Округляем новое значение до 8 бит
    7. In - W = D ?[w]            \\Вычисляет разницу новой и предыдущей выборки в перменную "D"
    8. IF D OF -3~-1 THEN: Out + 1\\При спаде значения (когда "D" будет отрицательным) продолжаем удерживть предыдущее
    9.                            \\значение "Out" пока значение "D" не привысит -3.
    Перевести это на язык вашей среды и проверить прийдётся вам.
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Ну так она и теряется. Во всех случаях. Она прямо тонет в погрешности, введённой уничтожением нужных значащих цифр. И дальше это уже будет погрешность "квантования", а не исходная помеха.
    Если Вы знаете, что погрешность в 1 бит, то и отбрасывайте ровно один бит, а не половину значащих цифр.

    Вы бьёте в шляпку гвоздя, надяесь, что он выпадет из стены... Мало того, ещё и спрашиваете: а может надо просто большее число раз ударить? А в #1 описано два разных молотка, которыми бить.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Y_Mur
    О какой помехе вы говорите ?
    Разрядность счётчика определяет уровень срабатывания компаратора, тоесть прекращение вычисления уровня сигнала. И нет никаких последних бит в помехе - счётчик двоичный.

    Если вы под АЦП понимаете старинные схемы, где на цепочку R-2R навешаны усилители - так это нигде не применяется фактически. Все современные АЦП последовательные.
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    S_Alex практически тоже самое уже сказал, просто не хочу пока сдаваться пока есть смутная надежда, возможно основанная на простом недопонимании.

    l_inc
    Не сразу прочуствовал насколько хорош пример с Пи :)
    Хочу имея Пи = 3.1415926535 ± 1e-10 округлить его до 3.14, но так чтобы из-за +1e-10 оно не превращалось в 3.15, а из-за -1e-10 в 3.13 :)) Думаю ни кто не будет спорить что с Пи это возможно ;) вот только непонятно как это обобщить на случай произвольного числа, включая числа вида 1.1999999999 реагирующее на +1e-10 или 1.2000000000, реагирующее на -1e-10. Округление решает эту проблему с числами 1.1999999999 и 1.2000000000, но обламывается на числах 1.1999999994 и 1.1999999995.

    Есть мысль пошаманить со сменой системы счисления, напрмер 1.1999999999 в двоичном виде теряет своё "пакостное свойство", также как и "коварное" двоичное 10111111111 в десятичном варианте будет "безобидным" 1535, но пока не очень понятно как это привязать к практике и удастся ли в итоге сэкономить биты.

    Clerk
    В последовательных АЦП проблема неточности младшего бита никуда не делась (leo и S_Alex вообще считают что её в принципе нельзя никуда деть). Простейший вариант увидеть это - подключить к последовательному АЦП любого современного МК потенциометр и попытаться добиться чтобы младший бит не дрожал при любом положении движка - загрублять (отбрасыванием младших битов) можно очень сильно, но всё равно находятся такие положения в которых дрожание младшего бита (из оставленнных после загрубления) имеется.