реклама на сайте
подробности

 
 
> Цифровой Фильтр на ATmega, Цифровой Фильтр на ATmega
_Ie0nid
сообщение Sep 16 2009, 04:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 20-09-08
Пользователь №: 40 344



Добрый день, давно не заходил с проблемами. КТо может помочь куском кода к цифровому фильтру для Codevision. Даже с чего начать не знаю, куда не сунусь везде только формулы да теория. Хочу попробовать отфильтровать сигнал снятый с ацп Atmegи, и преобразовать на выход с помощью ШИМ и RC цепи
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Sep 16 2009, 07:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Боюсь, что меня сейчас поколотят, но попробую облегчить вам жизнь. smile.gif
1) Берём прогу расчёта фильтров, которую я приложил.
2) Рисуем фильтр с нужными параметрами.
3) Садимся и вручную округляем коэффициенты до ближайшего двоичного (если непонятно как, то спрашивайте - поясню)
4) Переписываем (на бумаге) формулу каждого звена ч/з сдвиги
5) объединяем сдвиги и получаем общую прогу.
6) Я обычно, проверяю АЧХ полученной проги на IBM, чтобы исключить ошибки.

Правда такова, что фильтрация фильтром 2-4 порядка, часто бывает лаконичнее, эфективнее, красивее и, однозначно менее затратно по ресурсам чем скользящее усреднение.

Так, например, фильтр Y(i) = X(i) + 0.875Y(i-1) - X(i-1) прекрасно убирает постоянную составляющую. Иногда использовал такое свойство фильтра, как коэффициент передачи. Например требуется ослабить сигнал, либо наоборот его усилить.

Конечно, если более-менее сложная задача, то я сначала полностью моделирую процесс и обязательно его визуализирую. На всех этапах. Далее отрабатываю все формулы на модели. Потом уже переношу всё это на однокристалку. Для меня так проще.
Могу чего-нибудь на простом примере показать.
Прикрепленные файлы
Прикрепленный файл  ciirf1.zip ( 263.7 килобайт ) Кол-во скачиваний: 734
 
Go to the top of the page
 
+Quote Post
ZVE
сообщение Sep 17 2009, 11:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 19-11-07
Из: Vinnitsa, UA
Пользователь №: 32 472



Цитата(SasaVitebsk @ Sep 16 2009, 10:30) *
Могу чего-нибудь на простом примере показать.

Да покажите пример пожалуйста. Например приведенный Вами же фильтр который убирает постоянку.
Думаю топикстартеру будет полезно, да и многим другим тоже(в том числе и мне rolleyes.gif ).
Заранее благодарю.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 17 2009, 19:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ZVE @ Sep 17 2009, 14:18) *
Да покажите пример пожалуйста....

Я очень сильно упрощу. Те кто владеют теорией - пусть лучше не читают. smile.gif Основная цель будет - показать, что всё не так уж страшно. smile.gif Кто хочет глубже - без учебников не обойтись. Я не буду касаться таких свойств фильтров как фазовые искажения, импульсная х-ка и т.п. Только частотная и амплитудная.

Представим себе, что у нас входной сигнал 1200 Гц. Мы его принимаем на АЦП AVR. В связи с тем, что АЦП AVR работает лишь с положительным сигналом, нам пришлось его пропустить ч/з разделительный конденсатор и выставить резисторами 0.5 от опорного напряжения (типичный случай). В результате мы получаем синус от 0 до 1.1V(опора) max, что составит 0-1023 в единицах АЦП. Но для дальнейших расчтётов нам лучше работать с сигналом имеющим знак. Можно, не мудрствуя лукаво вычесть 512 и получить сигнал +/- 512. Но, резистивный делитель может быть сыставлен не совсем точно (например 0.6V) и в результате мы получим сдвинутый сигнал и соответственно постоянную составляющую в нём. Плюс, допустим мы хотим зарезать сетевые помехи (50 и 100 Гц) и какие-то высокочастотные помехи (например 5кГц). Короче мы решили слегка фильтрануть сигнал для уменьшения воздействия внешних помех. Допустим амплитудная характеристика нам важна только относительная. Ну к примеру идёт манипуляция по принципу есть сигнал/нет сигнала. smile.gif Таким образом надо его выделить и обработать пиковым детектором. smile.gif Скажем частота может плавать незначительно.

