#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define ORD 3
#define N 1000
#define K 1024
int main(int argc, char* argv[])
{
void* handle; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
double a[ORD+1], b[ORD+1];
double Rp = 1.0;
double w[N], mag[N], phi[N], tau[N];
double t[K], h[K];
fft_t pfft = {0};
int k, res;
handle = dspl_load(); /* Load DSPL function */
if(!handle)
{
printf("cannot to load libdspl!\n");
return 0;
}
/* Расчет коэффициентов передаточной функции H(s) */
res = butter_ap(Rp, ORD, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
/* печать коэффициентов передаточной функции */
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
/* расчет АЧХ, ФЧХ, ГВЗ */
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
filter_freq_resp(b, a, ORD, w, N,
DSPL_FLAG_ANALOG|DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP,
mag, phi, tau);
/* сохранение АЧХ, ФЧХ, ГВЗ в файлы*/
writetxt(w, mag, N, "dat/butter_ap_test_mag.txt");
writetxt(w, phi, N, "dat/butter_ap_test_phi.txt");
writetxt(w, tau, N, "dat/butter_ap_test_tau.txt");
/* расчет импульсной характеристики и сохранение в файл */
memset(&pfft, 0, sizeof(fft_t));
freqs2time(b, a, ORD, 200.0, K, &pfft, t,h);
writetxt(t, h, K, "dat/butter_ap_test_time.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 820, 680, "img/butter_ap_example.png", &hplot);
gnuplot_cmd(hplot, "set logscale x");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'w, рад/с'");
gnuplot_cmd(hplot, "set multiplot layout 2, 2 rowsfirst");
gnuplot_cmd(hplot, "set ylabel '|H(jw)|^2, дБ'");
gnuplot_cmd(hplot, "set yrange [-80:5]");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_mag.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Ф(w), рад'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_phi.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'tau(w), с'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_tau.txt' with lines");
gnuplot_cmd(hplot, "unset logscale x");
gnuplot_cmd(hplot, "set ylabel 'h(t)'");
gnuplot_cmd(hplot, "set xlabel 't, s'");
gnuplot_cmd(hplot, "set xrange [0:5]");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_time.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
fft_free(&pfft);
dspl_free(handle); /* free dspl handle */
return 0;
}
Расчет аналогового нормированного фильтра нижних частот Баттерворта
Аппроксимация квадрата АЧХ
нормированного ФНЧ Баттерворта представляется в виде (смотри рисунок 1):

– аппроксимирующий полином нормированного ФНЧ Баттерворта,
задает неравномерность
дБ в полосе пропускания фильтра.
нормированного ФНЧ Баттерворта
Порядок фильтра Баттерворта рассчитывается из уравнения:

рад/c – частота среза нормированного ФНЧ,
определяет переходную полосу фильтра,
задает требуемый уровень подавления
дБ в полосе заграждения фильтра.
Прологарифмируем правую и левую части уравнения и получим:

Исходными данными для расчета нормированного ФНЧ Баттерворта служат: частота среза
рад/c,
переходная полоса, задаваемая частотой
, допустимое искажение в полосе пропускания
(дБ)
и требуемое подавление в полосе заграждения
(дБ).
На рисунке 1 приведены соотношения параметров АЧХ нормированного ФНЧ, которые используются как исходные данных для синтеза фильтра.
Для расчета передаточной характеристики
мы должны получить выражения для нулей и полюсов квадрата модуля передаточной характеристики
нормированного ФНЧ Баттерворта.
Квадрат АЧХ
есть сечение квадрата модуля передаточной характеристики
при
.
Для расчета нулей и полюсов
подставим
в выражение квадрата АЧХ (1), тогда:

Очевидно, что ни при каких конечных комплексных
выражение (4) не равно нулю, квадрат модуля передаточной характеристики
нормированного ФНЧ Баттерворта не имеет конечных нулей.
Для расчета полюсов
нормированного ФНЧ Баттерворта приравняем знаменатель (4) к нулю:

Рассмотрим отдельно четные и нечетные значения порядка фильтра
.
При четных
имеем:

Представим минус единицу в правой части (6) через комплексную экспоненту
, тогда

Прологарифмируем левую и правую части уравнения (7) и получим:

Преобразуем:


Окончательно можно записать выражение для полюсов квадрата модуля
передаточной функции при четных
:

из выражения (5) имеем:

Представим единицу в правой части через комплексную экспоненту
тогда

Прологарифмируем левую и правую части уравнения (13) и получим:

Преобразуем:


Окончательно можно записать выражения для полюсов квадрата модуля
передаточной функции
при нечетных
:

На рисунке 2 показано расположение полюсов квадрата модуля передаточной функции
, заданной выражением (4) при четном
(слева) и нечетном
(справа) порядках фильтра Баттерворта.
и нечетном
порядках фильтра Баттерворта
Все полюсы квадрата модуля АЧХ фильтра Баттерворта расположены на окружности радиуса
, и отстоят друг от друга на угол
. В частном случае при
все полюсы расположены на единичной окружности.
Для получения устойчивого и физически реализуемого фильтра необходимо, чтобы все нули и полюсы передаточной функции
располагались в левой полуплоскости комплексной плоскости
или на мнимой оси
. Тогда для расчета передаточной функции
нормированного ФНЧ Баттерворта необходимо из всех
полюсов квадрата модуля
передаточной функции выбрать только те
полюсов, что лежат в левой полуплоскости.
Все
полюсов
, расположенные в левой полуплоскости могут быть записаны как для четного, так и для нечетного порядка фильтра
(смотри рисунок 2):

Перепишем в тригонометрической форме:

Таким образом, мы задали все полюсы передаточной функции
нормированного ФНЧ Баттерворта порядка
. Тогда передаточная функция
нормированного ФНЧ Баттерворта может быть представлена:

Обратим внимание, что все полюсы передаточной функции нормированного ФНЧ Баттерворта четного порядка (смотри рисунок 2) представляют собой комплексно-сопряженные пары, а у фильтра нечетного порядка есть один вещественный полюс.
Тогда можно представить передаточную функцию нормированного ФНЧ Баттерворта при помощи биквадратной формы. Для четного
:

Окончательно можно записать:

В случае нечетного
имеем дополнительный вещественный полюс
. Передаточную функцию
нормированного ФНЧ Баттерворта можно представить при помощи биквадратной формы для нечетного
:

Окончательно можно объединить выражения (22) и (23). Для любого целого
(
может принимать значения 0 или 1) передаточная функцию
нормированного ФНЧ Баттерворта имеет вид:

Коэффициент передачи
нормированного ФНЧ Баттерворта на нулевой частоте равен:

Для нормировки коэффициента передачи на нулевой частоте
необходимо передаточную функцию
нормированного ФНЧ Баттерворта (24) разделить на
. Тогда окончательно:

Необходимо отметить, что при
,
и
без нормировки. При этом
соответствует
и выражение для передаточной характеристики фильтра (26) преобразуется к виду:

Форма записи (27) передаточной функции нормированного ФНЧ Баттерворта получила широкое распространение ввиду того, что не требуется нормировка. Однако выражение (26) позволяет регулировать коэффициент передачи фильтра на частоте среза
и является более общей.
Рассчитаем нормированный ФНЧ Баттерворта при следующих параметрах квадрата АЧХ
(смотри рисунок 1):

Шаг 1. Рассчитываем параметры
и
:

Шаг 2. Рассчитываем порядок фильтра согласно выражению (3):

Округляем
до бо́льшего целого. Таким образом,
.
Шаг 3. Рассчитываем передаточную характеристику согласно выражению (26).
При этом
, значит
,
. Рассчитываем
:

Рассчитываем значения
. В нашем случае
, поэтому будет только одно значение
равное:

Передаточную функцию
фильтра можно записать:

На этом расчет нормированного ФНЧ Баттерворта окончен.
Комплексный коэффициент передачи
полученного фильтра равен:

На рисунке 3 показаны квадрат АЧХ
, ФЧХ
, групповая задержка
и импульсная характеристика
рассчитанного нормированного ФНЧ Баттерворта третьего порядка.
Обратите внимание, что по оси абсцисс частота представлена в логарифмическом масштабе.
Таким образом, в данном разделе мы рассмотрели порядок расчета передаточной функции аналогового нормированного ФНЧ Баттерворта и привели пример расчета фильтра по заданным параметрам АЧХ.
В библиотеке
DSPL-2.0
реализована функция
butter_ap
,
которая рассчитывает коэффициенты передаточной функции
аналогового
нормированного фильтра Баттерворта.
Исходный код программы butter_ap_example.c
расчета и построения характеристик фильтра (рисунок 3):