libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Функции анализа аналоговых и цифровых фильтров

Функции анализа аналоговых и цифровых фильтров Подробнее...

Функции

int filter_freq_resp (double *b, double *a, int ord, double *w, int n, int flag, double *mag, double *phi, double *tau)
 Расчет амплитудно-частотной (АЧХ), фазочастотной характеристик (ФЧХ), а также группового времени запаздывания (ГВЗ) цифрового или аналогового или фильтра. Подробнее...
 
int freqs (double *b, double *a, int ord, double *w, int n, complex_t *h)
 Расчет комплексного коэффициента передачи \( H(j \omega) \) аналогового фильтра. Подробнее...
 
int freqz (double *b, double *a, int ord, double *w, int n, complex_t *h)
 Расчет комплексного коэффициента передачи \( H \left(e^{j \omega} \right)\) цифрового фильтра. Подробнее...
 

Подробное описание

Функции анализа аналоговых и цифровых фильтров

Функции

◆ filter_freq_resp()

int filter_freq_resp ( double *  b,
double *  a,
int  ord,
double *  w,
int  n,
int  flag,
double *  mag,
double *  phi,
double *  tau 
)

Расчет амплитудно-частотной (АЧХ), фазочастотной характеристик (ФЧХ), а также группового времени запаздывания (ГВЗ) цифрового или аналогового или фильтра.


Функция рассчитывает АЧХ, ФЧХ и ГВЗ аналогового или цифрового фильтра, заданного передаточной характеристикой \(H(s)\), или \(H(z)\) соответственно

Аргументы
[in]bУказатель на вектор коэффициентов числителя передаточной функции \( H(s) \).
Размер вектора [ord+1 x 1].

[in]aУказатель на вектор коэффициентов знаменателя передаточной функции \( H(s) \).
Размер вектора [ord+1 x 1].

[in]ordПорядок фильтра. Количество коэффициентов числителя и знаменателя передаточной функции \( H(s) \) равно ord+1.

[in]wУказатель на вектор значений циклической частоты \( \omega \) (рад/с), для которого будет рассчитаны АЧХ, ФЧХ и ГВЗ аналогового фильтра, если установлен флаг DSPL_FLAG_ANALOG.
В случае если флаг DSPL_FLAG_ANALOG не установлен, то вектор частоты w используется как нормированная частота комплексного коэффициента передачи \( H \left(\mathrm{e}^{j\omega} \right) \) цифрового фильтра.
В этом случае характеристика цифрового фильтра является \( 2\pi \)-периодической, и вектор частоты может содержать произвольные значения, однако целесообразно задавать его от 0 до \( \pi \), а такжет от 0 до \( 2\pi \), или от \( -\pi \) до \( \pi \).
Размер вектора [n x 1].

[in]nРазмер вектора циклической частоты w.

[in]flagКомбинация флагов, которые задают расчет параметров:
DSPL_FLAG_ANALOG  Коэффициенты относятся к аналоговому фильтру
DSPL_FLAG_LOGMAG  АЧХ рассчитывать в логарифмическом масштабе
DSPL_FLAG_UNWRAP  раскрывать периодичность ФЧХ
[out]magУказатель на вектор АЧХ.
Размер вектора [n x 1].
Память должна быть выделена.
Если указатель NULL, то расчет АЧХ не производится.

[out]phiУказатель на вектор ФЧХ.
Размер вектора [n x 1].
Память должна быть выделена.
Если указатель NULL, то расчет ФЧХ не производится.

[out]tauУказатель на вектор ГВЗ.
Размер вектора [n x 1].
Память должна быть выделена.
Если указатель NULL, то расчет ГВЗ не производится.

Возвращает
RES_OK Параметры фильтра рассчитаны успешно.
В противном случае код ошибки.
Пример использования функции filter_freq_resp:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
/* Filter order */
#define ORD 3
/* Frequency response vector size */
#define N 1000
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
/* Load DSPL functions */
hdspl = dspl_load();
double a[ORD+1]; /* H(s) numerator coefficients vector */
double b[ORD+1]; /* H(s) denominator coefficients vector */
double Rp = 1.0; /* Magnitude ripple from 0 to 1 rad/s */
double w[N]; /* Angular frequency (rad/s) */
double mag[N]; /* Filter Magnitude (dB) */
double phi[N]; /* Phase response */
double tau[N]; /* Group delay */
int k;
/* H(s) coefficients calculation */
int res = butter_ap(Rp, ORD, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
/* Print H(s) coefficients */
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
/* Frequency in logarithmic scale from 0.01 to 100 rad/s */
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
/* Filter frequency parameter calculation */
filter_freq_resp(b, a, ORD, w, N,
DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP|DSPL_FLAG_ANALOG,
mag, phi, tau);
/* Write Magnitude, phase response and group delay to the files */
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");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 920, 260, "img/butter_ap_test.png", &hplot);
gnuplot_cmd(hplot, "set logscale x");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'frequency, rad/s'");
gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "set yrange [-100:5]");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_mag.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_phi.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Groupdelay, sec'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/butter_ap_test_tau.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return res;
}

Результат работы программы:

b[ 0] =   1.002   a[ 0] =   1.002
b[ 1] =   0.000   a[ 1] =   2.618
b[ 2] =   0.000   a[ 2] =   3.418
b[ 3] =   0.000   a[ 3] =   2.615
b[ 4] =   0.000   a[ 4] =   1.000


