#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define ORD 5
#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;
double Rs = 45.0;
double w[N], mag[N], phi[N], tau[N];
complex_t H[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 = ellip_ap(Rp, Rs, 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/ellip_ap_test_mag.txt");
writetxt(w, phi, N, "dat/ellip_ap_test_phi.txt");
writetxt(w, tau, N, "dat/ellip_ap_test_tau.txt");
/* расчет импульсной характеристики и сохранение в файл */
memset(&pfft, 0, sizeof(fft_t));
freqs2time(b, a, ORD, 50.0, K, &pfft, t,h);
writetxt(t, h, K, "dat/ellip_ap_test_time.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 820, 680, "img/ellip_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/ellip_ap_test_mag.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Ф(w), рад'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/ellip_ap_test_phi.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'tau(w), с'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/ellip_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/ellip_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] по заданным параметрам АЧХ, показанным на рисунке 1.
В отличии от фильтров Чебышева первого и второго рода, АЧХ эллиптических фильтров имеет равноволновые колебания как в полосе пропускания, так и в полосе заграждения.
Впервые описание передаточной функции фильтра с использованием аппарата эллиптических функций Якоби было произведено В. Кауэром в 1931 году [2]. Введение в теорию эллиптических функций представлено в приложении.
Аппроксимация квадрата АЧХ нормированного эллиптического ФНЧ представляется в виде:
Порядок эллиптического фильтра можно рассчитать из уравнения:
Исходными данными для расчета нормированного эллиптического ФНЧ служат: частота среза , переходная полоса, задаваемая , допустимое искажение в полосе пропускания (дБ) и требуемое подавление в полосе заграждения (дБ).
На первом шаге рассчитываются параметры , , и , после чего производится расчет требуемого порядка фильтра согласно выражению (3). Полученное значение порядка фильтра округляется до бо́льшего целого значения. При округлении до бо́льшего целого мы меняем параметры эллиптической дробно-рациональной функции. Так на рисунке 2а показаны АЧХ эллиптического фильтра при различном и фиксированном значении эллиптического модуля . Из рисунка 2а видно, что увеличение порядка при фиксированном приводит к увеличению уровня подавления фильтра в полосе заграждения.
Однако, в отличие от всех выше рассмотренных аппроксимирующих полиномов, эллиптическая дробно-рациональная фунция имеет дополнительную степень свободы в виде параметра эллиптического модуля . Мы можем использовать данных параметр для обеспечения требуемого уровня подавления (дБ) в полосе заграждения фильтра. Для этого необходимо произвести обновление значения эллиптического модуля согласно выражению [1]:
Квадрат АЧХ есть сечение квадрата модуля передаточной характеристики при .
Для расчета нулей и полюсов подставим в выражение квадрата АЧХ (1) , тогда:
Полюсы квадрата модуля передаточной функции нормированного эллиптического ФНЧ можно найти решив уравнение
Расположение нулей и полюсов квадрата модуля передаточной характеристики нормированного эллиптического ФНЧ на комплексной плоскости для фильтра четного и нечетного порядков при подавлении в полосе заграждения равном 40 дБ показано на рисунке 3.
Крестиками обозначены полюсы квадрата модуля передаточной характеристики, а кружочками – нули. Видно, что у фильтра нечетного порядка имеются чисто вещественные полюсы. Обратите внимание, что нули и полюсы отображены в одинаковом масштабе.
Также на рисунке 3 показаны параметрические кривые на которых расположены полюсы квадрата модуля передаточной функции для различного значения неравномерности в полосе пропускания и уровня подавления в полосе заграждения .
Для получения передаточной характеристики физически реализуемого фильтра необходимо, чтобы все ее нули и полюсы располагались в левой полуплоскости , или на мнимой оси . При этом нули и полюсы на мнимой оси должны быть простыми.
Тогда из всех нулей (8) , , квадрата модуля передаточной функции нормированного эллиптического ФНЧ необходимо выбрать различных нулей кратности один, а из полюсов (10) необходимо выбрать только полюса с отрицательной реальной частью.
Передаточную характеристику нормированного эллиптического ФНЧ можно записать в виде:
Тогда для любого , где может принимать значения 0 или 1, передаточную функцию нормированного эллиптического ФНЧ можно записать через биквадратную форму:
Коэффициент передачи на нулевой частоте нормированного эллиптического ФНЧ при равен:
Тогда окончательно передаточную характеристику нормированного эллиптического ФНЧ для произвольного порядка можно представить в виде:
Рассчитаем нормированный эллиптический ФНЧ исходя из следующих параметров квадрата АЧХ:
Шаг 3. Пересчет эллиптического модуля согласно выражению (4). Предварительно представим , откуда , . Тогда
Шаг 4. Расчет нулей и полюсов фильтра. Нули фильтра рассчитываются согласно (15):
Передаточная характеристика фильтра равна:
На этом расчет нормированного эллиптического ФНЧ можно считать оконченным.
Подставив в выражение для передаточной характеристики получим комплексный коэффициент передачи из которого можно рассчитать квадрат АЧХ , ФЧХ , групповую задержку и временну́ю импульсную характеристику нормированного эллиптического ФНЧ, которые показаны на рисунке 4.
В данном разделе мы рассмотрели порядок расчета передаточной функции аналогового нормированного эллиптического ФНЧ и привели пример расчета фильтра по заданным параметрам АЧХ.
В библиотеке DSPL-2.0 реализована функция ellip_ap , которая рассчитывает коэффициенты передаточной функции аналогового нормированного эллиптического ФНЧ.
Исходный код программы ellip_ap_example.c
расчета и построения характеристик эллиптического фильтра (рисунок 4):