|
|
 |
Ответов
|
Jan 24 2006, 15:08
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
фильтр на 316гц по идее должен пропускать частоту 316, не усиливая и не подавляя. А этот результат я объяснить никак не могу. Филтр реализуется такой вот функцией на языке Си++ в IAR C для Atmel AVR (3 версия)
// 1. Вычисление результата в рекурсивной ветви звена: // D10 = Uadc + D11*a11 + D12*a12
void MyChannelClass::FilterOne(MyChannelClass *pntr) { //формат коэффициентов 4.12 //формат переменных фильтров 8.8 pntr->D10 = pntr->ADC_buffer; //ывделяем из формата 12.20 число в формате 8.8 pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D11, pntr->a11)>>12 ); pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D12, pntr->a12)>>12 ); pntr->D12 = pntr->D11; pntr->D11 = pntr->D10; }
далее выполняется
// 2. Детектирование и сглаживание сигнала (амплитудное детектирование // Цикл выборки НЧ в 16 раз больше периода квантования // Uad1 = 4*b10*abs(D10) (умножение на 4 из-за сдвига на 2 разряда влево, чтобы убрать знак, хранящийся в старших разрядах 2байтной переменной D10 - это было в предыдущей программе для другого МК) Сейчас это написано на Си так.
pntr->Uad1 = SignedToUnsigned(pntr->D10); pntr->Uad1 = int( fmuls16x16_32( pntr->Uad1, pntr->b10)>>12 ); //8.8 x 4.12 = 12.20 -> 8.8 pntr->Uad1 = (pntr->Uad1)*4;
функция fmuls16x16_32 реализует умножение двухбайтных чисел и дает 4 байтный результат (арифметика с фиксированной точкой)
для фильтра на 430гц 1.584584 /* section 1 A1 */ -0.987981 /* section 1 A2 */ 0.006009 /* section 1 B0 */ -0.006009 /*section 1 B2 */ здесь имеется ввиду уравнение x[t] +a1*x[t-1] + a2*x[t-2] = b0*y[t] +b2*y[t-2] на практике остается только левая часть, а правая выносится как бы за сумматор (простите, что без картинки - если надо, сделаю).
Используемый коэффициент b0=0.3308. Это значение было подобрано так, чтобы все работало. И оно действительно работает в предыдущей версии устройства (его делал не я, и программу тоже не я писал, но сомнений в том, что это так не возникает). Подбирался он из следующих соображений : результат не должен был переполнять разрядную сетку. А если вынести коэффициенты b0 и b2 за сумматор, то значение фильтра будет равно абсолютному значению рекурсивной ветви звена.
я заподозрил что что-то не так, когда увидел что среднее значение после детектирования подчиняется закономерности, которую я описывал выше, и от этого предположения перешел к предыдущему шагу, о чем здесь и спрашиваю.
забыл сказать что речь идет о рекурсивном фильтре с бесконечной импульсной характеристикой (IIR). Рачет выполняет в старой проге методом Bilinear Transformation , работающей под DOS. Ее результат сомнений не вызывает
|
|
|
|
|
Jan 25 2006, 16:25
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792

|
Цитата(skopus @ Jan 24 2006, 18:08)  для фильтра на 430гц 1.584584 /* section 1 A1 */ -0.987981 /* section 1 A2 */ 0.006009 /* section 1 B0 */ -0.006009 /*section 1 B2 */ здесь имеется ввиду уравнение x[t] +a1*x[t-1] + a2*x[t-2] = b0*y[t] +b2*y[t-2] на практике остается только левая часть, а правая выносится как бы за сумматор (простите, что без картинки - если надо, сделаю).
Используемый коэффициент b0=0.3308. Это значение было подобрано так, чтобы все работало. И оно действительно работает в предыдущей версии устройства (его делал не я, и программу тоже не я писал, но сомнений в том, что это так не возникает). Подбирался он из следующих соображений : результат не должен был переполнять разрядную сетку. А если вынести коэффициенты b0 и b2 за сумматор, то значение фильтра будет равно абсолютному значению рекурсивной ветви звена.
я заподозрил что что-то не так, когда увидел что среднее значение после детектирования подчиняется закономерности, которую я описывал выше, и от этого предположения перешел к предыдущему шагу, о чем здесь и спрашиваю. Полагаю, что х - это входной сигнал, а у - выходной. Из написанного уравнения следует: y[t]=(x[t]+a1*x[t-1]+a2*x[t-2]-b2*y[t-2])/b0 поскольку сумма коэффициентов при х не равна 0, это значит, что данный фильтр как минимум пропускает постоянную составляющую. Есть большое подозрение, что запись исходного уравнения (для приведенных выше коэффициентов) неверна. Оно должно выглядеть так: y[t] +a1*y[t-1] + a2*y[t-2] = b0*x[t] +b2*x[t-2] а конечная рассчетная формула фильтра: y[t] = b0*x[t]+b2*x[t-2]-a1*y[t-1]-a2*y[t-2]
|
|
|
|
Сообщений в этой теме
ASV Цифровой фильтр Dec 8 2005, 20:08 mse Не всё так просто. ЦФ бывают, как минимум, FIR и I... Dec 8 2005, 21:47 Tiro ASV
По английски читаешь? Посмотри здесь, наприме... Dec 8 2005, 22:12 Dr.NoA Цитата(ASV @ Dec 8 2005, 23:08) Вопрос: и... Dec 9 2005, 09:22 mse ЦитатаКак раз все 10 отсчетов и надо пропускать че... Dec 9 2005, 19:58 GrayCat Цитата(ASV @ Dec 8 2005, 22:08) На скольк... Dec 12 2005, 08:58 aal В http://vlab.netsys.ru/forum/showthread.php?t=388... Dec 15 2005, 12:28 nano Крик о помощи
Начальные условия : топик прочел... Dec 15 2005, 16:41 ASV У меня задача следующая. Мне нужно померить напряж... Dec 20 2005, 21:19 mse Цитатаи умеет быстро умножать только 8bit
Ну не ст... Dec 20 2005, 21:43 ASV Цитата(mse @ Dec 21 2005, 01:43) Цитата и... Dec 20 2005, 21:48 mse Цитатаа не в строчку как это делают DSPIC-и.
Хех. ... Dec 20 2005, 21:54 ASV Цитата(mse @ Dec 21 2005, 01:54) Цитатаа ... Dec 21 2005, 22:46 urasinov nano
В MATLAB в DSP Blockset имеется Filter Realiz... Dec 22 2005, 07:17 Sokol Цитата(nano @ Dec 15 2005, 19:41) Крик о ... Dec 22 2005, 12:34 skopus Уважаемые, скажите пожалуйста насколько сильно мож... Jan 23 2006, 16:52 BVU Цитата(skopus @ Jan 23 2006, 19:52) Уважа... Jan 25 2006, 08:06 Dr.NoA Я правильно понял проблему? Вы подаете синус с амл... Jan 23 2006, 20:54 skopus нет. Вы не совсем правильно поняли. Фильтры не сое... Jan 24 2006, 05:02 skopus поисследовал ситуацию поподробнее и обнаружил, что... Jan 24 2006, 08:59 Dr.NoA Какие-то странные графики. Почему, например, для ф... Jan 24 2006, 10:54 Dr.NoA Я бы все таки проверил характеристики фильтра в Ma... Jan 24 2006, 19:54 skopus я уже неоднократно проверял. И в матлабе, и в про... Jan 25 2006, 07:06 skopus я не говорил что у меня НЧ фильтры. У меня узкопол... Jan 25 2006, 08:34 BVU Для выяснения причин данной проблемы нужно подать ... Jan 25 2006, 10:20 skopus Цитата(BVU @ Jan 25 2006, 13:20) Для выяс... Jan 25 2006, 14:54  BVU Цитата(skopus @ Jan 25 2006, 17:54) Цитат... Jan 25 2006, 15:46   Stanislav Цитата(BVU @ Jan 25 2006, 18:46) ...Судя ... Jan 25 2006, 16:05  Johny Цитата(skopus @ Jan 25 2006, 17:54) http:... Jan 25 2006, 16:56 michael34 Вряд ли ты прав... Хотя точно сказать не могу... Jan 25 2006, 11:11 BVU Цитата(michael34 @ Jan 25 2006, 14:11) Вр... Jan 25 2006, 13:34 Johny Еще раз о коэффициентах фильтра.
Если рассчитанны... Jan 26 2006, 07:52 Johny Цитата(Johny @ Jan 26 2006, 10:52) Надо е... Jan 26 2006, 08:34 Dr.NoA Как я понял, при расчете в таком виде
Цитата// 1. ... Jan 26 2006, 08:44 skopus Спасибо за совет. Но удивительное в том, что перво... Jan 26 2006, 11:17 Dr.NoA Наоборот, при такой записи уравнения
Цитатаx[kT]+a... Jan 26 2006, 13:12 skopus так в том-то и дело что этих b0 и b2 в уравнениях ... Jan 26 2006, 14:26 Dr.NoA Цитата(skopus @ Jan 26 2006, 17:26) так в... Jan 26 2006, 16:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|