#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include </usr/local/include/fftw3.h>
#include <dbDefs.h>
#include <registryFunction.h>
#include <subRecord.h>
#include <aSubRecord.h>
#include <epicsExport.h>
int aFTsubDebug;
static long aFTsubInit(aSubRecord *precord)
{
if (aFTsubDebug)
printf("Record %s called aFTsub(%p)\n",
precord->name, (void*) precord);
return 0;
}
static long aFTsubProcess(aSubRecord *precord)
{
int i;
long nord;
fftw_complex *in, *out;
fftw_plan p;
double *ain;
int *bin;
double *pout;
double re,im,mag;
ain = (double *)precord->a;
bin = (int *)precord->b;
nord = precord->nea;
pout = (double *)precord->vala;
in =(fftw_complex*)fftw_malloc(sizeof(fftw_complex)*bin[0]);
out=(fftw_complex*)fftw_malloc(sizeof(fftw_complex)*bin[0]);
for (i=0;i<bin[0]; i++) {
in[i][0]=ain[i];
in[i][1]=0.0;
}
p = fftw_plan_dft_1d(bin[0],in,out,FFTW_FORWARD,FFTW_ESTIMATE);
fftw_execute(p);
for (i=0; i<bin[0]; i++) {
re = out[i][0];
im = out[i][1];
mag = sqrt(re*re + im*im);
pout[i]=mag;
}
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
return 0;
}
epicsExportAddress(int, aFTsubDebug);
epicsRegisterFunction(aFTsubInit);
epicsRegisterFunction(aFTsubProcess);