Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IIR фильтр с помощью dsPIC FD Lite
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
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, с выходными тоже не всё ясно… или тут формула просто какаято другая???

неработает почему то вложение
Самурай
Цитата(Angelo @ Jan 28 2009, 21:46) *
Попробовал рассчитать 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):

Нажмите для просмотра прикрепленного файла
Angelo
Возможно и оно, но картинка пока не сложилась, в алгоритме явно часто используется выражение
Х0+b0*Х0,
где Х0- нулевой вх отсчет,
b0- коэф фильтра

Оно прям таки обрастает другими сомножителями и коэф.
Vlad27
Цитата(Angelo @ Jan 28 2009, 20:46) *
Попробовал рассчитать 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) - так должно быть.
Angelo
Всем спасибо! разобрался с этим вопросом!
Angelo
Кажется я поторопился, заметил в этом коде ещё одну не совсем понятную вещь.
Сам код реализует _почти_ следующие формулы:
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 преобразования туда сюда вроде не похоже. Разрядности А и В более чем достаточно, для чего это так делаеться? В чём смысл?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.