25 #include <lal/LALDatatypes.h>
26 #include <lal/LALMalloc.h>
27 #include <lal/TimeSeriesInterp.h>
28 #include <lal/Window.h>
29 #include <lal/XLALError.h>
54 static void default_kernel(
double *cached_kernel,
int kernel_length,
double residual,
void *data)
74 double *stop = cached_kernel + kernel_length;
79 sinx_over_pi = -sinx_over_pi;
80 for(i = -(kernel_length - 1) / 2; cached_kernel < stop; i++, sinx_over_pi = -sinx_over_pi) {
93 *cached_kernel++ = sinx_over_pi * (1. /
y -
y);
95 *cached_kernel++ = 0.;
117 void (*
kernel)(
double *, int, double,
void *);
171 LALREAL8SequenceInterp *interp;
172 double *cached_kernel;
174 if(kernel_length < 3)
176 if(!kernel && kernel_data) {
181 kernel_length -= (~kernel_length) & 1;
184 cached_kernel =
XLALMalloc(kernel_length *
sizeof(*cached_kernel));
185 if(!interp || !cached_kernel) {
192 interp->kernel_length = kernel_length;
193 interp->cached_kernel = cached_kernel;
195 interp->residual = 2.;
198 interp->noop_threshold = 1. / (4 * interp->kernel_length);
221 interp->kernel = kernel;
222 interp->kernel_data = kernel_data;
245 interp->kernel = NULL;
246 interp->kernel_data = NULL;
276 const REAL8 *data = interp->s->data;
277 double *cached_kernel = interp->cached_kernel;
278 double *stop = cached_kernel + interp->kernel_length;
287 int start = lround(
x);
288 double residual = start -
x;
291 if(!isfinite(
x) || (bounds_check && (x < 0 || x >= interp->s->length)))
295 if(fabs(residual) < interp->noop_threshold && interp->kernel ==
default_kernel)
296 return 0 <= start && start < (int) interp->s->length ? data[start] : 0.0;
299 if(fabs(residual - interp->residual) >= interp->noop_threshold) {
300 interp->kernel(cached_kernel, interp->kernel_length, residual, interp->kernel_data);
301 interp->residual = residual;
305 start -= (interp->kernel_length - 1) / 2;
306 if(start + interp->kernel_length > (
signed) interp->s->length)
307 stop -= start + interp->kernel_length - interp->s->length;
309 cached_kernel -= start;
312 for(val = 0.0; cached_kernel < stop;)
313 val += *cached_kernel++ * *data++;
348 LALREAL8TimeSeriesInterp *interp;
349 LALREAL8SequenceInterp *seqinterp;
353 if(!interp || !seqinterp) {
359 interp->series = series;
360 interp->seqinterp = seqinterp;
377 interp->series = NULL;
void XLALREAL8SequenceInterpDestroy(LALREAL8SequenceInterp *interp)
Free a LALREAL8SequenceInterp object.
LALREAL8SequenceInterp * XLALREAL8SequenceInterpCreate(const REAL8Sequence *s, int kernel_length, void(*kernel)(double *, int, double, void *), void *kernel_data)
Create a new REAL8Sequence interpolator associated with the given REAL8Sequence object.
static void default_kernel(double *cached_kernel, int kernel_length, double residual, void *data)
LALREAL8TimeSeriesInterp * XLALREAL8TimeSeriesInterpCreate(const REAL8TimeSeries *series, int kernel_length, void(*kernel)(double *, int, double, void *), void *kernel_data)
Create a new REAL8TimeSeries interpolator associated with the given REAL8TimeSeries object.
REAL8 XLALREAL8SequenceInterpEval(LALREAL8SequenceInterp *interp, double x, int bounds_check)
Evaluate a LALREAL8SequenceInterp at the real-valued index x.
void XLALREAL8TimeSeriesInterpDestroy(LALREAL8TimeSeriesInterp *interp)
Free a LALREAL8TimeSeriesInterp object.
REAL8 XLALREAL8TimeSeriesInterpEval(LALREAL8TimeSeriesInterp *interp, const LIGOTimeGPS *t, int bounds_check)
Evaluate a LALREAL8TimeSeriesInterp at the LIGOTimeGPS t.
#define LAL_PI
Archimedes's constant, pi.
double REAL8
Double precision real floating-point number (8 bytes).
#define XLAL_ERROR_REAL8(...)
Macro to invoke a failure from a XLAL routine returning a REAL8.
#define XLAL_ERROR_NULL(...)
Macro to invoke a failure from a XLAL routine returning a pointer.
@ XLAL_EFUNC
Internal function call failed bit: "or" this with existing error number.
@ XLAL_EDOM
Input domain error.
@ XLAL_EINVAL
Invalid argument.
REAL8 XLALGPSDiff(const LIGOTimeGPS *t1, const LIGOTimeGPS *t0)
Difference between two GPS times as double.
Epoch relative to GPS epoch, see LIGOTimeGPS type for more details.
Time series of REAL8 data, see DATATYPE-TimeSeries types for more details.
REAL8Sequence * data
The sequence of sampled data.
Vector of type REAL8, see DATATYPE-Vector types for more details.
Opaque LALREAL8SequenceInterp instance structure.
void(* kernel)(double *, int, double, void *)
Opaque LALREAL8TimeSeriesInterp structure.
const REAL8TimeSeries * series
LALREAL8SequenceInterp * seqinterp