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

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Цифровой Фильтр на ATmega, Цифровой Фильтр на ATmega
_Ie0nid
сообщение Sep 23 2009, 01:37
Сообщение #31


Участник
*

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



РАЗОБРАЛСЯ, тут еще на работе мне паренек здорово подсказал, так что большое спасибо всем за помощь.
Go to the top of the page
 
+Quote Post
Fix
сообщение Dec 27 2009, 18:27
Сообщение #32





Группа: Новичок
Сообщений: 4
Регистрация: 25-11-07
Пользователь №: 32 665



Подскажите, пожалуйста. что представляет собой кольцевой буфер для входных значений фильтра (полосового)?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Dec 27 2009, 22:26
Сообщение #33


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Fix @ Dec 27 2009, 20:27) *
Подскажите, пожалуйста. что представляет собой кольцевой буфер для входных значений фильтра (полосового)?

Допустим Вы хотите сделать кольцевой буфер размера N на основе массива(можно еще на основе связанного списка, это просто - указатель последнего элемента должен указывать на первый, но он намного "тяжеловеснее" чем на основе массива). Функция которая отвечает за запись и/или чтение из буфера дожна при этом обеспечивать кольцевую адресацию. Тоесть достигнув элемента массива N-1(т.к. в C адресация начинается с "0") начать запись вновь с "0"-го элемента.

"Счетчик" сбрасывают многими конструкциями. if(i=N){i=0}, i=i%N или i=(i)&(N). Последний случай - это наложение маски. Работает очень быстро - но только для порядка из ряда целой степени двойки. Первый - предполагает ветвление - потому, как-бы, чисто теоретически - это не хорошо для кэша(а автомат-способ его работы у каждого процессора свой). Но лучше посмотреть, что наваял компилятор в ассемблерном листинге - т.е.есть ли ветвление вообще.

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

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

P.S.: Сам кольцевой буфер проистекает от формулы свертки (это той, что по-идее должен знать каждый второкурсник ВТУЗа biggrin.gif biggrin.gif biggrin.gif ) - потому форма АЧХ(полосовой или какой иной) при этом никакой рояли не играет...

P.P.S.: исправил очепятку! Ибо знаю по-себе в какой ступор они приводят начинающих biggrin.gif ...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 27 2009, 23:01
Сообщение #34


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(DRUID3 @ Dec 28 2009, 01:26) *
"Счетчик" сбрасывают многими конструкциями. if(i=N){N=0}, i=i%N или i=(i)&(N). Последний случай - это наложение маски. Работает очень быстро - но только для порядка из ряда целой степени двойки.

Всё правильно. Только дополню, что существует особый случай, когда кольцевой буфер работает особенно изящно и быстро - это случай, когда он расчитан на 256 элементов. В этом случае, достаточно сделать "счетчик" цикла типа unsigned char, чтобы всё заработало само собой. Ведь в один байт число, большее чем 255 не запихнешь, поэтому такой счетчик будет "автоматически" сбрасываться при переполнении.
Кольцевые буферы на 256 элементов оказываются очень удобным инструментом не только для означенной цели, но и для буферизации приема и передачи по UART и USB, т.е. когда прием или получение приходят по прерыванию (UART) или когда отправлять по одному байту неэффективно (USB).
Примечание: у некоторых дурных компиляторов (кажется для MSP430) тип char трактуется как 2 байта, тогда ищите там другой однобайтный тип.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 28 2009, 18:02
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Xenia @ Dec 28 2009, 04:01) *
Примечание: у некоторых дурных компиляторов (кажется для MSP430) тип char трактуется как 2 байта, тогда ищите там другой однобайтный тип.
Это про CodeComposer Studio для серии TMS320.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 28 2009, 19:28
Сообщение #36


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



rezident
А однобайтный тип там есть?
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 28 2009, 23:39
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 758
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Вообще кольцевой буфер легко реализуется, если его длина не только 256, но и 2n. Просто в адресе (смещении от начала массива) маскируете n младших бит

Про БИХ еще добавлю, если топикстартер еще не получил внятный ответ. Более-менее серьезные БИХ фильтры не возбуждаются только при расчетах в формате double. Это легко увидеть в Матлабе, введя округление до желаемого типа данных. А про целый формат и говорить нечего, только простейший аналог однозвенного RC-фильтра. Так что в целых - только КИХ-фильтры!

