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 }