diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/Makefile.dirs b/Makefile.dirs old mode 100644 new mode 100755 diff --git a/Makefile.dspl b/Makefile.dspl old mode 100644 new mode 100755 diff --git a/Makefile.test b/Makefile.test old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/dox/doxyfile_ru b/dox/doxyfile_ru old mode 100644 new mode 100755 index 3490ded..03a421b --- a/dox/doxyfile_ru +++ b/dox/doxyfile_ru @@ -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 diff --git a/dox/makedoc.sh b/dox/makedoc.sh new file mode 100755 index 0000000..1fcb3c3 --- /dev/null +++ b/dox/makedoc.sh @@ -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 diff --git a/dox/ru/error_list.dox b/dox/ru/error_list.dox old mode 100644 new mode 100755 diff --git a/dox/ru/groups_define.dox b/dox/ru/groups_define.dox old mode 100644 new mode 100755 diff --git a/dox/ru/mainpage.dox b/dox/ru/mainpage.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/complex.dox b/dspl/dox/ru/complex.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/conv.dox b/dspl/dox/ru/conv.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/dft.dox b/dspl/dox/ru/dft.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/ellipj.dox b/dspl/dox/ru/ellipj.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/fft.dox b/dspl/dox/ru/fft.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/fillarray.dox b/dspl/dox/ru/fillarray.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/filter_an.dox b/dspl/dox/ru/filter_an.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/filter_ap.dox b/dspl/dox/ru/filter_ap.dox old mode 100644 new mode 100755 index 66de975..90bf31b --- a/dspl/dox/ru/filter_ap.dox +++ b/dspl/dox/ru/filter_ap.dox @@ -154,9 +154,51 @@ `RES_OK` Фильтр рассчитан успешно.

