Angelo 0 Posted January 28, 2009 (edited) · Report post Попробовал рассчитать 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 January 28, 2009 by Angelo Quote Ответить с цитированием Share this post Link to post Share on other sites
Самурай 0 Posted January 28, 2009 · Report post Попробовал рассчитать 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): Quote Ответить с цитированием Share this post Link to post Share on other sites
Angelo 0 Posted January 29, 2009 · Report post Возможно и оно, но картинка пока не сложилась, в алгоритме явно часто используется выражение Х0+b0*Х0, где Х0- нулевой вх отсчет, b0- коэф фильтра Оно прям таки обрастает другими сомножителями и коэф. Quote Ответить с цитированием Share this post Link to post Share on other sites
Vlad27 0 Posted January 29, 2009 · Report post Попробовал рассчитать 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) - так должно быть. Quote Ответить с цитированием Share this post Link to post Share on other sites
Angelo 0 Posted January 30, 2009 · Report post Всем спасибо! разобрался с этим вопросом! Quote Ответить с цитированием Share this post Link to post Share on other sites
Angelo 0 Posted March 3, 2009 (edited) · Report post Кажется я поторопился, заметил в этом коде ещё одну не совсем понятную вещь. Сам код реализует _почти_ следующие формулы: 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 March 3, 2009 by Angelo Quote Ответить с цитированием Share this post Link to post Share on other sites