Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LineFilter.hh
Go to the documentation of this file.
1 #ifndef LINEFILTER_HH
2 #define LINEFILTER_HH
3 
4 #include <iosfwd>
5 #include <list>
6 #include <vector>
7 #include "Pipe.hh"
8 #include "Time.hh"
9 #include "Interval.hh"
10 #include "TSeries.hh"
11 #include "wseries.hh"
12 
13 #include <complex>
14 
15 typedef std::complex<float> f_complex;
16 typedef double wavereal;
18 
19 struct lineData {
20  Time T_current;
21  float frequency;
22  float intensity;
23  unsigned int first;
24  std::vector<f_complex> amplitude;
25  std::vector<float> line;
26  std::vector<float> noise;
27  std::vector<float> filter;
28 };
29 
30 /** The LineFilter class containes methods to track and remove quasi-
31  * monochromatic lines. a TSeries by 2^N. The TSeries
32  * data are filtered before decimation to remove aliasing.
33  * @memo Line Removal.
34  * @version 1.2 ; Modified November 01, 2000
35  * @version 1.3 ; Modified November 17, 2000
36  * @author Sergey Klimenko
37  */
38 class LineFilter : public Pipe {
39 public:
40  /** Build an empty LineFilter.
41  * @memo Default constructor.
42  */
43  LineFilter(void);
44 
45  /** @memo LineFilter constructor
46  * filter type (default fid = 1) and time interval T to estimate and
47  * remove interference (T=0 - the whole input TS is used).
48  * @memo Constructor.
49  *@memo Set parameters of the line filter
50  *@param f - line base frequency
51  *@param T - time interval to estimate interference
52  * (T=0 - the whole TS is used)
53  *@param fid - filter ID:
54  * 1 - use resampling and FFT with noise floor estimation
55  * 0 - use resampling and FFT, no noise floor estimation
56  * -1 - heterodyne estimation of amplitude and phase, frequency=const
57  * -2 - -1 + Hann window
58  * -3 - the same as -2, but sin(), cos() and Hann() are tabulated
59  *@param nT - number of interval T sub0divisions
60  */
61  LineFilter(double f, double T = 0., int fid = 1, int nT = 1);
62 
63  /** Build a LineFilter identical to an existing filter.
64  * @memo Copy constructor.
65  */
66  LineFilter(const LineFilter& x);
67 
68  /** Destroy the LineFilter object and release the function storage.
69  * @memo Virtual destructor.
70  */
71  ~LineFilter(void);
72 
73 
74  /** Clone a LineFilter
75  */
76  LineFilter* clone(void) const;
77 
78  /** The argument time series is filtered to remove lines, and
79  * the argument TSeries ts is left unchanged.
80  * @memo Return cleaned TSeries.
81  */
82  TSeries apply(const TSeries& ts);
83  TSeries operator()(const TSeries& ts);
84  FilterIO& operator()(const FilterIO& in) {
85  return Pipe::operator() (in); }
86 
87  /** Operate on wavearray object
88  */
89  void apply(WaveData& ts);
90  FilterIO& apply(const FilterIO& in) {
91  return Pipe::apply (in); }
92 
93  /** Check the data for validity. If the data are not applicable for
94  * line removal, an exception is thrown.
95  */
96  void dataCheck(const TSeries& ts) const;
97  void dataCheck(const FilterIO& in) const {
98  Pipe::dataCheck (in); }
99 
100  /** Check the data for validity. Performs the same data checks as
101  * dataCheck() but returns a boolean status instead f throwing an
102  * exception.
103  */
104  bool isDataValid(const TSeries& ts) const;
105  bool isDataValid(const FilterIO& in) const {
106  return Pipe::isDataValid (in); }
107 
108 
109  /***setFilter*********************************************************
110  *@memo Set parameters of the line filter
111  *@param nF - first harmonic
112  *@param nL - last harmonic
113  *@param nS - skip nS-1 harmonics (take nF, nF+nS, nF+2nS,....)
114  *@param nD - wavelet decimation factor
115  *@param nB - nB/T is a frequency band to estimate noise
116  *@param nR - order of Resample Interpolating Filter
117  *@param nW - order of the decimating lifting wavelet
118  *********************************************************************/
119  void setFilter(int nF = 1,
120  int nL = 0,
121  int nS = 1,
122  int nD = -1,
123  int nB = 5,
124  int nR = 6,
125  int nW = 8);
126 
127  /***setFScan*********************************************************
128  *@memo Set parameters for getFrequency()
129  *@param f - base frequency: if f<=0 - don't scan frequency,
130  *@ f=0 - don't change frequency specified (by LineFilter)
131  *@param sn - limit on signal to noise ratio
132  *@param fS - initial range of frequency scan in units of fft bin
133  *@param nS - number of steps during frequency scan
134  *********************************************************************/
135  void setFScan(double f = 0.,
136  double sn = 2.,
137  double fS = 0.45,
138  int nS = 20);
139 
140 
141  /** Clear/release the internal History vector and reset the current
142  * time.
143  */
144  void reset();
145  void resize(size_t=0);
146 
147  inline Time getStartTime(void) const;
148  inline Time getCurrentTime(void) const;
149  inline bool inUse(void) const;
150 
151 //private:
152 
153  int FilterID;
154  double Frequency; // fundamental line frequency
155  double Window;
156  double Stride;
157  unsigned int nFirst; // first line harmonic
158  unsigned int nLast; // last line harmonic
159  int nStep; // skip harmonics (take nF, nF+nS, nF+2nS,....)
160  int nScan; // # of frequency steps to scan frequency
161  unsigned int nBand; // frequency band in fft bins to average noise
162  int nSubs; // number of data subsets to estimate signal PSD
163  double fBand; // frequency step in fft bins to scan frequency
164  int nLPF; // decimation factor
165  int nWave; // order of the interpolating wavelet
166  bool clean; // true if to clean data
167  bool badData; // false if valid data
168  bool noScan; // true if Frequency is fixed
169  int nRIF; // order of Resample Interpolating Filter
170  double SNR; // limit on SNR used by makeFilter
171  bool reFine; // refine frequency if true (set by SNR<0)
172  size_t dumpStart; // first lineList index used to dump data
175 
177  Time StartTime;
178  Interval Sample;
179 
180  wavearray<double> ct; // tabulated cos()
181  wavearray<double> st; // tabulated cos()
182  wavearray<double> wt; // tabulated window
183 
184  std::list<lineData> lineList;
185 
189 
190  WaveData getPSD(const WaveData &, int = 1);
191  double makeFilter(const WaveData &, int = 0);
193 
194  /***getHeteroLine****************************************************
195  *@memo reconstruct line amplitude and phase using heterodyne method
196  *@param input time series
197  *********************************************************************/
199 
200  double getOmega(const WaveData &, int = 2);
201  double fScan(const WaveData &);
202  double Interference(WaveData &, double);
203 
204  wavearray<float> getTrend(int, char);
205  bool DumpTrend(const char*, int = 0);
206  bool LoadTrend(const char*);
207 
208  inline double newRate(double);
209  unsigned int maxLine(int);
210  inline double axb(double, double);
211  inline double wrap(double);
212  inline long intw(double);
213 
214  // used by THtml doc
215  ClassDef(linefilter,1)
216 };
217 
218 inline double LineFilter::newRate(double rate)
219 {
220  double f = rate/Frequency;
221  f *= (nLPF >= 0) ? 1 : 2;
222  return (int(f)+1)*Frequency;
223 }
224 
225 inline double LineFilter::axb(double a, double b)
226 {return (a-long(a))*long(b) + (b-long(b))*long(a) + (a-long(a))*(b-long(b));}
227 
228 inline long LineFilter::intw(double a)
229 {return (a>0) ? long(a+0.5) : long(a-0.5);}
230 
231 inline double LineFilter::wrap(double a)
232 {
233  long l = a>0 ? long(a/PI/2. + 0.5) : long(a/PI/2. - 0.5);
234  return a - 2*PI*l;
235 }
236 
237 #ifndef __CINT__
238 
239 inline Time LineFilter::getStartTime(void) const {
240  return StartTime;
241 }
242 
243 inline Time LineFilter::getCurrentTime(void) const {
244  return CurrentTime;
245 }
246 
247 inline bool LineFilter::inUse(void) const {
248  return (StartTime != Time(0));
249 }
250 
251 #endif
252 
253 #endif // LineFilter_HH
int FilterState
Definition: LineFilter.hh:173
void reset()
Clear/release the internal History vector and reset the current time.
Definition: LineFilter.cc:152
unsigned int nBand
Definition: LineFilter.hh:161
bool LoadTrend(const char *)
Definition: LineFilter.cc:1489
wavearray< double > st
Definition: LineFilter.hh:181
double wrap(double)
Definition: LineFilter.hh:231
tuple f
Definition: cwb_online.py:91
r apply(0.2)
The linefilter class containes methods to track and remove quasi- monochromatic lines.
double axb(double, double)
Definition: LineFilter.hh:225
wavearray< double > a(hp.size())
bool badData
Definition: LineFilter.hh:167
WaveData Filter
Definition: LineFilter.hh:188
Time StartTime
Definition: LineFilter.hh:177
bool isDataValid(const FilterIO &in) const
Definition: LineFilter.hh:105
LineFilter * clone(void) const
Clone a LineFilter.
Definition: LineFilter.cc:70
double Interference(WaveData &, double)
Definition: LineFilter.cc:999
std::vector< f_complex > amplitude
Definition: LineFilter.hh:24
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\t layers : "<< nLAYERS<< "\t dF(hz) : "<< dF<< "\t dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1)*itime+ifreq;double time=itime *dT;double freq=(ifreq >0)?ifreq *dF:dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
float frequency
Definition: LineFilter.hh:21
bool DumpTrend(const char *, int=0)
Definition: LineFilter.cc:1405
~LineFilter(void)
Destroy the LineFilter object and release the function storage.
Definition: LineFilter.cc:57
double Frequency
Definition: LineFilter.hh:154
wavearray< wavereal > WaveData
Definition: LineFilter.hh:17
long intw(double)
Definition: LineFilter.hh:228
Time T_current
Definition: LineFilter.hh:20
double newRate(double)
Definition: LineFilter.hh:218
nT
Definition: cbc_plots.C:659
void setFilter(int nF=1, int nL=0, int nS=1, int nD=-1, int nB=5, int nR=6, int nW=8)
Definition: LineFilter.cc:124
std::list< lineData > lineList
Definition: LineFilter.hh:184
double getOmega(const WaveData &, int=2)
Definition: LineFilter.cc:674
#define PI
Definition: watfun.hh:14
LineFilter(void)
Build an empty LineFilter.
Definition: LineFilter.cc:25
lineData getHeteroLine(WaveData &)
Definition: LineFilter.cc:470
wavearray< double > ct
Definition: LineFilter.hh:180
unsigned int maxLine(int)
Definition: LineFilter.cc:92
std::vector< float > filter
Definition: LineFilter.hh:27
void dataCheck(const TSeries &ts) const
Check the data for validity.
Definition: LineFilter.cc:74
Time getStartTime(void) const
Definition: LineFilter.hh:239
unsigned int nLast
Definition: LineFilter.hh:158
lineData getLine(WaveData &)
Definition: LineFilter.cc:335
TSeries operator()(const TSeries &ts)
Definition: LineFilter.cc:1097
double Stride
Definition: LineFilter.hh:156
WaveData getPSD(const WaveData &, int=1)
Definition: LineFilter.cc:209
void setFScan(double f=0., double sn=2., double fS=0.45, int nS=20)
Definition: LineFilter.cc:185
FilterIO & apply(const FilterIO &in)
Definition: LineFilter.hh:90
double Window
Definition: LineFilter.hh:155
wavearray< float > getTrend(int, char)
Definition: LineFilter.cc:1220
float intensity
Definition: LineFilter.hh:22
bool inUse(void) const
Definition: LineFilter.hh:247
bool isDataValid(const TSeries &ts) const
Check the data for validity.
Definition: LineFilter.cc:102
WaveData LineSD
Definition: LineFilter.hh:187
double fScan(const WaveData &)
Definition: LineFilter.cc:796
double makeFilter(const WaveData &, int=0)
Definition: LineFilter.cc:280
double T
Definition: testWDM_4.C:11
Interval Sample
Definition: LineFilter.hh:178
ifstream in
void dataCheck(const FilterIO &in) const
Definition: LineFilter.hh:97
wavearray< double > ts(N)
void resize(size_t=0)
Definition: LineFilter.cc:163
double SNR
Definition: LineFilter.hh:170
double wavereal
Definition: LineFilter.hh:16
WaveData NoiseSD
Definition: LineFilter.hh:186
int l
Definition: cbc_plots.C:434
unsigned int nFirst
Definition: LineFilter.hh:157
The LineFilter class containes methods to track and remove quasi- monochromatic lines.
Definition: LineFilter.hh:38
size_t dumpStart
Definition: LineFilter.hh:172
unsigned int first
Definition: LineFilter.hh:23
std::complex< float > f_complex
Definition: LineFilter.hh:15
double fBand
Definition: LineFilter.hh:163
Time CurrentTime
Definition: LineFilter.hh:176
std::vector< float > noise
Definition: LineFilter.hh:26
std::vector< float > line
Definition: LineFilter.hh:25
Time getCurrentTime(void) const
Definition: LineFilter.hh:243
TSeries apply(const TSeries &ts)
The argument time series is filtered to remove lines, and the argument TSeries ts is left unchanged...
Definition: LineFilter.cc:1067
wavearray< double > wt
Definition: LineFilter.hh:182
FilterIO & operator()(const FilterIO &in)
Definition: LineFilter.hh:84
double SeedFrequency
Definition: LineFilter.hh:174