source: Sophya/trunk/ArchTOIPipe/Processors/wienerdecor.cc@ 1956

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

avec stdlib

File size: 1.9 KB
Line 
1#include "toimanager.h"
2#include "correl.h"
3#include "wienerdecor.h"
4extern "C" {
5#include "nrutil.h"
6}
7extern "C" void dtoeplz(double r[], double x[], double y[], int n);
8
9WienerDecorrelator::WienerDecorrelator(int n, int l) {
10 nsamples = n;
11 lcorr = l;
12}
13
14void WienerDecorrelator::init() {
15 declareInput("signal");
16 declareInput("probe");
17 declareOutput("signal");
18 name="WienerDecorrelator";
19 setNeededHistory(nsamples+lcorr+1);
20 lowExtra = lcorr;
21}
22
23void WienerDecorrelator::run() {
24 int snb = getMinIn();
25 int sne = getMaxIn();
26
27 // cout << "Wiener " << snb << " - " << sne << endl;
28
29 CorrelEstimator corr(lcorr, nsamples), autocorr(lcorr, nsamples);
30
31 double* r = new double[2*lcorr]; // autocorr toeplitz matrix
32 double* w = new double[lcorr+1]; // filter
33 double* y = new double[lcorr+1]; // corr vector
34 double* window = new double[lcorr];
35 double* filter = w+1;
36
37 int sn = snb;
38 int snstartcorr = -1;
39
40 while (sn < sne) {
41 if (snstartcorr < 0 ||
42 (snstartcorr + nsamples < sn && sn+nsamples < sne)) {
43 // let's (re)compute the correlation
44 snstartcorr = sn;
45 corr.reset();
46 autocorr.reset();
47 for (int i=sn; i<sn+nsamples; i++) {
48 double sig = getData(0, i);
49 double prb = getData(1, i);
50 corr.push(i, sig, prb);
51 autocorr.push(i, prb);
52 }
53 // correlation is recomputed, let's recompute the wiener filter from wiener equations
54 for (int i=0; i<lcorr; i++) {
55 r[lcorr+i] = r[lcorr-i] = autocorr.correl(i);
56 y[i+1] = corr.correl(i);
57 }
58 dtoeplz(r,w,y,lcorr);
59 cout << "Wiener filter : \n ";
60 for (int i=0; i<lcorr; i++) {
61 cout << filter[i] << " ";
62 }
63 cout << endl;
64 }
65
66 if (sn >= snb+lcorr-1) {
67 getData(1, sn-lcorr+1, lcorr, window);
68 double outSig = 0;
69 for (int i=0; i<lcorr; i++) {
70 outSig += filter[i] * window[lcorr-1 - i];
71 }
72 putData(0, sn, getData(0, sn) - outSig);
73 }
74 sn++;
75 }
76
77 delete[] y;
78 delete[] w;
79 delete[] r;
80}
Note: See TracBrowser for help on using the repository browser.