OptimumFilter.cpp

Go to the documentation of this file.
00001 #include <CMtuFormat.h>
00002 #include "types.h"
00003 #include <iostream>
00004 #include <fstream>
00005 #include <algorithm>
00006 #include <fftw3.h>
00007 
00008 using namespace std;
00009 void Filter(const tcompdata &Filter, ttsdata &TimeSeries)
00010 {
00011         double *timedomain;
00012         fftw_complex *freqdomain;
00013         fftw_plan pforward, pinverse;
00014         int seglength;
00015         int nsegs;
00016         double real, imag, mean;
00017         
00018         seglength = Filter.size() * 2;
00019         nsegs = TimeSeries.size()/seglength;
00020         timedomain = (double *)fftw_malloc(sizeof(double) * seglength);
00021         freqdomain = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * (seglength/2+1));
00022         pforward = fftw_plan_dft_r2c_1d(seglength,timedomain,freqdomain,FFTW_MEASURE);
00023         pinverse = fftw_plan_dft_c2r_1d(seglength,freqdomain,timedomain,FFTW_MEASURE);
00024         for (int i = 0; i < nsegs-1; ++i)
00025         {
00026                 mean = 0;
00027                 for (int j = 0; j < seglength; ++j)
00028                 {
00029                         timedomain[j] = TimeSeries.at(i*seglength +j);
00030                         mean += timedomain[j];
00031                 }
00032                 for (int j = 0; j < seglength; ++j)
00033                 {
00034                         timedomain[j] -=mean/seglength;
00035                         timedomain[j] *= 0.5 * (1 - cos(2 * PI *j /seglength));
00036                 }
00037                 fftw_execute(pforward);
00038                 for (int j = 0; j < seglength/2; j+=2)
00039                 {
00040                         real = freqdomain[j][0];
00041                         imag = freqdomain[j][1];
00042                         real *= (pow(freqdomain[j][0] - Filter.at(j).real(),2) + pow(freqdomain[j][1] - Filter.at(j).imag(),2))/
00043                                 ((pow(freqdomain[j][0] - Filter.at(j).real(),2) + pow(freqdomain[j][1] - Filter.at(j).imag(),2))
00044                                 + norm(Filter.at(j)));
00045                         imag *= (pow(freqdomain[j][0] - Filter.at(j).real(),2) + pow(freqdomain[j][1] - Filter.at(j).imag(),2))/
00046                                 ((pow(freqdomain[j][0] - Filter.at(j).real(),2) + pow(freqdomain[j][1] - Filter.at(j).imag(),2))
00047                                 + norm(Filter.at(j)));
00048                         freqdomain[j][0] = real;
00049                         freqdomain[j][1] = imag;        
00050                 }
00051                 fftw_execute(pinverse);
00052                 for (int j = 0; j < seglength; ++j)
00053                 {
00054                         TimeSeries.at(i*seglength +j)= timedomain[j]/seglength;
00055                 }       
00056         }
00057 }
00058 
00059 void ReadSpike(string name, tcompdata &Spike)
00060 {
00061         ifstream spikefile;
00062         double real,imag,dummy;
00063         
00064         spikefile.open(name.c_str());
00065         while (spikefile.good())
00066         {
00067                 spikefile >> dummy;
00068                 spikefile >> real;
00069                 spikefile >> imag;
00070                 if (spikefile.good())
00071                         Spike.push_back(real + I * imag);
00072         } 
00073         spikefile.close();
00074 }
00075 
00076 int main()
00077 {
00078         CMtuFormat TsData;
00079         string infilename;
00080         tcompdata SpikePowerex, SpikePowerey, SpikePowerhx, SpikePowerhy;
00081         
00082         
00083         cout << "TS File: ";
00084         cin >> infilename;
00085         
00086         TsData.GetData(infilename.c_str());
00087         
00088         ReadSpike(infilename+"_spikefreqex.dat", SpikePowerex);
00089         ReadSpike(infilename+"_spikefreqey.dat", SpikePowerey);
00090         ReadSpike(infilename+"_spikefreqhx.dat", SpikePowerhx);
00091         ReadSpike(infilename+"_spikefreqhy.dat", SpikePowerhy);
00092         Filter(SpikePowerex,TsData.Ex.data);
00093         Filter(SpikePowerey,TsData.Ey.data);
00094         Filter(SpikePowerhx,TsData.Hx.data);
00095         Filter(SpikePowerhy,TsData.Hy.data);
00096 
00097         TsData.WriteData(("opt"+infilename).c_str());
00098 }

Generated on Tue Aug 4 16:04:07 2009 for GPLIB++ by  doxygen 1.5.8