#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;
}
Расчет аналогового нормированного фильтра нижних частот Баттерворта
DSPL-2.0 — свободная библиотека алгоритмов цифровой обработки сигналов Распространяется под лицензией LGPL v3 Страница проекта на SourceForge |
Аппроксимация квадрата АЧХ нормированного ФНЧ Баттерворта представляется в виде (смотри рисунок 1):
Порядок фильтра Баттерворта рассчитывается из уравнения:
Прологарифмируем правую и левую части уравнения и получим:
Исходными данными для расчета нормированного ФНЧ Баттерворта служат: частота среза рад/c, переходная полоса, задаваемая частотой , допустимое искажение в полосе пропускания (дБ) и требуемое подавление в полосе заграждения (дБ).
На рисунке 1 приведены соотношения параметров АЧХ нормированного ФНЧ, которые используются как исходные данных для синтеза фильтра.
Для расчета передаточной характеристики мы должны получить выражения для нулей и полюсов квадрата модуля передаточной характеристики нормированного ФНЧ Баттерворта.
Квадрат АЧХ есть сечение квадрата модуля передаточной характеристики при .
Для расчета нулей и полюсов подставим в выражение квадрата АЧХ (1), тогда:
Очевидно, что ни при каких конечных комплексных выражение (4) не равно нулю, квадрат модуля передаточной характеристики нормированного ФНЧ Баттерворта не имеет конечных нулей.
Для расчета полюсов нормированного ФНЧ Баттерворта приравняем знаменатель (4) к нулю:
При четных имеем:
Все полюсы квадрата модуля АЧХ фильтра Баттерворта расположены на окружности радиуса , и отстоят друг от друга на угол . В частном случае при все полюсы расположены на единичной окружности.
Для получения устойчивого и физически реализуемого фильтра необходимо, чтобы все нули и полюсы передаточной функции располагались в левой полуплоскости комплексной плоскости или на мнимой оси . Тогда для расчета передаточной функции нормированного ФНЧ Баттерворта необходимо из всех полюсов квадрата модуля передаточной функции выбрать только те полюсов, что лежат в левой полуплоскости.
Все полюсов , расположенные в левой полуплоскости могут быть записаны как для четного, так и для нечетного порядка фильтра (смотри рисунок 2):
Тогда можно представить передаточную функцию нормированного ФНЧ Баттерворта при помощи биквадратной формы. Для четного :
Форма записи (27) передаточной функции нормированного ФНЧ Баттерворта получила широкое распространение ввиду того, что не требуется нормировка. Однако выражение (26) позволяет регулировать коэффициент передачи фильтра на частоте среза и является более общей.
Рассчитаем нормированный ФНЧ Баттерворта при следующих параметрах квадрата АЧХ (смотри рисунок 1):
Шаг 3. Рассчитываем передаточную характеристику согласно выражению (26). При этом , значит , . Рассчитываем :
Комплексный коэффициент передачи полученного фильтра равен:
Обратите внимание, что по оси абсцисс частота представлена в логарифмическом масштабе.
Таким образом, в данном разделе мы рассмотрели порядок расчета передаточной функции аналогового нормированного ФНЧ Баттерворта и привели пример расчета фильтра по заданным параметрам АЧХ.
В библиотеке DSPL-2.0 реализована функция butter_ap , которая рассчитывает коэффициенты передаточной функции аналогового нормированного фильтра Баттерворта.
Исходный код программы butter_ap_example.c
расчета и построения характеристик фильтра (рисунок 3):