Коэффициенты БИХ фильтров

Все что касается фильтрации
Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Re: Коэффициенты БИХ фильтров

Сообщение Ivan Karamazov »

НО ВАЖНО полоса фнч с частотой среза 0.5 будет равна пи рад/c потому что она симметрична относительна нуля и есть 0.5 пи в положительной области и 0.5 пи в отрицательной и полоса таким образом пи или Fд/2 (поэтому и полуполосный half-band)
Это вроде понятно -- применительно к комплекснозначному сигналу.
Т.е. фильтруя *действительный* белый шум ФНЧ с полосой "0.5" я каким-то образом умудрялся (вчера и сегодня утром) получать "почти полную полосу", а с ФНЧ 0.25 -- вроде как половину. Сейчас вроде как все правильно стало -- как это было и как удалось -- не знаю [возможно, линейный масштаб с логарифмическим попутал, возможно -- шум какой-то не тот попался :) :oops: :oops: ] -- в общем, по прочтении ответа все "вдруг" стало правильно и согласованно. Спасибо; наверное, мне по ночам лучше спать. :oops: :oops:
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Вычисление БИХ

Сообщение Ivan Karamazov »

Вот, опять нарвался. Я (для начала) считаю БИХ-обработанный сигнал так:

Код: Выделить всё

// process a sample
 inline double iirf(double sample)
 {
  double sum_i = sample;
  double sum_o = 0.0;
  int k = m_ix;
  int i;

  for(i = 0; i < m_nord; ++i)
  {
   if(0 == k)
    k = m_nord;
   --k;

   sum_i += m_z[k] * m_c[i];
   sum_o += m_z[k] * m_d[i];
  }

  m_z[m_ix] = sum_i;
  if(++m_ix >= m_nord)		// m_ix = (++m_ix) % m_nord; -- it's BAD for iNTEL
   m_ix = 0;

  return sum_i * m_d0 + sum_o;
 }
Т.е. в лоб реализую каноническую форму. С точки зрения вычислительной эффетивности (ВКЛЮЧАЯ эффективность адресно-индексных выражений) -- это, полагаю, не самый плохой вариант / вероятно -- не лучший, но здесь вынести оценку трудно).
Результат -- КИХ-16-пор.-- ok, т.е. волшебно; но хочется понять предел :? :) .КИХ 19-го порядка -- разваливается. (19-го -- потерян, но, например, такой (термины dsp.dll, разваливается согл. вышеизложенному алг. однозначно):)

Код: Выделить всё

 FP fp;
 fp.digital = true;
 fp.Rp = 2.0;
 fp.Rs = 96.0;
 fp.type = FB_LOW  | FA_ELLIP;
 fp.wpl = 0.4999;
 fp.wsl = 0.5005;
 fp.wph = fp.wsh = 0.0;
Т.е. (1) в инете море вариантов *реализаций* расчета БИХ -- после 2-го не читаю :shock: (2) умный отладчик показывает, что при вычислении выражения "return sum_i * m_d0 + sum_o;" вычитаются два больших-почти-равных-числа, что есть, по всем канонам точки очень плохо. Т.е., конечно, я, возможно, и справлюсь, [собственно, справился уже -- более скромный КИХ 16-го порядка не только работает, но и устраивает -- просто вопрос о границах IEEE754+IIR-unlim] но, кажется, вопрос "практики БИХ-фильтрации" не только мне м.б. интересен... ;) И, конечно, очень интересно мнение всех "муки прошедших".
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1036
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Коэффициенты БИХ фильтров

Сообщение Бахурин Сергей »

Расчет эллиптического фильтра высокого порядка это совсем нетривиальная задача. Все эллиптические функции рассчитываются итерационно, ошибки накапливаются. Кроме того у бих фильтров очень сильно различаются коэффициенты. Например максимальный по модулю к-т может быть 10^4 а минимальный 10^-6 получается 10 порядков что приводит к сложностям практической реализации. Все это накладывает ограничения на порядок фильтра. Вообще фильтры более 6-8 порядка я лично на практике не использую. В приведенном примере очень узкая переходная полоса и сильное подавление. Полюса фильтра почти на единичной окружности и любое округление может вывести полюс за единичную окружность и фильтр перестанет быть устойчивым. Насчет теоретических пределов можно сказать что если есть идеальный вычислитель без округлений и т.д. то можно сделать фильтр любого порядка.

Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Re: Коэффициенты БИХ фильтров

Сообщение Ivan Karamazov »

максимальный по модулю к-т может быть 10^4 а минимальный 10^-6
Ну, за этим я как раз слежу -- у меня разница не более примерно трех порядков получается. Во сяком случае, если я правльно понял, считать фильр в канонической форме либо как-то еще -- особой разницы нет? Т.е. все (включая заметные шумы у вполне устойчивого фильтра -- я только сегодня их заметил) зависит от близости полюсов к ед. окружности?
[Извиняюсь за дурацкие вопросы, но БИХ'и -- это какой-то совсем новый мир, а спросить боле не у кого -- народ при слове "КИХ-по-аналоговому-прототипу" шарахается так, как будто я предлагаю обсудить технику самоубийства :D ]
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

Dmitri Seva
Сообщения: 30
Зарегистрирован: 07 дек 2010, 09:29

Re: Коэффициенты БИХ фильтров

Сообщение Dmitri Seva »

Точность фильтрации зависит от точности вычисления коэффициентов и точности реализации самой процедуры фильтрации. Как и всегда точность вычисления коэффициентов можно существенно повысить отказавшись от плавающей точки и использовать арифметику с фиксированной точкой. Главное чтобы хватило разрядов. Плавающая точка универсальна и обеспечивает 15 значащих цифр (ieee754 double) независимо от положения точки. Плавающая точка обладает большим динамическим диапазоном, поэтому её удобнее применять в процедуре фильтрации если диапазон значений фильтруемого сигнала неизвестен. В случае если диапазон известен, то как обычно точность вычислений можно повысить перейдя на фиксированную точку, главное не допускать переполнения при суммировании. Фильтр является устойчивым если все его нули и полюса по модулю меньше единицы в Z-плоскости. Если хоть один нуль или полюс лежит на единичной окружности фильтр превращается в генератор. Если по модулю превышает единицу, то фильтр уходит в разнос. Визуально это все можно увидеть рассматривая диаграмму нулей и полюсов а также переходную и импульсную характеристику.

Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Re: Коэффициенты БИХ фильтров

Сообщение Ivan Karamazov »

Dmitri Seva
Почти полностью согласен, за исключением:
точность вычисления коэффициентов можно существенно повысить отказавшись от плавающей точки и использовать арифметику с фиксированной точкой
:shock:
Вопрос, конечно, был в другом -- собственно фильтрацию можно делать по-разному -- начиная от канонической формы через "по-определеню" и далее... -- можно сказать, в первый раз в жизне увидел расходящийся КИХ, 1-е, что приходит в голову -- попытаться перевернуть алгоритм вычисления *отсчетов*. Более таких идей применительно к БИХ не приходит. :)
Спасибо всем, кто помог "переболеть".
ps: а главное -- избегать крайностей -- т.е. предания анафеме плав. точки (с одной стороны), ну и, разумеется, слепой веры в точку ("53 бита мантиссы double все перемелит") -- со стороны другой.
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

Ответить