MtuFilter.cpp

Go to the documentation of this file.
00001 #include "MtuFilter.h"
00002 #include <fstream>
00003 #include <gsl/gsl_errno.h>
00004 #include <gsl/gsl_spline.h>
00005 #include "FatalException.h"
00006 #include <cassert>
00007 using namespace std;
00008 
00009 namespace gplib
00010   {
00011 
00012     MtuFilter::~MtuFilter()
00013       {
00014       }
00015 
00016     void MtuFilter::GetData(const std::string filename)
00017       {
00018         ifstream filterfile;
00019         ttsdata rawfreqs;
00020         ttsdata rawimag, rawreal;
00021         double currfreq, currreal, currimag, dummy;
00022         //double absresponse,phaseresponse;
00023         double *imag, *real, *freqs;
00024 
00025         FilterCoeff.clear();
00026         filterfile.open(filename.c_str());
00027         if (!filterfile)
00028           {
00029             throw FatalException("Filter-file  does not exist: " + filename);
00030           }
00031         filterfile >> dummy;
00032         while (filterfile.good())
00033           {
00034             filterfile >> currfreq;
00035             filterfile.ignore(256, ',');
00036             filterfile >> currreal;
00037             filterfile.ignore(256, ',');
00038             filterfile >> currimag;
00039             if (filterfile.good())
00040               {
00041                 rawfreqs.push_back(currfreq);
00042                 rawreal.push_back(currreal);
00043                 rawimag.push_back(currimag);
00044               }
00045           }
00046         assert(rawreal.size() == rawimag.size());
00047         assert(rawreal.size() == rawfreqs.size());
00048         filterfile.close();
00049 
00050         real = new double[rawreal.size()];
00051         imag = new double[rawimag.size()];
00052         freqs = new double[rawfreqs.size()];
00053 
00054         for (unsigned int i = 0; i < rawreal.size(); ++i)
00055           {
00056             real[rawreal.size() - 1 - i] = rawreal.at(i);
00057             imag[rawreal.size() - 1 - i] = rawimag.at(i);
00058             freqs[rawreal.size() - 1 - i] = rawfreqs.at(i);
00059           }
00060 
00061         gsl_interp_accel *accreal = gsl_interp_accel_alloc();
00062         gsl_interp_accel *accimag = gsl_interp_accel_alloc();
00063 
00064         gsl_spline *realspline = gsl_spline_alloc(gsl_interp_cspline,
00065             rawreal.size());
00066         gsl_spline *imagspline = gsl_spline_alloc(gsl_interp_cspline,
00067             rawimag.size());
00068 
00069         gsl_spline_init(realspline, freqs, real, rawreal.size());
00070         gsl_spline_init(imagspline, freqs, imag, rawimag.size());
00071 
00072         for (int i = 0; i < seglength / 2 + 1; ++i)
00073           {
00074             currreal = gsl_spline_eval(realspline, i * freqstep, accreal);
00075             currimag = gsl_spline_eval(imagspline, i * freqstep, accimag);
00076             FilterCoeff.push_back(currreal + I * currimag);
00077           }
00078         delete[] freqs;
00079         delete[] real;
00080         delete[] imag;
00081         gsl_spline_free(realspline);
00082         gsl_spline_free(imagspline);
00083         gsl_interp_accel_free(accreal);
00084         gsl_interp_accel_free(accimag);
00085       }
00086 
00087     void MtuFilter::WriteData(const std::string filename)
00088       {
00089         ofstream rawout;
00090         rawout.open((filename + ".raw").c_str());
00091         for (unsigned int i = 0; i < FilterCoeff.size(); ++i)
00092           {
00093             rawout << i * freqstep << " " << abs(FilterCoeff.at(i)) << " "
00094                 << arg(FilterCoeff.at(i)) << endl;
00095           }
00096         rawout.close();
00097       }
00098   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8