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

IIR фильтр с помощью dsPIC FD Lite

Попробовал рассчитать IIR фильтр 2го порядка для dsPICа с помощью dsPIC Filter Design Lite от микрочипа, хотя на самом деле это клон QED от Momentum, фильтр рассчитался, всё ок , даже эта программка выдаёт готовые *.s,h файла фильтра для добавления в проект, стало интересно как там реализован фильтр, я ожидал увидеть что то вроде:

Y(n) = b0*Xn + b0*X(n-1) + b0*X(n-2) - a1*Y(n-1) - a2*Y(n-2) , собственно аналогичная формула и приведена в мануале на Filter Design, однако в исходнике основная часть кода следующая:

 

DO  w4, transposeSectionLoop  
         MAC w5*w6, a, [w8]+=2, w5
         LAC [w11], #1, b
         SAC.R a, #-1, w7
         MAC w5*w6, b, [w8]+=2, w5
         MAC w5*w7, b, [w8]+=2, w5
         SAC.R b, #-1, [w10++]
         MPY w5*w6, b, [w8]+=2, w5
         SAC.R a, #-1, w6
         LAC [w10], #1, a
         MAC w5*w7, b, [w8]+=2, w5
transposeSectionLoop:         SAC.R b, #-1, [w11++]

 

Целиком файл во вложении, как я понял, этот кусок выполняется 1 раз для одного семпла, при условии, что фильтр 2го порядка. Разложив его по кусочкам ,не совсем понятно, что за алгоритм они применили, или как его перетасовали, коэффициенты используются все 5 штук, а вот входных семплов почему то у меня получилось только 2, с выходными тоже не всё ясно… или тут формула просто какаято другая???

 

неработает почему то вложение

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

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


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

Попробовал рассчитать IIR фильтр 2го порядка для dsPICа с помощью dsPIC Filter Design Lite от микрочипа, хотя на самом деле это клон QED от Momentum, фильтр рассчитался, всё ок , даже эта программка выдаёт готовые *.s,h файла фильтра для добавления в проект, стало интересно как там реализован фильтр, я ожидал увидеть что то вроде:

Y(n) = b0*Xn + b0*X(n-1) + b0*X(n-2) - a1*Y(n-1) - a2*Y(n-2) , собственно аналогичная формула и приведена в мануале на Filter Design, однако в исходнике основная часть кода следующая:

 

DO  w4, transposeSectionLoop  
         MAC w5*w6, a, [w8]+=2, w5
         LAC [w11], #1, b
         SAC.R a, #-1, w7
         MAC w5*w6, b, [w8]+=2, w5
         MAC w5*w7, b, [w8]+=2, w5
         SAC.R b, #-1, [w10++]
         MPY w5*w6, b, [w8]+=2, w5
         SAC.R a, #-1, w6
         LAC [w10], #1, a
         MAC w5*w7, b, [w8]+=2, w5
transposeSectionLoop:         SAC.R b, #-1, [w11++]

 

Целиком файл во вложении, как я понял, этот кусок выполняется 1 раз для одного семпла, при условии, что фильтр 2го порядка. Разложив его по кусочкам ,не совсем понятно, что за алгоритм они применили, или как его перетасовали, коэффициенты используются все 5 штук, а вот входных семплов почему то у меня получилось только 2, с выходными тоже не всё ясно… или тут формула просто какаято другая???

 

неработает почему то вложение

 

Возможно для реализации использовалась каноническая форма (прямая форма 2):

 

post-3066-1233172196_thumb.png

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


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

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

Х0+b0*Х0,

где Х0- нулевой вх отсчет,

b0- коэф фильтра

 

Оно прям таки обрастает другими сомножителями и коэф.

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


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

Попробовал рассчитать IIR фильтр 2го порядка для dsPICа с помощью dsPIC Filter Design Lite от микрочипа, хотя на самом деле это клон QED от Momentum, фильтр рассчитался, всё ок , даже эта программка выдаёт готовые *.s,h файла фильтра для добавления в проект, стало интересно как там реализован фильтр, я ожидал увидеть что то вроде:

Y(n) = b0*Xn + b0*X(n-1) + b0*X(n-2) - a1*Y(n-1) - a2*Y(n-2) , собственно аналогичная формула и приведена в мануале на Filter Design, однако в исходнике основная часть кода следующая:

 

DO  w4, transposeSectionLoop  
         MAC w5*w6, a, [w8]+=2, w5
         LAC [w11], #1, b
         SAC.R a, #-1, w7
         MAC w5*w6, b, [w8]+=2, w5
         MAC w5*w7, b, [w8]+=2, w5
         SAC.R b, #-1, [w10++]
         MPY w5*w6, b, [w8]+=2, w5
         SAC.R a, #-1, w6
         LAC [w10], #1, a
         MAC w5*w7, b, [w8]+=2, w5
transposeSectionLoop:         SAC.R b, #-1, [w11++]

 

Целиком файл во вложении, как я понял, этот кусок выполняется 1 раз для одного семпла, при условии, что фильтр 2го порядка. Разложив его по кусочкам ,не совсем понятно, что за алгоритм они применили, или как его перетасовали, коэффициенты используются все 5 штук, а вот входных семплов почему то у меня получилось только 2, с выходными тоже не всё ясно… или тут формула просто какаято другая???

 

неработает почему то вложение

Это - Transposed Direct Form II biquad filter structure, в формуле ошибочка:

Y(n) = b0*Xn + b1*X(n-1) + b2*X(n-2) - a1*Y(n-1) - a2*Y(n-2) - так должно быть.

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


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

Кажется я поторопился, заметил в этом коде ещё одну не совсем понятную вещь.

Сам код реализует _почти_ следующие формулы:

return = M2 + b0*Sempl

M2 = M1 + a1*return + b1*Sempl

M1 = a2*return + b2*Sempl

 

Отмечу, что эта формула в общем виде из кода, знаки перед константами а1,а2,b0,b1,b2 везде +, реальный знак определяется значением самой константы. Ядро в режиме Fractional вычислений, и если я правильно понял, оно само аппаратно расширяет знак до требуемой разрядности и выполняет здвиг влево.

 

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

 

A     =  M2  /2   +  b0*Sempl  /2
W7  = A *2 !!!!!!!!!!
W7  =  M2  +  b0*Sempl 
B     =  M1  /2   +  b1*Sempl  /2
B     =  M1  /2   +  b1*Sempl  /2   +  a1*W7  /2
B     =  M1  /2   +  b1*Sempl  /2   + a1*(M2  +  b0*Sempl)  /2
M2  =  B *2   !!!!!!!!

M2  =  M1        +  b1*Sempl       + a1*(M2  +  b0*Sempl) 

B     =  b2*Sempl  /2   + a2* W7  /2
B     =  b2*Sempl  /2   + a2*(M2  +  b0*Sempl)  /2
M1  =  B*2   !!!!!!!!

M1  =  b2*Sempl        + a2*(M2  +  b0*Sempl) 

A = A <<  число здвигов выходного масштабирования.
return  =  A *2  !!!!!!!
return  =  M2     +  b0*Sempl

 

 

Часть операций объединены для наглядности, А,B – это аккумуляторы пика, W7 – временный регистр. То есть если посмотреть на код, константы и ячейки задержки M1 и M2 используются смасштабированными делением на 2, а после выполнения части операций снова масштабируются обратно умножением на 2. В следующем цикле фильтра восстановленные М1 и М2 снова делються на 2….. На Fractional преобразования туда сюда вроде не похоже. Разрядности А и В более чем достаточно, для чего это так делаеться? В чём смысл?

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

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


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

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

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

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

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

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

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

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

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

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