В каталоге dat будут созданы три файла:

butter_ap_test_mag.txt    АЧХ фильтра
butter_ap_test_phi.txt    ФЧХ фильтра
butter_ap_test_tau.txt    ГВЗ фильтра

Кроме того программа GNUPLOT произведет построение следующих графиков по сохраненным в файлах данным:

Автор
Бахурин Сергей www.dsplib.org

См. определение в файле filter_an.c строка 238

◆ freqs()

int freqs ( double *  b,
double *  a,
int  ord,
double *  w,
int  n,
complex_t h 
)

Расчет комплексного коэффициента передачи \( H(j \omega) \) аналогового фильтра.


Функция рассчитывает значения комплексного коэффициента передачи \( H(j \omega)\) аналогового фильтра, заданного коэффициентами передаточной функции \( H(s) \):

\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \]

где \( N \) - порядок фильтра (параметр ord).

Комплексный коэффициент передачи рассчитывается путем подстановки \( s = j \omega \).

Аргументы
[in]bУказатель на вектор коэффициентов числителя передаточной функции \( H(s) \).
Размер вектора [ord+1 x 1].

[in]aУказатель на вектор коэффициентов знаменателя передаточной функции \( H(s) \).
Размер вектора [ord+1 x 1].

[in]ordПорядок фильтра. Количество коэффициентов числителя и знаменателя передаточной функции \( H(s) \) равно ord+1.

[in]wУказатель на вектор значений циклической частоты \( \omega \) (рад/с), для которого будет рассчитан комплексный коэффициент передачи \( H(j \omega) \).
Размер вектора [n x 1].

[in]nРазмер вектора циклической частоты w.

[out]hУказатель на вектор комплексного коэффициента передачи \( H(j \omega) \), рассчитанного для циклической частоты w.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Комплексный коэффициент передачи рассчитан успешно.
В противном случае код ошибки.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле filter_an.c строка 460

Используется в filter_freq_resp().

◆ freqz()

int freqz ( double *  b,
double *  a,
int  ord,
double *  w,
int  n,
complex_t h 
)

Расчет комплексного коэффициента передачи \( H \left(e^{j \omega} \right)\) цифрового фильтра.


Функция рассчитывает значения комплексного коэффициента передачи \( H \left(e^{j \omega} \right)\) цифрового фильтра, заданного коэффициентами передаточной функции \(H(z)\):

\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \]

где \(N\) — порядок фильтра (параметр ord).
Комплексный коэффициент передачи рассчитывается путем подстановки \(z = e^{j \omega} \).

Аргументы
[in]bУказатель на вектор коэффициентов числителя передаточной функции \(H(z)\).
Размер вектора [ord+1 x 1].

[in]aУказатель на вектор коэффициентов знаменателя передаточной функции \(H(z)\).
Размер вектора [ord+1 x 1].

[in]ordПорядок фильтра. Количество коэффициентов числителя и знаменателя передаточной функции \(H(z)\) равно ord+1.

[in]wУказатель на вектор значений нормированной циклической частоты \(\omega\), для которого будет рассчитан комплексный коэффициент передачи \( H \left(e^{j \omega} \right)\).
Размер вектора [n x 1].

[in]nРазмер вектора нормированной циклической частоты w.

[out]hУказатель на вектор комплексного коэффициента передачи \( H \left(e^{j \omega} \right)\), рассчитанного для циклической частоты w.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Комплексный коэффициент передачи рассчитан успешно.
В противном случае код ошибки.
Заметки
Комплексный коэффициент передачи \( H \left(e^{j \omega} \right)\) цифрового фильтра представляет собой \( 2 \pi-\)периодическую функцию нормированной циклической частоты \(\omega\). Поэтому анализ цифровых фильтров целесообразно вести на одном периоде повторения \( H \left(e^{j \omega} \right)\), т.е. в интервале \(\omega\) от 0 до \(2 \pi\), или от \(-\pi\) до \( \pi\).
Кроме того известно, что для фильтра с вещественными коэффициентами \( H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)\), а значит, анализ цифрового фильтра с вещественными коэффициентами достаточно вести для нормированной частоты \(\omega\) от 0 до \(\pi\).
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле filter_an.c строка 788

Используется в filter_freq_resp().

void gnuplot_close(void *h)
Закрыть хэндл GNUPLOT.
Definition: gnuplot.c:322
int logspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив значениями логарифмической шкале
Definition: array.c:1192
void gnuplot_cmd(void *h, char *cmd)
Функция посылает команду cmd пакету GNUPLOT, для построения или оформления графика,...
Definition: gnuplot.c:387
int butter_ap(double rp, int ord, double *b, double *a)
Расчет передаточной характеристики аналогового нормированного ФНЧ Баттерворта.
Definition: filter_ap.c:175
int writetxt(double *x, double *y, int n, char *fn)
Сохранить вещественные данные в текстовый файл
Definition: inout.c:464
int filter_freq_resp(double *b, double *a, int ord, double *w, int n, int flag, double *mag, double *phi, double *tau)
Расчет амплитудно-частотной (АЧХ), фазочастотной характеристик (ФЧХ), а также группового времени запа...
Definition: filter_an.c:238
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:497
int gnuplot_create(int argc, char *argv[], int w, int h, char *fn_png, void **hplot)
Создать график GNUPLOT.
Definition: gnuplot.c:200