34 #include <lal/EPSearch.h>
35 #include <lal/FrequencySeries.h>
36 #include <lal/Sequence.h>
37 #include <lal/TimeFreqFFT.h>
38 #include <lal/Units.h>
39 #include <lal/Window.h>
40 #include <lal/XLALError.h>
42 static double min(
double a,
double b) {
return a < b ?
a : b; }
43 static double max(
double a,
double b) {
return a > b ?
a : b; }
80 const int k10 = round(filter1->
f0 / filter1->
deltaF);
81 const int k20 = round(filter2->
f0 / filter2->
deltaF);
82 const double complex *f1data = filter1->
data->
data;
83 const double complex *f2data = filter2->
data->
data;
84 const double *pdata = psd ? psd->
data->
data - (int) round(psd->
f0 / psd->
deltaF) : NULL;
86 double complex sum = 0;
97 XLALPrintError(
"%s(): filters are incompatible or PSD does not span filters' frequencies", __func__);
107 const unsigned delta_k = abs(k10 +
k1 - k20 -
k2);
108 double sksk = (delta_k & 1 ? -1 : +1) * (delta_k < correlation->length ? correlation->
data[delta_k] : 0);
111 sksk *= sqrt(pdata[k10 +
k1] * pdata[k20 +
k2]);
113 sum += sksk * f1data[
k1] * conj(f2data[
k2]);
117 return 2 * cabs(sum);
152 double channel_width,
157 char filter_name[100];
167 sprintf(filter_name,
"channel %g +/- %g Hz", channel_flow + channel_width / 2, channel_width / 2);
171 if(filter->
f0 < 0.0) {
172 XLALPrintError(
"%s(): channel_flow - channel_width / 2 >= 0.0 failed", __func__);
211 norm = sqrt(channel_width / filter->
deltaF / norm);
static double max(double a, double b)
static double min(double a, double b)
COMPLEX16FrequencySeries * XLALCreateExcessPowerFilter(double channel_flow, double channel_width, const REAL8FrequencySeries *psd, const REAL8Sequence *correlation)
Generate the frequency domain channel filter function.
double XLALExcessPowerFilterInnerProduct(const COMPLEX16FrequencySeries *filter1, const COMPLEX16FrequencySeries *filter2, const REAL8Sequence *correlation, const REAL8FrequencySeries *psd)
Compute the magnitude of the inner product of two arbitrary channel filters.
COMPLEX16FrequencySeries * XLALCreateCOMPLEX16FrequencySeries(const CHAR *name, const LIGOTimeGPS *epoch, REAL8 f0, REAL8 deltaF, const LALUnit *sampleUnits, size_t length)
void XLALDestroyCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *series)
COMPLEX16FrequencySeries * XLALWhitenCOMPLEX16FrequencySeries(COMPLEX16FrequencySeries *fseries, const REAL8FrequencySeries *psd)
const LALUnit lalDimensionlessUnit
void XLALDestroyREAL8Window(REAL8Window *window)
REAL8Window * XLALCreateHannREAL8Window(UINT4 length)
#define XLAL_ERROR_REAL8(...)
#define XLAL_ERROR_NULL(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_IS_REAL8_FAIL_NAN(val)