26 #define CSWAP(x,y) {double _Complex * NFFT_SWAP_temp__; \
27 NFFT_SWAP_temp__=(x); (x)=(y); (y)=NFFT_SWAP_temp__;}
29 void simple_test_nnfft_1d(
void)
38 nnfft_init(&my_plan, 1, 3, 19, N);
43 my_plan.
x[j]=((double)rand())/((
double)RAND_MAX)-0.5;
48 my_plan.
v[j]=((double)rand())/((
double)RAND_MAX)-0.5;
64 nnfft_precompute_one_psi(&my_plan);
69 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
71 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"given Fourier coefficients, vector f_hat");
74 nnfft_trafo_direct(&my_plan);
75 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nndft, vector f");
78 nnfft_trafo(&my_plan);
79 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nnfft, vector f");
82 nnfft_finalize(&my_plan);
85 static
void simple_test_adjoint_nnfft_1d(
void)
94 nnfft_init(&my_plan, 1, 20, 33, N);
99 my_plan.
x[j]=((double)rand())/((
double)RAND_MAX)-0.5;
104 my_plan.
v[j]=((double)rand())/((
double)RAND_MAX)-0.5;
109 nnfft_precompute_psi(&my_plan);
112 nnfft_precompute_full_psi(&my_plan);
115 nnfft_precompute_lin_psi(&my_plan);
119 nnfft_precompute_phi_hut(&my_plan);
123 my_plan.
f[j] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
125 nfft_vpr_complex(my_plan.f,my_plan.M_total,"given Samples, vector f");
128 nnfft_adjoint_direct(&my_plan);
129 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nndft, vector f_hat");
132 nnfft_adjoint(&my_plan);
133 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nnfft, vector f_hat");
136 nnfft_finalize(&my_plan);
139 static
void simple_test_nnfft_2d(
void)
149 nnfft_init(&my_plan, 2,12*14,19, N);
154 my_plan.
x[2*j]=((double)rand())/((
double)RAND_MAX)-0.5;
155 my_plan.
x[2*j+1]=((double)rand())/((
double)RAND_MAX)-0.5;
161 my_plan.
v[2*j]=((double)rand())/((
double)RAND_MAX)-0.5;
162 my_plan.
v[2*j+1]=((double)rand())/((
double)RAND_MAX)-0.5;
167 nnfft_precompute_psi(&my_plan);
170 nnfft_precompute_full_psi(&my_plan);
173 nnfft_precompute_lin_psi(&my_plan);
177 nnfft_precompute_phi_hut(&my_plan);
181 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
183 nfft_vpr_complex(my_plan.f_hat,12,
184 "given Fourier coefficients, vector f_hat (first 12 entries)");
187 nnfft_trafo_direct(&my_plan);
188 nfft_vpr_complex(my_plan.f,my_plan.M_total,"ndft, vector f");
191 nnfft_trafo(&my_plan);
192 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nfft, vector f");
195 nnfft_finalize(&my_plan);
198 static
void simple_test_innfft_1d(
void)
205 nnfft_init(&my_plan,1 ,8 ,8 ,&N);
212 my_plan.
x[j]=((
double)rand())/((double)RAND_MAX)-0.5;
216 my_plan.
v[k]=((
double)rand())/((
double)RAND_MAX)-0.5;
220 nnfft_precompute_psi(&my_plan);
223 nnfft_precompute_full_psi(&my_plan);
227 nnfft_precompute_phi_hut(&my_plan);
231 my_iplan.
y[j] = ((
double)rand())/((double)RAND_MAX);
233 nfft_vpr_complex(my_iplan.
y,my_plan.
M_total,
"given data, vector given_f");
240 "approximate solution, vector f_hat_iter");
243 solver_before_loop_complex(&my_iplan);
247 printf(
"iteration l=%d\n",l);
248 solver_loop_one_step_complex(&my_iplan);
250 "approximate solution, vector f_hat_iter");
253 nnfft_trafo(&my_plan);
254 nfft_vpr_complex(my_plan.
f,my_plan.
M_total,
"fitting the data, vector f");
258 solver_finalize_complex(&my_iplan);
259 nnfft_finalize(&my_plan);
262 static void measure_time_nnfft_1d(
void)
270 for(my_N=16; my_N<=16384; my_N*=2)
272 nnfft_init(&my_plan,1,my_N,my_N,&N);
275 my_plan.
x[j]=((
double)rand())/((double)RAND_MAX)-0.5;
278 my_plan.
v[j]=((
double)rand())/((
double)RAND_MAX)-0.5;
281 nnfft_precompute_psi(&my_plan);
284 nnfft_precompute_full_psi(&my_plan);
287 nnfft_precompute_phi_hut(&my_plan);
290 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
292 t0 = nfft_clock_gettime_seconds();
293 nnfft_trafo_direct(&my_plan);
294 t1 = nfft_clock_gettime_seconds();
296 printf("t_nndft=%e,\t",t);
298 t0 = nfft_clock_gettime_seconds();
299 nnfft_trafo(&my_plan);
300 t1 = nfft_clock_gettime_seconds();
302 printf("t_nnfft=%e\t",t);
304 printf("(N=M=%d)\n",my_N);
306 nnfft_finalize(&my_plan);
313 printf(
"1) computing a one dimensional nndft, nnfft\n\n");
314 simple_test_nnfft_1d();
fftw_complex * f_hat
Fourier coefficients.
unsigned nnfft_flags
flags for precomputation, malloc
double * v
nodes (in fourier domain)
NFFT_INT M_total
Total number of samples.
data structure for an NNFFT (nonequispaced in time and frequency fast Fourier transform) plan with do...
double * x
nodes (in time/spatial domain)
fftw_complex * y
right hand side, samples
NFFT_INT N_total
Total number of Fourier coefficients.
data structure for an inverse NFFT plan with double precision
#define CSWAP(x, y)
Swap two vectors.
fftw_complex * f_hat_iter
iterative solution