Doxygen Source Code Documentation
thd_detrend.c File Reference
#include "mrilib.h"
Go to the source code of this file.
Functions | |
void | THD_const_detrend (int npt, float *xx, float *xx0) |
void | get_linear_trend (int npt, float *xx, float *f0, float *f1) |
void | THD_linear_detrend (int npt, float *far, float *xx0, float *xx1) |
void | get_quadratic_trend (int npt, float *xx, float *f0, float *f1, float *f2) |
void | THD_quadratic_detrend (int npt, float *far, float *xx0, float *xx1, float *xx2) |
void | THD_cubic_detrend (int npt, float *far) |
void | THD_normalize (int npt, float *far) |
void | THD_generic_detrend (int npt, float *far, int polort, int nort, float **ort) |
Function Documentation
|
Definition at line 27 of file thd_detrend.c. References x0. Referenced by absfft_func(), linear_filter_trend(), and THD_linear_detrend().
00028 { 00029 double t1,t3,t10 , x0,x1 ; 00030 int ii ; 00031 00032 if( npt < 2 || xx == NULL || f0 == NULL || f1 == NULL ) return ; 00033 00034 x0 = xx[0] ; x1 = 0.0 ; 00035 for( ii=1 ; ii < npt ; ii++ ){ 00036 x0 += xx[ii] ; 00037 x1 += xx[ii] * ii ; 00038 } 00039 00040 t1 = npt*x0; t3 = 1.0/npt; t10 = npt*npt; 00041 00042 *f0 = (float)(2.0/(npt+1.0)*t3*(2.0*t1-3.0*x1-x0)); 00043 *f1 = (float)(-6.0/(t10-1.0)*t3*(-x0-2.0*x1+t1)); 00044 return ; 00045 } |
|
Definition at line 76 of file thd_detrend.c. Referenced by THD_quadratic_detrend().
00077 { 00078 double x0,x1,x2 , N=npt ; 00079 int ii ; 00080 00081 if( npt < 3 || xx == NULL || f0 == NULL || f1 == NULL || f2 == NULL ) return; 00082 00083 x0 = xx[0] ; x1 = x2 = 0.0 ; 00084 for( ii=1 ; ii < npt ; ii++ ){ 00085 x0 += xx[ii] ; 00086 x1 += (xx[ii] * ii) ; 00087 x2 += (xx[ii] * ii) * ii ; 00088 } 00089 00090 *f0 = ( 3.0*(3.0*N*N-3.0*N+2.0) * x0 00091 -18.0*(-1.0+2.0*N) * x1 00092 +30.0 * x2 ) / (N*(N+2.0)*(N+1.0)) ; 00093 00094 *f1 = ( -18.0*(-1.0+2.0*N) * x0 00095 +12.0*(-1.0+2.0*N)*(8.0*N-11.0) * x1 /((N-1.0)*(N-2.0)) 00096 -180.0 * x2 /(N-2.0) ) 00097 / (N*(N+2.0)*(N+1.0)) ; 00098 00099 *f2 = ( 30.0 * x0 00100 -180.0 * x1 / (N-2.0) 00101 +180.0 * x2 / ((N-1.0)*(N-2.0)) ) / (N*(N+2.0)*(N+1.0)) ; 00102 return ; 00103 } |
|
Definition at line 11 of file thd_detrend.c.
00012 { 00013 int ii ; float xbar ; 00014 00015 if( npt < 2 || xx == NULL ) return ; 00016 00017 xbar = 0.0 ; 00018 for( ii=0 ; ii < npt ; ii++ ) xbar += xx[ii] ; 00019 xbar /= npt ; 00020 for( ii=0 ; ii < npt ; ii++ ) xx[ii] -= xbar ; 00021 if( xx0 != NULL ) *xx0 = xbar ; 00022 return ; 00023 } |
|
Cubic detrend a float array in place. Definition at line 134 of file thd_detrend.c. References far.
00135 { 00136 register int ii ; 00137 float g0,g1,g2,g3 , f0,f1,f2,f3 , t1,t2,t5,t8 , t95,t56,t22,t25,txx ; 00138 00139 if( npt < 5 || far == NULL ) return ; 00140 00141 t8 = npt*npt ; t2 = npt-1.0 ; t5 = t2*(npt-2.0) ; 00142 t95 = 0.05*t5*(npt-3.0) ; 00143 t56 = 0.16666667*t5 ; 00144 t22 = 0.5*t2 ; 00145 t25 = 1.5*t2 ; 00146 txx = 0.6*t8-1.5*npt+1.1 ; 00147 00148 g0=g1=g2=g3=0.0 ; 00149 for( ii=0 ; ii < npt ; ii++ ){ 00150 t1 = ii*ii ; 00151 f1 = ii - t22 ; 00152 f2 = t1 - t2*ii + t56 ; 00153 f3 = t1*(ii - t25) + txx*ii - t95 ; 00154 00155 g0 += far[ii] ; 00156 g1 += far[ii] * f1 ; 00157 g2 += far[ii] * f2 ; 00158 g3 += far[ii] * f3 ; 00159 } 00160 g0 *= (1.0/npt) ; 00161 g1 *= 12.0/(npt*(t8-1.0)) ; 00162 g2 *= 180.0/(npt*(t8-1.0)*(t8-4.0)) ; 00163 g3 *= 2800.0/(npt*(t8-1.0)*(t8-4.0)*(t8-9.0)) ; 00164 00165 for( ii=0 ; ii < npt ; ii++ ){ 00166 t1 = ii*ii ; 00167 f1 = ii- t22 ; 00168 f2 = t1 - t2*ii + t56 ; 00169 f3 = t1*(ii - t25) + txx*ii - t95 ; 00170 00171 far[ii] -= ( g0 + g1*f1 + g2*f2 + g3*f3 ) ; 00172 } 00173 00174 return ; 00175 } |
|
Detrend a vector with a given polort level, plus some others. ------------------------------------------------------------------------- Definition at line 200 of file thd_detrend.c. References far, fit, free, lsqfit(), malloc, and ref. Referenced by main().
00202 { 00203 int ii,jj , nref ; 00204 float **ref , *fit , xmid , xfac , val ; 00205 00206 /* check inputs */ 00207 00208 if( npt <= 1 || far == NULL ) return ; 00209 if( nort > 0 ){ 00210 if( ort == NULL ) return ; 00211 for( jj=0 ; jj < nort ; jj++ ) if( ort[jj] == NULL ) return ; 00212 } 00213 if( polort < 0 ) polort = -1 ; 00214 if( nort < 0 ) nort = 0 ; 00215 00216 nref = polort+1+nort ; 00217 if( nref == 0 || nref >= npt-1 ) return ; 00218 00219 ref = (float **) malloc( sizeof(float *) * nref ) ; 00220 xmid = 0.5*(npt-1) ; xfac = 1.0 / xmid ; 00221 for( jj=0 ; jj <= polort ; jj++ ){ 00222 ref[jj] = (float *) malloc( sizeof(float) * npt ) ; 00223 switch( jj ){ 00224 case 0: 00225 for( ii=0 ; ii < npt ; ii++ ) ref[jj][ii] = 1.0 ; 00226 break ; 00227 00228 case 1: 00229 for( ii=0 ; ii < npt ; ii++ ) ref[jj][ii] = xfac*(ii-xmid) ; 00230 break ; 00231 00232 case 2: 00233 for( ii=0 ; ii < npt ; ii++ ){ 00234 val = xfac*(ii-xmid) ; ref[jj][ii] = val*val ; 00235 } 00236 break ; 00237 00238 case 3: 00239 for( ii=0 ; ii < npt ; ii++ ){ 00240 val = xfac*(ii-xmid) ; ref[jj][ii] = val*val*val ; 00241 } 00242 break ; 00243 00244 default: 00245 for( ii=0 ; ii < npt ; ii++ ){ 00246 val = xfac*(ii-xmid) ; ref[jj][ii] = pow(val,(double)(jj)) ; 00247 } 00248 break ; 00249 } 00250 } 00251 for( jj=0 ; jj < nort ; jj++ ) /* user supplied refs */ 00252 ref[polort+1+jj] = ort[jj] ; 00253 00254 fit = lsqfit( npt , far , NULL , nref , ref ) ; 00255 00256 if( fit != NULL ){ /* good */ 00257 for( ii=0 ; ii < npt ; ii++ ){ 00258 val = far[ii] ; 00259 for( jj=0 ; jj < nref ; jj++ ) 00260 val -= fit[jj] * ref[jj][ii] ; 00261 far[ii] = val ; 00262 } 00263 free(fit) ; 00264 } else { 00265 fprintf(stderr,"THD_generic_detrend: lsqfit fails - no detrending!\n") ; 00266 } 00267 00268 for( jj=0 ; jj <= polort ; jj++ ) free(ref[jj]) ; 00269 free(ref) ; return ; 00270 } |
|
Definition at line 53 of file thd_detrend.c. References far, and get_linear_trend(). Referenced by main(), normalize_floatvector(), and THD_dataset_tshift().
00054 { 00055 register int ii ; 00056 float f0 , f1 ; 00057 00058 if( npt < 3 || far == NULL ) return ; 00059 00060 get_linear_trend( npt , far , &f0 , &f1 ) ; 00061 00062 far[0] -= f0 ; 00063 for( ii=1 ; ii < npt ; ii++ ) far[ii] -= (f0 + f1*ii) ; 00064 00065 if( xx0 != NULL ) *xx0 = f0 ; 00066 if( xx1 != NULL ) *xx1 = f1 ; 00067 00068 return ; 00069 } |
|
Definition at line 181 of file thd_detrend.c. References far. Referenced by main().
00182 { 00183 register int ii ; 00184 register float fac ; 00185 00186 if( npt <= 0 || far == NULL ) return ; 00187 00188 fac = 0 ; 00189 for( ii=0 ; ii < npt ; ii++ ) fac += far[ii]*far[ii] ; 00190 if( fac == 0.0 ) return ; 00191 fac = 1.0 / sqrt(fac) ; 00192 for( ii=0 ; ii < npt ; ii++ ) far[ii] /= fac ; 00193 return ; 00194 } |
|
Definition at line 111 of file thd_detrend.c. References far, and get_quadratic_trend(). Referenced by main().
00113 { 00114 register int ii ; 00115 float f0 , f1 , f2 ; 00116 00117 if( npt < 4 || far == NULL ) return ; 00118 00119 get_quadratic_trend( npt , far , &f0 , &f1 , &f2 ) ; 00120 00121 far[0] -= f0 ; 00122 for( ii=1 ; ii < npt ; ii++ ) far[ii] -= ( (f2*ii + f1)*ii + f0 ) ; 00123 00124 if( xx0 != NULL ) *xx0 = f0 ; 00125 if( xx1 != NULL ) *xx1 = f1 ; 00126 if( xx2 != NULL ) *xx2 = f2 ; 00127 00128 return ; 00129 } |