float DES_solve( MRI_IMAGE *psinv , float *z , float *coef , float *wks ) { float *psar , *iar , zi ; int ii,jj , ntim,nref ; ntim = psinv->ny ; nref = psinv->nx ; psar = MRI_FLOAT_PTR(psinv) ; /* step 1: despike the data the simplistic way */ if( use_des25 ) (void) DES_despike25( ntim , z , wks ) ; else (void) DES_despike9( ntim , z , wks ) ; /* least squares solve the equations with the modified data */ for( jj=0 ; jj < nref ; jj++ ) coef[jj] = 0.0f ; for( ii=0 ; ii < ntim ; ii++ ){ iar = psar + ii*nref ; zi = z[ii] ; for( jj=0 ; jj < nref ; jj++ ) coef[jj] += iar[jj]*zi ; } return 0.0f ; }
static int DES_despike25( int num , float *vec , float *wks ) { int ii , nsp ; float *zma,*zme , med,mad,val ; if( vec == NULL ) return 0 ; if( num < 25 ) return DES_despike9(num,vec,wks) ; if( wks != NULL ) zme = wks ; else zme = (float *)malloc(sizeof(float)*(2*num)) ; zma = zme + num ; DES9_init ; /* 18 Apr 2019 */ for( ii=0 ; ii < num ; ii++ ){ mead25(ii) ; zme[ii] = med ; zma[ii] = mad ; } mad = qmed_float(num,zma) ; if( mad <= 0.0f ){ if( wks == NULL ) free(zme); return 0; } /* should not happen */ mad *= 6.789f ; /* threshold value */ for( nsp=ii=0 ; ii < num ; ii++ ) if( fabsf(vec[ii]-zme[ii]) > mad ){ vec[ii] = zme[ii]; nsp++; } if( wks == NULL ) free(zme) ; return nsp ; }
int DES_despike25( int num , float *vec , float *wks ) { int ii , nsp ; float *zma,*zme , med,mad,val ; if( vec == NULL ) return 0 ; if( num < 25 ) return DES_despike9(num,vec,wks) ; zme = wks ; zma = zme + num ; for( ii=0 ; ii < num ; ii++ ){ mead25(ii) ; zme[ii] = med ; zma[ii] = mad ; } mad = qmed_float(num,zma) ; if( mad <= 0.0f ){ if( wks == NULL ) free(zme); return 0; } /* should not happen */ mad *= 6.789f ; /* threshold value */ for( nsp=ii=0 ; ii < num ; ii++ ) if( fabsf(vec[ii]-zme[ii]) > mad ){ vec[ii] = zme[ii]; nsp++; } return nsp ; }
void DES_despike25( int num , float *vec ) { int ii , nsp ; float *zma,*zme , med,mad,val ; if( deswks == NULL ) deswks = (float *)malloc(sizeof(float *)*(4*num)) ; if( vec == NULL ) return ; if( num < 25 ) { DES_despike9(num,vec) ; return ; } zme = deswks ; zma = zme + num ; for( ii=0 ; ii < num ; ii++ ){ mead25(ii) ; zme[ii] = med ; zma[ii] = mad ; } mad = qmed_float(num,zma) ; if( mad <= 0.0f ) return ; mad *= 6.789f ; /* threshold value */ for( nsp=ii=0 ; ii < num ; ii++ ) if( fabsf(vec[ii]-zme[ii]) > mad ){ vec[ii] = zme[ii]; nsp++; } return ; }