seisadaptive.cpp

Go to the documentation of this file.
00001 #include <fstream>
00002 #include <iostream>
00003 #include <vector>
00004 #include <string>
00005 #include <algorithm>
00006 #include <boost/shared_ptr.hpp>
00007 #include <boost/random/lagged_fibonacci.hpp>
00008 #include <boost/random/normal_distribution.hpp>
00009 #include <boost/random/variate_generator.hpp>
00010 #include <boost/date_time/posix_time/posix_time.hpp>
00011 #include "LMSCanceller.h"
00012 #include "RLSCanceller.h"
00013 #include "AMRLSCanceller.h"
00014 #include "SeisAdaptiveConfig.h"
00015 #include "SeismicDataComp.h"
00016 
00017 
00018 using namespace std;
00019 string version = "$Id: mtuadaptive.cpp 942 2007-04-08 16:13:01Z max $";
00020 
00021 
00022 
00023 int main()
00024 {
00025         cout << "This is mtuadaptive: Apply an adaptive filter (LMS or RLS) to cancel noise in MT time series" << endl<< endl;
00026         cout  << " The program will ask for reference and input filename, further settings are read from 'mtuadaptive.conf' " << endl;
00027         cout << " Output will be 2 Phoenix format files with ending '.clean' and '.eps' where the chosen channel is overwritten" << endl<< endl;
00028         cout << " This is Version: " << version << endl << endl;
00029         
00030         SeismicDataComp InputData, NoiseData;
00031         
00032         string tsfilename, noisefilename;
00033         SeisAdaptiveConfig Configuration;
00034         Configuration.GetData("mtuadaptive.conf");
00035         AdaptiveFilter *Filter;
00036         int filterchoice = -1;
00037         cout << "Which type of adaptive filter do you want ?" << endl;
00038         cout << " 1: LMS" << endl;
00039         cout << " 2: RLS" << endl;
00040         cout << " 3: AMRLS" << endl;
00041         cin >> filterchoice;
00042         switch (filterchoice)
00043         {
00044                 case 1:
00045                         Filter = new LMSCanceller(Configuration.filterlength,Configuration.mu);
00046                 break;
00047                 case 2:
00048                         Filter = new RLSCanceller(Configuration.filterlength,Configuration.delta,Configuration.lambda);
00049                 break;
00050                 case 3:
00051                         Filter = new AMRLSCanceller(Configuration.filterlength,Configuration.delta,Configuration.lambda,Configuration.alpha);
00052                 break;
00053                 default:
00054                         cerr << "Invalid number input, don't know what to do and will exit ! ";
00055                         return 100;
00056                 break;
00057         }
00058         
00059         cout << "Noise Data: ";
00060         cin >> noisefilename;
00061         NoiseData.GetData(noisefilename);
00062         
00063         const double orignoisemax = *max_element(NoiseData.GetData().begin(),NoiseData.GetData().end());
00064         boost::lagged_fibonacci607 RandomGenerator(static_cast<unsigned int>(std::time(0)));
00065         boost::normal_distribution<> Noisedist(0.0,fabs(orignoisemax/10.0));
00066         boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > NoiseGenerator(RandomGenerator,Noisedist);
00067 
00068         const size_t noiselength = NoiseData.GetData().size();
00069         
00070         const size_t inputsize = Configuration.filterlength;
00071         const size_t outputsize = 1;
00072         gplib::rvec currentinput(inputsize), currdesired(outputsize), currout(outputsize);
00073         
00074         for (size_t i = 0; i < noiselength; ++i)
00075         {
00076                 copy(NoiseData.GetData().begin()+i,NoiseData.GetData().begin()+inputsize+i,
00077                                 currentinput.begin());
00078                 currdesired(0) = NoiseGenerator();
00079                 Filter->CalcOutput(currentinput,currout);
00080                 Filter->AdaptFilter(currentinput,currdesired);  
00081         }       
00082         
00083         cout << "Radial Time Series Filename: ";
00084         cin >> tsfilename;
00085         InputData.GetData(tsfilename);
00086         const size_t inputlength = InputData.GetData().size();
00087         gplib::rvec newout(inputlength);
00088         for (size_t i = 0; i < inputlength; ++i)
00089         {
00090                 copy(InputData.GetData().begin()+i,InputData.GetData().begin()+inputsize+i,
00091                                 currentinput.begin());
00092                 Filter->CalcOutput(currentinput,currout);
00093                 newout(i) = currout(0);
00094         }
00095         copy(newout.begin(),newout.end(),InputData.GetData().begin());
00096         InputData.WriteAsSac("filter.r");
00097         ofstream rweightfile("filter.r.weights");
00098         copy(Filter->GetWeightsAsVector().begin(),Filter->GetWeightsAsVector().end(),ostream_iterator<double>(rweightfile,"\n"));
00099         
00100         cout << "Vertical Time Series Filename: ";
00101         cin >> tsfilename;
00102         InputData.GetData(tsfilename);
00103         
00104         for (size_t i = 0; i < inputlength; ++i)
00105         {
00106                 copy(InputData.GetData().begin()+i,InputData.GetData().begin()+inputsize+i,
00107                                 currentinput.begin());
00108                 Filter->CalcOutput(currentinput,currout);
00109                 newout(i) = currout(0);
00110         }
00111         copy(newout.begin(),newout.end(),InputData.GetData().begin());
00112         InputData.WriteAsSac("filter.z");
00113         ofstream zweightfile("filter.z.weights");
00114         copy(Filter->GetWeightsAsVector().begin(),Filter->GetWeightsAsVector().end(),ostream_iterator<double>(zweightfile,"\n"));
00115 }

Generated on Fri Jul 4 15:30:21 2008 for GPLIB++ by  doxygen 1.5.5