Берём прогу, что я приложил в прошлом посте (спасибо автору) и строим полосовой фильтр. (clip1)

Теперь немного о дробной арифметике.
Все знают что если 1 поделить на 2 то получим 0.5. Если ещё раз разделить = 0.25. Что такое деление на 2 - сдвиг вправо на 1 разряд. Таким образом если себе представить дробную часть, то двочное число 1000000B = 0.5, 01000000B = 0.25, 01100000B = 0.25+0125 = 0.375. Из этого понятно, что умножение на дробные коэффициенты можно представить как сдвиги и сложения. Желательно подобрать такие коэффициенты, чтобы число этих операций было минимальным при допустимой погрешности вычислений. Понятно также, что если у нас сигнал 10 бит, то сдвиги на 8-9 разрядов практически не внесут значимых результатов. Надо также учитывать, что фильтр может искажать сигнал по амплитуде. Для этого желательно следить за амплитудным значением на графике АЧХ. Для простоты картины можно отталкиваться от того, что сумма коэффициентов должна быть равна 1. Если это не так, то результирующий сигнал увеличится либо уменьшится. Часто это бывает непринципиально или даже желательно.

Исходя из этого "подкорректируем" коэффициенты X фильтра и перерисуем график воспользовавшись программой. (clip2)
Поступим аналогично с Y. (clip3)
После построения графика - видим что размах полезного сигнала изменился в 1.3 раза. Можно, естественно, подобрать коэффициенты более точно, но для поставленной задачи нам это ни к чему.

Теперь перенесём это на бумагу.
Теперь поясню, для тех кто непонимает, что это за X, Y, i. smile.gif
Надо понимать, что фильтр состоит из звеньев (в данном фильтре 1 звено). Звенья независимы. Выходные данные первого звена - входные второго. И так далее.
В данном контексте будем считать так:
X входные данные первого звена (сигнал с АЦП)
Y выходные данные первого звена (выход фильтра). Если у нас более одного звена, то Y это входные данные второго звена.
(i) текущее значение
(i-1) предыдущее значение (значение полученное в предыдущей выборке)
(i-2) значение полученное 2 выборки назад и т.д.
Я упрощу выражение и вместо X(i-1) буду писать X1 и так далее.

Итак X коэфф. фильтра будут выглядеть так:
0.0625*(X0+X4)-0.125*X2 = ((X0+X4)>>4)-(X2>>3)

Y коэф. будут выглядеть так
-(-1.875*Y1+2*Y2-1.0625*Y3+0.3125*Y4) = 1.875*Y1-2*Y2+1.0625*Y3-0.3125Y4 = 2*Y1-0.125*Y1-2*Y2+Y3+0.0625*Y3-0.3125*Y4
= (Y1<<1)-(Y1>>3)-(Y2<<1)+Y3+(Y3>>4)-(Y4>>2)-(Y4>>4)

Итого общая формула (1):
Y0 = ((X0+X4)>>4)-(X2>>3)+(Y1<<1)-(Y1>>3)-(Y2<<1)+Y3+(Y3>>4)-(Y4>>2)-(Y4>>4)

Для понимания дальнейшего я перепишу по другому первых 2 члена
((X0+X4)>>4)-(X2>>3) = ((X0+X4)>>1)-X2)>>3
По сути это вынос множителя за скобки и математически ничего не даёт. На самом деле это уменьшает объём вычислений и повышает их точность.

Давайте перепишем полученную формулу фильтра (1) с учётом последнего замечания, но не ввиде формулы, а в виде последовательности вычислений.
Для этого введём временную переменную Temp и будем выбирать равные коэф. сдвигов. Я в коментах буду указывать номер члена формулы (1) которые я взял.
В результате получим:

Temp = (X0+X4+Y3-Y4)>>1; // все члены со сдвигом 4 = 1,7,9
Temp += (-X2-Y1); // ... 3 = 2,4 Естественно лучше записать Temp -= X2+Y1;
Temp >>= 1;
Temp += (-Y4); // .... 2 = 8 Опять таки Temp -= Y4;
Temp >>= 2; // Поскольку у нас нет членов со сдвигом >>1
Temp += (Y1<<1)-(Y2<<1)+Y3;

Из получившейся проги видно что результирующий коэфф. действительно будет более 1 так как в последней строчки получим 1 а в предпоследней ещё 1/4, но это просто так, для проверки себя.
Я не буду сейчас писать кольцевой буфер для входных значений фильтра. Чтобы было понятней что я делаю. Кстати если используем ФНЧ или ФВЧ, то там вообще это без надобности. Тем не менее, я часто пишу кольцевой буфер с отладочными целями, чтобы в процессе отладки увидеть как работает фильтр и некоторые его звенья. После завершения отладки - могу выкинуть, либо сохранить.

Итак, будет выглядеть так:

X4=X3; // Новый сэмпл сдвигает значения
X3=X2;
X2=X1;
X1=X0;
X0=ADCH;
Temp = (X0+X4+Y3-Y4)>>1; // все члены со сдвигом 4 = 1,7,9
Temp += (-X2-Y1); // ... 3 = 2,4 Естественно лучше записать Temp -= X2+Y1;
Temp >>= 1;
Temp += (-Y4); // .... 2 = 8 Опять таки Temp -= Y4;
Temp >>= 2; // Поскольку у нас нет членов со сдвигом >>1
Temp += (Y1<<1)-(Y2<<1)+Y3;
Y4=Y3; // Новый сэмпл сдвигает значения
Y3=Y2;
Y2=Y1;
Y1=Y0;
Y0=Temp;

Ну вот и всё.
На последок хотелось бы отметить что имеет значение разрядность чисел. Бывает, при сложных фильтрах, где малые коэффициенты происходит потеря точности, которая сводит на нет весь результат. Особенно если пользовать 8 бит данные. Часто бывает, при пограничных значениях (близких к максимому или минимому) что происходит потеря точности из-за переполнений и в этом случае достаточно использовать повышенную разрядность только переменной Temp.
Но в этом смысле преимущество Си просто фантастическое.
Представим что я написал этот фильтр для разрядности АЦП 8 бит. Тогда объявление переменных следующее:
int8_t X0,X1,X2,X3,X4,Y1,Y2,Y3,Y4,Temp;
Представим, что в процессе работы/наладки, я пришёл к выводу, что мне надо повысить разрядность до 10 бит.
Исправления будут следующие:
1) В строке объявления переменных надо исправить uint8_t на uint16_t (2 символа)
2) в строке программы изменить ADCH на ADC (1 символ)
3) В строке инициализации АЦП убрать (1<<ADLAR) (ещё 10 символов)
Итого исправления 13 символов. Тот кто пишет на ассемблере может оценить объём работы необходимый для перевода такого фильтра с 8 на 16 бит.



Цитата(Serhiy_UA @ Sep 17 2009, 16:19) *
Много лет назад экспериментировал на ATmega16 со звуковыми частотами. То же АЦП-цифровой фильтр-ШИМ-RC. Строил НЧ и ВЧ фильтры с БИХ, с аккумулятором сумм до 32-бит, а также коэффициентами до 16-бит. Фильтры в итоге всегда самовозбуждались. Тема по прежнему актуальна.
Кто либо построил и реально использовал такие фильтры, есть ли положительные результаты, чем рассчитывали коэффициенты?

