kopia lustrzana https://github.com/Dsplib/libdspl-2.0
some docs
rodzic
b203899a2d
commit
afdc6bf7e5
|
@ -786,7 +786,8 @@ INPUT = ru \
|
|||
../dspl/src \
|
||||
../include \
|
||||
../test/dox/ru \
|
||||
../test/src
|
||||
../test/src \
|
||||
../test/bin/gnuplot
|
||||
|
||||
# This tag can be used to specify the character encoding of the source files
|
||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||
|
@ -853,7 +854,8 @@ FILE_PATTERNS = *.c \
|
|||
*.ucf \
|
||||
*.qsf \
|
||||
*.as \
|
||||
*.js
|
||||
*.js \
|
||||
*.plt
|
||||
|
||||
# The RECURSIVE tag can be used to specify whether or not subdirectories should
|
||||
# be searched for input files as well.
|
||||
|
@ -902,7 +904,8 @@ EXCLUDE_SYMBOLS =
|
|||
# command).
|
||||
|
||||
EXAMPLE_PATH = ../test/src \
|
||||
../test/dox
|
||||
../test/dox \
|
||||
../test/bin/gnuplot
|
||||
|
||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
#!/bin/bash
|
||||
|
||||
cd ../
|
||||
make
|
||||
cd test/bin
|
||||
for file in *.exe
|
||||
do
|
||||
"./$file"
|
||||
done
|
||||
cd ../../dox
|
||||
|
||||
doxygen doxyfile_ru
|
||||
|
||||
cd ../
|
||||
make clean
|
||||
cd dox
|
|
@ -154,9 +154,51 @@
|
|||
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
|
||||
В противном случае
|
||||
\ref ERROR_CODE_GROUP "код ошибки".<BR>
|
||||
|
||||
|
||||
Пример использования функции `cheby1_ap`:
|
||||
|
||||
\include cheby1_ap_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.125 a[ 0] = 0.177
|
||||
b[ 1] = 0.000 a[ 1] = 0.405
|
||||
b[ 2] = 0.000 a[ 2] = 1.169
|
||||
b[ 3] = 0.000 a[ 3] = 0.582
|
||||
b[ 4] = 0.000 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
|
||||
<BR><BR>
|
||||
В каталоге `dat` будут созданы три файла:<BR>
|
||||
|
||||
<pre>
|
||||
cheby1_ap_test_mag.txt АЧХ фильтра
|
||||
cheby1_ap_test_phi.txt ФЧХ фильтра
|
||||
cheby1_ap_test_tau.txt ГВЗ фильтра
|
||||
</pre>
|
||||
|
||||
Кроме того программа GNUPLOT произведет построение следующих графиков
|
||||
по сохраненным в файлах данным:
|
||||
|
||||
АЧХ фильтра: `cheby1_ap_test_mag.png`
|
||||
\image html cheby1_ap_test_mag.png
|
||||
|
||||
ФЧХ фильтра: `cheby1_ap_test_phi.png`
|
||||
\image html cheby1_ap_test_phi.png
|
||||
|
||||
ГВЗ фильтра: `butter_ap_test_tau.png`
|
||||
\image html cheby1_ap_test_tau.png
|
||||
|
||||
|
||||
Скрипт GNUPLOT для построения графиков из текстовых файлов:
|
||||
\include cheby1_ap_test.plt
|
||||
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
|
@ -0,0 +1,199 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФВЧ
|
||||
|
||||
Функция производит перобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФВЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] a Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] ord Порядок исходного фильтра и
|
||||
фильтра после переобразования.<BR><BR>
|
||||
|
||||
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
|
||||
|
||||
\param[in] w1 Требуемая частота среза ФВЧ
|
||||
после преобразования.<BR><BR>
|
||||
|
||||
|
||||
\param[in,out] beta Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$F(s)\f$
|
||||
ФВЧ после преобразования.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$F(s)\f$
|
||||
аналогового ФВЧ после преобразования.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` Преоборазование расчитано успешно.<BR><BR>
|
||||
В противном случае
|
||||
\ref ERROR_CODE_GROUP "код ошибки".<BR>
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФНЧ
|
||||
|
||||
Функция производит перобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФНЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] a Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] ord Порядок исходного фильтра и
|
||||
фильтра после переобразования.<BR><BR>
|
||||
|
||||
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
|
||||
|
||||
\param[in] w1 Требуемая частота среза ФНЧ
|
||||
после преобразования.<BR><BR>
|
||||
|
||||
|
||||
\param[in,out] beta Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$F(s)\f$
|
||||
ФНЧ после преобразования.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$F(s)\f$
|
||||
аналогового ФНЧ после преобразования.<BR>
|
||||
Размер вектора `[ord+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` Преоборазование расчитано успешно.<BR><BR>
|
||||
В противном случае
|
||||
\ref ERROR_CODE_GROUP "код ошибки".<BR>
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ratcompos( double* b, double* a, int n,
|
||||
double* c, double* d, int p,
|
||||
double* beta, double* alpha)
|
||||
\brief Рациональная композиця
|
||||
|
||||
Функция рассчитывает композицию вида \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, где
|
||||
|
||||
\f[
|
||||
H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}
|
||||
{\sum\limits_{k = 0}^{n} a_k s^k}, \ \ \ \
|
||||
F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}
|
||||
{\sum\limits_{k = 0}^{p} с_k s^k}, \ \ \ \
|
||||
Y(s) = \frac{\sum\limits_{m = 0}^{n \cdot p} \beta_m s^m}
|
||||
{\sum\limits_{k = 0}^{n \cdot p} \alpha_k s^k}
|
||||
\f]
|
||||
|
||||
Функция рациональной композиции необходима для произведения частотных
|
||||
преобразований передаточных характеристик аналоговых и цифровых фильтров,
|
||||
а также для билинейного преобразования передаточных характеристик аналоговых
|
||||
фильтров в соответствующие передаточные характеристики цифровых фильтров.
|
||||
|
||||
\param[in] b Указатель на вектор коэффициентов
|
||||
числителя функции \f$H(s)\f$.<BR>
|
||||
Размер вектора `[n+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] a Указатель на вектор коэффициентов знаменателя
|
||||
функции \f$H(s)\f$.<BR>
|
||||
Размер вектора `[n+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] n Порядок полиномов рациональной
|
||||
функции \f$H(s)\f$.<BR><BR>
|
||||
|
||||
|
||||
\param[in] c Указатель на вектор коэффициентов
|
||||
числителя функции \f$F(s)\f$.<BR>
|
||||
Размер вектора `[p+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] d Указатель на вектор коэффициентов знаменателя
|
||||
функции \f$F(s)\f$.<BR>
|
||||
Размер вектора `[p+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in] p Порядок полиномов рациональной
|
||||
функции \f$F(s)\f$.<BR><BR>
|
||||
|
||||
\param[in,out] beta Указатель на вектор коэффициентов
|
||||
числителя функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
|
||||
Размер вектора `[n*p+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
|
||||
функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
|
||||
Размер вектора `[n*p+1 x 1]`.<BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` Рациональная композиция рассчитана успешно.<BR><BR>
|
||||
В противном случае
|
||||
\ref ERROR_CODE_GROUP "код ошибки".<BR>
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -25,6 +25,33 @@
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* low 2 high transformation
|
||||
*******************************************************************************/
|
||||
int DSPL_API low2high(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
{
|
||||
|
||||
double num[2] = {0.0, 0.0};
|
||||
double den[2] = {0.0, 1.0};
|
||||
|
||||
if(!b || !a || !beta || !alpha)
|
||||
return ERROR_PTR;
|
||||
if(ord < 1)
|
||||
return ERROR_FILTER_ORD;
|
||||
if(w0 <= 0.0 || w1 <= 0.0)
|
||||
return ERROR_FILTER_FT;
|
||||
|
||||
num[0] = w1 / w0;
|
||||
|
||||
return ratcompos(b, a, ord, num, den, 1, beta, alpha);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
low 2 low transformation
|
||||
|
@ -43,7 +70,7 @@ int DSPL_API low2low(double* b, double* a, int ord, double w0, double w1,
|
|||
if(w0 <= 0.0 || w1 <= 0.0)
|
||||
return ERROR_FILTER_FT;
|
||||
|
||||
den[0] = w0 / w1;
|
||||
den[0] = w1 / w0;
|
||||
|
||||
return ratcompos(b, a, ord, num, den, 1, beta, alpha);
|
||||
}
|
||||
|
|
|
@ -95,6 +95,7 @@ p_linspace linspace ;
|
|||
p_log_cmplx log_cmplx ;
|
||||
p_logspace logspace ;
|
||||
p_low2low low2low ;
|
||||
p_low2high low2high ;
|
||||
p_poly_z2a_cmplx poly_z2a_cmplx ;
|
||||
p_polyval polyval ;
|
||||
p_polyval_cmplx polyval_cmplx ;
|
||||
|
@ -223,6 +224,7 @@ void* dspl_load()
|
|||
LOAD_FUNC(log_cmplx);
|
||||
LOAD_FUNC(logspace);
|
||||
LOAD_FUNC(low2low);
|
||||
LOAD_FUNC(low2high);
|
||||
LOAD_FUNC(poly_z2a_cmplx);
|
||||
LOAD_FUNC(polyval);
|
||||
LOAD_FUNC(polyval_cmplx);
|
||||
|
|
|
@ -522,6 +522,14 @@ DECLARE_FUNC(int, logspace, double
|
|||
COMMA int
|
||||
COMMA double*);
|
||||
//------------------------------------------------------------------------------
|
||||
DECLARE_FUNC(int, low2high, double* b
|
||||
COMMA double* a
|
||||
COMMA int ord
|
||||
COMMA double w0
|
||||
COMMA double w1
|
||||
COMMA double* beta
|
||||
COMMA double* alpha);
|
||||
//------------------------------------------------------------------------------
|
||||
DECLARE_FUNC(int, low2low, double* b
|
||||
COMMA double* a
|
||||
COMMA int ord
|
||||
|
|
|
@ -95,6 +95,7 @@ p_linspace linspace ;
|
|||
p_log_cmplx log_cmplx ;
|
||||
p_logspace logspace ;
|
||||
p_low2low low2low ;
|
||||
p_low2high low2high ;
|
||||
p_poly_z2a_cmplx poly_z2a_cmplx ;
|
||||
p_polyval polyval ;
|
||||
p_polyval_cmplx polyval_cmplx ;
|
||||
|
@ -223,6 +224,7 @@ void* dspl_load()
|
|||
LOAD_FUNC(log_cmplx);
|
||||
LOAD_FUNC(logspace);
|
||||
LOAD_FUNC(low2low);
|
||||
LOAD_FUNC(low2high);
|
||||
LOAD_FUNC(poly_z2a_cmplx);
|
||||
LOAD_FUNC(polyval);
|
||||
LOAD_FUNC(polyval_cmplx);
|
||||
|
|
|
@ -522,6 +522,14 @@ DECLARE_FUNC(int, logspace, double
|
|||
COMMA int
|
||||
COMMA double*);
|
||||
//------------------------------------------------------------------------------
|
||||
DECLARE_FUNC(int, low2high, double* b
|
||||
COMMA double* a
|
||||
COMMA int ord
|
||||
COMMA double w0
|
||||
COMMA double w1
|
||||
COMMA double* beta
|
||||
COMMA double* alpha);
|
||||
//------------------------------------------------------------------------------
|
||||
DECLARE_FUNC(int, low2low, double* b
|
||||
COMMA double* a
|
||||
COMMA int ord
|
||||
|
|
|
@ -3,41 +3,50 @@
|
|||
#include <string.h>
|
||||
#include "dspl.h"
|
||||
|
||||
// Порядок фильтра
|
||||
#define ORD 4
|
||||
|
||||
// размер векторов частотной характериситки фильтра
|
||||
#define N 1000
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
void* handle; // DSPL handle
|
||||
handle = dspl_load(); // Load DSPL function
|
||||
void* handle; // DSPL handle
|
||||
handle = dspl_load(); // Load DSPL function
|
||||
|
||||
double a[ORD+1], b[ORD+1]; // коэффицинеты H(s)
|
||||
double Rp = 3.0; // неравномерность в полосе пропускания 3дБ
|
||||
// Частота (w), АЧХ (mag), ФЧХ (phi) и ГВЗ (tau)
|
||||
double w[N], mag[N], phi[N], tau[N];
|
||||
int k;
|
||||
|
||||
double a[ORD+1], b[ORD+1];
|
||||
double Rp = 3.0;
|
||||
double w[N], mag[N], phi[N], tau[N];
|
||||
|
||||
|
||||
int k;
|
||||
int res = cheby1_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);
|
||||
freqs_resp(b, a, ORD, w, N, DSPL_FLAG_LOG|DSPL_FLAG_UNWRAP, mag, phi, tau);
|
||||
|
||||
writetxt(w, mag, N, "dat/cheby1_ap_test_mag.txt");
|
||||
writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt");
|
||||
writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt");
|
||||
|
||||
dspl_free(handle); // free dspl handle
|
||||
|
||||
res = system("gnuplot gnuplot/cheby1_ap_test.plt");
|
||||
|
||||
return 0;
|
||||
// рассчитываем нормированный ФНЧ Чебышева 1 рода
|
||||
int res = cheby1_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]);
|
||||
|
||||
// вектор частоты в логарифмической шакале от 0.01 до 100 рад/c
|
||||
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
|
||||
|
||||
//частотные характеристика фильтра
|
||||
freqs_resp(b, a, ORD, w, N, DSPL_FLAG_LOG|DSPL_FLAG_UNWRAP,
|
||||
mag, phi, tau);
|
||||
|
||||
// Сохранить характеристики для построения графиков
|
||||
writetxt(w, mag, N, "dat/cheby1_ap_test_mag.txt");
|
||||
writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt");
|
||||
writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt");
|
||||
|
||||
dspl_free(handle); // free dspl handle
|
||||
|
||||
// выполнить скрипт GNUPLOT для построения графиков
|
||||
// по рассчитанным данным
|
||||
return system("gnuplot gnuplot/cheby1_ap_test.plt");;
|
||||
}
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue