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

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

new output for wiener, unconnected outs ok in processor

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 for (int i=sn; i<sn+nsamples; i++) {
50 double sig = getData(0, i);
51 double prb = getData(1, i);
52 corr.push(i, sig, prb);
53 autocorr.push(i, prb);
54 }
55 // correlation is recomputed, let's recompute the wiener filter from wiener equations
56 for (int i=0; i<lcorr; i++) {
57 r[lcorr+i] = r[lcorr-i] = autocorr.correl(i);
58 y[i+1] = corr.correl(i);
59 }
60 dtoeplz(r,w,y,lcorr);
61 if (!isnan(w[1])) {
62 for (int i=0; i<lcorr; i++) {
63 filter[i] = w[i+1];
64 }
65 } else {
66 cout << "Bad inversion, keeping previous filter\n";
67 }
68 cout << "Wiener filter : " << sn << "\n ";
69 for (int i=0; i<lcorr; i++) {
70 cout << filter[i] << " ";
71 }
72 cout << endl;
73 }
74
75 if (sn >= snb+lcorr-1) {
76 getData(1, sn-lcorr+1, lcorr, window);
77 double outSig = 0;
78 for (int i=0; i<lcorr; i++) {
79 outSig += filter[i] * window[lcorr-1 - i];
80 }
81 putData(0, sn, getData(0, sn) - outSig);
82 putData(1, sn, outSig);
83 }
84 sn++;
85 }
86
87 delete[] y;
88 delete[] w;
89 delete[] r;
90 delete[] filter;
91}
Note: See TracBrowser for help on using the repository browser.