|
|
  |
Цифровой Фильтр на ATmega, Цифровой Фильтр на ATmega |
|
|
|
Sep 18 2009, 22:52
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Чет не едут у меня лыжи  С флоатами хрень какая-то - время выполнения короче чем int-ми.. Где-то засада (никогда их не пользую)... Насчет минуса - появится если всю сумму Yi приравнять к нулю и вынести Y0... А правильно это или нет - надо глубже смотреть...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 18 2009, 23:16
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Goodefine @ Sep 19 2009, 04:52)  Чет не едут у меня лыжи  С флоатами хрень какая-то - время выполнения короче чем int-ми.. Где-то засада (никогда их не пользую)... Но хоть заработало?  А с минусом оказывается всё в порядке, там в хелпе написано: Цитата y(n)=( a0*x(n)+a1*x(n-1)+a2*x(n-2) ) – ( b1*y(n-1) + b2*y(n-2) )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 18 2009, 23:43
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(AHTOXA @ Sep 19 2009, 02:16)  Но хоть заработало?  Не-а, не хочет он с включенной оптимизацией считать Код Y0=0.00625*(X0+X4)-0.125*X2 + 1.875*Y1-2*Y2 + 1.0625*Y3 -0.3125*Y4; ну не может за 1,25мкс он это просчитать. Сходу не пойму где грабли А с выключенной - 129мкс, чуть более 125мкс  В любом случае 2,5В на выходе
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 19 2009, 04:15
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(Goodefine @ Sep 19 2009, 03:43)  Не-а, не хочет он с включенной оптимизацией считать Код Y0=0.00625*(X0+X4)-0.125*X2 + 1.875*Y1-2*Y2 + 1.0625*Y3 -0.3125*Y4; ну не может за 1,25мкс он это просчитать. Сходу не пойму где грабли А с выключенной - 129мкс, чуть более 125мкс  В любом случае 2,5В на выходе  А вы по ассемблеру посмотрите. А с флоатами лучше не связываться. Я как-то делал генератор синуса, так с флоатами амплитуду колебаний потехоньку возрастала , сделал с фиксированной точкой 1:15 и амплитуда четко стояла (сутки гонял).
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Sep 20 2009, 20:33
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Эээээ... Результат обсуждения меня не порадовал. Я вам давал не теорию и не практику, а методику. Вы должны проследить и... сделать любой. А соответственно найти ошибки в моём.  Я ведь на бумаге всё это писал. Тем не менее там всё правильно... И нет никаких заморочек с компилятором. 1) Если вы посмотрите АЧХ фильтра, то вы поймёте что результат работы при строке Код X0=(int)ADCW-512; и при строке Код X0=(int)ADCW; должен быть одинаков! Фильтр вычитает постоянную составляющую. 2) Если бы я, для того чтобы проверить работу фильтра каждый раз ваял такую схему ... Нет конечно, респект и уважуха, но вы же всётаки прграммисты.  У них подход попроще .... Я написал для себя приложение в билдере по принципу ГКЧ и тестирую свой фильтр целиком, причём если надо, то использую нужные мне размерности переменных. Потом целиком эту прогу вырезаю и вставляю в IAR. Когда прочитал вашу бучу, то проанализировал. Скажем так...  была неточность, но не в фильтре. Можно было и так как я выложил, но нужна небольшая коррекция. Вопрос какая? Прикладываю фильтр, вырезанный из проги и результат тестирования.  Код x4=x3; x3=x2; x2=x1; x1=x0; x0=ADC;
y4=y3; y3=y2; y2=y1; y1=y0;
tek16 = y1>>3; tek16 += x0+x2-y2; tek16 >>= 1; tek16 += x0+x2-x1+y1-y2; tek16 >>= 1; tek16 += y1-x1;
y0 = tek16; Затестите на своей чудо машинке. Ну и найдите причину хомута.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 21 2009, 13:45
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(SasaVitebsk @ Sep 20 2009, 23:33)  Эээээ... Результат обсуждения меня не порадовал.Я вам давал не теорию и не практику, а методику. Вы должны проследить и... сделать любой. А соответственно найти ошибки в моём. Я ведь на бумаге всё это писал. Тем не менее там всё правильно... Если Вы восприняли мой пост как критику в адрес своей методики, то спешу заверить, что это совершенно не так. Дело было поздно ночью, когда легко проглядеть ньюанс, подобный потерянному здесь... Тот случай - когда вроде все правильно, но не работает. Поэтому, собственно, вопрос и последовал... Цитата(SasaVitebsk @ Sep 20 2009, 23:33)  2) Если бы я, для того чтобы проверить работу фильтра каждый раз ваял такую схему ... Нет конечно, респект и уважуха, но вы же всётаки прграммисты. У них подход попроще .... Я написал для себя приложение в билдере по принципу ГКЧ ... Ну, имхо, модель простейшая и ваяется быстро, при определенных навыках - copy/paste  Когда под рукой нет необходимого инструментария для работы с цифровыми фильтрами - так тоже неплохо - плюс время выполнения в железе оценить можно, и подумать сколько звеньев поставить получится... Цитата(SasaVitebsk @ Sep 20 2009, 23:33)  Когда прочитал вашу бучу, то проанализировал... Подымать бучу и в мыслях не было, уж извините если так получилось.. Цитата(SasaVitebsk @ Sep 20 2009, 23:33)  Скажем так... была неточность, но не в фильтре. Можно было и так как я выложил, но нужна небольшая коррекция. Вопрос какая? Неточность легко ищется незамыленным глазом: читаем хелп: Цитата y(n)=( a0*x(n)+a1*x(n-1)+a2*x(n-2) ) – ( b1*y(n-1) + b2*y(n-2) ) И ключевая Ваша фраза: Цитата Я упрощу выражение и вместо X(i-1) буду писать X1 и так далее.... следование которой и привело к неточности: X(n-4) стал Х4, а Xn -> X0 (и т.д.). А привязка коэфф. не изменилась. В то время как X4 (если его номер рассматривать как порядковый номер следования отсчета во времени) на самом деле Xn. Иными словами перепутались коэффициенты с отсчетами. То же самое и с Yi. при этом следует еще учесть, что выход - это Y4. Тогда код фильтра будет такой: Код X4=X3; X3=X2; X2=X1; X1=X0; X0=(int)ADCW;
Y0=Y1; Y1=Y2; Y2=Y3; Y3=Y4;
Temp = (X4+X0+Y1-Y0)>>1; Temp -= X2+Y3; Temp >>= 1; Temp -= Y0; Temp >>= 2; Temp +=((Y3-Y2)<<1)+Y1;
Y4=Temp;
PORTD= (unsigned char) ((Y4+512)>>2); Т.е. видно, что крайние Xi и Yi поменялись местами соответственно (X4<->X0,Y4<->Y0 и т.д.). Цитата(SasaVitebsk @ Sep 20 2009, 23:33)  Затестите на своей чудо машинке... Затестил. работает. Только хочу заметить, что АЧХ фильтра не такая как на картинке - если верить модели, работает это скорее как ФВЧ, где - то от 400 Гц - далее подъем и спад до 3кГц почти не заметен... А что касается первоначального фильтра - тоже работает, после исправлений - там частота резонанса около 1336,9 Гц... Откуда так точно? Все просто, иногда (не всегда) после снятия сигналов, фильтр звенит на этой частоте. Звон правда достаточно малый - амплитуда около 0,02В (одна градация ЦАПа). Спад АЧХ возле этой частоты заметен на глаз, что называтся... Вот как то так... Еще раз спасибо Вам, что потратили свое время на очевидные объяснения..
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 21 2009, 20:27
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Goodefine @ Sep 21 2009, 16:45)  Затестил. работает. Только хочу заметить, что АЧХ фильтра не такая как на картинке - если верить модели, работает это скорее как ФВЧ, где - то от 400 Гц - далее подъем и спад до 3кГц почти не заметен...  Так я и выбрал фильтр собственно весьма пологий. Да ещё и всего-лишь 3-его порядка. Мне кажется, что людям было-бы интересно узнать сколько "завесил" такой фильтр. Сколько он отъел ресурсов. Я, в свою очередь хотел бы отметить, что полосовой фильтр 5-го порядка легко реализуется на 1.8МГц при частоте выборки 6800 вместе с ФНЧ и перемножением сигнала.  AVR при этом кушает менее 1ма.
|
|
|
|
|
Sep 22 2009, 04:58
|
Участник

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