В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+ + +Пример использования функции `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 + +

+В каталоге `dat` будут созданы три файла:
+ +
+cheby1_ap_test_mag.txt	  АЧХ фильтра	 
+cheby1_ap_test_phi.txt	  ФЧХ фильтра
+cheby1_ap_test_tau.txt	  ГВЗ фильтра
+
+ +Кроме того программа 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 ***************************************************************************** */ diff --git a/dspl/dox/ru/filter_ft.dox b/dspl/dox/ru/filter_ft.dox new file mode 100644 index 0000000..b280ed9 --- /dev/null +++ b/dspl/dox/ru/filter_ft.dox @@ -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$ + исходного аналогового ФНЧ.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] a Указатель на вектор коэффициентов знаменателя + передаточной функции \f$H(s)\f$ + исходного аналогового ФНЧ.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] ord Порядок исходного фильтра и + фильтра после переобразования.

+ +\param[in] w0 Частота среза исходного ФНЧ.

+ +\param[in] w1 Требуемая частота среза ФВЧ + после преобразования.

+ + +\param[in,out] beta Указатель на вектор коэффициентов + числителя передаточной функции \f$F(s)\f$ + ФВЧ после преобразования.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in,out] alpha Указатель на вектор коэффициентов знаменателя + передаточной функции \f$F(s)\f$ + аналогового ФВЧ после преобразования.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ + +\return + `RES_OK` Преоборазование расчитано успешно.

+ В противном случае + \ref ERROR_CODE_GROUP "код ошибки".
+ +\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$ + исходного аналогового ФНЧ.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] a Указатель на вектор коэффициентов знаменателя + передаточной функции \f$H(s)\f$ + исходного аналогового ФНЧ.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] ord Порядок исходного фильтра и + фильтра после переобразования.

+ +\param[in] w0 Частота среза исходного ФНЧ.

+ +\param[in] w1 Требуемая частота среза ФНЧ + после преобразования.

+ + +\param[in,out] beta Указатель на вектор коэффициентов + числителя передаточной функции \f$F(s)\f$ + ФНЧ после преобразования.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in,out] alpha Указатель на вектор коэффициентов знаменателя + передаточной функции \f$F(s)\f$ + аналогового ФНЧ после преобразования.
+ Размер вектора `[ord+1 x 1]`.
+ Память должна быть выделена.

+ + +\return + `RES_OK` Преоборазование расчитано успешно.

+ В противном случае + \ref ERROR_CODE_GROUP "код ошибки".
+ +\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$.
+ Размер вектора `[n+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] a Указатель на вектор коэффициентов знаменателя + функции \f$H(s)\f$.
+ Размер вектора `[n+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] n Порядок полиномов рациональной + функции \f$H(s)\f$.

+ + +\param[in] c Указатель на вектор коэффициентов + числителя функции \f$F(s)\f$.
+ Размер вектора `[p+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] d Указатель на вектор коэффициентов знаменателя + функции \f$F(s)\f$.
+ Размер вектора `[p+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in] p Порядок полиномов рациональной + функции \f$F(s)\f$.

+ +\param[in,out] beta Указатель на вектор коэффициентов + числителя функции \f$Y(s) = (H \circ F)(s)\f$.
+ Размер вектора `[n*p+1 x 1]`.
+ Память должна быть выделена.

+ +\param[in,out] alpha Указатель на вектор коэффициентов знаменателя + функции \f$Y(s) = (H \circ F)(s)\f$.
+ Размер вектора `[n*p+1 x 1]`.
+ Память должна быть выделена.

+ + +\return + `RES_OK` Рациональная композиция рассчитана успешно.

+ В противном случае + \ref ERROR_CODE_GROUP "код ошибки".
+ +\author + Бахурин Сергей + www.dsplib.org +***************************************************************************** */ + diff --git a/dspl/dox/ru/fourier_series.dox b/dspl/dox/ru/fourier_series.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/goertzel.dox b/dspl/dox/ru/goertzel.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/inout.dox b/dspl/dox/ru/inout.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/polyval.dox b/dspl/dox/ru/polyval.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/randgen.dox b/dspl/dox/ru/randgen.dox old mode 100644 new mode 100755 diff --git a/dspl/dox/ru/resampling.dox b/dspl/dox/ru/resampling.dox old mode 100644 new mode 100755 diff --git a/dspl/obj/.gitignore b/dspl/obj/.gitignore old mode 100644 new mode 100755 diff --git a/dspl/src/array.c b/dspl/src/array.c old mode 100644 new mode 100755 diff --git a/dspl/src/cheby.c b/dspl/src/cheby.c old mode 100644 new mode 100755 diff --git a/dspl/src/complex.c b/dspl/src/complex.c old mode 100644 new mode 100755 diff --git a/dspl/src/conv.c b/dspl/src/conv.c old mode 100644 new mode 100755 diff --git a/dspl/src/dft.c b/dspl/src/dft.c old mode 100644 new mode 100755 diff --git a/dspl/src/ellipj.c b/dspl/src/ellipj.c old mode 100644 new mode 100755 diff --git a/dspl/src/fft.c b/dspl/src/fft.c old mode 100644 new mode 100755 diff --git a/dspl/src/fillarray.c b/dspl/src/fillarray.c old mode 100644 new mode 100755 diff --git a/dspl/src/filter_an.c b/dspl/src/filter_an.c old mode 100644 new mode 100755 diff --git a/dspl/src/filter_ap.c b/dspl/src/filter_ap.c old mode 100644 new mode 100755 diff --git a/dspl/src/filter_ft.c b/dspl/src/filter_ft.c old mode 100644 new mode 100755 index 3cd256f..6b198e3 --- a/dspl/src/filter_ft.c +++ b/dspl/src/filter_ft.c @@ -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); } diff --git a/dspl/src/fourier_series.c b/dspl/src/fourier_series.c old mode 100644 new mode 100755 diff --git a/dspl/src/goertzel.c b/dspl/src/goertzel.c old mode 100644 new mode 100755 diff --git a/dspl/src/inout.c b/dspl/src/inout.c old mode 100644 new mode 100755 diff --git a/dspl/src/math.c b/dspl/src/math.c old mode 100644 new mode 100755 diff --git a/dspl/src/polyval.c b/dspl/src/polyval.c old mode 100644 new mode 100755 diff --git a/dspl/src/randgen.c b/dspl/src/randgen.c old mode 100644 new mode 100755 diff --git a/dspl/src/resampling.c b/dspl/src/resampling.c old mode 100644 new mode 100755 diff --git a/dspl/src/signals.c b/dspl/src/signals.c old mode 100644 new mode 100755 diff --git a/dspl/src/trapint.c b/dspl/src/trapint.c old mode 100644 new mode 100755 diff --git a/include/dspl.c b/include/dspl.c old mode 100644 new mode 100755 index 064ea06..7d7f375 --- a/include/dspl.c +++ b/include/dspl.c @@ -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); diff --git a/include/dspl.h b/include/dspl.h old mode 100644 new mode 100755 index 4202f7f..fee91ba --- a/include/dspl.h +++ b/include/dspl.h @@ -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 diff --git a/release/doc/.gitignore b/release/doc/.gitignore old mode 100644 new mode 100755 diff --git a/release/doc/ru/.gitignore b/release/doc/ru/.gitignore old mode 100644 new mode 100755 diff --git a/release/include/dspl.c b/release/include/dspl.c old mode 100644 new mode 100755 index 064ea06..7d7f375 --- a/release/include/dspl.c +++ b/release/include/dspl.c @@ -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); diff --git a/release/include/dspl.h b/release/include/dspl.h old mode 100644 new mode 100755 index 4202f7f..fee91ba --- a/release/include/dspl.h +++ b/release/include/dspl.h @@ -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 diff --git a/release/lib/.gitignore b/release/lib/.gitignore old mode 100644 new mode 100755 diff --git a/test/bin/.gitignore b/test/bin/.gitignore old mode 100644 new mode 100755 diff --git a/test/bin/dat/.gitignore b/test/bin/dat/.gitignore old mode 100644 new mode 100755 diff --git a/test/bin/gnuplot/butter_ap_test.plt b/test/bin/gnuplot/butter_ap_test.plt old mode 100644 new mode 100755 diff --git a/test/bin/gnuplot/cheby1_ap_test.plt b/test/bin/gnuplot/cheby1_ap_test.plt old mode 100644 new mode 100755 diff --git a/test/bin/img/.gitignore b/test/bin/img/.gitignore old mode 100644 new mode 100755 diff --git a/test/obj/.gitignore b/test/obj/.gitignore old mode 100644 new mode 100755 diff --git a/test/src/butter_ap_test.c b/test/src/butter_ap_test.c old mode 100644 new mode 100755 diff --git a/test/src/cheby1_ap_test.c b/test/src/cheby1_ap_test.c old mode 100644 new mode 100755 index a17e585..35156a5 --- a/test/src/cheby1_ap_test.c +++ b/test/src/cheby1_ap_test.c @@ -3,41 +3,50 @@ #include #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");; } diff --git a/test/src/cheby2_ap_zp_test.c b/test/src/cheby2_ap_zp_test.c old mode 100644 new mode 100755 diff --git a/test/src/conv_fft_cmplx_test.c b/test/src/conv_fft_cmplx_test.c old mode 100644 new mode 100755 diff --git a/test/src/dft_cmplx_test.c b/test/src/dft_cmplx_test.c old mode 100644 new mode 100755 diff --git a/test/src/dft_test.c b/test/src/dft_test.c old mode 100644 new mode 100755 diff --git a/test/src/dspl_info_test.c b/test/src/dspl_info_test.c old mode 100644 new mode 100755 diff --git a/test/src/ellip_landen_test.c b/test/src/ellip_landen_test.c old mode 100644 new mode 100755 diff --git a/test/src/fft_cmplx_test.c b/test/src/fft_cmplx_test.c old mode 100644 new mode 100755 diff --git a/test/src/fft_test.c b/test/src/fft_test.c old mode 100644 new mode 100755