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

Last change on this file since 2075 was 1982, checked in by ansari, 23 years ago

Compil sur magique SGI-CC , Reza 3/5/2002

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