|
|
  |
IIR фильтр с помощью dsPIC FD Lite |
|
|
|
Jan 28 2009, 18:46
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Попробовал рассчитать 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, 18:52
|
|
|
|
|
Jan 28 2009, 19:57
|
Местный
  
Группа: Участник
Сообщений: 468
Регистрация: 4-03-05
Пользователь №: 3 066

|
Цитата(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):
|
|
|
|
|
Jan 29 2009, 10:21
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Возможно и оно, но картинка пока не сложилась, в алгоритме явно часто используется выражение Х0+b0*Х0, где Х0- нулевой вх отсчет, b0- коэф фильтра Оно прям таки обрастает другими сомножителями и коэф.
|
|
|
|
|
Jan 29 2009, 12:27
|
Частый гость
 
Группа: Свой
Сообщений: 95
Регистрация: 31-07-05
Из: Полоцк Беларусь
Пользователь №: 7 227

|
Цитата(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) - так должно быть.
|
|
|
|
|
Jan 30 2009, 15:11
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Всем спасибо! разобрался с этим вопросом!
|
|
|
|
|
Mar 3 2009, 15:25
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Кажется я поторопился, заметил в этом коде ещё одну не совсем понятную вещь. Сам код реализует _почти_ следующие формулы: 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 - Mar 3 2009, 15:27
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|