Сообщение отредактировал V_G - Dec 28 2009, 23:46
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 30 2009, 01:18
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Xenia @ Dec 29 2009, 00:28) *
А однобайтный тип там есть?
Да какая разница? "Затачивание" на типы переменных, без явной проверки на выход за границы массива это потенциальный источник большого количества глюков программ. Именно такие уязвимости часто используют хакеры. Ваш совет считаю "вредным". В крайнем случае можно делать так, как V_G написал - маскировать старшие биты счетчика/индекса, урезая его разрядность. Но при этом остается проблема атомарности доступа к его значению.
Go to the top of the page
 
+Quote Post
Fix
сообщение Dec 30 2009, 11:48
Сообщение #39





Группа: Новичок
Сообщений: 4
Регистрация: 25-11-07
Пользователь №: 32 665



При расчете коэффициентов полосового фильтра с помощью программы ciirf1, рекомендованной SasaVitebsk, и при расчете в MatLab получаются совершенно разные их значения , ciirf1 постоянно дает значение a1=0 и a3=0, почему?
Go to the top of the page
 
+Quote Post
V_G
сообщение Dec 30 2009, 12:18
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 758
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Существуют разные алгоритмы синтеза фильтров и разные способы реализации одних и тех же требований к фильтрам. В том же Матлабе вы можете получить одинаковую амплитуду лепестков в полосе задержания (equiripple) или спадающую. Тут главное, чтобы результирующая ЧХ удовлетворяла. И чтобы было меньше негативное влияние округления (в Матлабе, повторю, можно увидеть отличия от расчетных характеристик при различных способах округления на различных этапах расчетов). Каким будет при этом a1, a3, не знаю. Есть одно строгое требование к коэффициентам КИХ: их сумма должна быть равна коэффициенту передачи на постоянном токе. Т.е. нулю для ФВЧ и ПФ.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 30 2009, 13:14
Сообщение #41


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 204
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Добавлю, что АЧХ фильтра и ФЧХ связаны между собой. В filterdesign MATLAB можно варьировать (оптимизировать) характеристики фильтра.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 30 2009, 21:35
Сообщение #42


Гуру
******

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



Цитата(Fix @ Dec 30 2009, 14:48) *
... рекомендованной SasaVitebsk ...

Боже упаси. smile.gif

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

При выборе и обкатке своих фильтров я моделирую их поведение более сложно. Ну а на чёрную иногда ...

smile.gif

Я просто привёл пример, чтобы начинающие программисты не боялись применять такую технологию как цифровая фильтрация.
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Dec 31 2009, 08:02
Сообщение #43


Знающий
****

Группа: Свой
Сообщений: 718
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Цитата(SasaVitebsk @ Dec 31 2009, 00:35) *
...Существует большое количество других программ. Например QED...


Спасибо, очень интересный ресурс с QED. Кстати его адрес
http://www.kanecomputing.co.uk/mds_qedesign_lite.htm

Может не по теме, но там мощно..
http://www.kanecomputing.co.uk/
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 31 2009, 10:31
Сообщение #44


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 187
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Всё правильно. Только дополню, что существует особый случай, когда кольцевой буфер работает особенно изящно и быстро - это случай, когда он расчитан на 256 элементов. В этом случае, достаточно сделать "счетчик" цикла типа unsigned char, чтобы всё заработало само собой.


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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jan 2 2010, 10:51
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(SasaVitebsk @ Sep 17 2009, 22:45) *
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;

Если уж речь идёт о ATmega, то почему бы не использовать вместо этого извращения умножение командами mul...fmuls? Тогда при изменении коэффициентов не придётся каждый раз переписывать код программы. А небольшое увеличение времени (если оно ешё будет) тут, как я понял, совершенно не критично.

Я делал что-то подобное (не помню как оно научно называется) без обратных связей. Т.е. все элементы Y=0. Но с FIFO 256 слов. И умножал на коэффициенты в форме с плавающей запятой. Только была одна хитрость. Порядок у моих самодельных флоатов был представлен в виде кодов 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80. Т.е., если сначала перемножить мантисы, а затем умножить командой mul полученную мантису на порядок, получалось собственно число.
Мне пришлось сделать таким образом т.к. коэффициенты были заранее неизвестны. Они вычислялись и уточнялись в процессе работы. И с быстродействием проблеммы были. Деление 16/16 из-за этого тоже пришлось переделать - меньше 60 тактов получилось.
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th September 2017 - 07:53
Рейтинг@Mail.ru


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