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 }