Jump to content

    
Sign in to follow this  
Angelo

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

Recommended Posts

Попробовал рассчитать 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, с выходными тоже не всё ясно… или тут формула просто какаято другая???

 

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

Edited by Angelo

Share this post


Link to post
Share on other sites
Попробовал рассчитать 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

Share this post


Link to post
Share on other sites

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

Х0+b0*Х0,

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

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

 

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

Share this post


Link to post
Share on other sites
Попробовал рассчитать 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) - так должно быть.

Share this post


Link to post
Share on other sites

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

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

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 преобразования туда сюда вроде не похоже. Разрядности А и В более чем достаточно, для чего это так делаеться? В чём смысл?

Edited by Angelo

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this