Таки решид проблему сам. Привожу фрагменты исходника на случай, если кому понадобится.
Код
//---------------------------------
// описание структур
typedef struct
{
double a, b;
}ab_Val;
typedef struct
{
double D[3], C[2];
}IIR2_par;
//---------------------------------
// определение параметров
int GetIir2Parameters(double Ff, ab_Val &abv, double K, IIR2_par *p)
{
if(Ff == 0) return 1;
double L = 1.0 / tan(M_PI * Ff);
double a = abv.a, b = abv.b;
double det = 1.0 + a * L + b * L * L;
if(det == 0) return 2;
double *C = p->C, *D = p->D;
D[0] = K / det;
D[1] = 0;
D[2] = 0;
C[0] = (1.0 - a * L + b * L * L) / det;
C[1] = -(2 * b * L * L) / det;
return 0;
}
//---------------------------------
// параметры для разных типов фильтров
// взято из книги П.Хоровиц, У.Хилл "Полупроводниковая схемотехника"
static ab_Val abv[]=
{
{1.2872, 0.4142}, // ФКЗ
{1.3617, 0.6180}, // Бесселя
{1.4142, 1.0000}, // Баттерворта
{1.3614, 1.3827}, // Чебышева 0.5 дБ
{1.3022, 1.5515}, // Чебышева 1 дБ
{1.1813, 1.7775}, // Чебышева 2 дБ
{1.0650, 1.9305} // Чебышева 3 дБ
};
//---------------------------------
// вызов функции расчёта параметров
if(GetIir2Parameters(F_3db / f_sample, abv[i], 2.0, &iir2p)) goto __exit;
Методику расчёта взял из обозначенной книги. Несмотря на то, что всё это работает, у меня возник вопрос:
на самом ли деле D[1] и D[2] должны быть равны 0? Если следовать примеру - то да, если выводить по формулам, то нет.

Я сделал, как в примере...
Редактирую, добавляю картинку со структурой этого фильтра.
Эскизы прикрепленных изображений
/* Всё хорошо в меру. */