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

Last change on this file since 2225 was 2225, checked in by aubourg, 23 years ago

v_oct02_mieux

File size: 2.8 KB
Line 
1#include <math.h>
2#include "toimanager.h"
3#include "correl.h"
4#include "wienerdecor.h"
5extern "C" {
6#include "nrutil.h"
7}
8extern "C" void dtoeplz(double r[], double x[], double y[], int n);
9
10WienerDecorrelator::WienerDecorrelator(int n, int l) {
11 nsamples = n;
12 lcorr = l;
13 doNotLookAt();
14}
15
16void WienerDecorrelator::init() {
17 declareInput("signal");
18 declareInput("probe");
19 declareOutput("signal");
20 declareOutput("noiseestim");
21 name="WienerDecorrelator";
22 setNeededHistory(nsamples+lcorr+1);
23 lowExtra = lcorr;
24}
25
26void WienerDecorrelator::run() {
27 int snb = getMinIn();
28 int sne = getMaxIn();
29
30 // cout << "Wiener " << snb << " - " << sne << endl;
31
32 CorrelEstimator corr(lcorr, nsamples), autocorr(lcorr, nsamples);
33
34 double* r = new double[2*lcorr]; // autocorr toeplitz matrix
35 double* w = new double[lcorr+1]; // filter
36 double* y = new double[lcorr+1]; // corr vector
37 double* window = new double[lcorr];
38 uint_8* fwind = new uint_8[lcorr];
39 double* filter = new double[lcorr];
40 for (int i=0; i<lcorr; i++) filter[i]=0;
41
42 int sn = snb;
43 int snstartcorr = -1;
44
45 while (sn <= sne) {
46 if (snstartcorr < 0 ||
47 (snstartcorr + nsamples < sn && sn+nsamples < sne)) {
48 // let's (re)compute the correlation
49 snstartcorr = sn;
50 corr.reset();
51 autocorr.reset();
52 cout << "computing correl " << sn << " -> " << sn+nsamples << endl;
53 for (int i=sn; i<sn+nsamples; i++) {
54 uint_8 flag1, flag2;
55 double sig, prb;
56 getData(0, i, sig, flag1);
57 if (flag1 & flgNotLookAt) continue;
58 getData(1, i, prb, flag2);
59 if (flag2 & flgNotLookAt) continue;
60 if ((i-sn)%100 == 0) {
61 //cout << " sig/prb : " << i << " : " << sig << " / " << prb
62 // << hex << " " << flag1 << " " << flag2 << dec << endl;
63 }
64 corr.push(i, sig, prb);
65 autocorr.push(i, prb);
66 }
67 // correlation is recomputed, let's recompute the wiener filter from wiener equations
68 {for (int i=0; i<lcorr; i++) {
69 r[lcorr+i] = r[lcorr-i] = autocorr.correl(i);
70 y[i+1] = corr.correl(i);
71 //cout << "r " << lcorr+i << " " << lcorr -i << " = " << r[lcorr+i]
72 // << "\n"
73 // << "y " << i+1 << " = " << y[i+1] << endl;
74 }}
75 dtoeplz(r,w,y,lcorr);
76 if (!isnan(w[1])) {
77 for (int i=0; i<lcorr; i++) {
78 filter[i] = w[i+1];
79 }
80 } else {
81 cout << "Bad inversion, keeping previous filter\n";
82 }
83 cout << "Wiener filter : " << sn << "\n ";
84 {for (int i=0; i<lcorr; i++) {
85 cout << filter[i] << " ";
86 }}
87 cout << endl;
88 }
89
90 if (sn >= snb+lcorr-1) {
91 getData(1, sn-lcorr+1, lcorr, window, fwind);
92 uint_8 flag = 0;
93 double outSig = 0;
94 for (int i=0; i<lcorr; i++) {
95 outSig += filter[i] * window[lcorr-1 - i];
96 flag |= fwind[lcorr-1 -i];
97 }
98 putData(0, sn, getData(0, sn) - outSig, flag);
99 putData(1, sn, outSig, flag);
100 }
101 sn++;
102 }
103
104 delete[] y;
105 delete[] w;
106 delete[] r;
107 delete[] filter;
108}
Note: See TracBrowser for help on using the repository browser.