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

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

Я ВАС понял.

Так по подбору коэффициентов то подскажите вот например 0.673 разбираем на (Х0>>1+X0>>3+X0>>5+X0>>6)=X0*0.673

потом группируем по сдвигам и упрощаем вынося за скобки так ?

Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 :) т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).

Изменено пользователем Herz

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


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

Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 :) т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).

Да вы немного не поняли, это только один коэффициент, так раскладываются все ну смотря какой фильтр, допустим 7 штук, потом раскрываем скобки,

потом упрощаем вынося за скобки, допустим вынесли за скобки >>2 И потом >>1.

Оставшееся раскладываем по сдвигам и записываем как

темр=все с 1 сдвигом

темр=все с 2 сдвигами

и т д

а потом

темр=темр + (что за скобкой1) >>2

темр=темр + (что за скобкой2) >>1

И наконец

темр=темр+целая часть

 

Хотя можно и немного по другому, записать

Итого все на сдвигах, да в том то и прикол что для приемлемой точности более 7 сдвигов то и не нужно

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

особо, а кода меньше и выполняется быстрее, я бы сказал красивое решение )

Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут куеву хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 :) т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).

Хотя и Ваш вариант нада попробовать )))) и сравнить ))))

Изменено пользователем Herz

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


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

Итого все на сдвигах, да в том то и прикол что для приемлемой точности более 7 сдвигов то и не нужно

Ну мой вариант это тоже по сути сдвиг максимум на 8 разрядов. Только я снова Вас спрашиваю, сколько тактов уходит на сдвиг на 7 бит? Или Вы не оцениваете вычислительные затраты в тактах, тогда о какой эффективности алгоритма идет речь? Непонятно.

а кода меньше и выполняется быстрее
Кода меньше, чем где?

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


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

Ну мой вариант это тоже по сути сдвиг максимум на 8 разрядов. Только я снова Вас спрашиваю, сколько тактов уходит на сдвиг на 7 бит? Или Вы не оцениваете вычислительные затраты в тактах, тогда о какой эффективности алгоритма идет речь? Непонятно.

Кода меньше, чем где?

ДЛя avr один сдвиг в право один такт (LSR, Logical Shift Right (asm)), если семь сдвигов то семь тактов, не считая временных буферов для X,Y.

Хотя и это можно посчитать

 

А если округлять то вообще не более 4-х тактов выходит на фильтр )

Правда там еще сложения есть, в итоге вместе с буфером больше конечно будет

А вообще на ПЛИС это реализуется похоже еще интереснее ....

Изменено пользователем RedD

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


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

Кода меньше, чем где?

Кода меньше если округлять с подбором, визуально контролируя АЧХ.

Допустим если округлять до двух знаков да еще с подбором на мин количество сдвигов, то и сдвигов меньше и слагаемых меньше,

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

 

Оно конечно когда там полноценный DSP или STM то можно и не заморачиваться и делать по полной программе, а на avr так не получится, там каждый такт на счету )

Изменено пользователем RedD

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


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

ДЛя avr один сдвиг в право один такт (LSR, Logical Shift Right (asm)), если семь сдвигов то семь тактов,

С отрицательными числами тоже? (извините, плохо знаю AVR)

И потом нужно еще принимать во внимание разрядность исходных данных. Всё хорошо когда они 8-битные, но сейчас даже самый плохенький АЦП в контроллере уже имеет разрядность 10+, так что это уже 2 байта.

И потом, если Вы вдруг решите изменить частоту среза фильтра это же все коэффициенты и их группировки нужно пересчитывать (и возможно вводить новые сдвиги). Это весь текст ЦФ надо править. :(

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


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

С отрицательными числами тоже? (извините, плохо знаю AVR)

И потом нужно еще принимать во внимание разрядность исходных данных. Всё хорошо когда они 8-битные, но сейчас даже самый плохенький АЦП в контроллере уже имеет разрядность 10+, так что это уже 2 байта.

И потом, если Вы вдруг решите изменить частоту среза фильтра это же все коэффициенты и их группировки нужно пересчитывать (и возможно вводить новые сдвиги). Это весь текст ЦФ надо править. :(

 

 

Все ответы здесь ....

https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%...%BA%D0%BE%D0%B9

 

В том числе и алгоритм, это всего лишь ЦОС, если посмотреть на схему и алгоритм то один в один, остальное тоже там, обычный институтский курс

Изменено пользователем RedD

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


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

А вообще меня интересовала практическая реализация вот этого вот

Трехполосный эквалайзер + компрессор в полосе 0,3 - 3,4 кГц.

На маломощном avr )

Изменено пользователем RedD

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


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

Все ответы здесь ....

https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%...%BA%D0%BE%D0%B9

 

В том числе и алгоритм, это всего лишь ЦОС, если посмотреть на схему и алгоритм то один в один, остальное тоже там, обычный институтский курс

laughing.gif Вы не поняли, я про то, что изменение даже одного коэффициента влечет переписывание алгоритма обработки в целом (число сдвигов, группировки по сдвигам и т.д.)

Про ЦФ я кое что знаю, первый фильтр я написал еще когда учился в 6 классе :rolleyes: , не совсем фильтр конечно, а систему разностных уравнений для получения эффекта вращающихся галактик, но не суть. Писалось это на БК0010, с его быстродействием 300тыс.оп./cек и работало в реальном времени. К слову всё делалось безо всяких википедий и учебников :smile3046:

А вообще меня интересовала практическая реализация вот этого вот
Раньше это делалось чисто аналоговым путем (обычный АРУ на пиковом детекторе) безо всяких процессоров, в чем преимущество цифрового метода?

Работоспособность компрессора динамического диапазона подтверждена результатами MATLAB-моделирования.
интересно бы еще узнать мнение целевой аудитории.

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


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

Ну то что я хотел сделать я почти сделал )

 

 

