Jump to content

    
Sign in to follow this  
Wantcan

Усреднение вычислений АЦП

Recommended Posts

Да как же они могут вести себя одинаково, если у них и ФЧХ и ПХ разные!?

В первом посте автор топика обозначил задачу - "показывать на индикаторе среднее значение", для этой задачи различия КИХ и БИХ фильтров несущественны - оба являются инерционным звеном и справляются с поставленной задачей. Приведённая мной формула экспоненциального скользящего среднего позволяет обойтись без хранения массива измеренных значений и их пересуммирования на каждом цикле измерения.

Может быть, автору окажется полезной статья "Выбор типа скользящих средних" , которую я прикрепил к сообщению. Кстати, в ней на 52 странице приведены импульсные характеристики различных типов усреднения. Сравнив графики б) и г) легко убедиться, что ИХ простого взвешенного усреднения и экспоненциального весьма схожи.

50_55.pdf

Share this post


Link to post
Share on other sites
Вообще-то это пример фильтра EMA (экспоненциальное скользящее среднее), а не SMA (простое скользящее среднее). В общем виде EMA выглядит как рекурсия Y(i+1)=Y(i)+(X(i)–Y(i))*K, где K=2/(N+1), Y(i+1) выходное значение фильтра, Y(i) - предыдущее выходное значение фильтра, X(i) - значение текущего отсчета. N имеет тот же смысл, что и "тау" RC-цепочки.

Смысл может и тот же, а насчет численного значения я сильно сомневаюсь. Чтобы получить фильтр с постоянной времени tau, коэффициент вычисляется по формуле K = 1 - exp(-T/tau), где T - период следования входных отсчетов.

Share this post


Link to post
Share on other sites
Смысл может и тот же, а насчет численного значения я сильно сомневаюсь. Чтобы получить фильтр с постоянной времени tau, коэффициент вычисляется по формуле K = 1 - exp(-T/tau), где T - период следования входных отсчетов.

Вот то-то и оно. Знания и вера входят в конфликт.

Инженер, чтобы устранить мигание цифр на индикаторе, возьмет среднее арифметическое от 2-4 измерений. Или даже в АЦП что-нибудь из двух компонентов придумает.

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

Share this post


Link to post
Share on other sites
Инженер, чтобы устранить мигание цифр на индикаторе, возьмет среднее арифметическое от 2-4 измерений. Или даже в АЦП что-нибудь из двух компонентов придумает.

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

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

 

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

 

Что же касается фильтра T_ave += (T_in - T_ave) / K то для него не требуется никакой плавающей точки - он работает c целыми переменными практически в таком виде как я здесь написал. Если же вы имеете в виду экспоненту для для вычисления K, то она вычисляется один раз на калькуляторе, а если она является степенью двойки, то не требуется даже деления, можно обойтись сдвигами. А дополнительные килобайты нужны как раз при вычислении среднего арифметического - в данном случае кроме текущего и предыдущего отсчетов хранить ничего не требуется.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Кстати, в ней на 52 странице приведены импульсные характеристики различных типов усреднения. Сравнив графики б) и г) легко убедиться, что ИХ простого взвешенного усреднения и экспоненциального весьма схожи.
Действительно схожи. Видимо я что-то перепутал или подзабыл :(

Смысл может и тот же, а насчет численного значения я сильно сомневаюсь. Чтобы получить фильтр с постоянной времени tau, коэффициент вычисляется по формуле K = 1 - exp(-T/tau), где T - период следования входных отсчетов.
А где это вы увидели, что я утверждал про идентичность численных значений? :cranky: Для EMA через количество отсчетов равное N величина выходного сигнала сравняется со величиной входного единичного импульсного сигнала. Для настоящей RC-цепочки, если на вход подан единичный импульсный сигнал, то через промежуток времени равный τ=RC величина сигнала на выходе фильтра увеличиться в e раз.

Да, расчет для RC не очень простой, но существует радиолюбительские правила "пяти тау" и "двадцати тау". Первое гласит, что "за время равное τ=5*RC напряжение на конденсаторе RC-цепочки достигнет (с приемлимой точностью) 99% от входного". И соответственно для правила "двадцати тау" то же самое, но для τ=20*RC и отношение - 99,9%.

Share this post


Link to post
Share on other sites
Для настоящей RC-цепочки, если на вход подан единичный импульсный сигнал, то через промежуток времени равный τ=RC величина сигнала на выходе фильтра увеличиться в e раз.

Удивительные вещи Вы пишите... Праздники не проходят бесследно?

Share this post


Link to post
Share on other sites
Действительно схожи. Видимо я что-то перепутал или подзабыл :(

Экспонента и прямая?.. Да, схожи, но... при наличии достаточного воображения. Или после 300...500 граммов.

 

Для настоящей RC-цепочки, если на вход подан единичный импульсный сигнал, то через промежуток времени равный τ=RC величина сигнала на выходе фильтра увеличиться в e раз.

Удивительные вещи Вы пишите... Праздники не проходят бесследно?

Да ладно вам придираться, все поняли о чем речь. Это если на входе единичный сигнал упал в 0, то на выходе он уменьшится в e раз через время tau=RC. На выходе этого фильтра, тоже.

Share this post


Link to post
Share on other sites
Для настоящей RC-цепочки, если на вход подан единичный импульсный сигнал, то через промежуток времени равный τ=RC величина сигнала на выходе фильтра увеличиться в e раз.
Я предпочитаю несколько другое "качественное" понимание T=RC: касательная проведённая в момент времени 0 к экспоненте пересечёт линию установившегося значения этой экспоненты в момент времени Т=RC - это я так, к слову:)

Share this post


Link to post
Share on other sites

Возник вопрос по формуле T_average = T_average + (T_current - T_average) / 20.0.

 

Если я правильно понял, то первое значение лучше сразу занести в переменную T_average.

А если не записать, то показания будут нарастать в зависимости от кол-ва отсчётов ?

Share this post


Link to post
Share on other sites
Возник вопрос по формуле T_average = T_average + (T_current - T_average) / 20.0.

 

Если я правильно понял, то первое значение лучше сразу занести в переменную T_average.

А если не записать, то показания будут нарастать в зависимости от кол-ва отсчётов ?

Да, лучше инициализировать не нулем, а первым считанным значением, тогда фильтру не придется долго выходить на установившееся значение. А формулу лучше представить в сишном виде, даже если будешь реализовывать ее на ассемблере, легче для понимания:

 

T_average += (T_current - T_average) / 20.0.

 

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

Share this post


Link to post
Share on other sites

Хочу сказать, что для фильтрации данных с АЦП применил программный ФНЧ, любезно выложенный defunc в одной из веток AVR. Результатом остался доволен!!!

Share this post


Link to post
Share on other sites
haker_fox, прошу тнуть пальцем в то место форума,о котором вы упомянули,т.к. для меня все еще актуальна эта тема..

То есть вы упорно пытаетесь усреднить помехи, вместо того, чтобы устранить их?

Share this post


Link to post
Share on other sites
То есть вы упорно пытаетесь усреднить помехи, вместо того, чтобы устранить их?

Так ведь, "усреднить помехи" по сути и означает отфильтровать их, т.е. - устранить.. Или нет?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this