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

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

missing include

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