Почему вы не можете просто усреднить образцы АЦП, чтобы получить большее разрешение от АЦП?


8

Я пытаюсь получить более 10 бит точности от моего АЦП Arduino, но я не могу понять теорию, стоящую за этим. В часто цитируемой заметке по применению Atmel ( http://www.atmel.com/Images/doc8003.pdf ) говорится, что

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

Тогда то, что они предлагают для «Децимации», это перемещение десятичной точки. Что равняется уменьшению двоичного значения для каждого места, куда вы его перемещаете, так что вы также можете разделить базовое значение 10 на 2, 4 или 8, или что у вас есть. Я неправильно понимаю децимацию?


«В сочетании с передискретизацией, которая увеличивает разрешение», - я думаю, они говорят, что для получения более высокого разрешения нужно брать больше образцов. (В отличие от чего, я не знаю. Может, они думают, что кто-то будет настолько глуп, чтобы снова и снова усреднять один и тот же образец?)
user253751

В области DSP (цифровая обработка сигналов) термин «децимация» означает обычный алгоритм удаления (отбрасывания) выборок, если они сильно не меняются (при избыточной дискретизации значительно выше границы Найквиста сигнала или после фильтра сглаживания). Этот термин происходит от практики в Древнем Риме (?) Убивать каждого, скажем, третьего солдата в полку, который потерпел неудачу на поле битвы.
Ale..chenski

И я не вижу, где статья Atmel предлагает переместить любые десятичные точки, хотя это может быть частью алгоритма усреднения.
Ale..chenski

Ответы:


7

Я взглянул на записку, и это действительно странное утверждение (или запутанный способ сказать, что они на самом деле означают).

Возможно, что они на самом деле означают, так это то, что если вы хотите получить большее разрешение, вы не можете разделить / сдвинуть число после того же масштаба, что и отдельный образец, потому что (в целочисленной арифметике) это отбросит полученные вами биты.

Если ваши образцы АЦП шумят , то, конечно, вы можете разделить, чтобы получить менее шумное значение в исходном масштабе.


Еще одна вещь, о которой я подумал только из вашего вопроса, заключалась в том, что для правильной передискретизации вам нужно использовать эффективный фильтр нижних частот, а прямая скользящая средняя не так хороша в качестве фильтра нижних частот, как правильно спроектированная КИХ. (или IIR) фильтр - но это, кажется, не поддерживается текстом заметки.


Фильтр нижних частот или фильтр скользящего среднего не будет отфильтровывать шум 1 / f, что является
Voltage Spike

16

Если вы попросите кого-нибудь измерить доску размером 45,2 см с точностью до ближайшего сантиметра, он ответит (или должен) ответить 45. Если вы попросите измерить ее еще раз, он ответит 45 снова. Повторите упражнение еще 8 раз, и среднее значение всех измерений должно быть ровно 45. Независимо от того, сколько раз один из них сэмплирует входной сигнал, в итоге получится значение 45. Среднее значение всех этих показаний, конечно, будет 45 (хотя доска длиной 45,2 см).

Если у вас есть человек, отрегулируйте измерительный прибор так, чтобы перед первым измерением он показывал 0,45 см в длину, 0,35 см до второго, 0,05 см до пятого, 0,05 см до шестого и т. Д. До 0,45 см до десятое, затем два из измерений будет читать 46, а остальные восемь будет 45. Среднее из всех будет 45,2.

На практике, управлять сложностями так сложно. Если перед каждым измерением случайным образом настраивать измерительное устройство для считывания где-то между 0,5 см в длину и 0,5 см в длину, то примерно 1/5 измерений будет считывать 46, а остальные 45, но поскольку корректировки являются случайными, фактическая доля может быть выше или ниже. Проведение десяти измерений не добавит значимости точности, но в среднем около 100.

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

Между прочим, в первоначальном использовании, чтобы «уничтожить» армию, нужно было убить 1/10 солдат в ней. Удалить данные из АЦП означает отбросить их часть. Общий префикс с фразой «десятичная точка» не подразумевает ассоциацию.


14

Короткий ответ - шум, и не обязательно шум, который имеет значение, но тип шума . Другая проблема - это нелинейные эффекты, такие как INL, которые сбрасывают среднее значение.

Сначала на шум:

Если бы мы попробовали распределение Гаусса, оно выглядело бы примерно так:

введите описание изображения здесь

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

μ=1ni=1nxi

Проблема заключается в фликкер-шуме или 1 / f-шуме, он смещает среднее гауссовское значение и приводит к сбою статистики, поскольку распределение больше не является гауссовским.

Это плохая модель, но вы могли бы подумать, что она выглядит примерно так: INL - это тоже проблема, потому что она может внести несколько ошибок, которые также отбрасывают среднее.

μ=1ni=1nxi+error

Это, вероятно, сбивает с толку, давайте посмотрим на временную область, как показано ниже

На верхнем изображении вы можете увидеть сигнал с гауссовским шумом, было бы легко «нарисовать линию» через середину и найти среднее значение. Чем больше выборки у вас от такого сигнала, тем выше точность и знание среднего значения.

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

Проблема в том, что большинство электроники имеют фликкер-шум, резисторы - нет (при условии, что температура в помещении не влияет), а транзисторы и микросхемы - нет. Существуют усилители, называемые прерывистыми усилителями, которые преодолевают эти эффекты.

Еще одна вещь, которую нужно знать, это то, что есть АЦП (линейный имеет новое ядро ​​SAR), где инженеры работали над устранением эффектов 1 / f-шума (и других нелинейных эффектов АЦП, таких как INL) до уровня намного ниже, чем бит АЦП. ценность. Вы можете использовать избыточную дискретизацию и получать 32-битные значения из 14-битного ядра.

Источник: EDN- 1 / f Noise - мерцающая свеча введите описание изображения здесь


Очень интересно, но я не думаю, что примечание к заявлению
касалось

Все хорошие моменты; простой фильтр усреднения - это SINC (все коэффициенты одинаковы), но он никогда не может полностью сойтись (цитата позже - используя телефон прямо сейчас).
Питер Смит

6

Тогда то, что они предлагают для «Децимации», это перемещение десятичной точки.

не совсем. часть прореживания утверждает, что, на мой взгляд, правильно, что нормальное «усреднение» нескольких выборок, но с сохранением битовой ширины, не сохраняет столько информации. Таким образом, если вы усредните m n-битных показаний АЦП, полученное среднее значение все равно будет n-разрядным показанием АЦП.

предложенный подход состоит в том, чтобы, мягко говоря, усреднить n-разрядные показания АЦП, чтобы полученное среднее значение имело более высокую битовую ширину. Например, суммирование 4 10-разрядных показаний АЦП и деление суммы на 2 дает 11-разрядное считывание АЦП.

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

другой момент, что для уменьшения шума передискретизация эффективна только при наличии шума. Если бы у вас был 10-разрядный АЦП, разработанный Богом (т. Е. Каждое чтение - это абсолютное истинное чтение, без изменений), избыточная выборка не сработала бы.

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


> Это простое усреднение людьми в сети широко понимается как неправильный подход. нет, если вы усредните их как поплавки
Plumpie

4

Во-первых, АЦП только так хорошо, как его источник опорного напряжения. Если ваш Arduino использует + 5 В в качестве эталона, вы можете забыть о любой точности, так как регулятор + 5 В довольно шумный, с низкой точностью, например, 1-5%, и его выходное напряжение будет зависеть от величины тока, потребляемого от это, как во время измерения, а также в последние несколько миллисекунд.

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

Я не проверял SAR ADC внутри Arduino. У меня есть опыт работы с AT90PWM3B, близким родственником. Это довольно хорошо. При постоянном входном напряжении вы снова и снова получаете одно и то же значение АЦП, когда 1 LSB колеблется, если напряжение находится между значениями. Не могу ожидать лучшего результата от SAR ADC. (Я использовал хороший источник внешнего напряжения)

Итак, шум здесь не проблема ...

На самом деле, шум твой друг ...

Давайте предположим, что напряжение, которое вы хотите измерить, падает на значение АЦП 100.1.

Вы делаете 10 измерений, но так как АЦП хорош, вы получаете 100 каждый раз!

Таким образом, вам нужно немного шума в вашем сигнале, например, один LSB шума, чтобы гарантировать, что если вы измерите 100,1, то вы получите 100 в девяти случаях из десяти и 101 в одном случае из десяти. Таким образом, это будет в среднем до 100,1, получить идею?

Если это исходит от датчика, обычно у вас будет достаточно шума бесплатно.


Хорошие замечания обо всех способах, которыми я теряю точность и точность с моим текущим методом. У меня есть tl431 (прецизионный регулируемый шунт), и я попробую подключить его.
Plumpie

Линейные регуляторы напряжения имеют время отклика в диапазоне МГц и, следовательно, довольно стабильны в диапазоне частот АЦП.
JimmyB

Тогда вы можете измерять только напряжения относительно одного и того же Vcc (потенциометр, датчики типа делителя напряжения).
JimmyB

LDO с ответом "В диапазоне МГц" ???? Отправьте даташитов, я хотел бы встретиться с одним из них! Скорее всего, Arduino поставляется с отвратительным 1117 или аналогичным, который имеет медленный переходный ответ собаки ... Использование поставки в качестве эталона в любом случае не предназначено для точности.
peufeu

4

Чего вам не хватает, так это значения «прореживания».

Строго говоря, «прореживание» - это сокращение до 1/10. То есть с 10 уменьшить до 1.

«Децимация», используемая в выборке, теряет строгий смысл. Вместо 1/10 это означает «уменьшить число».

Это означает, что вы усредняете некоторое количество образцов и сокращаете количество образцов на одно и то же число.

Например, если вы производите выборку на частоте 1000 Гц и усредняете 4 выборки, вы сохраняете только среднее значение. В конце у вас есть только 250 выборок в секунду вместо 1000. Вы потеряли временное разрешение, но получили один бит разрешения напряжения.

Для каждого фактора 4 вы получаете 1 бит. Среднее и десятичное значение 4, а также разрешение от 10 бит до 11 бит.

Другой фактор 4 (4 * 4 = 16 всего) дает вам от 10 до 12 бит. Другой фактор 4 дает вам разрешение 13 бит.

Но обратите внимание, что теперь вы увеличиваете частоту дискретизации в 64 раза. Ваша эффективная частота выборки уменьшается на тот же коэффициент. Используя пример частоты дискретизации 1000 Гц, вы снижаете до 15 эффективных выборок в секунду.

Это прореживание, и именно столько старших битовых АЦП получают высокое разрешение. Они выбирают с высокой скоростью, усредняют (или используют цифровой фильтр нижних частот) и уничтожают.

В крайнем случае, у вас есть однобитный АЦП (простой компаратор), который выполняет избыточную выборку в несколько миллионных раз, чтобы получить эффективную битовую глубину в 16 бит.

Чтобы это работало, нужно помнить, что в вашем сигнале должен быть шум, примерно равный наименьшему значению, которое может измерить ваш АЦП. Для 10 разрядного АЦП с использованием опорного напряжения 5В, который был бы шум около 5мВ пика до пика.

Усреднение шума - это то, откуда на самом деле происходит усиление битов. Представьте, что у вас есть сигнал (DC), который лежит точно между значением 512 отсчетов АЦП и 513 отсчетов АЦП. Без шума измеренное значение всегда будет одинаковым - усреднение даст вам то же значение, что и выборки.

Добавьте шум примерно наименьшего измеримого значения, и это выглядит совсем иначе. Хотя сам сигнал не изменяется, измеренные значения будут «колебаться» вокруг истинного значения сигнала. Среднее значение теперь отличается от сэмплов, и чем больше сэмплов вы используете, тем ближе вы подходите к реальному значению сигнала.


Я использовал эту технику с Arduino (который использует процессор Atmel с 10-битным АЦП), чтобы получить лучшее разрешение для некоторых измерений, которые я делал.

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

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

Я обнаружил, что мне нужно как минимум 16 бит. Это означало бы в среднем 4096 образцов.
Это примерно полсекунды с использованием самой быстрой выборки, возможной с помощью программного обеспечения Arduino.

Поскольку мне потребовалось 14400 измерений, полный цикл занял бы 2 часа.

Я не такой терпеливый, и то, что я измерял, не будет оставаться постоянным так долго. Мне пришлось переключиться на использование АЦП, который использует гораздо более высокую частоту передискретизации, и которая обеспечивает более высокое разрешение выборок с более низкой скоростью.

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


3
Поскольку у вас есть время, чтобы придираться к тому, что означает децимация : строго говоря, это означает уменьшение на 1/10, оставляя 9/10 пунктов.
труба

2

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

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

Если вам нужно действительно высокое разрешение (и низкая пропускная способность), посмотрите, как работает сигма-дельта АЦП. Они имеют 1-битный высокоскоростной сигнал, который затем фильтруется до некоторой полосы пропускания с более высоким разрешением, иногда до 20 бит и более.


2

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

Усреднение работает для улучшения разрешения путем уменьшения ошибки стандартного отклонения, σ, Критерии, которым нужно соответствовать, - это то, что шум Гаусса должен просто превышать ошибку квантования. Спецификацией, которая должна быть определена, является общая ошибка, и ошибка или разрешение квантования вносят лишь незначительную сумму в общий бюджет ошибок.

Например, если вы хотите улучшить разрешение на 2 бита, но ваш шум уже составляет 3 бита, вы должны подумать, как уменьшить шум на 2 + 3 = 5 бит, одновременно увеличивая разрешение на 2 бита.

  • Это может быть цифровое решение с усреднением> 25 выборок с затратами на задержку или аналоговое решение с фильтрацией подавления шума, балансировкой сигналов для подавления синфазного шума и / или лучшим экранированием сигнала наряду с цифровым усреднением.

Где n - желаемый дополнительный бит (ы) разрешения, тогда сдвиг вправо двоичного числа (или десятичное значение) x1 равно / 2.

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

Обратите внимание, что термин «прореживание» применяется как к десятичным значениям, так и к двоичным кодированным десятичным числам. Вы можете визуализировать, если у вас есть счетчик, который читает целочисленные значения, а затем, усредняя 10 результатов, вы делите на 10, чтобы добиться улучшения с дополнительным десятичным знаком, но σ шум только уменьшается 1/10=1/3.3 для x выборок, но также и то, что задержка увеличивается на x временных выборок, поэтому для уменьшения задержки необходима передискретизация,

foversampling=4nfNyquist

Однако шум на этой частоте дискретизации,fs должно быть достаточно, чтобы сглаживать +/- 1 бит по некоторым x образцам, чтобы получить лучшее улучшение разрешения.

  • Например, если BW 10 кГц, то fNyquist= 20кГц
  • и если вы хотите преобразовать 10-битное разрешение в 12-битное, тогда n = 2. Увеличение разрешения с 10-битного до 12-битного требует суммирования 16 10-битных значений. Сумма из 16 10-битных значений генерирует 14-битный результат, в котором последние два бита не должны содержать ценной информации.

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

Чтобы оптимизировать АЦП для скорости и ошибок, необходимо определить общий бюджет ошибок и доступное разрешение (биты), требуемое ОСШ или абсолютную ошибку для любого заданного сигнала во всем диапазоне измерений. Определение всех источников ошибок на первый взгляд может показаться сложным, но в том числе необходимым;

например, ошибка усиления, ошибка смещения, ошибка квантования, ошибка шума CM, ошибка шума DM, шум Vref или ошибка смещения, шум окружающей среды и т. д., ошибка задержки (от усреднения)

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

То же самое относится к усреднению (для медленных сигналов) и передискретизации ширины полосы сигнала и децимированию для АЦП в реальном времени.

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


1

Теория, лежащая в основе этого, может быть вкратце взята из этого предложения в статье в Википедии о передискретизации :

Однако SNR увеличивается на sqrt (N) (...). Суммирование некоррелированного шума увеличивает его амплитуду на sqrt (N), в то время как суммирование когерентного сигнала увеличивает его среднее значение на N. В результате SNR (или сигнал / шум) увеличивается на sqrt (N). В этом примере это означает, что при N = 256 динамический диапазон увеличивается на 8 бит, а содержание «когерентного сигнала» увеличивается на N, но шум изменяется с коэффициентом sqrt (N) = sqrt (256). ) = 16 в примере (не путать с увеличением на 16 бит), поэтому SNR изменяется с коэффициентом 16.

