libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
butter_ap_zp.c
1 /*
2 * Copyright (c) 2015-2022 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 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include "dspl.h"
25 
26 
27 
28 #ifdef DOXYGEN_ENGLISH
29 
112 #endif
113 #ifdef DOXYGEN_RUSSIAN
114 
206 #endif
207 int DSPL_API butter_ap_zp(int ord, double rp, complex_t* z, int* nz,
208  complex_t *p, int* np)
209 {
210  double alpha;
211  double theta;
212  double ep;
213  int r;
214  int L;
215  int ind = 0, k;
216 
217  if(rp < 0 || rp == 0)
218  return ERROR_FILTER_RP;
219  if(ord < 1)
220  return ERROR_FILTER_ORD;
221  if(!z || !p || !nz || !np)
222  return ERROR_PTR;
223 
224  ep = sqrt(pow(10.0, rp*0.1) - 1.0);
225  r = ord % 2;
226  L = (int)((ord-r)/2);
227 
228  alpha = pow(ep, -1.0/(double)ord);
229  if(r)
230  {
231  RE(p[ind]) = -alpha;
232  IM(p[ind]) = 0.0;
233  ind++;
234  }
235  for(k = 0; k < L; k++)
236  {
237  theta = M_PI*(double)(2*k + 1)/(double)(2*ord);
238  RE(p[ind]) = RE(p[ind+1]) = -alpha * sin(theta);
239  IM(p[ind]) = alpha * cos(theta);
240  IM(p[ind+1]) = -alpha * cos(theta);
241  ind+=2;
242  }
243  *np = ord;
244  *nz = 0;
245  return RES_OK;
246 }
247 
248 
int butter_ap_zp(int ord, double rp, complex_t *z, int *nz, complex_t *p, int *np)
Расчет массивов нулей и полюсов передаточной функции аналогового нормированного ФНЧ Баттерворта.
Definition: butter_ap_zp.c:207
#define ERROR_FILTER_ORD
Порядок фильтра задан неверно. Порядок фильтра должен быть задан положительным целым значением.
Definition: dspl.h:575
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:420
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:610
#define ERROR_FILTER_RP
Параметр неравномерности фильтра в полосе пропускания задан неверно. Данный параметр задается в дБ и ...
Definition: dspl.h:577
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:478