source: Sophya/trunk/ArchTOIPipe/Processors/correl.cc@ 2331

Last change on this file since 2331 was 1945, checked in by aubourg, 24 years ago

avec stdlib

File size: 2.3 KB
Line 
1#include <iostream.h>
2#include <stdlib.h>
3#include "correl.h"
4
5CorrelEstimator::CorrelEstimator(int n, int wsize) {
6 ncor = n;
7 winsize = wsize;
8
9 mT = new int_4[winsize];
10 mX = new r_8[winsize];
11 mY = new r_8[winsize];
12
13 mC = new r_8[ncor];
14 mNC = new int_4[ncor];
15
16 for (int i=0; i<ncor; i++) {
17 mC[i] = mNC[i] = 0;
18 }
19
20 mNDat = 0;
21 mINext = 0;
22 mIFirst = 0;
23}
24
25CorrelEstimator::~CorrelEstimator() {
26 delete[] mNC;
27 delete[] mC;
28 delete[] mY;
29 delete[] mX;
30 delete[] mT;
31}
32
33void CorrelEstimator::reset() {
34 for (int i=0; i<ncor; i++) {
35 mC[i] = mNC[i] = 0;
36 }
37
38 mNDat = 0;
39 mINext = 0;
40 mIFirst = 0;
41
42}
43
44void CorrelEstimator::push(int_4 t, r_8 x, r_8 y) {
45 if (mNDat == winsize) {
46 pop();
47 }
48 mT[mINext] = t;
49 mX[mINext] = x;
50 mY[mINext] = y;
51 int iCur = mINext;
52 mINext++; if (mINext == winsize) mINext=0;
53 mNDat++;
54 if (mINext > winsize) {cerr << "CorrelEstimator::push mINext > winsize"<< endl; abort();}
55
56
57 for (int i=0; i<ncor; i++) {
58 int ii=iCur;
59 while (mT[ii] > t-i) {
60 ii--;
61 if (ii<0) ii = winsize-1;
62 if ((mINext <= mIFirst && (ii<mIFirst && ii>=mINext)) ||
63 (mINext > mIFirst && (ii<mIFirst || ii>=mINext))) { // not found
64 ii = -1;
65 break;
66 }
67 }
68 if (ii>0) {
69 mNC[i]++;
70 mC[i] += mX[iCur] * mY[ii];
71 }
72 }
73}
74
75void CorrelEstimator::push(int_4 t, r_8 x) {
76 push(t,x,x);
77}
78
79void CorrelEstimator::pop() {
80 int t = mT[mIFirst];
81 for (int i=0; i<ncor; i++) {
82 int ii=mIFirst;
83 while (mT[ii] < t+i) {
84 ii++;
85 if (ii>=winsize) ii = 0;
86 if ((mINext <= mIFirst && ii<mIFirst && ii>=mINext) ||
87 (mINext > mIFirst && ii>=mINext)) { // not found
88 ii = -1;
89 break;
90 }
91 }
92 if (ii>0) {
93 mNC[i]--;
94 mC[i] -= mX[ii] * mY[mIFirst];
95 }
96
97 mIFirst++;
98 if (mIFirst >= winsize) {
99 mIFirst = 0;
100 }
101 }
102}
103
104void CorrelEstimator::recompute() {
105}
106
107r_8 CorrelEstimator::correl(int k) {
108 if (k<0 || k>= ncor) {
109 cerr << "invalid parameter " << k << " for correl "
110 << "(valid : [0;" << ncor-1<<"])" << endl;
111 abort();
112 }
113
114 if (mNC[k] == 0) {
115 return 0;
116 } else {
117 return mC[k]/mNC[k];
118 }
119}
120
121int_4 CorrelEstimator::ns4correl(int k) {
122 if (k<0 || k>= ncor) {
123 cerr << "invalid parameter " << k << " for correl "
124 << "(valid : [0;" << ncor-1<<"])" << endl;
125 abort();
126 }
127
128 return mNC[k];
129}
Note: See TracBrowser for help on using the repository browser.