#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
/*filter order */
#define ORD 8
/* Frequency response vector size */
#define T 201
#define N 2000
/*******************************************************************************
* Нахожу значение y(x0) в табличной функции y(x)
******************************************************************************/
double find_value(double* x, double *y, int n, double x0)
{
double val = y[0];
double dxmin = fabs(x[0] - x0);
int i;
double dx;
for(i = 0; i < n; i++)
{
dx = fabs(x[i] - x0);
if(dx < dxmin)
{
dxmin = dx;
val = y[i];
}
}
return val;
}
/*******************************************************************************
* Main program
******************************************************************************/
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot[4]; /* GNUPLOT handle */
hdspl = dspl_load(); /* Load DSPL functions */
double b[ORD+1]; /* Коэффициенты числителя H(z) эллиптического фильтра */
double a[ORD+1]; /* Коэффициенты знаменателя H(z) эллиптического фильтра */
double w[N]; /* нормированная часта */
double tau_p[N]; /* Фазовая задержка фильтра */
double tau_g[N]; /* Групповая задержка фильтра */
double mag[N]; /* АЧХ фильтра */
double phi[N]; /* ФЧХ фильтра */
double t[T]; /* время */
double x[T]; /* входной сигнал */
double y[T]; /* выходной сигнал */
double zx[T]; /* треугольная огибающая входного сигнала */
double tzy[T]; /* время смещенное на величину групповой задержки */
double zy[T]; /* треугольная огибающая на выходе фильтра */
double g, tg, tp;
int i;
/* Рассчитываем эллиптический БИХ-фильтр */
iir(0.5, 60.0, ORD, 0.15, 0.0, DSPL_FILTER_LPF | DSPL_FILTER_ELLIP, b, a);
/* вывод коэффициентов фильтра на печать */
for(i = 0; i <= ORD; i++)
printf("%.9f %.9f\n", b[i], a[i]);
/* Заполняю массив нормированной частоты от 0 до pi/4 */
linspace(0, M_PI*0.25, N, DSPL_PERIODIC, w);
/* рассчет фазовой задержки */
phase_delay(b,a,ORD, DSPL_FLAG_DIGITAL, w, N, tau_p);
/* рассчет групповой задержки */
group_delay(b,a,ORD, DSPL_FLAG_DIGITAL, w, N, tau_g);
/* рассчет АЧХ и ФЧХ задержки */
filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_DIGITAL, mag, phi, NULL);
/*
находим значения АЧХ, фазовой и групповой задержки для частоты
входного сигнала pi/8 и выводим значения на печать.
*/
g = find_value(w, mag, N, 0.125*M_PI);
tg = find_value(w, tau_g, N, 0.125*M_PI);
tp = find_value(w, tau_p, N, 0.125*M_PI);
printf(" gain = %.4f\n tau_g = %.3f\n tau_p = %.3f\n", g, tg, tp);
/* Сохраняем АЧХ, ФЧХ, фазовую и групповую задержку в файлы для
построения графиков */
writetxt(w, tau_g, N, "dat/tau_g.txt");
writetxt(w, tau_p, N, "dat/tau_p.txt");
writetxt(w, mag, N, "dat/mag.txt");
writetxt(w, phi, N, "dat/phi.txt");
/* Формируем сигнал и треугольные огибающие на входе и выходе */
window(zx, T, DSPL_WIN_BARTLETT | DSPL_SYMMETRIC, 0);
window(zy, T, DSPL_WIN_BARTLETT | DSPL_SYMMETRIC, 0);
for(i = 0; i < T; i++)
{
t[i] = (double)i; /* время */
x[i] = sin(M_PI * 0.125 * t[i]) * zx[i]; /* сигнал на входе */
tzy[i] = t[i] + tg; /* смещаю огибающую на групповую задержку */
/* умножаю на найденное значение АЧХ на частоте pi/8 */
zy[i] = zx[i] * g;
}
/* пропускаю сигнал через фильтр */
filter_iir(b,a,ORD,x,T,y);
/* сохраняю входной и выходной сигналы, а также треугольные огибающие */
writetxt(t, x, T, "dat/x.txt");
writetxt(t, y, T, "dat/y.txt");
writetxt(t, zx, T, "dat/zx.txt");
writetxt(tzy, zy, T, "dat/zy.txt");
/*------------------------------------------------------------------------*/
/* Построение графиков GNUPLOT */
gnuplot_create(argc, argv, 800, 600, "img/group_delay.png", hplot);
gnuplot_cmd(hplot[0], "unset key");
gnuplot_cmd(hplot[0], "set grid");
gnuplot_cmd(hplot[0], "unset xlabel");
gnuplot_cmd(hplot[0], "plot 'dat/tau_g.txt' with lines, 'dat/tau_p.txt' with lines");
gnuplot_close(hplot[0]);
gnuplot_create(argc, argv, 800, 600, "img/group_delay.png", hplot+1);
gnuplot_cmd(hplot[1], "unset key");
gnuplot_cmd(hplot[1], "set grid");
gnuplot_cmd(hplot[1], "unset xlabel");
gnuplot_cmd(hplot[1], "plot 'dat/mag.txt' with lines");
gnuplot_close(hplot[1]);
gnuplot_create(argc, argv, 800, 600, "img/group_delay.png", hplot+2);
gnuplot_cmd(hplot[2], "unset key");
gnuplot_cmd(hplot[2], "set grid");
gnuplot_cmd(hplot[2], "unset xlabel");
gnuplot_cmd(hplot[2], "plot 'dat/x.txt' with lines, 'dat/zx.txt' with lines");
gnuplot_close(hplot[2]);
gnuplot_create(argc, argv, 800, 600, "img/group_delay.png", hplot+3);
gnuplot_cmd(hplot[3], "unset key");
gnuplot_cmd(hplot[3], "set grid");
gnuplot_cmd(hplot[3], "unset xlabel");
gnuplot_cmd(hplot[3], "plot 'dat/y.txt' with lines, 'dat/zy.txt' with lines");
gnuplot_close(hplot[3]);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}
Групповая задержка фильтра и ее расчёт
![]() DSPL-2.0 — свободная библиотека алгоритмов цифровой обработки сигналов Распространяется под лицензией LGPL v3
Страница проекта на SourceForge
|
Аналоговые и цифровые фильтры характеризуются
передаточными характеристиками
и
соответственно, которые могут быть записаны как рациональные функции комплексных переменных
и
:


