Angelo 0 28 января, 2009 Опубликовано 28 января, 2009 (изменено) · Жалоба Попробовал рассчитать 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, с выходными тоже не всё ясно… или тут формула просто какаято другая??? неработает почему то вложение Изменено 28 января, 2009 пользователем Angelo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 28 января, 2009 Опубликовано 28 января, 2009 · Жалоба Попробовал рассчитать 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 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Возможно и оно, но картинка пока не сложилась, в алгоритме явно часто используется выражение Х0+b0*Х0, где Х0- нулевой вх отсчет, b0- коэф фильтра Оно прям таки обрастает другими сомножителями и коэф. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad27 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Попробовал рассчитать 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 0 30 января, 2009 Опубликовано 30 января, 2009 · Жалоба Всем спасибо! разобрался с этим вопросом! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Angelo 0 3 марта, 2009 Опубликовано 3 марта, 2009 (изменено) · Жалоба Кажется я поторопился, заметил в этом коде ещё одну не совсем понятную вещь. Сам код реализует _почти_ следующие формулы: 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 преобразования туда сюда вроде не похоже. Разрядности А и В более чем достаточно, для чего это так делаеться? В чём смысл? Изменено 3 марта, 2009 пользователем Angelo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться