Brief description of class still missing. More...
#include <TaperDelegate.h>
Classes | |
class | ComplexSample |
class | RealSample |
class | Sample |
Public Member Functions | |
template<typename sampleType > | |
void | apply (sampleType samples, int signalFirstSample, int signalLastSample, int windowFirstSample, int windowLastSample) const |
template<typename sampleType > | |
void | apply (sampleType samples, int nSamples, const TimeRange &range, double samplingFrequency) const |
TaperDelegate (const TaperParameters *p) | |
~TaperDelegate () |
Brief description of class still missing.
Full description of class still missing
GeopsyCore::TaperDelegate::TaperDelegate | ( | const TaperParameters * | p | ) |
void GeopsyCore::TaperDelegate::apply | ( | sampleType | samples, |
int | signalFirstSample, | ||
int | signalLastSample, | ||
int | windowFirstSample, | ||
int | windowLastSample | ||
) | const |
Source: http://en.wikipedia.org/wiki/Window_function
Outside signalFirstSample and signalLastSample the signal is not touched. Outside windowFirstSample and windowLastSample the affected signal is set to null. The signal is modified between windowFirstSample and windowLastSample according to window function.
windowFirstSample and windowLastSample can be outside the range signalFirstSample and signalLastSample.
References GeopsyCore::TaperParameters::alpha(), GeopsyCore::TaperParameters::Bartlett, GeopsyCore::TaperParameters::BartlettHann, GeopsyCore::TaperParameters::Blackman, GeopsyCore::TaperParameters::BlackmanHarris, GeopsyCore::TaperParameters::BlackmanNuttall, QGpCoreTools::cos(), GeopsyCore::TaperParameters::Cosine, QGpCoreTools::exp(), GeopsyCore::TaperParameters::FlatTop, GeopsyCore::TaperParameters::Gaussian, GeopsyCore::TaperParameters::Hamming, GeopsyCore::TaperParameters::Hann, GeopsyCore::TaperParameters::Lanczos, GeopsyCore::TaperParameters::Nuttall, GeopsyCore::TaperParameters::Rectangular, GeopsyCore::TaperParameters::reversed(), GeopsyCore::TaperParameters::sigma(), QGpCoreTools::sin(), TRACE, GeopsyCore::TaperParameters::Triangular, GeopsyCore::TaperParameters::Tukey, and GeopsyCore::TaperParameters::window().
Referenced by apply(), and GeopsyCore::DoubleSignal::taper().
{ TRACE; double width=windowLastSample-windowFirstSample; double widthFactor=1.0/width; ASSERT(windowFirstSample<=windowLastSample); if(windowFirstSample>signalLastSample) { windowFirstSample=signalLastSample; } if(windowLastSample>signalLastSample) { windowLastSample=signalLastSample; } int i=signalFirstSample; // Sets signal eventually to null before the window if(!_parameters->reversed()) { for(; i<=windowFirstSample; i++) { samples.setNull(i); } } // Transforms signal according to window type within window range switch(_parameters->window()) { case TaperParameters::Rectangular: if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.setNull(i); } } else { i=windowLastSample; } break; case TaperParameters::Hann: widthFactor*=2.0*M_PI; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.multiply(i, 0.5+0.5*cos((i-windowFirstSample)*widthFactor)); } } else { for(; i<=windowLastSample; i++) { samples.multiply(i, 0.5-0.5*cos((i-windowFirstSample)*widthFactor)); } } break; case TaperParameters::Hamming: widthFactor*=2.0*M_PI; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.multiply(i, 0.46+0.46*cos((i-windowFirstSample)*widthFactor)); } } else { for(; i<=windowLastSample; i++) { samples.multiply(i, 0.54-0.46*cos((i-windowFirstSample)*widthFactor)); } } break; case TaperParameters::Tukey: { ASSERT(_parameters->alpha()<=1.0); ASSERT(_parameters->alpha()>0.0); double term=2.0/_parameters->alpha(); double factor=term*widthFactor*M_PI; term=M_PI*(1.0-term); int windowLastSampleLeft=(int)floor(_parameters->alpha()*width*0.5); if(windowLastSampleLeft>signalLastSample) { windowLastSampleLeft=signalLastSample; } int windowFirstSampleRight=(int)ceil(width*(1.0-_parameters->alpha()*0.5)); if(windowFirstSampleRight>signalLastSample) { windowFirstSampleRight=signalLastSample; } if(_parameters->reversed()) { for(; i<=windowLastSampleLeft; i++) { samples.multiply(i, 0.5+0.5*cos(factor*(i-windowFirstSample))); } for(; i<=windowFirstSampleRight; i++) { samples.setNull(i); } for(; i<=windowLastSample; i++) { samples.multiply(i, 0.5-0.5*cos(factor*(i-windowFirstSample)+term)); } } else { for(; i<=windowLastSampleLeft; i++) { samples.multiply(i, 0.5-0.5*cos(factor*(i-windowFirstSample))); } for(i=windowFirstSampleRight; i<=windowLastSample; i++) { samples.multiply(i, 0.5+0.5*cos(factor*(i-windowFirstSample)+term)); } } } break; case TaperParameters::Cosine: widthFactor*=M_PI; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.multiply(i, 1.0-sin((i-windowFirstSample)*widthFactor)); } } else { for(; i<=windowLastSample; i++) { samples.multiply(i, sin((i-windowFirstSample)*widthFactor)); } } break; case TaperParameters::Lanczos: { double factor=M_PI*2.0*widthFactor; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=factor*(i-windowFirstSample)-M_PI; samples.multiply(i, 1.0-sin(x)/x); } } else { for(; i<=windowLastSample; i++) { double x=factor*(i-windowFirstSample)-M_PI; samples.multiply(i, sin(x)/x); } } } break; case TaperParameters::Triangular: { double factor=2.0*widthFactor; double term=0.5*width; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.multiply(i, factor*fabs(i-windowFirstSample-term)); } } else { for(; i<=windowLastSample; i++) { samples.multiply(i, 1.0-factor*fabs(i-windowFirstSample-term)); } } } break; case TaperParameters::Bartlett: { double factor=2.0/(width+1.0); double term=0.5*width; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { samples.multiply(i, factor*fabs(i-windowFirstSample-term)); } } else { for(; i<=windowLastSample; i++) { samples.multiply(i, 1.0-factor*fabs(i-windowFirstSample-term)); } } } break; case TaperParameters::Gaussian: { ASSERT(_parameters->sigma()<=0.5); double factor=2.0*widthFactor; double invSigma=1.0/_parameters->sigma(); if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=(factor*(i-windowFirstSample)-1.0)*invSigma; samples.multiply(i, 1.0-exp(-0.5*x*x)); } } else { for(; i<=windowLastSample; i++) { double x=(factor*(i-windowFirstSample)-1.0)*invSigma; samples.multiply(i, exp(-0.5*x*x)); } } } break; case TaperParameters::BartlettHann: if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=(i-windowFirstSample)*widthFactor; samples.multiply(i, 0.38+0.48*fabs(x-0.5)+0.38*cos(2.0*M_PI*x)); } } else { for(; i<=windowLastSample; i++) { double x=(i-windowFirstSample)*widthFactor; samples.multiply(i, 0.62-0.48*fabs(x-0.5)-0.38*cos(2.0*M_PI*x)); } } break; case TaperParameters::Blackman: { double a0=(1.0-_parameters->alpha())*0.5; double a1=0.5; double a2=_parameters->alpha()*0.5; double f1=2.0*M_PI*widthFactor; double f2=f1*2.0; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-(a0-a1*cos(x*f1)+a2*cos(x*f2))); } } else { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, a0-a1*cos(x*f1)+a2*cos(x*f2)); } } } break; case TaperParameters::Nuttall: { double f1=2.0*M_PI*widthFactor; double f2=f1*2.0; double f3=f1*3.0; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-(0.355768-0.487396*cos(x*f1)+0.144232*cos(x*f2)-0.012604*cos(x*f3))); } } else { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 0.355768-0.487396*cos(x*f1)+0.144232*cos(x*f2)-0.012604*cos(x*f3)); } } } break; case TaperParameters::BlackmanHarris: { double f1=2.0*M_PI*widthFactor; double f2=f1*2.0; double f3=f1*3.0; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-(0.35875-0.48829*cos(x*f1)+0.14128*cos(x*f2)-0.01168*cos(x*f3))); } } else { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 0.35875-0.48829*cos(x*f1)+0.14128*cos(x*f2)-0.01168*cos(x*f3)); } } } break; case TaperParameters::BlackmanNuttall: { double f1=2.0*M_PI*widthFactor; double f2=f1*2.0; double f3=f1*3.0; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-(0.3635819-0.4891775*cos(x*f1)+0.1365995*cos(x*f2)-0.0106411*cos(x*f3))); } } else { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 0.3635819-0.4891775*cos(x*f1)+0.1365995*cos(x*f2)-0.0106411*cos(x*f3)); } } } break; case TaperParameters::FlatTop: { double f1=2.0*M_PI*widthFactor; double f2=f1*2.0; double f3=f1*3.0; double f4=f1*4.0; if(_parameters->reversed()) { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-(1.0-1.93*cos(x*f1)+1.29*cos(x*f2)-0.388*cos(x*f3)+0.032*cos(x*f4))); } } else { for(; i<=windowLastSample; i++) { double x=i-windowFirstSample; samples.multiply(i, 1.0-1.93*cos(x*f1)+1.29*cos(x*f2)-0.388*cos(x*f3)+0.032*cos(x*f4)); } } } break; } // Sets signal eventually to null after the window if(!_parameters->reversed()) { for(; i<=signalLastSample; i++) { samples.setNull(i); } } }
void GeopsyCore::TaperDelegate::apply | ( | sampleType | samples, |
int | nSamples, | ||
const TimeRange & | range, | ||
double | samplingFrequency | ||
) | const |
Overload function provided for convenience.
References apply(), GeopsyCore::TimeRange::end(), GeopsyCore::TimeRange::start(), and TRACE.