00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 #ifndef REC_FILTER_SOURCE
00027 #define REC_FILTER_SOURCE
00028 
00029 #include "rec_filter.h"
00030 
00033 namespace PLib{
00034 
00035 void toParams(double a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, double b1, double b2, double c1, double c2, double k, Params& params){
00036   params.a1 = a1 ;
00037   params.a2 = a2 ;
00038   params.a3 = a3 ;
00039   params.a4 = a4 ;
00040   params.a5 = a5 ;
00041   params.a6 = a6 ;
00042   params.a7 = a7 ;
00043   params.a8 = a8 ;
00044   params.b1 = b1 ;
00045   params.b2 = b2 ;
00046   params.c1 = c1 ;
00047   params.c2 = c2 ; 
00048   params.k = k ;
00049 }
00050 
00051 void fromParams(const Params& params, double &a1, double &a2, double &a3, double &a4, double &a5, double &a6, double &a7, double &a8, double &b1, double &b2, double &c1, double &c2, double &k){
00052   a1 = params.a1 ;
00053   a2 = params.a2 ;
00054   a3 = params.a3 ;
00055   a4 = params.a4 ;
00056   a5 = params.a5 ;
00057   a6 = params.a6 ;
00058   a7 = params.a7 ;
00059   a8 = params.a8 ;
00060   b1 = params.b1 ;
00061   b2 = params.b2 ;
00062   c1 = params.c1 ;
00063   c2 = params.c2 ; 
00064   k = params.k ;
00065 }
00066 
00067 void generalRFx(const Params& params, const Basic2DArray<double> &x, Basic2DArray<double> &y){
00068   Basic2DArray<double> y1,y2 ;
00069   y1.resize(x);
00070   y2.resize(x);
00071   y.resize(x);
00072   
00073   double a1,a2,a3,a4,a5,a6,a7,a8 ;
00074   double b1,b2 ;
00075   double c1,c2 ;
00076   double k ;
00077   
00078   fromParams(params,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,c1,c2,k) ;
00079   int i,j ;
00080   const int rows = x.rows() ;
00081   const int cols = x.cols() ; 
00082   
00083   for(i=0;i<rows-1;++i){
00084     y1(i,0) = a1*x(i,0) ;
00085     y1(i,1) = a1*x(i,1) + a2*x(i,0) + b1*y1(i,0) ;
00086     for(j=2;j<cols-1;++j){
00087       y1(i,j) = a1*x(i,j) + a2*x(i,j-1) + b1*y1(i,j-1) + b2*y1(i,j-2) ;
00088     }
00089   }
00090 
00091   for(i=rows-1;i>=0;--i){
00092     j = cols-1 ;
00093     y2(i,j) = 0 ;
00094     y(i,j) = c1*(y1(i,j)+y2(i,j));
00095     j = cols-2 ;
00096     y2(i,j) = a3*x(i,j+1) + b1*y2(i,j+1) ;
00097     y(i,j) = c1*(y1(i,j)+y2(i,j));
00098     for(j=cols-3;j>=0;--j){
00099       y2(i,j) = a3*x(i,j+1) + a4*x(i,j+2) + b1*y2(i,j+1) + b2*y2(i,j+2) ;
00100       y(i,j) = c1*(y1(i,j)+y2(i,j));
00101     }
00102   }  
00103 
00104 }
00105 
00106 
00107 void generalRFy(const Params& params, const Basic2DArray<double> &r, Basic2DArray<double> &y){
00108   Basic2DArray<double> y1,y2 ;
00109   y1.resize(r);
00110   y2.resize(r);
00111   y.resize(r);
00112   
00113   double a1,a2,a3,a4,a5,a6,a7,a8 ;
00114   double b1,b2 ;
00115   double c1,c2 ;
00116   double k ;
00117   
00118   fromParams(params,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,c1,c2,k) ;
00119   int i,j ;
00120   const int rows = r.rows() ;
00121   const int cols = r.cols() ; 
00122   
00123   for(j=0;j<cols-1;++j){
00124     y1(0,j) = a5*r(0,j) ;
00125     y1(1,j) = a5*r(1,j) + a6*r(0,j) + b1*y1(0,j);
00126     for(i=2;i<rows-1;++i){
00127       y1(i,j) = a5*r(i,j) + a6*r(i-1,j) + b1*y1(i-1,j) + b2*y1(i-2,j) ;
00128     }
00129   }
00130 
00131   for(j=cols-1;j>=0;--j){
00132     i = rows-1 ;
00133     y2(i,j) = 0 ;
00134     y(i,j) = c2*(y1(i,j)+y2(i,j));
00135     i = rows-2 ;
00136     y2(i,j) = a7*r(i+1,j) + b1*y2(i+1,j) ;
00137     y(i,j) = c2*(y1(i,j)+y2(i,j));    
00138     for(i=rows-3;i>=0;--i){
00139       y2(i,j) = a7*r(i+1,j) + a8*r(i+2,j) + b1*y2(i+1,j) + b2*y2(i+2,j) ;
00140       y(i,j) = c2*(y1(i,j)+y2(i,j));
00141     }
00142   }
00143 }
00144 
00145 
00146 
00147 void generalRF(const Params& params, const Basic2DArray<double> &x, Basic2DArray<double> &y){
00148   Basic2DArray<double> y1,y2,r ;
00149   y1.resize(x);
00150   y2.resize(x);
00151   r.resize(x) ;
00152   y.resize(x);
00153   
00154   double a1,a2,a3,a4,a5,a6,a7,a8 ;
00155   double b1,b2 ;
00156   double c1,c2 ;
00157   double k ;
00158   
00159   fromParams(params,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,c1,c2,k) ;
00160 
00161   int i,j ;
00162   const int rows = x.rows() ;
00163   const int cols = x.cols() ; 
00164   
00165   for(i=0;i<rows-1;++i){
00166     y1(i,0) = a1*x(i,0) ;
00167     y1(i,1) = a1*x(i,1) + a2*x(i,0) + b1*y1(i,0) ;
00168     for(j=2;j<cols-1;++j){
00169       y1(i,j) = a1*x(i,j) + a2*x(i,j-1) + b1*y1(i,j-1) + b2*y1(i,j-2) ;
00170     }
00171   }
00172 
00173   for(i=rows-1;i>=0;--i){
00174     j = cols-1 ;
00175     y2(i,j) = 0 ;
00176     r(i,j) = c1*(y1(i,j)+y2(i,j));
00177     j = cols-2 ;
00178     y2(i,j) = a3*x(i,j+1) + b1*y2(i,j+1) ;
00179     r(i,j) = c1*(y1(i,j)+y2(i,j));
00180     for(j=cols-3;j>=0;--j){
00181       y2(i,j) = a3*x(i,j+1) + a4*x(i,j+2) + b1*y2(i,j+1) + b2*y2(i,j+2) ;
00182       r(i,j) = c1*(y1(i,j)+y2(i,j));
00183     }
00184   }  
00185 
00186   for(j=0;j<cols-1;++j){
00187     y1(0,j) = a5*r(0,j) ;
00188     y1(1,j) = a5*r(1,j) + a6*r(0,j) + b1*y1(0,j);
00189     for(i=2;i<rows-1;++i){
00190       y1(i,j) = a5*r(i,j) + a6*r(i-1,j) + b1*y1(i-1,j) + b2*y1(i-2,j) ;
00191     }
00192   }
00193 
00194   for(j=cols-1;j>=0;--j){
00195     i = rows-1 ;
00196     y2(i,j) = 0 ;
00197     y(i,j) = c2*(y1(i,j)+y2(i,j));
00198     i = rows-2 ;
00199     y2(i,j) = a7*r(i+1,j) + b1*y2(i+1,j) ;
00200     y(i,j) = c2*(y1(i,j)+y2(i,j));    
00201     for(i=rows-3;i>=0;--i){
00202       y2(i,j) = a7*r(i+1,j) + a8*r(i+2,j) + b1*y2(i+1,j) + b2*y2(i+2,j) ;
00203       y(i,j) = c2*(y1(i,j)+y2(i,j));
00204     }
00205   }
00206 
00207 }
00208 
00209 void smooth2ndOrder(Params& params, double alpha){
00210   const double expa = exp(-alpha) ;
00211   const double expa2 = exp(-2*alpha) ;
00212   params.k = (1-expa)*(1-expa)/(1+2*alpha*expa-expa2) ;
00213   params.b1 = 2*expa ;
00214   params.b2 = -expa2 ;
00215   params.a1 = params.a5 = params.k ;
00216   params.a2 = params.a6 = params.k*expa*(alpha-1) ;
00217   params.a3 = params.a7 = params.k*expa*(alpha+1) ;
00218   params.a4 = params.a8 = -params.k*expa2;
00219   params.c1 = params.c2 = 1 ;
00220 }
00221 
00222 void xderiv2ndOrderSmooth(Params& params, double alpha){
00223   const double expa = exp(-alpha) ;
00224   const double expa2 = exp(-2*alpha) ;
00225   params.k = (1-expa)*(1-expa)/(1+2*alpha*expa-expa2) ;
00226   params.b1 = 2*expa ;
00227   params.b2 = -expa2 ;
00228   params.a1 = 0 ;
00229   params.a2 = 1 ;
00230   params.a3 = -1 ;
00231   params.a4 = 0 ;
00232   params.a5 = params.k ;
00233   params.a6 = params.k*expa*(alpha-1) ;
00234   params.a7 = params.k*expa*(alpha+1) ;
00235   params.a8 = -params.k*expa2 ;
00236   params.c1 = -1*(1-expa)*(1-expa);
00237   params.c2 = 1 ;
00238 }
00239 
00240 void yderiv2ndOrderSmooth(Params& params, double alpha){
00241   const double expa = exp(-alpha) ;
00242   const double expa2 = exp(-2*alpha) ;
00243   params.k = (1-expa)*(1-expa)/(1+2*alpha*expa-expa2) ;
00244   params.b1 = 2*expa ;
00245   params.b2 = -expa2 ;
00246   params.a1 = params.k ;
00247   params.a2 = params.k*expa*(alpha-1) ;
00248   params.a3 = params.k*expa*(alpha+1) ;
00249   params.a4 = -params.k*expa2 ;
00250   params.a5 = 0 ;
00251   params.a6 = 1 ;
00252   params.a7 = -1 ;
00253   params.a8 = 0 ;
00254   params.c1 = 1 ;
00255   params.c2 = -1*(1-expa)*(1-expa);
00256 }
00257 
00258 void xderiv2ndOrder(Params& params, double alpha){
00259   const double expa = exp(-alpha) ;
00260   const double expa2 = exp(-2*alpha) ;
00261   params.k = (1-expa)*(1-expa)/(expa) ;
00262   params.b1 = 2*expa ;
00263   params.b2 = -2*expa2 ;
00264   params.a1 = 0 ;
00265   params.a2 = 1 ;
00266   params.a3 = -1 ;
00267   params.a4 = 0 ;
00268   params.c1 = params.k*expa ;
00269   params.c2 = params.k*expa ;
00270 }
00271 
00272 void yderiv2ndOrder(Params& params, double alpha){
00273   const double expa = exp(-alpha) ;
00274   const double expa2 = exp(-2*alpha) ;
00275   params.k = (1-expa)*(1-expa)/(expa) ;
00276   params.b1 = 2*expa ;
00277   params.b2 = -2*expa2 ;
00278   params.a5 = 0 ;
00279   params.a6 = 1 ;
00280   params.a7 = -1 ;
00281   params.a8 = 0 ;
00282   params.c1 = params.k*expa ;
00283   params.c2 = params.k*expa ;
00284 }
00285 
00286 void smooth1stOrder(Params& params, double alpha, double k0){
00287   const double expa = exp(-alpha) ;
00288   params.k = (1-expa)/(1+expa) ; 
00289   params.b1 = expa ;
00290   params.b2 = 0;
00291   params.a1 = 1 ;
00292   params.a2 = 0 ;
00293   params.a3 = expa ;
00294   params.a4 = 0 ;
00295   params.a5 = 1 ;
00296   params.a6 = 0 ;
00297   params.a7 = expa ;
00298   params.a8 = 0 ;
00299   params.c1 = params.k ;
00300   params.c2 = params.k ;
00301 }
00302 
00303 void LL1stOrder(Params& params, double alpha){
00304   const double expa = exp(-alpha) ;
00305   const double expa2 = exp(-2*alpha);
00306   params.k = (1-expa2)/(2*alpha*expa) ; 
00307   params.b1 = 2*expa ;
00308   params.b2 = -expa2;
00309   params.a1 = 0 ;
00310   params.a2 = 1 ;
00311   params.a3 = 1 ;
00312   params.a4 = 0 ;
00313   params.a5 = 0 ;
00314   params.a6 = 1 ;
00315   params.a7 = 1 ;
00316   params.a8 = 0 ;
00317   params.c1 = params.c2 = (1-expa2)/2 ;
00318 }
00319 
00320 void ubyteToDouble(const Basic2DArray<unsigned char>& img, Basic2DArray<double>& mat){
00321   mat.resize(img.rows(),img.cols());
00322   for(int i=img.rows()-1;i>=0;--i)
00323     for(int j=img.cols()-1;j>=0;--j)
00324       mat(i,j) = img(i,j) ;
00325 }
00326 
00327 void doubleToUbyte(const Basic2DArray<double>& mat, Basic2DArray<unsigned char>& img){
00328   img.resize(mat.rows(),mat.cols());
00329   for(int i=img.rows()-1;i>=0;--i)
00330     for(int j=img.cols()-1;j>=0;--j)
00331       img(i,j) = (unsigned char)mat(i,j) ;
00332 }
00333 
00334 double quadInterp(double x, double x0, double f0, double x1, double f1, double x2, double f2){
00335   const double f01 = firstDivDiff(x0,f0,x1,f1) ;
00336   const double f012 = secondDivDiff(x0,f0,x1,f1,x2,f2);
00337   double fx = f0 + (x-x0)*f01 + (x-x0)*(x-x1)*f012 ;
00338   return fx;
00339 }
00340 
00341 int findEdge(const Basic2DArray<double>& dx, const Basic2DArray<double>& dy, Basic2DArray<double> &edge, Basic2DArray<double>& gradN, double thresh){
00342   if(dx.rows() != dy.rows() || dx.cols() != dy.cols())
00343     return 0;
00344   edge.resize(dx) ;
00345   gradN.resize(dx);
00346   
00347   int i,j ;
00348 
00349   for(i=0;i<dx.rows();++i)
00350     for(j=0;j<dx.cols();++j){
00351       gradN(i,j) = sqrt(dx(i,j)*dx(i,j) + dy(i,j)*dy(i,j)) ;
00352     }
00353  
00354 
00355   for(i=1;i<dx.rows()-1;++i)
00356     for(j=1;j<dx.cols()-1;++j){
00357       if(absolute(dx(i,j)) > absolute(dy(i,j))){
00358         double d = 1/dx(i,j) ;
00359         double y = dy(i,j)/dx(i,j) ;
00360         double b = quadInterp(i+y,i-1,gradN(i-1,j+1),i,gradN(i,j+1),i+1,gradN(i+1,j+1));
00361         double c = quadInterp(i-y,i-1,gradN(i-1,j-1),i,gradN(i,j-1),i+1,gradN(i+1,j-1));
00362         if(gradN(i,j) >= b && gradN(i,j) >= c && gradN(i,j) > thresh)
00363           edge(i,j) = 200;
00364         else
00365           edge(i,j) = 0 ; 
00366 
00367       }
00368       else{
00369         double d = 1/dy(i,j) ;
00370         double x = dx(i,j)/dy(i,j) ;
00371         double b = quadInterp(j-x,j-1,gradN(i-1,j-1),j,gradN(i-1,j),j+1,gradN(i-1,j+1));
00372         double c = quadInterp(j+x,j-1,gradN(i+1,j-1),j,gradN(i+1,j),j+1,gradN(i+1,j+1));
00373         if(gradN(i,j) >= b && gradN(i,j) >= c && gradN(i,j) > thresh)
00374           edge(i,j) = 200;
00375         else
00376           edge(i,j) = 0 ; 
00377       }
00378     }
00379   return 1;
00380 }
00381 
00382 int findSubEdge(const Basic2DArray<double>& dx, const Basic2DArray<double>& dy, Basic2DArray<double> &edge, double thresh, const Basic2DArray<double>& in){
00383   if(dx.rows() != dy.rows() || dx.cols() != dy.cols())
00384     return 0;
00385   const int zoom = 7 ;
00386   const int zoom2 = 4 ;
00387   edge.resize(dx.rows()*zoom,dx.cols()*zoom) ;
00388   Basic2DArray<double> gradN(dx.rows(),dx.cols());
00389   int i,j ;
00390 
00391   for(i=0;i<dx.rows();++i)
00392     for(j=0;j<dx.cols();++j){
00393       gradN(i,j) = sqrt(dx(i,j)*dx(i,j) + dy(i,j)*dy(i,j)) ;
00394     }
00395  
00396 
00397   for(i=1;i<dx.rows()-1;++i)
00398     for(j=1;j<dx.cols()-1;++j)
00399       for(int k=0;k<zoom;++k)
00400         for(int l=0;l<zoom;l++)
00401           edge(i*zoom+k-zoom2,j*zoom+l-zoom2) =  (in(i,j)>250) ? 250 : in(i,j);
00402 
00403 
00404   for(i=1;i<dx.rows()-1;++i)
00405     for(j=1;j<dx.cols()-1;++j){
00406       if(absolute(dx(i,j)) > absolute(dy(i,j))){
00407         double d = 1/dx(i,j) ;
00408         double y = dy(i,j)/dx(i,j) ;
00409         double c = quadInterp(i+y,i-1,gradN(i-1,j+1),i,gradN(i,j+1),i+1,gradN(i+1,j+1));
00410         double a = quadInterp(i-y,i-1,gradN(i-1,j-1),i,gradN(i,j-1),i+1,gradN(i+1,j-1));
00411         if(gradN(i,j) >= a && gradN(i,j) >= c && gradN(i,j) > thresh){
00412           double m = (a-c)/( 2*(a-2*gradN(i,j)+c)) ;
00413           double di, dj ;
00414           if(absolute(m)>0.5) cerr << " m = " << m << " " << a << " " << gradN(i,j) << " " << c << " at " << i << j << endl ; 
00415           dj = zoom*m*absolute(dx(i,j))/gradN(i,j) ;
00416           di = zoom*m*absolute(dy(i,j))/gradN(i,j) ;
00417           if(m<0 && dx(i,j)*dy(i,j)<0)
00418             di *= -1 ;
00419           if(m>0 && dx(i,j)*dy(i,j)<0)
00420             di *= -1 ;
00421           
00422 
00423 
00424 
00425 
00426           edge(i*zoom+di,j*zoom+dj) = 0 ; 
00427         }
00428       }
00429       else{
00430         double d = 1/dy(i,j) ;
00431         double x = dx(i,j)/dy(i,j) ;
00432         double a = quadInterp(j-x,j-1,gradN(i-1,j-1),j,gradN(i-1,j),j+1,gradN(i-1,j+1));
00433         double c = quadInterp(j+x,j-1,gradN(i+1,j-1),j,gradN(i+1,j),j+1,gradN(i+1,j+1));
00434         if(gradN(i,j) >= a && gradN(i,j) >= c && gradN(i,j) > thresh){
00435           double m = (a-c)/( 2*(a-2*gradN(i,j)+c)) ;
00436           double di, dj ;
00437           if(absolute(m)>0.5) cerr << " m = " << m << " " << a << " " << gradN(i,j) << " " << c << " at " << i << j << endl ; 
00438           dj = zoom*m*absolute(dx(i,j))/gradN(i,j);
00439           if(m<0 && dx(i,j)*dy(i,j)<0)
00440             dj *= -1 ; 
00441           if(m>0 && dx(i,j)*dy(i,j)<0)
00442             dj *= -1 ; 
00443           di = zoom*m*absolute(dy(i,j))/gradN(i,j) ; 
00444           
00445 
00446 
00447 
00448 
00449           edge(i*zoom+di,j*zoom+dj) = 0 ; 
00450         }
00451       }
00452     }
00453   return 1;
00454 }
00455 
00456 
00457 
00458 
00459 
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489 
00490 
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508  template <class T> 
00509  RecursiveFilter<T>::RecursiveFilter(const Basic2DArray<T>& in, Basic2DArray<T>& out): input(in), output(out) {
00510    input_ = new Basic2DArray<double>(in.rows(),in.cols()) ;
00511    output_ = new Basic2DArray<double>(out.rows(),out.cols()) ;
00512    output.resize(out.rows(),out.cols());
00513    toDouble(input,*input_);
00514  }
00515  
00516  template <>
00517    RecursiveFilter<double>::RecursiveFilter(const Basic2DArray<double>& in, Basic2DArray<double>& out): input(in), output(out) {
00518    input_ = const_cast<Basic2DArray<double>*>(&in) ;
00519    
00520    output_ = &out ;
00521    output.resize(out.rows(),out.cols());
00522  }
00523  
00524  template <class T>
00525    void RecursiveFilter<T>::compute_xderiv2ndOrderSmooth(double alpha){
00526    xderiv2ndOrderSmooth(params,alpha) ;
00527    generalRFx(params,*input_,*output_);
00528    cerr << "size = " << output_->rows() << "," << output_->cols() << endl ; 
00529    fromDouble(*output_,output) ;
00530  }
00531  
00532  template <class T>
00533    void RecursiveFilter<T>::compute_yderiv2ndOrderSmooth(double alpha){
00534    yderiv2ndOrderSmooth(params,alpha);
00535    generalRFy(params,*input_,*output_);
00536    fromDouble(*output_,output) ;
00537  }
00538  
00539  template <class T>
00540    void RecursiveFilter<T>::compute_xderiv2ndOrder(double alpha){
00541    xderiv2ndOrder(params,alpha) ;
00542    generalRFx(params,*input_,*output_);
00543    fromDouble(*output_,output) ;
00544  }                                  
00545  
00546  template <class T>
00547    void RecursiveFilter<T>::compute_yderiv2ndOrder(double alpha){
00548    yderiv2ndOrder(params,alpha);
00549    generalRFy(params,*input_,*output_);
00550    fromDouble(*output_,output) ;
00551  }
00552  
00553  template <class T>
00554    void RecursiveFilter<T>::compute_smooth1stOrder(double alpha, double k0){
00555    smooth1stOrder(params,alpha,k0) ;
00556    generalRF(params,*input_,*output_);
00557    fromDouble(*output_,output);
00558  }
00559  
00560  
00561  template <class T>
00562    void RecursiveFilter<T>::compute_smooth1stOrder_x(double alpha, double k0){
00563    smooth1stOrder(params,alpha,k0) ;
00564    generalRFx(params,*input_,*output_);
00565    fromDouble(*output_,output) ;
00566  }
00567  
00568  
00569  template <class T>
00570    void RecursiveFilter<T>::compute_smooth1stOrder_y(double alpha, double k0){
00571    smooth1stOrder(params,alpha,k0) ;
00572    generalRFy(params,*input_,*output_);
00573    fromDouble(*output_,output) ;
00574  }
00575  
00576  
00577  template <class T>
00578    void RecursiveFilter<T>::compute_smooth2ndOrder(double alpha){
00579    smooth2ndOrder(params,alpha) ;
00580    generalRF(params,*input_,*output_);
00581    fromDouble(*output_,output) ;
00582  }
00583  
00584  
00585  template <class T>
00586    void RecursiveFilter<T>::compute_smooth2ndOrder_x(double alpha){
00587    smooth2ndOrder(params,alpha) ;
00588    generalRFx(params,*input_,*output_);
00589    fromDouble(*output_,output) ;
00590  }
00591  
00592  
00593  template <class T>
00594    void RecursiveFilter<T>::compute_smooth2ndOrder_y(double alpha){
00595    smooth2ndOrder(params,alpha) ;
00596    generalRFy(params,*input_,*output_);
00597    fromDouble(*output_,output) ;
00598  }
00599  
00600  
00601  template <class T>
00602    void RecursiveFilter<T>::compute_LL1stOrder(double alpha){
00603    LL1stOrder(params,alpha);
00604    generalRF(params,*input_,*output_);
00605    fromDouble(*output_,output) ;
00606  }
00607  
00608  
00609  template <class T>
00610    void RecursiveFilter<T>::compute_LL1stOrder_x(double alpha){
00611    LL1stOrder(params,alpha);
00612    generalRFx(params,*input_,*output_);
00613    fromDouble(*output_,output) ;
00614  }
00615  
00616  
00617  template <class T>
00618    void RecursiveFilter<T>::compute_LL1stOrder_y(double alpha){
00619    LL1stOrder(params,alpha);
00620    generalRFy(params,*input_,*output_);
00621    fromDouble(*output_,output) ;
00622  }
00623  
00624 }
00625 
00626 
00627 
00628 #endif