sinfo_median.c

00001 /*
00002  * This file is part of the ESO SINFONI Pipeline
00003  * Copyright (C) 2004,2005 European Southern Observatory
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA
00018  */
00019 /*---------------------------------------------------------------------------
00020    
00021    File name     :    sinfo_median.c
00022    Author         :    N. Devillard
00023    Created on    :    1998
00024    Description    :    Fast sinfo_median finding routines.
00025 
00026  *--------------------------------------------------------------------------*/
00027 /*
00028     $Id: sinfo_median.c,v 1.4 2012/03/02 08:42:20 amodigli Exp $
00029     $Author: amodigli $
00030     $Date: 2012/03/02 08:42:20 $
00031     $Revision: 1.4 $
00032 */
00033 
00034 #ifdef HAVE_CONFIG_H
00035 #  include <config.h>
00036 #endif
00037 /*---------------------------------------------------------------------------
00038                                    Includes
00039  ---------------------------------------------------------------------------*/
00040 #include "sinfo_median.h"
00048 /*---------------------------------------------------------------------------
00049                                    Macros
00050  ---------------------------------------------------------------------------*/
00051 #define median_WIRTH(a,n) sinfo_kth_smallest(a,n,(((n)&1)?((n)/2):(((n)/2)-1)))
00052 /*---------------------------------------------------------------------------
00053                               Function codes
00054  ---------------------------------------------------------------------------*/
00083 #define PIX_SWAP(a,b) { register pixelvalue t=(a);(a)=(b);(b)=t; }
00084 
00085 pixelvalue 
00086 sinfo_kth_smallest(pixelvalue a[], int n, int k)
00087 {
00088     register int i,j,l,m ;
00089     register pixelvalue x ;
00090 
00091     l=0 ; m=n-1 ;
00092     while (l<m) {
00093         x=a[k] ;
00094         i=l ;
00095         j=m ;
00096         do {
00097             while (a[i]<x) i++ ;
00098             while (x<a[j]) j-- ;
00099             if (i<=j) {
00100                 PIX_SWAP(a[i],a[j]) ;
00101                 i++ ; j-- ;
00102             }
00103         } while (i<=j) ;
00104         if (j<k) l=i ;
00105         if (k<i) m=j ;
00106     }
00107     return a[k] ;
00108 }
00109 
00110 #undef PIX_SWAP
00111 
00126 #define DBL_SWAP(a,b) { register double t=(a);(a)=(b);(b)=t; }
00127 
00128 double 
00129 sinfo_kth_smallest_double(double a[], int n, int k)
00130 {
00131     register int i,j,l,m ;
00132     register double x ;
00133 
00134     l=0 ; m=n-1 ;
00135     while (l<m) {
00136         x=a[k] ;
00137         i=l ;
00138         j=m ;
00139         do {
00140             while (a[i]<x) i++ ;
00141             while (x<a[j]) j-- ;
00142             if (i<=j) {
00143                 DBL_SWAP(a[i],a[j]) ;
00144                 i++ ; j-- ;
00145             }
00146         } while (i<=j) ;
00147         if (j<k) l=i ;
00148         if (k<i) m=j ;
00149     }
00150     return a[k] ;
00151 }
00152 
00153 #undef DBL_SWAP
00154 
00155 #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
00156 #define PIX_SWAP(a,b) { pixelvalue temp=(a);(a)=(b);(b)=temp; }
00157 
00172 pixelvalue
00173 sinfo_opt_med3(
00174     pixelvalue  *   p
00175 )
00176 {
00177     PIX_SORT(p[0],p[1]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[0],p[1]) ;
00178     return(p[1]) ;
00179 }
00180 
00195 pixelvalue
00196 sinfo_opt_med5(
00197     pixelvalue  *   p
00198 )
00199 {
00200     PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ;
00201     PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ;
00202     PIX_SORT(p[1],p[2]) ; return(p[2]) ;
00203 }
00204 
00219 pixelvalue
00220 sinfo_opt_med7(
00221     pixelvalue  *   p
00222 )
00223 {
00224     PIX_SORT(p[0], p[5]) ; PIX_SORT(p[0], p[3]) ; PIX_SORT(p[1], p[6]) ;
00225     PIX_SORT(p[2], p[4]) ; PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[5]) ;
00226     PIX_SORT(p[2], p[6]) ; PIX_SORT(p[2], p[3]) ; PIX_SORT(p[3], p[6]) ;
00227     PIX_SORT(p[4], p[5]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[1], p[3]) ;
00228     PIX_SORT(p[3], p[4]) ; return (p[3]) ;
00229 }
00230 
00249 pixelvalue
00250 sinfo_opt_med9(
00251     pixelvalue  *   p
00252 )
00253 {
00254     PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
00255     PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
00256     PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
00257     PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
00258     PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
00259     PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
00260     PIX_SORT(p[4], p[2]) ; return(p[4]) ;
00261 }
00262 
00281 pixelvalue
00282 sinfo_opt_med25(
00283     pixelvalue  *   p
00284 )
00285 { 
00286     PIX_SORT(p[0], p[1]) ;   PIX_SORT(p[3], p[4]) ;   PIX_SORT(p[2], p[4]) ;
00287     PIX_SORT(p[2], p[3]) ;   PIX_SORT(p[6], p[7]) ;   PIX_SORT(p[5], p[7]) ;
00288     PIX_SORT(p[5], p[6]) ;   PIX_SORT(p[9], p[10]) ;  PIX_SORT(p[8], p[10]) ;
00289     PIX_SORT(p[8], p[9]) ;   PIX_SORT(p[12], p[13]) ; PIX_SORT(p[11], p[13]) ;
00290     PIX_SORT(p[11], p[12]) ; PIX_SORT(p[15], p[16]) ; PIX_SORT(p[14], p[16]) ;
00291     PIX_SORT(p[14], p[15]) ; PIX_SORT(p[18], p[19]) ; PIX_SORT(p[17], p[19]) ;
00292     PIX_SORT(p[17], p[18]) ; PIX_SORT(p[21], p[22]) ; PIX_SORT(p[20], p[22]) ;
00293     PIX_SORT(p[20], p[21]) ; PIX_SORT(p[23], p[24]) ; PIX_SORT(p[2], p[5]) ;
00294     PIX_SORT(p[3], p[6]) ;   PIX_SORT(p[0], p[6]) ;   PIX_SORT(p[0], p[3]) ;
00295     PIX_SORT(p[4], p[7]) ;   PIX_SORT(p[1], p[7]) ;   PIX_SORT(p[1], p[4]) ;
00296     PIX_SORT(p[11], p[14]) ; PIX_SORT(p[8], p[14]) ;  PIX_SORT(p[8], p[11]) ;
00297     PIX_SORT(p[12], p[15]) ; PIX_SORT(p[9], p[15]) ;  PIX_SORT(p[9], p[12]) ;
00298     PIX_SORT(p[13], p[16]) ; PIX_SORT(p[10], p[16]) ; PIX_SORT(p[10], p[13]) ;
00299     PIX_SORT(p[20], p[23]) ; PIX_SORT(p[17], p[23]) ; PIX_SORT(p[17], p[20]) ;
00300     PIX_SORT(p[21], p[24]) ; PIX_SORT(p[18], p[24]) ; PIX_SORT(p[18], p[21]) ;
00301     PIX_SORT(p[19], p[22]) ; PIX_SORT(p[8], p[17]) ;  PIX_SORT(p[9], p[18]) ;
00302     PIX_SORT(p[0], p[18]) ;  PIX_SORT(p[0], p[9]) ;   PIX_SORT(p[10], p[19]) ;
00303     PIX_SORT(p[1], p[19]) ;  PIX_SORT(p[1], p[10]) ;  PIX_SORT(p[11], p[20]) ;
00304     PIX_SORT(p[2], p[20]) ;  PIX_SORT(p[2], p[11]) ;  PIX_SORT(p[12], p[21]) ;
00305     PIX_SORT(p[3], p[21]) ;  PIX_SORT(p[3], p[12]) ;  PIX_SORT(p[13], p[22]) ;
00306     PIX_SORT(p[4], p[22]) ;  PIX_SORT(p[4], p[13]) ;  PIX_SORT(p[14], p[23]) ;
00307     PIX_SORT(p[5], p[23]) ;  PIX_SORT(p[5], p[14]) ;  PIX_SORT(p[15], p[24]) ;
00308     PIX_SORT(p[6], p[24]) ;  PIX_SORT(p[6], p[15]) ;  PIX_SORT(p[7], p[16]) ;
00309     PIX_SORT(p[7], p[19]) ;  PIX_SORT(p[13], p[21]) ; PIX_SORT(p[15], p[23]) ;
00310     PIX_SORT(p[7], p[13]) ;  PIX_SORT(p[7], p[15]) ;  PIX_SORT(p[1], p[9]) ;
00311     PIX_SORT(p[3], p[11]) ;  PIX_SORT(p[5], p[17]) ;  PIX_SORT(p[11], p[17]) ;
00312     PIX_SORT(p[9], p[17]) ;  PIX_SORT(p[4], p[10]) ;  PIX_SORT(p[6], p[12]) ;
00313     PIX_SORT(p[7], p[14]) ;  PIX_SORT(p[4], p[6]) ;   PIX_SORT(p[4], p[7]) ;
00314     PIX_SORT(p[12], p[14]) ; PIX_SORT(p[10], p[14]) ; PIX_SORT(p[6], p[7]) ;
00315     PIX_SORT(p[10], p[12]) ; PIX_SORT(p[6], p[10]) ;  PIX_SORT(p[6], p[17]) ;
00316     PIX_SORT(p[12], p[17]) ; PIX_SORT(p[7], p[17]) ;  PIX_SORT(p[7], p[10]) ;
00317     PIX_SORT(p[12], p[18]) ; PIX_SORT(p[7], p[12]) ;  PIX_SORT(p[10], p[18]) ;
00318     PIX_SORT(p[12], p[20]) ; PIX_SORT(p[10], p[20]) ; PIX_SORT(p[10], p[12]) ;
00319  
00320     return (p[12]);
00321 } 
00322 
00323 #undef PIX_SORT
00324 #undef PIX_SWAP
00325 
00341 pixelvalue 
00342 sinfo_median_pixelvalue(pixelvalue * a, int n)
00343 {
00344     pixelvalue    sinfo_median ;
00345 
00346     switch(n) {
00347         case 3:
00348         sinfo_median = sinfo_opt_med3(a);
00349         break ;
00350 
00351         case 5:
00352         sinfo_median = sinfo_opt_med5(a);
00353         break ;
00354 
00355         case 7:
00356         sinfo_median = sinfo_opt_med7(a);
00357         break ;
00358 
00359         case 9:
00360         sinfo_median = sinfo_opt_med9(a);
00361         break ;
00362 
00363         case 25:
00364         sinfo_median = sinfo_opt_med25(a);
00365         break ;
00366 
00367         default:
00368         sinfo_median = median_WIRTH(a,n);
00369         break ;
00370     }
00371     return sinfo_median;
00372 }
00373 

Generated on 3 Mar 2013 for SINFONI Pipeline Reference Manual by  doxygen 1.6.1