C передаточными функциями связано понятие комплексного коэффициента передачи. Для аналогового фильтра комплексный коэффициент передачи получается подстановкой
, а для цифрового — подстановкой
. Комплексные коэффициенты передачи
и
аналогового и цифрового фильтров равны:

АЧХ и ФЧХ аналогового фильтра:


Для гармонического синусоидального сигнала фазовый сдвиг соответствует временно́му сдвигу, как это показано на рисунке 1.

Задержанный сигнал можно представить как:










Если входной сигнал не просто является гармоническим колебанием с частотой , но имеет некоторую огибающую в полосе от
до
, то различные частоты из заданной полосы будут иметь различные задержки.
Мы можем формально рассмотреть приращения:










Продемонстрируем это на примере.
Рассмотрим АЧХ , ФЧХ
, фазовую задержку
и групповое время запаздывания
цифрового эллиптического фильтра нижних частот 8 порядка c коэффициентами передаточной функции
:






Пусть также дан отсчёт гармонического сигнала на нормированной частоте
:



Из характеристик фильтра, приведенных на рисунке 2 можно видеть, что фазовая задержка фильтра на частоте тестового сигнала равна
отсчётов, а групповая задержка
отсчётов, что почти в два раза выше фазовой задержки.
Пропустим сигнал через данный эллиптический фильтр и проанализируем сигнал на выходе фильтра, показанный на рисунке 3б сплошной линией. Можно видеть, что выходной сигнал задержан относительно входного.

Рассмотрим задержку гармонического сигнала на частоте , как это показано на рисунке 3в при увеличении масштаба по оси времени. Можно видеть, что гармоническое колебание задержано на величину фазовой задержки
отсчётов. Это можно видеть как по максимумам колебания, так и по точкам пересечения нуля.
Рассмотрим теперь задержку треугольной огибающей на выходе фильтра, как это показано с увеличением масштаба на рисунке 3г. Можно видеть, что треугольная огибающая задержана на величину групповой задержки отсчётов.
Таким образом мы продемонстрировали, что прохождение сигнала через фильтр характеризуется двумя параметрами: фазовой задержкой , которая характеризует задержку гармонического сигнала в результате фазового сдвига, а также величиной группового времени запаздывания (групповой задержки)
, которая определяет задержку огибающей гармонического сигнала, и может существенно отличаться от фазовой задержки.
При передачи информации гармоническое колебание не является информационным, поэтому на практике величина группового времени запаздывания является более часто используемым параметром, так как именно оно определяет задержку информационной огибающей при прохождении сигнала через фильтр.
Расчет групповой задержки на основе численного дифференцирования ФЧХ согласно (12) бывает затруднительно ввиду наличия разрывов ФЧХ, как это показано на рисунке 3. В результате дифференцирования возникают выбросы в групповой задержке, которые мешают анализу.
Для улучшения качества расчёта группового времени запаздывания можно использовать алгоритм, приведенный в данном параграфе для цифрового БИХ-фильтра.
Комплексный коэффициент передачи цифрового БИХ-фильтра имеет вид:


















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






















Приведенный алгоритм расчёта групповой задержки аналоговых и цифровых фильтров реализован программно в библиотеке DSPL-2.0. Функция phase_delay реализует расчёт фазовой задержи фильтра, заданного векторами коэффициентов передаточной функции, а функция group_delay рассчитывает групповое время запаздывания фильтра.
Данные для тестового примера, демонстрирующего различие фазовой и групповой задержки фильтра также рассчитаны с использованием DSPL-2.0. Исходный код программы group_delay_test расчёта данных для построения рисунков 2 и 3 приведен в следующем листинге:
В данном разделе мы рассмотрели такие характеристики цифровых и аналоговых фильтров, как фазовая и групповая задержка.
Было показано, что величина фазовой задержки определяет временну́ю задержку гармонического сигнала на выходе фильтра, определяемую фазовым поворотом в соответствии со значением ФЧХ на заданной частоте.
В отличии от фазовой задержки, групповое время запаздывания определяет величину временно́й задержки огибающей гармонического сигнала.
Приведены аналитические выражения расчёта групповой задержки аналогового и цифрового фильтра без численного дифференцирования ФЧХ.