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

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

decorrelateur wiener

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