Changeset 1579 for trunk/src/STMath.cpp


Ignore:
Timestamp:
06/29/09 13:52:18 (15 years ago)
Author:
Malte Marquarding
Message:

Ticket #46; changed scnatable.lag_flag to handle a start/end value rather than a width. lag channels can also be specified directly by seeting the unit to

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/STMath.cpp

    r1571 r1579  
    19621962CountedPtr< Scantable >
    19631963  asap::STMath::lagFlag( const CountedPtr< Scantable > & in,
    1964                           double frequency, double width )
     1964                         double start, double end,
     1965                         const std::string& mode)
    19651966{
    19661967  CountedPtr< Scantable > out = getScantable(in, false);
     
    19801981      Vector<Float> spec = specCol(i);
    19811982      Vector<uChar> flag = flagCol(i);
    1982       Int lag0 = Int(spec.nelements()*abs(inc)/(frequency+width)+0.5);
    1983       Int lag1 = Int(spec.nelements()*abs(inc)/(frequency-width)+0.5);
     1983      int fstart = -1;
     1984      int fend = -1;
    19841985      for (int k=0; k < flag.nelements(); ++k ) {
    19851986        if (flag[k] > 0) {
    1986           spec[k] = 0.0;
     1987          fstart = k;
     1988          while (flag[k] > 0 && k < flag.nelements()) {
     1989            fend = k;
     1990            k++;
     1991          }
    19871992        }
     1993        Float interp = 0.0;
     1994        if (fstart-1 > 0 ) {
     1995          interp = spec[fstart-1];
     1996          if (fend+1 < spec.nelements()) {
     1997            interp = (interp+spec[fend+1])/2.0;
     1998          }
     1999        } else {
     2000          interp = spec[fend+1];
     2001        }
     2002        if (fstart > -1 && fend > -1) {
     2003          for (int j=fstart;j<=fend;++j) {
     2004            spec[j] = interp;
     2005          }
     2006        }
     2007        fstart =-1;
     2008        fend = -1;
    19882009      }
    19892010      Vector<Complex> lags;
    19902011      ffts.fft0(lags, spec);
    1991       Int start =  max(0, lag0);
    1992       Int end =  min(Int(lags.nelements()-1), lag1);
    1993       if (start == end) {
    1994         lags[start] = Complex(0.0);
     2012      Int lag0(start+0.5);
     2013      Int lag1(end+0.5);
     2014      if (mode == "frequency") {
     2015        lag0 = Int(spec.nelements()*abs(inc)/(start)+0.5);
     2016        lag1 = Int(spec.nelements()*abs(inc)/(end)+0.5);
     2017      }
     2018      Int lstart =  max(0, lag0);
     2019      Int lend =  min(Int(lags.nelements()-1), lag1);
     2020      if (lstart == lend) {
     2021        lags[lstart] = Complex(0.0);
    19952022      } else {
    1996         for (int j=start; j <=end ;++j) {
     2023        if (lstart > lend) {
     2024          Int tmp = lend;
     2025          lend = lstart;
     2026          lstart = tmp;
     2027        }
     2028        for (int j=lstart; j <=lend ;++j) {
    19972029          lags[j] = Complex(0.0);
    19982030        }
Note: See TracChangeset for help on using the changeset viewer.