Beispiel #1
0
static void init_kernel(int z, int fftlen, kernel * kern)
{
   int numkern;
   fcomplex *tempkern;

   kern->z = z;
   kern->fftlen = fftlen;
   kern->numbetween = ACCEL_NUMBETWEEN;
   kern->kern_half_width = z_resp_halfwidth((double) z, LOWACC);
   numkern = 2 * kern->numbetween * kern->kern_half_width;
   kern->numgoodbins = kern->fftlen - numkern;
   kern->data = gen_cvect(kern->fftlen);
   tempkern = gen_z_response(0.0, kern->numbetween, kern->z, numkern);
   place_complex_kernel(tempkern, numkern, kern->data, kern->fftlen);
   free(tempkern);
   COMPLEXFFT(kern->data, kern->fftlen, -1);
}
Beispiel #2
0
void rz_interp(fcomplex * data, int numdata, double r, double z,
               int kern_half_width, fcomplex * ans)
  /* This routine uses the correlation method to do a Fourier        */
  /* complex interpolation at a single point in the f-fdot plane.    */
  /* It does the correlations manually. (i.e. no FFTs)               */
  /* Arguments:                                                      */
  /*   'data' is a complex array of the data to be interpolated.     */
  /*   'numdata' is the number of complex points (bins) in data.     */
  /*   'r' is the Fourier frequency in data that we want to          */
  /*      interpolate.  This can (and should) be fractional.         */
  /*   'z' is the fdot to use (z=f-dot*T^2 (T is integration time)). */
  /*   'kern_half_width' is the half-width of the kernel in bins.    */
  /*   'ans' is the complex answer.                                  */
{
   float *dataptr, *respptr;
   int ii, numkern, nsum, intfreq, lodata, hidata, loresp, hiresp;
   double fracfreq, dintfreq, tmpd, tmpr;
   fcomplex *response;

   /* Check 'r' and return 0.0 + 0.0i if out of bounds.        */
   /* Should this return an error and exit instead?            */

   if (r > numdata - 1.0 || r < 0.0) {
      ans->r = 0.0;
      ans->i = 0.0;
      return;
   }

   /* Split 'r' into integer and fractional parts */

   fracfreq = modf(r, &dintfreq);
   intfreq = (int) dintfreq;

   /* Return immediately if 'r' is close to an           */
   /* integer frequency and z is very close to zero      */

   if (fabs(z) < 1E-4) {
      if (fracfreq < 1E-5) {
         ans->r = data[intfreq].r;
         ans->i = data[intfreq].i;
         return;
      }
      if ((1.0 - fracfreq) < 1E-5) {
         ans->r = data[intfreq + 1].r;
         ans->i = data[intfreq + 1].i;
         return;
      }
   }

   /* Generate the response function */

   numkern = 2 * kern_half_width;
   response = gen_z_response(fracfreq, 1, z, numkern);

   /* Determine the summation boundaries */

   lodata = intfreq - kern_half_width;
   if (lodata < 0) {
      loresp = abs(lodata);
      lodata = 0;
   } else {
      loresp = 0;
   }
   hidata = intfreq + kern_half_width - 1;
   if (hidata > numdata - 1) {
      hiresp = numkern - hidata + numdata - 1;
   } else {
      hiresp = numkern;
   }
   nsum = hiresp - loresp;

   /* Set up our pointers */

   dataptr = (float *) (data + lodata);
   respptr = (float *) (response + loresp);

   /* Do the summation */

   ans->r = 0.0;
   ans->i = 0.0;

   for (ii = 0; ii < nsum; ii++) {
      tmpd = *(dataptr++);
      tmpr = *(respptr++);
      ans->r += tmpd * tmpr + (*dataptr) * (*respptr);
      ans->i += (*dataptr) * tmpr - (*respptr) * tmpd;
      dataptr++;
      respptr++;
   }

   vect_free(response);
   return;
}