41 FilterID(1), Frequency(60.), Window(0.0), Stride(1.), nFirst(1), nLast(0),
42 nStep(1), nScan(20), nBand(5), nSubs(1), fBand(0.45), nLPF(-1), nWave(16),
43 clean(false), badData(false), noScan(false), nRIF(6),
SNR(2.), reFine(true),
44 dumpStart(0), FilterState(0), SeedFrequency(60.), CurrentTime(0.),
68 if(f < 0.)
clean =
true;
69 nSubs = (nT > 0) ? nT : 1;
91 unsigned int imax = (
nLPF>0) ?
int(L/2)+1 :
int(L/4)+1;
92 if(
nFirst > imax) std::cout<<
"linefilter: Invalid harmonic number.\n";
95 if(imax > (
unsigned)L/2) imax = L/2;
130 nBand = (nB>=2) ? nB : 2;
179 reFine = (sN>0) ?
true :
false;
182 noScan = (f < 0.) ? true :
false;
200 int n =
int(m/(nb*L))*
L;
212 cout <<
" linefilter::getPSD error: time series is too short to contain\n" 213 <<
" one cycle of fundamental harmonic " <<
Frequency <<
"\n";
217 c = (nb>1) ? 1./(nb-1) : 1.;
223 for(k = 0; k <
nSubs; k++){
226 for(j = 0; j < nb; j++){
228 psd.
data[0] -= tds.
Stack(TD, n, n*j+m*k);
239 td2.
cpf(tds); td2.
cpf(tds,L,0,L);
245 for (i = 2; i < L-1; i+=2){
247 psd.
data[i/2] += c*(a*a+b*b);
268 cout <<
" linefilter::MakeFilter() error: badData flag is on\n";
278 cout <<
" linefilter::MakeFilter() error: data length too short to contain\n" 279 <<
" at least one cycle of target frequency = " <<
Frequency <<
" Hz\n";
284 unsigned int imax =
maxLine(L);
332 cout <<
" getLine() error: invalid interference frequency" 340 unsigned int imax =
maxLine(L);
342 if (n/L == 0 || L < 4) {
343 cout <<
" getLine() error: input data length too short to contain\n" 344 <<
" one cycle of target frequency = " <<
Frequency <<
" Hz\n";
366 td2.
cpf(tds); td2.
cpf(tds,L,0,L);
379 for (
unsigned int i = 0;
i < (unsigned)L-1;
i+=2) {
385 amp.
data[
i] += (a*a + b*b)/nSubs;
394 a -= (a>0.) ? long(a+0.5) : long(a-0.5);
400 if((L&1) == 1) tds.
data[L-1] = 0.;
412 tds.getStatistics(a,b);
415 iF = (k == nSubs-1) ? TD.
size() : n*k+
n;
417 for (
int i = 0; i <
L; i++)
418 for(
int j = n*k+i;
j < iF;
j +=
L)
419 TD.
data[
j] = tds.data[i];
429 for (
unsigned int i = nFirst;
i < imax;
i += abs(
nStep)) {
459 register double C,
S,
c,
s, ch,sh,
x;
462 register double* p = TD.
data;
471 cout <<
" getLine() error: invalid interference frequency" 505 for (mode = nFirst; mode < imax; mode += abs(
nStep)) {
512 ch = cos(2*
PI/
double(n));
513 sh = sin(2*
PI/
double(n));
515 for (k = 0; k <
nSubs; k++) {
522 for (i = 0; i <
n; i++) {
531 else if(
FilterID==-2 || mode>nFirst){
534 for (i = 0; i <
n; i++) {
548 for (i = 0; i <
n; i++) {
555 amp.
data[k+
m] = 2.*sqrt(a*a + b*b)/double(n);
556 phi.
data[k+
m] = atan2(b,a);
572 for (mode = nFirst; mode < imax; mode += abs(
nStep)) {
579 for (k = 0; k <
nSubs; k++) {
598 for (i = 0; i < n/2; i++){
605 for (k = 0; k < nSubs-1; k++) {
607 x = phi.
data[k+
m] +omega*(k*n+n/2);
610 x = phi.
data[k+m+1]+omega*(k*n+n/2);
613 for (i = 0; i <
n; i++) {
615 b = amp.
data[k+1+
m]* u;
622 *(p++) -= (a*(n-i) + b*
i)/n;
626 a = amp.
data[nSubs-1+
m];
627 x = phi.
data[nSubs-1+
m]+omega*(TD.
size()-n/2);
630 for (i = TD.
size()-n/2; i<
N; i++){
670 cout <<
" getOmega() error: invalid interference frequency" 688 unsigned int imax =
maxLine(L);
690 if (n/L == 0 || L < 4) {
691 cout <<
" getOmega() error: input data length too short to contain\n" 692 <<
" one cycle of target frequency = " <<
Frequency <<
" Hz\n";
703 double step = n/TDR.
rate();
706 double FSNR =
SNR/(1.+
SNR);
708 for (
int k = 0;
k < nsub;
k++) {
714 td2.
cpf(tds); td2.
cpf(tds,L,0,L);
725 for (
unsigned int i = 2;
i < (unsigned)L-1;
i+=2) {
731 amp.
data[
i] += a*a+b*b;
733 phase +=
axb(wt/2.,
double(i/2));
734 phase -=
intw(phase);
737 F = phase - phi.
data[i+1];
739 phi.
data[
i] += (long(wt*(i/2)+0.5) +
F)/step/(i/2);
758 if(a < 0.0001) a = 0.0001;
760 omega += a*phi.
data[2*
i];
769 omega = (weight>1.) ? omega/weight/(nsub-1) : -
Frequency;
783 #define np 6 // number of points in interpolation scheme in resample() 798 double am = 1., ac = 0.;
821 if (TD.
rate() <= 0.) {
822 cout <<
" fScan() error: invalid sampling rate = " 823 << TD.
rate() <<
" Aborting calculation.\n";
829 cout <<
" fScan() error: invalid interference frequency = " 830 << ff <<
" Aborting calculation.\n";
845 cout <<
" Scanning frequency from "<< ff-mScan*fw/2. <<
" Hz to " 846 << ff+mScan*fw/2. <<
" Hz\n";
861 if (ip > 0 && ip < (mScan-1) && !
badData) {
863 fp += (d > 0.) ? 0.5*fw*(sw.
data[ip + 1] - sw.
data[ip - 1])/d : 0.;
879 for (
int m = 0;
m < 3;
m++) {
898 d=2.*ss[1]-(ss[2]+ss[0]);
901 ac = 0.5 * (ss[2] - ss[0]);
902 fwhm = sqrt(ac*ac+2.*ss[1]*d)/d;
907 ac = (ss[2] > ss[0])? am : -am;
914 if(
fabs(ac) < am) mode = 1;
915 if(
fabs(ac)<am/4. && fw/dfft>0.1) mode = 2;
919 delta = (fc-fp)/fw + ac;
927 if(
fabs(delta) < e1)
break;
928 if(
fabs(delta*fwhm) < e1 && fw/dfft<0.1)
break;
933 ss[0] = ss[1]; ss[1] = ss[2]; ks[2] = 1;
936 ss[2] = ss[1]; ss[1] = ss[0]; ks[0] = 1;
938 fc += (ac>0.) ? fw : -fw;
944 ss[0] = ss[1]; ks[1] = 1;
947 ss[2] = ss[1]; ks[1] = 1;
950 fc += (ac>0.) ? fw : -fw;
954 ks[0] = 1; ks[2] = 1;
956 if(fw/dfft<0.01) fw = 0.01*dfft;
994 if ( TD.
rate() <= 0. || omega <= 0. ) {
995 cout <<
" Interference() error: invalid interference frequency = " 996 << omega <<
"\n Aborting calculation.\n";
1057 if (!ts.
size())
return;
1058 if (!ts.
rate())
return;
1079 int nTS = ts.
size();
1083 NN = (nTS >> LPF) << LPF;
1102 cout <<
" linefilter::apply() error: invalid time window "<<
Window<<
" sec.\n";
1111 while(i <= n-nn && nn > 0) {
1114 delta *= double(n - i)/nn;
1121 if(LPF) tx->
cpf(tw,nn,i);
1122 else tx->
cpf(ts,nn,i);
1129 if(omega < 0.) omega =
fScan(*tx);
1137 if(LPF) tw.
sub(*tx,nn,0,i);
1138 else ts.
cpf(*tx,nn,0,i);
1156 if(nTS != (
int)ts.
size())
1157 cout <<
"linefilter::apply(): is "<<ts.
size()<<
", should be: "<<nTS<<
"\n";
1176 list<linedata>::iterator it;
1187 out.
rate((step>0.) ? 1./step : 1.);
1189 if(l_size < 2) {
return out; }
1197 if(m > 0 && m <= v_size)
1203 for(
int i=0;
i<l_size;
i++) {
1207 F *= (m == 0) ? 1. : (v->
first+m-1);
1211 if(n) averF /= double(n);
1215 for(
int i=0;
i<l_size;
i++) {
1225 if(m == 0 || m > v_size)
1233 if(m == 0 || m > v_size){
1235 out.
data[
i] = v_size;
1244 a -= (a>0.) ? long(a+0.5) : long(a-0.5);
1249 if(c ==
'f') out.
data[
i] =
F;
1251 if(c ==
'f' && step<1.1*
Stride){
1253 a -= (a>0.) ? long(a+0.5) : long(a-0.5);
1254 out.
data[
i] = (long(
F*step+0.5) +
a)/step;
1260 out.
data[
i] = (m == 0) ? a : a*(v->
first+m-1);
1264 if(m == 0 || m > v_size)
1265 out.
data[
i] = v_size;
1272 if(m > v_size || v_size < 1)
break;
1274 for(
int j=0;
j<v_size;
j++){
1287 if(m > v_size || v_size < 1)
break;
1289 for(
int j=0;
j<v_size;
j++)
1297 if(m > v_size || v_size < 1)
break;
1299 for(
int j=0;
j<v_size;
j++)
1308 if(m > v_size || v_size < 1)
break;
1310 for(
int j=0;
j<v_size;
j++)
1319 if(m > v_size || v_size < 1)
break;
1321 for(
int j=0;
j<v_size;
j++){
1331 out.
data[
i] /= (a>0.) ?
a : 1.;
1336 if(m > v_size || v_size < 1)
break;
1360 list<linedata>::iterator it =
lineList.begin();
1368 size_t max_size = 0;
1369 for(
size_t i=0;
i<l_size;
i++) {
1372 if(v_size > max_size) max_size = v_size;
1375 int m = (5*max_size+4);
1376 size_t n = m*(l_size+1);
1377 if(n < 4)
return false;
1382 out->
data[0] = max_size;
1383 out->
data[1] = l_size;
1394 double gpsTime = it->T_current;
1396 int gps =
int(gpsTime)/1000;
1397 out->
data[4] = float(gps);
1398 out->
data[5] = gpsTime - 1000.*double(gps);
1401 for(
size_t i=1;
i<=l_size;
i++) {
1410 for(
unsigned int j=0;
j<max_size;
j++){
1419 out->
data[
i*m+4+
j*5] = 0.;
1420 out->
data[
i*m+5+
j*5] = 0.;
1421 out->
data[
i*m+6+
j*5] = 0.;
1422 out->
data[
i*m+7+
j*5] = 0.;
1423 out->
data[
i*m+8+
j*5] = 0.;
1446 double gpsTime = 0.;
1447 unsigned int count = 0;
1450 if(in.
size() < 6)
return false;
1452 while(count < in.
size()){
1453 p = &(in.
data[count]);
1454 int m =
int(*(p+2) + 0.5);
1455 if(m <= 1)
return false;
1457 int l_size =
int(*(p+1) + 0.5);
1458 if(l_size < 1)
return false;
1460 int v_size =
int(*p + 0.5);
1461 count +=
int(*(p+3)+0.5);
1463 gpsTime = double(
int(*(p+4)+0.5))*1000. + *(p+5);
1470 v.
line.resize(v_size);
1471 v.
noise.resize(v_size);
1480 for(
int i=1;
i<=l_size;
i++) {
1482 if(*p != 0.) step = *p - last;
1490 for(
int j=0;
j<v_size;
j++){
std::list< linedata > lineList
virtual void rate(double r)
The linefilter class containes methods to track and remove quasi- monochromatic lines.
wavearray< double > a(hp.size())
void setFilter(int nF=1, int nL=0, int nS=1, int nD=-1, int nB=5, int nR=6, int nW=8)
void apply(WaveData &ts)
Operate on wavearray object.
std::vector< float > line
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<< "\ layers : "<< nLAYERS<< "\ dF(hz) : "<< dF<< "\ 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
wavearray< double > psd(33)
virtual void ReadBinary(const char *, int=0)
linefilter * clone(void) const
Clone a linefilter.
wavearray< wavereal > WaveData
void reset()
Clear/release the internal History vector and reset the current time.
virtual void start(double s)
cout<< "SNR "<< xsnr<< endl;wavearray< double > f
cout<< "Selected Pixels : "<< nPix<< endl;wc.cluster(1, 1);SSeries< double > ss
int Sample(Complex *H, double *t, int N, double totalMass, double Rate, wavearray< double > &hps, wavearray< double > &hxs)
virtual size_t size() const
std::vector< f_complex > amplitude
void sub(const wavearray< DataType_t > &, int=0, int=0, int=0)
bool LoadTrend(const char *)
int getLayer(wavearray< DataType_t > &w, double n)
param: n - layer number
printf("total live time: non-zero lags = %10.1f \, liveTot)
linedata getLine(WaveData &)
wavearray< float > getTrend(int, char)
std::vector< float > filter
WaveData getPSD(const WaveData &, int=1)
void setFScan(double f=0., double sn=2., double fS=0.45, int nS=20)
double getOmega(const WaveData &, int=2)
virtual void DumpBinary(const char *, int=0)
double axb(double, double)
linefilter(void)
Build an empty linefilter.
bool DumpTrend(const char *, int=0)
double makeFilter(const WaveData &, int=0)
wavearray< double > ts(N)
virtual void resample(double, int=6)
double fabs(const Complex &x)
void resample(const wavearray< DataType_t > &, double, int=6)
void Forward(int n=-1)
param: wavelet - n is number of steps (-1 means full decomposition)
Meyer< double > S(1024, 2)
double fScan(const WaveData &)
linedata getHeteroLine(WaveData &)
double Stack(const wavearray< DataType_t > &, int)
std::complex< float > f_complex
~linefilter(void)
Destroy the linefilter object and release the function storage.
virtual void resize(unsigned int)
void Inverse(int n=-1)
param: n - number of steps (-1 means full reconstruction)
void putLayer(wavearray< DataType_t > &, double n)
param: n - layer number
double Interference(WaveData &, double)
std::vector< float > noise
void cpf(const wavearray< DataType_t > &, int=0, int=0, int=0)
unsigned int maxLine(int)