#include "mrilib.h"
/*--------------------------------------------------------------------------*/
MRI_IMAGE * mri_fft2D( MRI_IMAGE * im , int mode )
{
MRI_IMAGE * cxim , * outim ;
int nx,ny , nxup,nyup , ii,jj ;
complex * cxar , * outar , * cpt , * opt ;
if( im == NULL ) return NULL ;
/* convert input to complex */
cxim = mri_to_complex(im) ;
cxar = MRI_COMPLEX_PTR(cxim) ;
/* compute size of output */
nx = cxim->nx ; nxup = csfft_nextup_one35(nx) ;
ny = cxim->ny ; nyup = csfft_nextup_one35(ny) ;
/* create output array */
outim = mri_new( nxup , nyup , MRI_complex ) ;
outar = MRI_COMPLEX_PTR(outim) ;
/* copy input to output, zero padding along the way */
opt = outar ;
cpt = cxar ;
for( jj=0 ; jj < ny ; jj++ ){
for( ii=0 ; ii < nx ; ii++ ){opt->r=cpt->r; opt->i=cpt->i; opt++; cpt++;}
for( ; ii < nxup ; ii++ ){opt->r=opt->i=0.0; opt++;}
}
for( ; jj < nyup ; jj++ ){opt->r=opt->i=0.0; opt++;}
mri_free(cxim) ;
/* row FFTs */
for( jj=0 ; jj < ny ; jj++ )
csfft_cox( mode , nxup , outar+jj*nxup ) ;
/* column FFTs */
cxar = (complex *) malloc(sizeof(complex)*nyup) ;
for( ii=0 ; ii < nxup ; ii++ ){
for( jj=0 ; jj < nyup ; jj++ ) cxar[jj] = outar[ii+jj*nxup] ;
csfft_cox( mode , nyup , cxar ) ;
for( jj=0 ; jj < nyup ; jj++ ) outar[ii+jj*nxup] = cxar[jj] ;
}
free(cxar) ; return outim ;
}
/*--------------------------------------------------------------------------*/
MRI_IMAGE * cx_scramble( MRI_IMAGE * ima , MRI_IMAGE * imb ,
float alpha , float beta )
{
int ii , npix ;
double r1,r2 , t1,t2 , rr,tt ;
complex * ar , * br , * cr ;
double aa,aa1 , bb,bb1 ;
MRI_IMAGE * imc ;
if( ima == NULL || ima->kind != MRI_complex ||
imb == NULL || imb->kind != MRI_complex ||
ima->nx != imb->nx || ima->ny != imb->ny ||
alpha < 0.0 || alpha > 1.0 ||
beta < 0.0 || beta > 1.0 ) return NULL ;
npix = ima->nvox ;
ar = MRI_COMPLEX_PTR(ima) ;
br = MRI_COMPLEX_PTR(imb) ;
imc = mri_new_conforming( ima , MRI_complex ) ;
cr = MRI_COMPLEX_PTR(imc) ;
aa = alpha ; aa1 = 1.0 - aa ;
bb = beta ; bb1 = 1.0 - bb ;
for( ii=0 ; ii < npix ; ii++ ){
r1 = CABS(ar[ii]) ; r2 = CABS(br[ii]) ; rr = pow(r1,aa)*pow(r2,aa1) ;
t1 = CARG(ar[ii]) ; t2 = CARG(br[ii]) ; tt = t1-t2 ;
if( tt < -PI ) t2 -= 2.0*PI ;
else if( tt > PI ) t2 += 2.0*PI ;
tt = bb*t1 + bb1*t2 ;
cr[ii].r = rr * cos(tt) ; cr[ii].i = rr * sin(tt) ;
}
return imc ;
}
/*--------------------------------------------------------------------------*/
MRI_IMAGE * mri_scramble( MRI_IMAGE * ima , MRI_IMAGE * imb ,
float alpha , float beta )
{
MRI_IMAGE * cxa, * cxb, * cxc ;
int nx,ny , nxup,nyup ;
if( ima == NULL || imb == NULL ||
ima->nx != imb->nx || ima->ny != imb->ny ||
alpha < 0.0 || alpha > 1.0 ||
beta < 0.0 || beta > 1.0 ) return NULL ;
cxa = mri_fft2D( ima , -1 ) ;
cxb = mri_fft2D( imb , -1 ) ;
cxc = cx_scramble( cxa,cxb,alpha,beta ) ;
mri_free(cxa) ; mri_free(cxb) ;
cxa = mri_fft2D( cxc , 1 ) ;
mri_free(cxc) ;
cxb = mri_to_mri( ima->kind , cxa ) ;
mri_free(cxa) ;
return cxb ;
}
/*--------------------------------------------------------------------------*/
int main( int argc , char * argv[] )
{
float alpha,beta ;
MRI_IMAGE * ima , * imb , * imc , * imd ;
int nx,ny,nxup,nyup ;
if( argc < 6 ){
printf("Usage: phace alpha beta im1 im2 fname\n") ; exit(0) ;
}
alpha = strtod(argv[1],NULL) ;
beta = strtod(argv[2],NULL) ;
ima = mri_read(argv[3]) ;
imb = mri_read(argv[4]) ;
imc = mri_scramble( ima,imb , alpha,beta ) ;
nx = ima->nx ; ny = ima->ny ;
nxup = imc->nx ; nyup = imc->ny ;
if( nx < nxup || ny < nyup ){
imd = mri_cut_2D( imc , 0,nx-1 , 0,ny-1 ) ;
mri_free(imc) ;
imc = imd ;
}
mri_free(ima) ; mri_free(imb) ;
mri_write( argv[5] , imd ) ;
exit(0) ;
}
syntax highlighted by Code2HTML, v. 0.9.1