mffm-fftw (1.7-3) complexFFT.cc

Summary

 complexFFT.cc |  142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 142 insertions(+)

    
download this patch

Patch contents

--- mffm-fftw-1.7.orig/complexFFT.cc
+++ mffm-fftw-1.7/complexFFT.cc
@@ -0,0 +1,142 @@
+/* Copyright 2001,2002 Matt Flax <flatmax@ieee.org>
+   This file is part of the MFFM FFTw Wrapper library.
+
+   MFFM MFFM FFTw Wrapper library is free software; you can 
+   redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   MFFM FFTw Wrapper library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You have received a copy of the GNU General Public License
+   along with the MFFM FFTw Wrapper library
+*/
+#include "complexFFT.H"
+#include <stdlib.h>
+
+#include <iostream>
+using namespace std;
+
+complexFFTData::
+complexFFTData(int sz){
+  //  std::cout <<"complexFFTData init:"<<this<<std::endl;
+  size=sz;
+  in = out = NULL;
+  power_spectrum = NULL;
+
+  //in = new fftw_complex[size];
+  //out = new fftw_complex[size];
+  //power_spectrum = new fftw_real[size];
+  in = (fftw_complex*)fftw_malloc(size*sizeof(fftw_complex));
+  out = (fftw_complex*)fftw_malloc(size*sizeof(fftw_complex));
+  power_spectrum = (fftw_real*)fftw_malloc(size*sizeof(fftw_real));
+  if (!in || !out || !power_spectrum){
+    std::cerr << "Could not allocate enough mem for a complexFFT"<<std::endl;
+    //if (in) delete [] in;
+    //if (out) delete [] out;
+    //if (power_spectrum) delete [] power_spectrum;
+    if (in) fftw_free(in); in=NULL;
+    if (out) fftw_free(out); out=NULL;
+    if (power_spectrum) fftw_free(power_spectrum); power_spectrum=NULL;
+    exit(-1);
+  }
+  totalPower = 0.0;
+  //  std::cout <<"complexFFTData exit"<<std::endl;
+}
+
+complexFFTData::
+~complexFFTData(){
+  //if (in) delete [] in;
+  //if (out) delete [] out;
+  //if (power_spectrum) delete [] power_spectrum;
+  if (in) fftw_free(in); in=NULL;
+  if (out) fftw_free(out); out=NULL;
+  if (power_spectrum) fftw_free(power_spectrum); power_spectrum=NULL;
+}
+
+int complexFFTData::
+compPowerSpec(){
+  int bin;
+  totalPower = 0.0;
+  double max = power_spectrum[bin=0] = c_re(out[0])*c_re(out[0])+c_im(out[0])*c_im(out[0]);  // DC component
+  for (int k = 1; k < getSize(); ++k){
+    if ((power_spectrum[k] = c_re(out[k])*c_re(out[k]) + c_im(out[k])*c_im(out[k]))>max){
+      max=power_spectrum[bin=k];
+    }
+    totalPower += power_spectrum[k];
+  }
+  /*  if (getSize() % 2 == 0){ // N is even
+    power_spectrum[getSize()/2] = out[getSize()/2]*out[getSize()/2];  // Nyquist freq.
+    if (power_spectrum[getSize()/2]>max)
+      max=power_spectrum[bin=getSize()/2];      
+    totalPower += power_spectrum[getSize()/2];
+    }*/
+  return bin;
+}
+
+complexFFT::
+complexFFT(complexFFTData *d) {
+  //  std::cout <<"complexFFT init:"<<this<<std::endl;
+  data=d;
+  createPlan();
+}
+
+complexFFT::
+~complexFFT(){
+  destroyPlan();
+}
+
+void complexFFT::
+destroyPlan(void){
+  if (data){
+    fftw_destroy_plan(fwdPlan);
+    fftw_destroy_plan(invPlan);
+  }
+}
+
+void complexFFT::
+createPlan(void){
+  if (data){
+    //fftw3
+    fwdPlan = fftw_plan_dft_1d(data->getSize(), data->in, data->out, FFTW_FORWARD, PLANTYPE);
+    invPlan = fftw_plan_dft_1d(data->getSize(), data->out, data->in, FFTW_BACKWARD, PLANTYPE);
+  }
+}
+
+void complexFFT::
+switchData(complexFFTData *d){
+  //fftw_cleanup();
+  destroyPlan();
+  data=d;
+  createPlan();
+}
+
+void complexFFT::
+fwdTransform(){
+  if (!data)
+    std::cerr<<"complexFFT::fwdTransform : data not present, please switch data"<<std::endl;
+  else
+    fftw_execute(fwdPlan);
+  /*fftw_execute_dft(
+          fwdPlan,
+          data->in, data->out);
+
+	  }*/
+}
+
+void complexFFT::
+invTransform(){
+  if (!data)
+    std::cerr<<"complexFFT::invTransform : data not present, please switch data"<<std::endl;
+  else
+    fftw_execute(invPlan);
+  /*fftw_execute_dft(
+          invPlan,
+          data->in, data->out);
+
+	  }*/
+}