На Ваши вопросы

1. То не вижу разницы в том сколько двигать 8 16 32, почему ?

Ну хотя бы потому что под 16 бит АЦП и МК нужен 16 бит и т д иначе просто глупость получается.

2. Насчет отрицательных не думал, нужно будет че нить придумаем )

 

 

 

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


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

Ну хотя бы потому что под 16 бит АЦП и МК нужен 16 бит

Ну в Atmege ядро вроде бы 8-битное. Если речь уже не об atmege, то и сложности с группировкой сдвиговых операций наверно смысла не имеют? В том же кортексе сдвиг на нужное число бит (арифметический, т.е с учетом знака) делается одной инструкцией ASR.

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


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

Ну в Atmege ядро вроде бы 8-битное. Если речь уже не об atmege, то и сложности с группировкой сдвиговых операций наверно смысла не имеют? В том же кортексе сдвиг на нужное число бит (арифметический, т.е с учетом знака) делается одной инструкцией ASR.

 

 

Что Вы имеете под группировкой ?

 

Про знак .....

 

 

С АЦП не может придти отрицательное значение только положительные ....

с ними и работаем, для 8 битного АЦП 0-255, для 10 битного 0-1023

 

Если про это то

 

Си

temp=temp-x2>>2 => temp=temp-(x2)>>2,

 

Да и то только для наглядности, приоритет сдвига выше чем сложение. Сдвиг в 3 группе, сложение в 5 пятой группе приоритетов )

 

ASM

temp=r20,

ldi r0,x2,

lsr r0,

sub temp,r0

Изменено пользователем RedD

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


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

Что Вы имеете под группировкой ?

Ваши же слова:

Я ВАС понял.

Так по подбору коэффициентов то подскажите вот например 0.673 разбираем на (Х0>>1+X0>>3+X0>>5+X0>>6)=X0*0.673

потом группируем по сдвигам и упрощаем вынося за скобки так ?

 

Про знак .....

 

С АЦП не может придти отрицательное значение только положительные ....

с ними и работаем, для 8 битного АЦП 0-255, для 10 битного 0-1023

Ага, а усиление как делать будем? :) Допустим нужно будет усилить какието полосы частот, а какието ослабить -подумайте что будет если просто поделить диапазон 0-255 на N.

(подсказка: Ваш сигнал всегда содержит (бесполезную)постоянную составляющую, которая также будет усиливаться/ослабляться вместе с (полезной) переменной)

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


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

Ваши же слова:

 

 

Ага, а усиление как делать будем? :) Допустим нужно будет усилить какието полосы частот, а какието ослабить -подумайте что будет если просто поделить диапазон 0-255 на N.

(подсказка: Ваш сигнал всегда содержит (бесполезную)постоянную составляющую, которая также будет усиливаться/ослабляться вместе с (полезной) переменной)

 

Про усиление или ослабление я Вас понял, но дело даже не в постоянной составляющей, например

С АЦП прищло 10, усиливаем в два раза, 10*2=20 но дело в том что усиливаем только положительную полу волну, а отрицательную наоборот ослабляем, и усиление не то, и сигнал искажен.

 

Делаем смещение на 128 при (256, 8 бит) пришло 10 ушло 20, пришло -10 ушло -20.

 

В общем то дельное замечание

 

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


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

Но и сигнал тогда на вход двухполярный нужен, операционник с двуполярным питанием, как то так, ну ессно смещение в половину AREF,

Изменено пользователем RedD

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


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

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

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

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

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

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

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

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

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

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