00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00028 #include "AutoCorrelationFFT.h"
00029
00030 using std::ostringstream;
00031 using namespace Marsyas;
00032
00033
00034 AutoCorrelationFFT::AutoCorrelationFFT(mrs_string name):MarSystem("AutoCorrelationFFT", name)
00035 {
00036
00037
00038
00039
00040
00041
00042
00043
00044 }
00045
00046 AutoCorrelationFFT::AutoCorrelationFFT(const AutoCorrelationFFT& orig) : MarSystem(orig)
00047 {
00048
00049
00050
00051
00052
00053 }
00054
00055 AutoCorrelationFFT::~AutoCorrelationFFT()
00056 {
00057 }
00058
00059 MarSystem*
00060 AutoCorrelationFFT::clone() const
00061 {
00062 return new AutoCorrelationFFT(*this);
00063 }
00064
00065 void
00066 AutoCorrelationFFT::myUpdate(MarControlPtr sender)
00067 {
00068 MarSystem::myUpdate(sender);
00069 mrs_string inObsNames = ctrl_inObsNames_->to<mrs_string>();
00070
00071 setControl("mrs_natural/onSamples", (mrs_natural)(ctrl_inSamples_->to<mrs_natural>()/2));
00072 setControl("mrs_natural/onObservations", (mrs_natural)(ctrl_inObservations_->to<mrs_natural>()));
00073
00074
00075
00076
00077
00078
00079 }
00080
00081
00082 void
00083 AutoCorrelationFFT::myProcess(realvec& in, realvec& out)
00084 {
00085 for (mrs_natural o=0;o<inObservations_;o++)
00086 {
00087
00088 mrs_natural i;
00089 temp_.create(inSamples_);
00090 for (i=0; i < inSamples_; ++i)
00091 temp_(i) = in(o,i);
00092 mrs_real *temp = temp_.getData();
00093 fft_.rfft(temp, inSamples_/2, FFT_FORWARD);
00094
00095
00096 out(o,0) = 0.0;
00097
00098
00099
00100 for (i=1; i<onSamples_; ++i)
00101 {
00102 out(o,i) = sqrt(temp[2*i]*temp[2*i] + temp[2*i+1]*temp[2*i+1]);
00103
00104 }
00105 }
00106
00107
00108 }
00109