|
здраствуйте, простите за то что долго не было, и за глупые вопросы.
Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы.
Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:,
второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли),
Y(i) = X(i) + 0.875Y(i-1) - X(i-1),
каждая последующая выборка еще раз преобразуется по следующему закону, а затем еще раз по следующему, а затем складывается с текущими. И это кажется странным, потому как если высокачстотная составляющая была большой, она так самой большой и пройдет, если не прав прошу поправить потому как:,
третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ.
И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл. Если мы складываем два аналоговых сигнала с разными частотами (например две палки спектра), мы получаем сигнал с этими двумя палками. Если мы складываем выборки в разные такты мы получаем просто число. Или же весь смысл этого сумматора (и вообще всех кубиков в структуре фильтра) в том, чтобы подобрать такую формулу, чтобы она выполняла нужную для нас манипуляцию с выборками (то есть нужную АЧХ). Заранее спасибо.
|
|
|
|
|
Sep 22 2009, 10:00
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_Ie0nid @ Sep 22 2009, 07:58)  Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы. Если вы пытаетесь разобраться в теории, тем более в теории цифровой фильтрации задавая простые вопросы на форуме, то это тупик. Здесь вы единственное, что можете узнать это название книги и имя автора. А далее - только читать. Если не понимаете - берёте другую книгу, читаете несколько раз и так до момента просветления.  Цитата Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:, Попытка на пальцах объяснить теорию, насчитывающую тома - это глупость. Вы уж извините, не хочу никого обидеть. Я не являюсь знатоком теории фильтрации, но тем не менее убеждён, что попытка упрощения до уровня домохозяйки, даёт только ложные представления. Результат мы видим повсеместно, когда комбайнёты и директора колхозов становятся руководителями страны. Хотите стать проффессионалом в своём деле - попробуйте им стать. Цитата второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли),
Y(i) = X(i) + 0.875Y(i-1) - X(i-1),
каждая последующая выборка еще раз преобразуется по следующему закону, а затем еще раз по следующему, а затем складывается с текущими. И это кажется странным, потому как если высокачстотная составляющая была большой, она так самой большой и пройдет, если не прав прошу поправить потому как:, В той программе, которую я выкладывал - есть HELP, как это не странно. Там есть формула. А то что выше я привёл как прикол. Она как раз не очень ложится на теорию. Тем не менее действительно работает. Я её выдрал из какого-то апнота TI. Её АЧХ можно посмотреть той же прогой, что я прикладывал. Цитата третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ. Формула определяется не типом сигнала, а типом выбранного фильтра. Например в той проге которую я приложил используется фильтр Батерворта. Если запустить знаменитый QED2000, то там этих фильтров - море. А в теории ещё больше. Каждый фильтр имеет свои особенности. Например некоторые имеют минимальные фазовые искажения и т.д. Формула для каждого из этих фильтров уже определена задолго до того, как вы задумались на эту тему. Сама формула представляет собой полином. Прикладная же задача состоит в том, чтобы исходя из характеристик фильтра и частоты дискретезации выбрать коэффициенты полинома и подставить в уже готовую формулу. В этом, как правило помогают готовые программы. Например та же QED или та, что привёл я. Я же рассказывал методику как довести коэффициенты до программы.  То есть всё это теории ни грамма не касается. Ни каким боком. Цитата И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл. Если мы складываем два аналоговых сигнала с разными частотами (например две палки спектра), мы получаем сигнал с этими двумя палками. Если мы складываем выборки в разные такты мы получаем просто число. Или же весь смысл этого сумматора (и вообще всех кубиков в структуре фильтра) в том, чтобы подобрать такую формулу, чтобы она выполняла нужную для нас манипуляцию с выборками (то есть нужную АЧХ). Заранее спасибо. Книги и ещё раз книги.
|
|
|
|
|
Sep 22 2009, 10:35
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата(SasaVitebsk @ Sep 21 2009, 23:27)  Мне кажется, что людям было-бы интересно узнать сколько "завесил" такой фильтр. Сколько он отъел ресурсов... При уровне оптимизации -03 (по скорости) тело фильтра занимает 68 байт и выполняется, при тактовой частоте 16384000 Гц примерно за 3мкс. При периоде в 125мкс (8000кГц) это занимает не более 2.5% процессорного времени. Откуда видно, что при снижении тактовой до 1Мгц еще не менее 50% времени останется... При оптимизации по размеру, время незначительно увеличивается, а размер незначительно уменьшается. Ток потребления неизвестен (модель), но существуют широкие возможности для его уменьшения Цитата(_Ie0nid @ Sep 22 2009, 07:58)  ...И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл... Сумматором можете не заморачиваться. Он там только для того, чтобы арифметически правильно сложить сигналы с разными частотами....
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Sep 22 2009, 10:52
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(_Ie0nid @ Sep 22 2009, 08:58)  Учите матчасть. Кстати, цифровыми методами можно синтезировать физически нереализуемый фильтр Так что физический смысл в цифровой фильтрации искать бесполезно. Кстати, забавная задачка на вшивость, на которой я засыпался на зачёте: Входной аналоговый сигнал -> АЦП -> ЦАП -> Выходной аналоговый сигнал Как будут различаться спектры входного и выходного сигнала? (для простоты, разрядность и частота дискретизации ЦАП и АЦП совпадают)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|