Перейти к содержанию
    

Цифровой Фильтр на ATmega

Я это уже проделывал. Основное отличие - фильтр начинает колбасить сразу же, еще до подачи сигналов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот Long не пробовал, только сейчас - то же самое... Ща возьму гарантированно рабочий фильтр с флоат коэффициентами и посмотрю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ещё одна мысль. Я не совсем понял, откуда взялся минус перед всеми игреками вот тут:

Y коэф. будут выглядеть так

-(-1.875*Y1+2*Y2-1.0625*Y3+0.3125*Y4) =

Может его не надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чет не едут у меня лыжи :( С флоатами хрень какая-то - время выполнения короче чем int-ми.. Где-то засада (никогда их не пользую)...

Насчет минуса - появится если всю сумму Yi приравнять к нулю и вынести Y0... А правильно это или нет - надо глубже смотреть...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чет не едут у меня лыжи :( С флоатами хрень какая-то - время выполнения короче чем int-ми.. Где-то засада (никогда их не пользую)...

 

Но хоть заработало? :)

 

А с минусом оказывается всё в порядке, там в хелпе написано:

y(n)=( a0*x(n)+a1*x(n-1)+a2*x(n-2) ) – ( b1*y(n-1) + b2*y(n-2) )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но хоть заработало? :)

Не-а, не хочет он с включенной оптимизацией считать

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В на выходе :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не-а, не хочет он с включенной оптимизацией считать

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В на выходе :smile3046:

 

А вы по ассемблеру посмотрите.

А с флоатами лучше не связываться.

Я как-то делал генератор синуса, так с флоатами амплитуду колебаний потехоньку возрастала , сделал с фиксированной точкой 1:15 и амплитуда четко стояла (сутки гонял).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эээээ...

Результат обсуждения меня не порадовал. :laughing:

 

Я вам давал не теорию и не практику, а методику. Вы должны проследить и... сделать любой. А соответственно найти ошибки в моём. :) Я ведь на бумаге всё это писал. Тем не менее там всё правильно... И нет никаких заморочек с компилятором.

 

1) Если вы посмотрите АЧХ фильтра, то вы поймёте что результат работы при строке

X0=(int)ADCW-512;

и при строке

X0=(int)ADCW;

должен быть одинаков! Фильтр вычитает постоянную составляющую.

 

2) Если бы я, для того чтобы проверить работу фильтра каждый раз ваял такую схему ... :biggrin:

Нет конечно, респект и уважуха, но вы же всётаки прграммисты. :) У них подход попроще .... :biggrin:

Я написал для себя приложение в билдере по принципу ГКЧ и тестирую свой фильтр целиком, причём если надо, то использую нужные мне размерности переменных. Потом целиком эту прогу вырезаю и вставляю в 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;

 

Затестите на своей чудо машинке. Ну и найдите причину хомута. :(

post-11521-1253478782_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эээээ...

Результат обсуждения меня не порадовал.Я вам давал не теорию и не практику, а методику. Вы должны проследить и... сделать любой. А соответственно найти ошибки в моём. Я ведь на бумаге всё это писал. Тем не менее там всё правильно...

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

2) Если бы я, для того чтобы проверить работу фильтра каждый раз ваял такую схему ...

Нет конечно, респект и уважуха, но вы же всётаки прграммисты. У них подход попроще ....

Я написал для себя приложение в билдере по принципу ГКЧ ...

Ну, имхо, модель простейшая и ваяется быстро, при определенных навыках - copy/paste :) Когда под рукой нет необходимого инструментария для работы с цифровыми фильтрами - так тоже неплохо - плюс время выполнения в железе оценить можно, и подумать сколько звеньев поставить получится...

Когда прочитал вашу бучу, то проанализировал...

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

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

Неточность легко ищется незамыленным глазом: читаем хелп:

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 и т.д.).

Затестите на своей чудо машинке...

Затестил. работает. Только хочу заметить, что АЧХ фильтра не такая как на картинке - если верить модели, работает это скорее как ФВЧ, где - то от 400 Гц - далее подъем и спад до 3кГц почти не заметен...

А что касается первоначального фильтра - тоже работает, после исправлений - там частота резонанса около 1336,9 Гц... Откуда так точно? Все просто, иногда (не всегда) после снятия сигналов, фильтр звенит на этой частоте. Звон правда достаточно малый - амплитуда около 0,02В (одна градация ЦАПа). Спад АЧХ возле этой частоты заметен на глаз, что называтся... Вот как то так...

Еще раз спасибо Вам, что потратили свое время на очевидные объяснения..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Затестил. работает. Только хочу заметить, что АЧХ фильтра не такая как на картинке - если верить модели, работает это скорее как ФВЧ, где - то от 400 Гц - далее подъем и спад до 3кГц почти не заметен...

 

