source: trunk/src/ATrous/filter.cc @ 848

Last change on this file since 848 was 846, checked in by MatthewWhiting, 13 years ago

Lots of small changes to the reconstruction code, getting the type definitions appropriate (signed vs unsigned ints, with size_t parameters in there as well.)

File size: 8.1 KB
Line 
1// -----------------------------------------------------------------------
2// filter.cc: Defining a filter function for wavelet reconstruction.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
28#include <iostream>
29#include <sstream>
30#include <duchamp/duchamp.hh>
31#include <duchamp/ATrous/filter.hh>
32#include <math.h>
33#include <vector>
34
35namespace duchamp
36{
37
38  Filter::Filter()
39  {
40    this->sigmaFactors.resize(3);
41    for(int i=0;i<3;i++) this->sigmaFactors[i] = new std::vector<double>(20);
42    this->loadSpline();
43  }
44
45  Filter::Filter(const Filter& f)
46  {
47    operator=(f);
48  }
49
50  Filter& Filter::operator=(const Filter& f)
51  {
52    if(this==&f) return *this;
53    this->name = f.name;
54    this->filter1D = f.filter1D;
55    this->maxNumScales = f.maxNumScales;
56    this->sigmaFactors = f.sigmaFactors;
57    return *this;
58  }
59
60  //-----------------------------------------------------------------------
61
62  Filter::~Filter()
63  {
64    this->filter1D.clear();
65    this->maxNumScales.clear();
66    //for(int i=0;i<3;i++) delete this->sigmaFactors[i];
67    //for(int i=0;i<3;i++) this->sigmaFactors[i]->clear();
68//     for(int i=0;i<3;i++){
69//       std::vector<double>* p = this->sigmaFactors[i];
70//       delete p;
71//     }
72    this->sigmaFactors.clear();
73  }
74  //-----------------------------------------------------------------------
75
76  void Filter::define(int filtercode)
77  {
78    switch(filtercode)
79      {
80      case 2:
81        this->loadTriangle();
82        break;
83      case 3:
84        this->loadHaar();
85        break;
86      case 4:
87        //       this->loadTopHat();
88      case 1:
89      default:
90        if(filtercode!=1){
91          //    if(filtercode==4) {
92          //      std::stringstream errmsg;
93          //      errmsg << "TopHat Wavelet not being used currently."
94          //             << "Using B3 spline instead.\n";
95          //      duchampWarning("Filter::define", errmsg.str());
96          //    }
97          //    else {
98          std::stringstream errmsg;
99          errmsg << "Filter code " << filtercode << " undefined. Using B3 spline.\n";
100          duchampWarning("Wavelet Filter", errmsg.str());
101          //    }
102        }
103        this->loadSpline();
104        break;
105      }
106 
107  }
108  //-----------------------------------------------------------------------
109
110  unsigned int Filter::getNumScales(long length)
111  {
112    unsigned int num;
113    switch(this->filter1D.size()){
114    case 5:
115      num = log(double(length-1))/M_LN2 - 1;
116      break;
117    case 3:
118      num = log(double(length-1))/M_LN2;
119      break;
120    default:
121      num = 1 + log(double(length-1)/double(this->filter1D.size()-1))/M_LN2;
122      break;
123    }
124    return num;
125  }
126  //-----------------------------------------------------------------------
127
128  unsigned int Filter::getMaxSize(int scale)
129  {
130    switch(this->filter1D.size()){
131    case 5:
132      return int(pow(2,scale+1)) + 1;
133      break;
134    case 3:
135      return int(pow(2,scale)) + 1;
136      break;
137    default:
138      return int(pow(2,scale-1))*(this->filter1D.size()-1) + 1;
139      break;
140    }
141  }
142  //-----------------------------------------------------------------------
143
144  void Filter::loadSpline()
145  {
146    double filter[5] = {0.0625, 0.25, 0.375, 0.25, 0.0625};
147    this->name = "B3 spline function";
148    this->filter1D.resize(5);
149    for(int i=0;i<5;i++) this->filter1D[i] = filter[i];
150    this->sigmaFactors.resize(3);
151    this->maxNumScales.resize(3);
152
153    this->maxNumScales[0] = 18;
154    double sigmaFactors1D[19] = {1.00000000000,7.23489806e-1,2.85450405e-1,1.77947535e-1,
155                                 1.22223156e-1,8.58113122e-2,6.05703043e-2,4.28107206e-2,
156                                 3.02684024e-2,2.14024008e-2,1.51336781e-2,1.07011079e-2,
157                                 7.56682272e-3,5.35055108e-3,3.78341085e-3,2.67527545e-3,
158                                 1.89170541e-3,1.33763772e-3,9.45852704e-4};
159    this->sigmaFactors[0]->resize(19);
160    for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
161
162    this->maxNumScales[1] = 11;
163    double sigmaFactors2D[12] = {1.00000000000,8.90796310e-1,2.00663851e-1,8.55075048e-2,
164                                 4.12474444e-2,2.04249666e-2,1.01897592e-2,5.09204670e-3,
165                                 2.54566946e-3,1.27279050e-3,6.36389722e-4,3.18194170e-4};
166    this->sigmaFactors[1]->resize(12);
167    for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
168
169    this->maxNumScales[2] = 7;
170    double sigmaFactors3D[8] = {1.00000000000,9.56543592e-1,1.20336499e-1,3.49500154e-2,
171                                1.18164242e-2,4.13233507e-3,1.45703714e-3,5.14791120e-4};
172    this->sigmaFactors[2]->resize(8);
173    for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
174  }
175  //-----------------------------------------------------------------------
176
177  void Filter::loadTriangle()
178  {
179    double filter[3] = {1./4., 1./2., 1./4.};
180    this->filter1D.resize(3);
181    for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
182    this->name = "Triangle function";
183    this->sigmaFactors.resize(3);
184    this->maxNumScales.resize(3);
185
186    this->maxNumScales[0] = 18;
187    double sigmaFactors1D[19] = {1.00000000000,6.12372436e-1,3.30718914e-1,2.11947812e-1,
188                                 1.45740298e-1,1.02310944e-1,7.22128185e-2,5.10388224e-2,
189                                 3.60857673e-2,2.55157615e-2,1.80422389e-2,1.27577667e-2,
190                                 9.02109930e-3,6.37887978e-3,4.51054902e-3,3.18942978e-3,
191                                 2.25527449e-3,1.59471988e-3,1.12763724e-4};
192    this->sigmaFactors[0]->resize(19);
193    for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
194
195    this->maxNumScales[1] = 12;
196    double sigmaFactors2D[13] = {1.00000000000,8.00390530e-1,2.72878894e-1,1.19779282e-1,
197                                 5.77664785e-2,2.86163283e-2,1.42747506e-2,7.13319703e-3,
198                                 3.56607618e-3,1.78297280e-3,8.91478237e-4,4.45738098e-4,
199                                 2.22868922e-4};
200    this->sigmaFactors[1]->resize(13);
201    for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
202
203    this->maxNumScales[2] = 8;
204    double sigmaFactors3D[9] = {1.00000000000,8.959544490e-1,1.92033014e-1,5.76484078e-2,
205                                1.94912393e-2,6.812783870e-3,2.40175885e-3,8.48538128e-4,
206                                2.99949455e-4};
207    this->sigmaFactors[2]->resize(9);
208    for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
209  }
210  //-----------------------------------------------------------------------
211
212  void Filter::loadHaar()
213  {
214    double filter[3] = {0., 1./2., 1./2.};
215    this->name = "Haar wavelet";
216    this->filter1D.resize(3);
217    for(int i=0;i<3;i++) this->filter1D[i] = filter[i];
218    this->sigmaFactors.resize(3);
219    this->maxNumScales.resize(3);
220
221    this->maxNumScales[0] = 6;
222    double sigmaFactors1D[7] = {1.00000000000,7.07167810e-1,5.00000000e-1,3.53553391e-1,
223                                2.50000000e-1,1.76776695e-1,1.25000000e-1};
224    this->sigmaFactors[0]->resize(7);
225    for(int i=0;i<19;i++)(*this->sigmaFactors[0])[i] = sigmaFactors1D[i];
226
227    this->maxNumScales[1] = 6;
228    double sigmaFactors2D[7] = {1.00000000000,4.33012702e-1,2.16506351e-1,1.08253175e-1,
229                                5.41265877e-2,2.70632939e-2,1.35316469e-2};
230    this->sigmaFactors[1]->resize(7);
231    for(int i=0;i<12;i++)(*this->sigmaFactors[1])[i] = sigmaFactors2D[i];
232
233    this->maxNumScales[2] = 8;
234    double sigmaFactors3D[9] = {1.00000000000,9.35414347e-1,3.30718914e-1,1.16926793e-1,
235                                4.13398642e-2,1.46158492e-2,5.16748303e-3,1.82698115e-3,
236                                6.45935379e-4};
237    this->sigmaFactors[2]->resize(9);
238    for(int i=0;i<12;i++)(*this->sigmaFactors[2])[i] = sigmaFactors3D[i];
239  }
240
241}
Note: See TracBrowser for help on using the repository browser.