#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) к нулю:

.
При четных
имеем:

, тогда




передаточной функции при четных
:

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

тогда




передаточной функции
при нечетных
:

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


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

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


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

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

нормированного ФНЧ Баттерворта на нулевой частоте равен:

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

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

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

и
:


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

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

фильтра можно записать:

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

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