libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
freqz.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 
84 #endif
85 #ifdef DOXYGEN_RUSSIAN
86 
154 #endif
155 int DSPL_API freqz(double* b, double* a, int ord, double* w,
156  int n, complex_t *h)
157 {
158  complex_t jw;
159  complex_t *bc = NULL;
160  complex_t *ac = NULL;
161  complex_t num, den;
162  double mag;
163  int k;
164  int res;
165 
166  if(!b || !w || !h)
167  return ERROR_PTR;
168  if(ord<0)
169  return ERROR_FILTER_ORD;
170  if(n<1)
171  return ERROR_SIZE;
172 
173 
174  bc = (complex_t*) malloc((ord+1) * sizeof(complex_t));
175  res = re2cmplx(b, ord+1, bc);
176  if( res!=RES_OK )
177  goto exit_label;
178 
179  if(a)
180  {
181  /* IIR filter if a != NULL */
182  ac = (complex_t*) malloc((ord+1) * sizeof(complex_t));
183  res = re2cmplx(a, ord+1, ac);
184  if( res!=RES_OK )
185  goto exit_label;
186  for(k = 0; k < n; k++)
187  {
188  RE(jw) = cos(w[k]);
189  IM(jw) = -sin(w[k]);
190  res = polyval_cmplx(bc, ord, &jw, 1, &num);
191  if(res != RES_OK)
192  goto exit_label;
193  res = polyval_cmplx(ac, ord, &jw, 1, &den);
194  if(res != RES_OK)
195  goto exit_label;
196  mag = ABSSQR(den);
197  if(mag == 0.0)
198  {
199  res = ERROR_DIV_ZERO;
200  goto exit_label;
201  }
202  mag = 1.0 / mag;
203  RE(h[k]) = CMCONJRE(num, den) * mag;
204  IM(h[k]) = CMCONJIM(num, den) * mag;
205  }
206  }
207  else
208  {
209  /* FIR filter if a == NULL */
210  for(k = 0; k < n; k++)
211  {
212  RE(jw) = cos(w[k]);
213  IM(jw) = -sin(w[k]);
214  res = polyval_cmplx(bc, ord, &jw, 1, h+k);
215  if(res != RES_OK)
216  goto exit_label;
217  }
218  }
219  res = RES_OK;
220 exit_label:
221  if(bc)
222  free(bc);
223  if(ac)
224  free(ac);
225  return res;
226 }
227 
#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
int freqz(double *b, double *a, int ord, double *w, int n, complex_t *h)
Расчет комплексного коэффициента передачи цифрового фильтра.
Definition: freqz.c:155
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558
#define ABSSQR(x)
Макрос возвращает квадрат модуля комплексного числа x.
Definition: dspl.h:534
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:478