LAL  7.5.0.1-b72065a
IIRFilterVectorR_source.c
Go to the documentation of this file.
1 #define CONCAT2x(a,b) a##b
2 #define CONCAT2(a,b) CONCAT2x(a,b)
3 #define STRING(a) #a
4 
5 #ifdef COMPLEX_DATA
6 # define DBLDATATYPE COMPLEX16
7 # ifdef SINGLE_PRECISION
8 # define DATATYPE COMPLEX8
9 # else
10 # define DATATYPE COMPLEX16
11 # endif
12 #else
13 # define DBLDATATYPE REAL8
14 # ifdef SINGLE_PRECISION
15 # define DATATYPE REAL4
16 # else
17 # define DATATYPE REAL8
18 # endif
19 #endif
20 
21 #define VECTORTYPE CONCAT2(DATATYPE,Vector)
22 #define FILTERTYPE CONCAT2(DBLDATATYPE,IIRFilter)
23 
24 #define FUNC CONCAT2(XLALIIRFilterReverse,VECTORTYPE)
25 
26 int FUNC(VECTORTYPE *vector, FILTERTYPE *filter)
27 {
28  INT4 j; /* Index for filter coeficients. */
29  INT4 length; /* Length of vector. */
30  DATATYPE *data; /* Vector data. */
31  DBLDATATYPE w, datum; /* Current auxiliary and output values. */
32  INT4 directOrder; /* Number of direct filter coefficients. */
33  INT4 recursOrder; /* Number of recursive filter coefficients. */
34  INT4 numHist; /* The number of auxiliary data kept. */
35  REAL8 *directCoef; /* Direct filter coefficients. */
36  REAL8 *recursCoef; /* Recursive filter coefficients. */
37  DBLDATATYPE *temp=NULL; /* Temporary storage for auxiliary sequence. */
38 
39  /* Make sure all the structures have been initialized. */
40  if ( ! vector || ! filter )
42  if ( ! vector->data )
44  if ( ! filter->directCoef || ! filter->recursCoef || ! filter->history
45  || ! filter->directCoef->data || ! filter->recursCoef->data
46  || ! filter->history->data )
48 
49  length=vector->length;
50  data=vector->data+length-1;
51  directOrder=filter->directCoef->length;
52  recursOrder=filter->recursCoef->length;
53  directCoef=filter->directCoef->data;
54  recursCoef=filter->recursCoef->data;
55  numHist=filter->history->length+1;
56  temp = LALMalloc( numHist*sizeof(*temp) );
57  if ( ! temp )
59  memset(temp,0,(numHist-1)*sizeof(*temp));
60 
61  /* Run through the vector. */
62  while(length--){
63 
64  /* Compute the auxiliary variable. */
65  for(j=numHist-1;j>=recursOrder;j--)
66  temp[j]=temp[j-1];
67  w=*data;
68  for(;j;j--)
69  w+=recursCoef[j]*(temp[j]=temp[j-1]);
70 
71  /* Compute filter output. */
72  datum=*directCoef*(*temp=w);
73  for(j=1;j<directOrder;j++)
74  datum+=directCoef[j]*temp[j];
75  *(data--)=datum;
76  }
77  LALFree(temp);
78 
79  /* Normal exit */
80  return 0;
81 }
82 
83 #undef FUNC
84 #undef VECTORTYPE
85 #undef FILTERTYPE
86 #undef DBLDATATYPE
87 #undef DATATYPE
88 #undef CONCAT2x
89 #undef CONCAT2
90 #undef STRING
#define DBLDATATYPE
#define DATATYPE
#define FILTERTYPE
#define FUNC
#define VECTORTYPE
#define LALMalloc(n)
Definition: LALMalloc.h:93
#define LALFree(p)
Definition: LALMalloc.h:96
double REAL8
Double precision real floating-point number (8 bytes).
int32_t INT4
Four-byte signed integer.
#define XLAL_ERROR(...)
Macro to invoke a failure from a XLAL routine returning an integer.
Definition: XLALError.h:700
@ XLAL_ENOMEM
Memory allocation error.
Definition: XLALError.h:407
@ XLAL_EFAULT
Invalid pointer.
Definition: XLALError.h:408
@ XLAL_EINVAL
Invalid argument.
Definition: XLALError.h:409