All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Classes | Public Member Functions
GeopsyCore::TaperDelegate Class Reference

Brief description of class still missing. More...

#include <TaperDelegate.h>

List of all members.

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 ()

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References TRACE.

  {
    TRACE;
    _parameters=p;
  }

Description of destructor still missing

References TRACE.

  {
    TRACE;
  }

Member Function Documentation

template<typename sampleType >
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);
      }
    }
  }
template<typename sampleType >
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.

  {
    TRACE;
    apply(samples, 0, nSamples-1, (int)round(range.start()*samplingFrequency),
          (int)round(range.end()*samplingFrequency));
  }

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines