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
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 }