:)

Так я и выбрал фильтр собственно весьма пологий. Да ещё и всего-лишь 3-его порядка.

Мне кажется, что людям было-бы интересно узнать сколько "завесил" такой фильтр. Сколько он отъел ресурсов.

 

Я, в свою очередь хотел бы отметить, что полосовой фильтр 5-го порядка легко реализуется на 1.8МГц при частоте выборки 6800 вместе с ФНЧ и перемножением сигнала. :) AVR при этом кушает менее 1ма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

здраствуйте, простите за то что долго не было, и за глупые вопросы.

 

Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы.

 

Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:,

 

второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли),

 

Y(i) = X(i) + 0.875Y(i-1) - X(i-1),

 

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

 

третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ.

 

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

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы привели формулу, которую я пытался понять с помощью каких то физических принципов, в результате натыкался на точно такие же формулы.

Если вы пытаетесь разобраться в теории, тем более в теории цифровой фильтрации задавая простые вопросы на форуме, то это тупик. Здесь вы единственное, что можете узнать это название книги и имя автора. А далее - только читать. Если не понимаете - берёте другую книгу, читаете несколько раз и так до момента просветления. :)

Первое: мне объясняли принцип действия цифрового фильтра и она заключается в следующем. Допустим первая выборка равна 8, вторая 8, затем третья равная 10, четвертая равная 8, и пятая снова 8. Если на третью приходилась высокочастотная составляющая, и мы ее в соответствующем такте уменьшаем с соответствующим коэффициентом усиления (например отрицательным), то поучается ФНЧ. Если я не прав то поправьте пожалуйста, потому как:,

:bb-offtopic:

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

второе: судя по рисункам которые приводятся в книгах, и по формуле которую привел SASAVITEBSK (за что огромное спасибо, навила хоть на мысли),

 

Y(i) = X(i) + 0.875Y(i-1) - X(i-1),

 

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

В той программе, которую я выкладывал - есть HELP, как это не странно. Там есть формула. А то что выше я привёл как прикол. Она как раз не очень ложится на теорию. Тем не менее действительно работает. Я её выдрал из какого-то апнота TI. Её АЧХ можно посмотреть той же прогой, что я прикладывал.

третье: Я примерно прикинул формулу на бумажке, она действительно убирает постоянную составляющую, если сигнал постоянный, каждая последующая выборка на выходе будет стремится к нулю. Крутизна фильтра я так понимаю определяется количеством членов формулы (полинома?). А вот коэффициент ослабления? И потом как синтезировать такую формулу исходя из нужного фильтра. Например ФНЧ, или ФВЧ.

Формула определяется не типом сигнала, а типом выбранного фильтра. Например в той проге которую я приложил используется фильтр Батерворта. Если запустить знаменитый QED2000, то там этих фильтров - море. А в теории ещё больше. Каждый фильтр имеет свои особенности. Например некоторые имеют минимальные фазовые искажения и т.д. Формула для каждого из этих фильтров уже определена задолго до того, как вы задумались на эту тему. Сама формула представляет собой полином. Прикладная же задача состоит в том, чтобы исходя из характеристик фильтра и частоты дискретезации выбрать коэффициенты полинома и подставить в уже готовую формулу. В этом, как правило помогают готовые программы. Например та же QED или та, что привёл я. Я же рассказывал методику как довести коэффициенты до программы. :) То есть всё это теории ни грамма не касается. Ни каким боком.

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

Заранее спасибо.

Книги и ещё раз книги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, что людям было-бы интересно узнать сколько "завесил" такой фильтр. Сколько он отъел ресурсов...

При уровне оптимизации -03 (по скорости) тело фильтра занимает 68 байт и выполняется, при тактовой частоте 16384000 Гц примерно за 3мкс. При периоде в 125мкс (8000кГц) это занимает не более 2.5% процессорного времени. Откуда видно, что при снижении тактовой до 1Мгц еще не менее 50% времени останется... При оптимизации по размеру, время незначительно увеличивается, а размер незначительно уменьшается. Ток потребления неизвестен (модель), но существуют широкие возможности для его уменьшения

 

...И наконец, четвертое. В схемах фильтра нарисован сумматор, можете объяснить его физический смысл...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учите матчасть.

Кстати, цифровыми методами можно синтезировать физически нереализуемый фильтр :rolleyes:

Так что физический смысл в цифровой фильтрации искать бесполезно.

 

Кстати, забавная задачка на вшивость, на которой я засыпался на зачёте:

Входной аналоговый сигнал -> АЦП -> ЦАП -> Выходной аналоговый сигнал

Как будут различаться спектры входного и выходного сигнала?

(для простоты, разрядность и частота дискретизации ЦАП и АЦП совпадают)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...