Собственно цифровые фильтры хороши именно тем, что без разницы на чем они считаются. Mega16/ARM/PIC - при тех же коэффициентах и разрядностях работать будут одинаково. По моему очевидно, что ATMega не разрабатывалась для обработки звука. Для этого есть более удобные процы. Я работал со звуком только в рамках телефонной линии. При выборке 8кГц и верхней частоте 3.4кГц требуется, для удовлетворительного качества, АЦП разрядностью 14 бит. При этом для обработки двух потоков приходится греметь всеми костями ATMega на частоте 16МГц. Пробовал обеспечить вывод разными способами, в том числе и ШИМом. Понятно что 14 бит ШИМ на 8кГц даёт сотни МГц поэтому упрощали до 8 бит. Даже при 8 бит для получения приемлемого сигнала, требовалась выходная обвеска сопоставимая с размерами изделия. Причём настройка-регулировка была бы непростая.
Короче из всех вариантов этот был самым отвратительным. Существуют внешние цапы, в том числе звуковые, в том числе с нелинейной характеристикой и встроенными цифровыми фильтрами. Стоят - копейки. С фильтрами проблем не было. Правда, как я говорил обработка была весьма топорная.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Ie0nid   Цифровой Фильтр на ATmega   Sep 16 2009, 04:18
- - Genadi Zawidowski   Радиолюбительская конструкция.   Sep 16 2009, 04:50
- - haker_fox   Цитата(_Ie0nid @ Sep 16 2009, 13:18) куда...   Sep 16 2009, 06:36
|- - MrYuran   Цитата(SasaVitebsk @ Sep 16 2009, 11:30) ...   Sep 16 2009, 07:39
||- - SasaVitebsk   Цитата(MrYuran @ Sep 16 2009, 10:39) Непл...   Sep 16 2009, 08:14
|- - Serhiy_UA   Много лет назад экспериментировал на ATmega16 со з...   Sep 17 2009, 13:19
|- - galjoen   Цитата(SasaVitebsk @ Sep 17 2009, 22:45) ...   Jan 2 2010, 10:51
- - Legotron   Цитата(MrYuran @ Sep 16 2009, 11:39) А дл...   Sep 17 2009, 13:04
|- - Сергей Борщ   Цитата(Legotron @ Sep 17 2009, 16:04) А п...   Sep 17 2009, 13:17
- - Goodefine   Цитата(SasaVitebsk @ Sep 17 2009, 22:45) ...   Sep 18 2009, 21:08
|- - AHTOXA   Скорее всего причина вот тут: Код X0=ADCW-512; Поп...   Sep 18 2009, 21:24
- - Goodefine   Цитата(AHTOXA @ Sep 19 2009, 00:24) Попро...   Sep 18 2009, 21:38
|- - AHTOXA   Тогда наоборот, замените в объявлении Xi, Yi и Tem...   Sep 18 2009, 22:12
- - Goodefine   Я это уже проделывал. Основное отличие - фильтр на...   Sep 18 2009, 22:22
|- - AHTOXA   Да, засада А long пробовали?   Sep 18 2009, 22:26
- - Goodefine   Вот Long не пробовал, только сейчас - то же самое....   Sep 18 2009, 22:30
|- - AHTOXA   Есть ещё одна мысль. Я не совсем понял, откуда взя...   Sep 18 2009, 22:42
- - Goodefine   Чет не едут у меня лыжи С флоатами хрень какая-т...   Sep 18 2009, 22:52
|- - AHTOXA   Цитата(Goodefine @ Sep 19 2009, 04:52) Че...   Sep 18 2009, 23:16
- - Goodefine   Цитата(AHTOXA @ Sep 19 2009, 02:16) Но хо...   Sep 18 2009, 23:43
|- - dimka76   Цитата(Goodefine @ Sep 19 2009, 03:43) Не...   Sep 19 2009, 04:15
- - SasaVitebsk   Эээээ... Результат обсуждения меня не порадовал. ...   Sep 20 2009, 20:33
- - Goodefine   Цитата(SasaVitebsk @ Sep 20 2009, 23:33) ...   Sep 21 2009, 13:45
|- - SasaVitebsk   Цитата(Goodefine @ Sep 21 2009, 16:45) За...   Sep 21 2009, 20:27
- - _Ie0nid   здраствуйте, простите за то что долго не было, и з...   Sep 22 2009, 04:58
|- - SasaVitebsk   Цитата(_Ie0nid @ Sep 22 2009, 07:58) Вы п...   Sep 22 2009, 10:00
|- - MrYuran   Цитата(_Ie0nid @ Sep 22 2009, 08:58) Учи...   Sep 22 2009, 10:52
- - Goodefine   Цитата(SasaVitebsk @ Sep 21 2009, 23:27) ...   Sep 22 2009, 10:35
- - _Ie0nid   РАЗОБРАЛСЯ, тут еще на работе мне паренек здорово ...   Sep 23 2009, 01:37
- - Fix   Подскажите, пожалуйста. что представляет собой кол...   Dec 27 2009, 18:27
|- - DRUID3   Цитата(Fix @ Dec 27 2009, 20:27) Подскажи...   Dec 27 2009, 22:26
|- - Xenia   Цитата(DRUID3 @ Dec 28 2009, 01:26) ...   Dec 27 2009, 23:01
|- - rezident   Цитата(Xenia @ Dec 28 2009, 04:01) Примеч...   Dec 28 2009, 18:02
|- - Xenia   rezident А однобайтный тип там есть?   Dec 28 2009, 19:28
|- - rezident   Цитата(Xenia @ Dec 29 2009, 00:28) А одно...   Dec 30 2009, 01:18
- - V_G   Вообще кольцевой буфер легко реализуется, если его...   Dec 28 2009, 23:39
- - Fix   При расчете коэффициентов полосового фильтра с пом...   Dec 30 2009, 11:48
|- - SasaVitebsk   Цитата(Fix @ Dec 30 2009, 14:48) ... реко...   Dec 30 2009, 21:35
|- - Serhiy_UA   Цитата(SasaVitebsk @ Dec 31 2009, 00:35) ...   Dec 31 2009, 08:02
- - V_G   Существуют разные алгоритмы синтеза фильтров и раз...   Dec 30 2009, 12:18
- - mdmitry   Добавлю, что АЧХ фильтра и ФЧХ связаны между собой...   Dec 30 2009, 13:14
- - Rst7   ЦитатаВсё правильно. Только дополню, что существуе...   Dec 31 2009, 10:31
- - Rioi   Все знают о существовании таких файлов: 1) AVR201:...   Jan 6 2010, 10:21
|- - galjoen   Цитата(Rioi @ Jan 6 2010, 13:21) А теперь...   Jan 6 2010, 10:50
|- - SasaVitebsk   Цитата(Rioi @ Jan 6 2010, 14:21) все знаю...   Jan 23 2010, 21:46
- - DRUID3   Забавная информация к размышлению для тех кто пише...   Jan 24 2010, 10:12
- - Rst7   ЦитатаЗабавная информация к размышлению Информаци...   Jan 24 2010, 10:44
- - SasaVitebsk   Да не на что она не намекает. Заниматься такой опт...   Jan 24 2010, 11:09
|- - DRUID3   Цитата(SasaVitebsk @ Jan 24 2010, 13:09) ...   Jan 24 2010, 12:36
|- - RedD   Для SasaVitebsk. Интересует тема, не могу написать...   Jan 1 2016, 18:24
- - Andrew34   Вечер добрый господа электронщики!) У меня про...   May 24 2010, 14:40
- - Herz   RedD, Вы обратили внимание на то, как выглядит Ваш...   Jan 1 2016, 18:52
|- - RedD   Цитата(Herz @ Jan 1 2016, 18:52) RedD, Вы...   Jan 1 2016, 19:26
|- - Herz   Цитата(RedD @ Jan 1 2016, 21:26) Извиняюс...   Jan 1 2016, 22:34
|- - RedD   Цитата(Herz @ Jan 1 2016, 22:34) Вы бы Пр...   Jan 2 2016, 08:49
|- - RedD   Вобщем правильно, вручную проверил, Но все равно ...   Jan 2 2016, 10:31
||- - RedD   Слесарь да я смотрю ты местный, Не знаешь как с Са...   Jan 8 2016, 09:43
|- - Alexashka   Цитата(RedD @ Jan 2 2016, 12:49) Я ВАС по...   Jan 8 2016, 23:15
|- - RedD   Цитата(Alexashka @ Jan 9 2016, 00:15) Мож...   Jan 9 2016, 14:16
- - Alexashka   ЦитатаИтого все на сдвигах, да в том то и прикол ч...   Jan 10 2016, 10:24
|- - RedD   Цитата(Alexashka @ Jan 10 2016, 11:24) Ну...   Jan 10 2016, 10:31
||- - Alexashka   Цитата(RedD @ Jan 10 2016, 14:31) ДЛя avr...   Jan 10 2016, 17:49
||- - RedD   Цитата(Alexashka @ Jan 10 2016, 18:49) С ...   Jan 10 2016, 19:24
||- - RedD   А вообще меня интересовала практическая реализация...   Jan 11 2016, 04:22
||- - Alexashka   Цитата(RedD @ Jan 10 2016, 23:24) Все отв...   Jan 11 2016, 06:03
||- - RedD   Ну то что я хотел сделать я почти сделал ) На Ва...   Jan 11 2016, 09:31
||- - Alexashka   Цитата(RedD @ Jan 11 2016, 13:31) Ну хотя...   Jan 11 2016, 10:27
||- - RedD   Цитата(Alexashka @ Jan 11 2016, 11:27) Ну...   Jan 11 2016, 15:31
||- - Alexashka   Цитата(RedD @ Jan 11 2016, 19:31) Что Вы ...   Jan 11 2016, 17:21
||- - RedD   Цитата(Alexashka @ Jan 11 2016, 18:21) Ва...   Jan 11 2016, 17:46
|||- - Alexashka   Цитата(RedD @ Jan 11 2016, 21:46) но дело...   Jan 11 2016, 19:38
|||- - RedD   Да не АЦП однополярный, делаем смещение и ввиду то...   Jan 11 2016, 20:42
|||- - Alexashka   Цитата(RedD @ Jan 12 2016, 00:42) И тогда...   Jan 12 2016, 01:39
|||- - RedD   Цитата(Alexashka @ Jan 12 2016, 02:39) Да...   Jan 12 2016, 09:01
|||- - RedD   А понял, если наложить ФВЧ то и получим смещение, ...   Jan 12 2016, 13:57
|||- - Alexashka   1) Да как Вам удобней, так и делайте. 2) Y0=Y1||Y2...   Jan 13 2016, 01:04
||- - RedD   Но и сигнал тогда на вход двухполярный нужен, опер...   Jan 11 2016, 17:46
|- - RedD   Цитата(Alexashka @ Jan 10 2016, 11:24) Ко...   Jan 10 2016, 12:50
- - RedD   Ок ) Возми в студенты а ? Вторую вышку хочу получ...   Jan 14 2016, 00:56
- - IMaxI   Прошу прощение. А не проще ли использовать аппарат...   Feb 5 2016, 05:00
- - Alexashka   Цитата(IMaxI @ Feb 5 2016, 08:00) А учиты...   Feb 5 2016, 05:57
- - RedD   dspic тоже не плох   Feb 6 2016, 08:43
- - RedD   http://www.cqham.ru/forum/showthread.php?3...-Mixe...   Apr 12 2017, 13:26
- - RedD   Не хотел новую тему создавать, а можно загрузить t...   Apr 11 2018, 07:29


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th August 2025 - 21:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016