Таким образом, при условии, что ваш сигнал соответствует определенным критериям (например, достаточно медленный и низкий уровень шума), вы фактически увеличиваете один бит на каждые 4 выборки. Затем для каждых 4 полученных выборок вы можете получить «соединение», а затем снова сформировать еще один образец с более высоким разрешением, чтобы в итоге вы получали log_4 (n) битов для каждого n выборок, которые вы читали на своем АЦП.

Что касается части прореживания, то она не является усреднением, особенно если принять во внимание, что мы говорим здесь о целых числах (образцы АЦП). Например, если у вас есть образцы 1, 1, 3и 2, ваша средняя будет:

int result = (1+1+3+2)/4;

Так как вы усредняете с помощью целочисленной математики, ваш «математический результат» 1,75 округляется до 1. Если вы затем умножите на 2, вы получите 2.

Теперь, если вы уничтожите это с помощью:

int result = (1+1+3+2)>>1;

Ваш результат будет 3. Вы можете утверждать, что это то же самое, что деление на 2, но, конечно, вы не можете утверждать, что 3 - это среднее 1, 1, 3 и 2 . Увидеть разницу?

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


Я чувствую, что если амплитуда шума увеличивается с sqrt (N) и когерентный сигнал увеличивается с N, тогда SNR придется увеличивать с N / sqrt (N), а не sqrt (N)
Plumpie

@Plumpie Проверьте свою математику снова N/sqrt(N) = sqrt(N).
Ронан

1

Похоже, что все уже рассмотрели теоретическую часть вашего вопроса, но, поскольку вы используете Arduino, вы можете прочитать мои приключения, пытаясь повысить разрешение АЦП с помощью этой техники:

Улучшение разрешения Arduino ADC с помощью сглаживания и передискретизации

Характер шума является важной частью истории, и оказывается, что вы можете генерировать достаточно хорошее сглаживание, просто пульсируя на контакте с резистором, пока вы читаете АЦП асинхронно. Это не идеально, и вы получаете небольшое смещение синхронизации, которое варьируется в зависимости от того, сколько дополнительных выборок / битов вы пытаетесь получить. Я также согласился бы с критикой, что эта техника зависит от плохой стабилизации рельсов в Arduino, так что в действительности она ведет к ошибкам, а не к хорошей практике. Но это очень легко сделать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.