|
libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
|
29 #ifdef DOXYGEN_ENGLISH
94 #ifdef DOXYGEN_RUSSIAN
161 int DSPL_API
group_delay(
double* pb,
double* pa,
int ord,
int flag,
162 double* w,
int n,
double* tau)
164 double a, b, c, d, da, db, dc, dd, f, e;
169 if(!pb || !w || !tau || (!pa && (flag & DSPL_FLAG_ANALOG)))
181 qa = (
double*)malloc((ord+1) *
sizeof(double));
182 memset(qa, 0, (ord+1) *
sizeof(
double));
186 for(t = 0; t < n; t++)
188 a = b = c = d = da = db = dc = dd = 0.0;
189 if(flag & DSPL_FLAG_ANALOG)
191 for(m = 0; m < ord+1; m+=4)
193 a += pb[m] * pow(w[t], (
double)m);
194 c += qa[m] * pow(w[t], (
double)m);
195 da += pb[m] * (double) m * pow(w[t], (
double)(m-1));
196 dc += qa[m] * (double) m * pow(w[t], (
double)(m-1));
198 for(m = 2; m < ord+1; m+=4)
200 a -= pb[m] * pow(w[t], (
double)m);
201 c -= qa[m] * pow(w[t], (
double)m);
202 da -= pb[m] * (double) m * pow(w[t], (
double)(m-1));
203 dc -= qa[m] * (double) m * pow(w[t], (
double)(m-1));
206 for(m = 1; m < ord+1; m+=4)
208 b += pb[m] * pow(w[t], (
double)m) ;
209 d += qa[m] * pow(w[t], (
double)m) ;
210 db += pb[m] * (double) m * pow(w[t], (
double)(m-1)) ;
211 dd += qa[m] * (double) m * pow(w[t], (
double)(m-1)) ;
214 for(m = 3; m < ord+1; m+=4)
216 b -= pb[m] * pow(w[t], (
double)m) ;
217 d -= qa[m] * pow(w[t], (
double)m) ;
218 db -= pb[m] * (double) m * pow(w[t], (
double)(m-1)) ;
219 dd -= qa[m] * (double) m * pow(w[t], (
double)(m-1)) ;
225 for(m = 0; m < ord+1; m++)
227 a += pb[m] * cos(w[t]*(
double)m);
228 b -= pb[m] * sin(w[t]*(
double)m);
229 c += qa[m] * cos(w[t]*(
double)m);
230 d -= qa[m] * sin(w[t]*(
double)m);
232 da -= pb[m] *(double)m * sin(w[t]*(
double)m);
233 db -= pb[m] *(double)m * cos(w[t]*(
double)m);
234 dc -= qa[m] *(double)m * sin(w[t]*(
double)m);
235 dd -= qa[m] *(double)m * cos(w[t]*(
double)m);
239 f = da * c + a * dc + db * d + b * dd;
240 e = db * c + b * dc - da * d - a * dd;
241 tau[t] = (f * (b * c - a * d) - e * (a * c + b * d)) /
242 ((a * a + b * b) * (c * c + d * d));
int group_delay(double *pb, double *pa, int ord, int flag, double *w, int n, double *tau)
Расчет группового времени запаздывания цифрового или аналогового фильтра.
#define ERROR_FILTER_ORD
Порядок фильтра задан неверно. Порядок фильтра должен быть задан положительным целым значением.
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.