source: branches/fitshead-branch/ATrous/atrous.cc @ 1441

Last change on this file since 1441 was 86, checked in by Matthew Whiting, 18 years ago

Large commit, mostly removing dud commented code, and adding comments and
documentation to the existing code. No new features.

File size: 5.2 KB
Line 
1// ATROUS.CC
2//  Functions necessary for the reconstruction routines.
3#include <ATrous/atrous.hh>
4#include <math.h>
5
6int Filter::getNumScales(long length)
7{
8  switch(this->filter1D.size()){
9  case 5:
10    return int(logf(float(length-1))/M_LN2) - 1;
11    break;
12  case 3:
13    return int(logf(float(length-1))/M_LN2);
14    break;
15  default:
16    return 1 + int(logf(float(length-1)/float(this->filter1D.size()-1))/M_LN2);
17    break;
18  }
19}
20
21int Filter::getMaxSize(int scale)
22{
23  switch(this->filter1D.size()){
24  case 5:
25    return int(pow(2,scale+1)) + 1;
26    break;
27  case 3:
28    return int(pow(2,scale)) + 1;
29    break;
30  default:
31    return int(pow(2,scale-1))*(this->filter1D.size()-1) + 1;
32    break;
33  }
34}
35
36Filter::Filter()
37{
38  this->sigmaFactors.resize(3);
39  for(int i=0;i<3;i++) this->sigmaFactors[i] = new vector<double>(20);
40}
41
42
43void Filter::define(int filtercode)
44{
45  switch(filtercode)
46    {
47    case 2:
48      this->loadTriangle();
49      break;
50    case 3:
51      this->loadHaar();
52      break;
53    case 4:
54      //       this->loadTopHat();
55    case 1:
56    default:
57      if(filtercode!=1){
58        if(filtercode==4)
59          std::cerr << "TopHat Wavelet not being used currently. Using B3 spline instead.\n";
60        else
61          std::cerr << "Filter code " << filtercode << " undefined. Using B3 spline.\n";
62      }
63      this->loadSpline();
64      break;
65    }
66 
67}
68
69void Filter::loadSpline()
70{
71  double filter[5] = {0.0625, 0.25, 0.375, 0.25, 0.0625};
72  this->name = "B3 spline function";
73  this->filter1D.resize(5);
74  for(int i=0;i<5;i++) this->filter1D[i] = filter[i];
75  this->sigmaFactors.resize(3);
76  this->maxNumScales.resize(3);
77
78  this->maxNumScales[0] = 18;
79  double sigmaFactors1D[19] = {1.00000000000,7.23489806e-1,2.85450405e-1,1.77947535e-1,
80                               1.22223156e-1,8.58113122e-2,6.05703043e-2,4.28107206e-2,
81                               3.02684024e-2,2.14024008e-2,1.51336781e-2,1.07011079e-2,
82                               7.56682272e-3,5.35055108e-3,3.78341085e-3,2.67527545e-3,
83                               1.89170541e-3,1.33763772e-3,9.45852704e-4};
84  this->sigmaFactors[0]->resize(19);
85  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
86
87  this->maxNumScales[1] = 11;
88  double sigmaFactors2D[12] = {1.00000000000,8.90796310e-1,2.00663851e-1,8.55075048e-2,
89                               4.12474444e-2,2.04249666e-2,1.01897592e-2,5.09204670e-3,
90                               2.54566946e-3,1.27279050e-3,6.36389722e-4,3.18194170e-4};
91  this->sigmaFactors[1]->resize(12);
92  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
93
94  this->maxNumScales[2] = 7;
95  double sigmaFactors3D[8] = {1.00000000000,9.56543592e-1,1.20336499e-1,3.49500154e-2,
96                              1.18164242e-2,4.13233507e-3,1.45703714e-3,5.14791120e-4};
97  this->sigmaFactors[2]->resize(8);
98  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
99}
100
101void Filter::loadTriangle()
102{
103  double filter[3] = {1./4., 1./2., 1./4.};
104  this->filter1D.resize(3);
105  for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
106  this->name = "Triangle function";
107  this->sigmaFactors.resize(3);
108  this->maxNumScales.resize(3);
109
110  this->maxNumScales[0] = 18;
111  double sigmaFactors1D[19] = {1.00000000000,6.12372436e-1,3.30718914e-1,2.11947812e-1,
112                               1.45740298e-1,1.02310944e-1,7.22128185e-2,5.10388224e-2,
113                               3.60857673e-2,2.55157615e-2,1.80422389e-2,1.27577667e-2,
114                               9.02109930e-3,6.37887978e-3,4.51054902e-3,3.18942978e-3,
115                               2.25527449e-3,1.59471988e-3,1.12763724e-4};
116  this->sigmaFactors[0]->resize(19);
117  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
118
119  this->maxNumScales[1] = 12;
120  double sigmaFactors2D[13] = {1.00000000000,8.00390530e-1,2.72878894e-1,1.19779282e-1,
121                               5.77664785e-2,2.86163283e-2,1.42747506e-2,7.13319703e-3,
122                               3.56607618e-3,1.78297280e-3,8.91478237e-4,4.45738098e-4,
123                               2.22868922e-4};
124  this->sigmaFactors[1]->resize(13);
125  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
126
127  this->maxNumScales[2] = 8;
128  double sigmaFactors3D[9] = {1.00000000000,8.959544490e-1,1.92033014e-1,5.76484078e-2,
129                              1.94912393e-2,6.812783870e-3,2.40175885e-3,8.48538128e-4,
130                              2.99949455e-4};
131  this->sigmaFactors[2]->resize(9);
132  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
133}
134
135void Filter::loadHaar()
136{
137  double filter[3] = {0., 1./2., 1./2.};
138  this->name = "Haar wavelet";
139  this->filter1D.resize(3);
140  for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
141  this->sigmaFactors.resize(3);
142  this->maxNumScales.resize(3);
143
144  this->maxNumScales[0] = 6;
145  double sigmaFactors1D[7] = {1.00000000000,7.07167810e-1,5.00000000e-1,3.53553391e-1,
146                              2.50000000e-1,1.76776695e-1,1.25000000e-1};
147  this->sigmaFactors[0]->resize(7);
148  for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
149
150  this->maxNumScales[1] = 6;
151  double sigmaFactors2D[7] = {1.00000000000,4.33012702e-1,2.16506351e-1,1.08253175e-1,
152                              5.41265877e-2,2.70632939e-2,1.35316469e-2};
153  this->sigmaFactors[1]->resize(7);
154  for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
155
156  this->maxNumScales[2] = 8;
157  double sigmaFactors3D[9] = {1.00000000000,9.35414347e-1,3.30718914e-1,1.16926793e-1,
158                              4.13398642e-2,1.46158492e-2,5.16748303e-3,1.82698115e-3,
159                              6.45935379e-4};
160  this->sigmaFactors[2]->resize(9);
161  for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
162}
Note: See TracBrowser for help on using the repository browser.