21#include <lal/LALStdlib.h>
22#include <lal/LALConstants.h>
23#include <lal/AVFactories.h>
25#include <lal/IIRFilter.h>
130 for(i=0,num=0;i<numZeros;i++)
131 if(cimagf(zeros[i])==0.0){
133 if(crealf(zeros[i])==0.0)
136 else if(cimagf(zeros[i])>0.0){
145 REAL4 x = crealf(zeros[i]) - crealf(zeros[0]);
146 REAL4 y = cimagf(zeros[i]) + cimagf(zeros[0]);
148 for(j=1;j<numZeros;j++){
149 x=crealf(zeros[i])-crealf(zeros[j]);
150 y=cimagf(zeros[i])+cimagf(zeros[j]);
160 crealf(zeros[i]),cimagf(zeros[i]));
162 crealf(zeros[k]),cimagf(zeros[k]));
167 if ( num != numZeros )
174 for(i=0,num=0;i<numPoles;i++)
175 if(cimagf(poles[i])==0.0){
177 if(crealf(poles[i])==0.0)
180 else if(cimagf(poles[i])>0.0){
189 REAL4 x = crealf(poles[i]) - crealf(poles[0]);
190 REAL4 y = cimagf(poles[i]) + cimagf(poles[0]);
192 for(j=1;j<numPoles;j++){
193 x=crealf(poles[i])-crealf(poles[j]);
194 y=cimagf(poles[i])+cimagf(poles[j]);
204 crealf(poles[i]),cimagf(poles[i]));
206 crealf(poles[k]),cimagf(poles[k]));
211 if ( num != numPoles )
222 for(i=0;i<numPoles;i++){
225 if((crealf(poles[i])==crealf(zeros[j]))&&(cimagf(poles[i])==cimagf(zeros[j]))){
229 crealf(poles[i]),cimagf(poles[i]));
233 if(numPoles<numZeros){
240 for(i=0;i<numPoles;i++){
241 REAL4 zAbs=crealf(poles[i])*crealf(poles[i])+cimagf(poles[i])*cimagf(poles[i]);
246 crealf(poles[i]),cimagf(poles[i]),i,zAbs);
255 num = (numPoles>=numZeros) ? numZeros : numPoles;
267 direct=
output->directCoef->data;
268 recurs=
output->recursCoef->data;
272 for(i=1;i<numRecurs;i++)
274 for(i=0;i<numPoles;i++){
280 recurs[j]-=
x*recurs[j-1];
283 recurs[j]-=2.0*
x*recurs[j-1]-(
x*
x+
y*
y)*recurs[j-2];
284 recurs[j]-=2.0*
x*recurs[j-1];
289 for(i=0;i<numDirect;i++)
291 direct[num-numZeros]=crealf(input->
gain);
292 for(i=0;i<numZeros;i++){
297 for(;j>num-numZeros;j--)
298 direct[j]-=
x*direct[j-1];
300 for(;j>num-numZeros+1;j--)
301 direct[j]-=2.0*
x*direct[j-1]-(
x*
x+
y*
y)*direct[j-2];
302 direct[j]-=2.0*
x*direct[j-1];
307 if(numDirect>=numRecurs)
317 history=
output->history->data;
357 for(i=0,num=0;i<numZeros;i++)
358 if(cimag(zeros[i])==0.0){
360 if(creal(zeros[i])==0.0)
363 else if(cimag(zeros[i])>0.0){
372 REAL8 x = creal(zeros[i]) - creal(zeros[0]);
373 REAL8 y = cimag(zeros[i]) + cimag(zeros[0]);
375 for(j=1;j<numZeros;j++){
376 x=creal(zeros[i])-creal(zeros[j]);
377 y=cimag(zeros[i])+cimag(zeros[j]);
387 creal(zeros[i]),cimag(zeros[i]));
389 creal(zeros[k]),cimag(zeros[k]));
394 if ( num != numZeros )
401 for(i=0,num=0;i<numPoles;i++)
402 if(cimag(poles[i])==0.0){
404 if(creal(poles[i])==0.0)
407 else if(cimag(poles[i])>0.0){
416 REAL8 x = creal(poles[i]) - creal(poles[0]);
417 REAL8 y = cimag(poles[i]) + cimag(poles[0]);
419 for(j=1;j<numPoles;j++){
420 x=creal(poles[i])-creal(poles[j]);
421 y=cimag(poles[i])+cimag(poles[j]);
431 creal(poles[i]),cimag(poles[i]));
433 creal(poles[k]),cimag(poles[k]));
438 if ( num != numPoles )
449 for(i=0;i<numPoles;i++){
452 if((creal(poles[i])==creal(zeros[j]))&&(cimag(poles[i])==cimag(zeros[j]))){
456 creal(poles[i]),cimag(poles[i]));
460 if(numPoles<numZeros){
467 for(i=0;i<numPoles;i++){
468 REAL8 zAbs=creal(poles[i])*creal(poles[i])+cimag(poles[i])*cimag(poles[i]);
473 creal(poles[i]),cimag(poles[i]),i,zAbs);
482 num = (numPoles>=numZeros) ? numZeros : numPoles;
494 direct=
output->directCoef->data;
495 recurs=
output->recursCoef->data;
499 for(i=1;i<numRecurs;i++)
501 for(i=0;i<numPoles;i++){
507 recurs[j]-=
x*recurs[j-1];
510 recurs[j]-=2.0*
x*recurs[j-1]-(
x*
x+
y*
y)*recurs[j-2];
511 recurs[j]-=2.0*
x*recurs[j-1];
516 for(i=0;i<numDirect;i++)
518 direct[num-numZeros]=creal(input->
gain);
519 for(i=0;i<numZeros;i++){
524 for(;j>num-numZeros;j--)
525 direct[j]-=
x*direct[j-1];
527 for(;j>num-numZeros+1;j--)
528 direct[j]-=2.0*
x*direct[j-1]-(
x*
x+
y*
y)*direct[j-2];
529 direct[j]-=2.0*
x*direct[j-1];
534 if(numDirect>=numRecurs)
544 history=
output->history->data;
584 for(i=0,num=0;i<numZeros;i++)
585 if(cimag(zeros[i])==0.0){
587 if(creal(zeros[i])==0.0)
590 else if(cimag(zeros[i])>0.0){
599 REAL8 x = creal(zeros[i]) - creal(zeros[0]);
600 REAL8 y = cimag(zeros[i]) + cimag(zeros[0]);
602 for(j=1;j<numZeros;j++){
603 x=creal(zeros[i])-creal(zeros[j]);
604 y=cimag(zeros[i])+cimag(zeros[j]);
614 creal(zeros[i]),cimag(zeros[i]));
616 creal(zeros[k]),cimag(zeros[k]));
621 if ( num != numZeros )
628 for(i=0,num=0;i<numPoles;i++)
629 if(cimag(poles[i])==0.0){
631 if(creal(poles[i])==0.0)
634 else if(cimag(poles[i])>0.0){
643 REAL8 x = creal(poles[i]) - creal(poles[0]);
644 REAL8 y = cimag(poles[i]) + cimag(poles[0]);
646 for(j=1;j<numPoles;j++){
647 x=creal(poles[i])-creal(poles[j]);
648 y=cimag(poles[i])+cimag(poles[j]);
658 creal(poles[i]),cimag(poles[i]));
660 creal(poles[k]),cimag(poles[k]));
665 if ( num != numPoles )
676 for(i=0;i<numPoles;i++){
679 if((creal(poles[i])==creal(zeros[j]))&&(cimag(poles[i])==cimag(zeros[j]))){
683 creal(poles[i]),cimag(poles[i]));
687 if(numPoles<numZeros){
694 for(i=0;i<numPoles;i++){
695 REAL8 zAbs=creal(poles[i])*creal(poles[i])+cimag(poles[i])*cimag(poles[i]);
700 creal(poles[i]),cimag(poles[i]),i,zAbs);
709 num = (numPoles>=numZeros) ? numZeros : numPoles;
721 direct=
output->directCoef->data;
722 recurs=
output->recursCoef->data;
726 for(i=1;i<numRecurs;i++)
728 for(i=0;i<numPoles;i++){
734 recurs[j]-=
x*recurs[j-1];
737 recurs[j]-=2.0*
x*recurs[j-1]-(
x*
x+
y*
y)*recurs[j-2];
738 recurs[j]-=2.0*
x*recurs[j-1];
743 for(i=0;i<numDirect;i++)
745 direct[num-numZeros]=creal(input->
gain);
746 for(i=0;i<numZeros;i++){
751 for(;j>num-numZeros;j--)
752 direct[j]-=
x*direct[j-1];
754 for(;j>num-numZeros+1;j--)
755 direct[j]-=2.0*
x*direct[j-1]-(
x*
x+
y*
y)*direct[j-2];
756 direct[j]-=2.0*
x*direct[j-1];
761 if(numDirect>=numRecurs)
771 history=
output->history->data;
#define ABORT(statusptr, code, mesg)
#define ASSERT(assertion, statusptr, code, mesg)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
int XLALPrintWarning(const char *fmt,...)
REAL4IIRFilter * XLALCreateREAL4IIRFilter(COMPLEX8ZPGFilter *input)
void LALCreateREAL4IIRFilter(LALStatus *stat, REAL4IIRFilter **output, COMPLEX8ZPGFilter *input)
Deprecated.
REAL8IIRFilter * XLALCreateREAL8IIRFilter(COMPLEX16ZPGFilter *input)
COMPLEX16IIRFilter * XLALCreateCOMPLEX16IIRFilter(COMPLEX16ZPGFilter *input)
void LALCreateREAL8IIRFilter(LALStatus *stat, REAL8IIRFilter **output, COMPLEX16ZPGFilter *input)
Deprecated.
void XLALDestroyREAL4IIRFilter(REAL4IIRFilter *filter)
void XLALDestroyCOMPLEX16IIRFilter(COMPLEX16IIRFilter *filter)
void XLALDestroyREAL8IIRFilter(REAL8IIRFilter *filter)
#define IIRFILTERH_ENUL
Unexpected null pointer in arguments.
#define IIRFILTERH_EPAIR
Input has unpaired nonreal poles or zeros.
#define IIRFILTERH_EMEM
Memory allocation error.
#define IIRFILTERH_EOUT
Output handle points to a non-null pointer.
#define LAL_REAL8_EPS
Difference between 1 and the next resolvable REAL8 2^-52.
#define LAL_REAL4_EPS
Difference between 1 and the next resolvable REAL4 2^-23.
double complex COMPLEX16
Double-precision floating-point complex number (16 bytes total)
double REAL8
Double precision real floating-point number (8 bytes).
float complex COMPLEX8
Single-precision floating-point complex number (8 bytes total)
int32_t INT4
Four-byte signed integer.
float REAL4
Single precision real floating-point number (4 bytes).
@ LALWARNING
enable warning messages
REAL4Vector * XLALCreateREAL4Vector(UINT4 length)
REAL8Vector * XLALCreateREAL8Vector(UINT4 length)
COMPLEX16Vector * XLALCreateCOMPLEX16Vector(UINT4 length)
#define XLAL_ERROR_NULL(...)
Macro to invoke a failure from a XLAL routine returning a pointer.
#define xlalErrno
Modifiable lvalue containing the XLAL error number.
int XLALClearErrno(void)
Clears the XLAL error number, returns the old value.
@ XLAL_ENOMEM
Memory allocation error.
@ XLAL_EFAULT
Invalid pointer.
@ XLAL_EFUNC
Internal function call failed bit: "or" this with existing error number.
@ XLAL_EINVAL
Invalid argument.
This structure stores the direct and recursive REAL8 filter coefficients, as well as the complex-valu...
UINT4 length
Number of elements in array.
COMPLEX16 * data
Pointer to the data array.
See DATATYPE-ZPGFilter types for details.
UINT4 length
Number of elements in array.
COMPLEX8 * data
Pointer to the data array.
See DATATYPE-ZPGFilter types for details.
LAL status structure, see The LALStatus structure for more details.
This structure stores the direct and recursive REAL4 filter coefficients, as well as the history of t...
This structure stores the direct and recursive REAL8 filter coefficients, as well as the history of t...
void output(int gps_sec, int output_type)