libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
freqs.c
1 /*
2 * Copyright (c) 2015-2024 Sergey Bakhurin
3 * Digital Signal Processing Library [http://dsplib.org]
4 *
5 * This file is part of libdspl-2.0.
6 *
7 * is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * DSPL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #include <stdlib.h>
23 #include <string.h>
24 #include <math.h>
25 #include "dspl.h"
26 
27 
28 
29 #ifdef DOXYGEN_ENGLISH
30 
79 #endif
80 #ifdef DOXYGEN_RUSSIAN
81 
142 #endif
143 int DSPL_API freqs(double* b, double* a, int ord,
144  double* w, int n, complex_t *h)
145 {
146  complex_t jw;
147  complex_t *bc = NULL;
148  complex_t *ac = NULL;
149  complex_t num, den;
150  double mag;
151  int k;
152  int res;
153 
154  if(!b || !a || !w || !h)
155  return ERROR_PTR;
156  if(ord<0)
157  return ERROR_FILTER_ORD;
158  if(n<1)
159  return ERROR_SIZE;
160 
161  RE(jw) = 0.0;
162 
163  bc = (complex_t*) malloc((ord+1) * sizeof(complex_t));
164  res = re2cmplx(b, ord+1, bc);
165 
166  if( res!=RES_OK )
167  goto exit_label;
168 
169  ac = (complex_t*) malloc((ord+1) * sizeof(complex_t));
170  res = re2cmplx(a, ord+1, ac);
171  if( res!=RES_OK )
172  goto exit_label;
173 
174  for(k = 0; k < n; k++)
175  {
176  IM(jw) = w[k];
177  res = polyval_cmplx(bc, ord, &jw, 1, &num);
178  if(res != RES_OK)
179  goto exit_label;
180  res = polyval_cmplx(ac, ord, &jw, 1, &den);
181  if(res != RES_OK)
182  goto exit_label;
183  mag = ABSSQR(den);
184  if(mag == 0.0)
185  {
186  res = ERROR_DIV_ZERO;
187  goto exit_label;
188  }
189  mag = 1.0 / mag;
190  RE(h[k]) = CMCONJRE(num, den) * mag;
191  IM(h[k]) = CMCONJIM(num, den) * mag;
192  }
193  res = RES_OK;
194 exit_label:
195  if(bc)
196  free(bc);
197  if(ac)
198  free(ac);
199  return res;
200 }
201 
202 
203 
#define ERROR_FILTER_ORD
Порядок фильтра задан неверно. Порядок фильтра должен быть задан положительным целым значением.
Definition: dspl.h:575
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:420
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:610
int polyval_cmplx(complex_t *a, int ord, complex_t *x, int n, complex_t *y)
Расчет комплексного полинома
Definition: polyval_cmplx.c:80
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
Definition: dspl.h:618
#define ERROR_DIV_ZERO
Ошибка деления на ноль. Функция возвращает данную ошибку, если в вычислительном алгоритме возникло де...
Definition: dspl.h:567
int re2cmplx(double *x, int n, complex_t *y)
Преобразование массива вещественных данных в массив комплексных данных.
Definition: re2cmplx.c:120
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558
#define ABSSQR(x)
Макрос возвращает квадрат модуля комплексного числа x.
Definition: dspl.h:534
int freqs(double *b, double *a, int ord, double *w, int n, complex_t *h)
Расчет комплексного коэффициента передачи аналогового фильтра.
Definition: freqs.c:143
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:478