void // space to frequency mad_cmat_nfft (const cnum_t x[], const num_t x_node[], cnum_t r[], ssz_t m, ssz_t n, ssz_t nr) { assert( x && r ); int precomp = 0; if (m != p_n1 || n != p_n2 || nr != p_m) { nfft_finalize(&p); nfft_init_2d (&p, m, n, nr); p_n1 = m, p_n2 = n, p_m = nr, precomp = 1; } if (x_node || precomp) { for (ssz_t i=0; i < m*n; i++) // adjoint transform needs -x_node p.x[i] = x_node[i] == -0.5 ? 0.4999999999999999 : -x_node[i]; if(p.flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); } mad_cvec_copy(x, p.f, m*n); const char *error_str = nfft_check(&p); if (error_str) error("%s", error_str); nfft_adjoint(&p); // nfft_adjoint_direct(&p); // mad_cvec_copy(p.f_hat, r, nr); mad_cvec_copy(p.f_hat+nr/2, r, nr/2); // for compatibility with FFTW ?? (TBC) mad_cvec_copy(p.f_hat, r+nr/2, nr/2); }
void // frequency to space mad_cmat_infft (const cnum_t x[], const num_t r_node[], cnum_t r[], ssz_t m, ssz_t n, ssz_t nx) { assert( x && r ); int precomp = 0; if (m != p_n1 || n != p_n2 || nx != p_m) { nfft_finalize(&p); nfft_init_2d (&p, m, n, nx); p_n1 = m, p_n2 = n, p_m = nx, precomp = 1; } if (r_node || precomp) { for (ssz_t i=0; i < m*n; i++) // forward transform needs -r_node p.x[i] = r_node[i] == -0.5 ? 0.4999999999999999 : -r_node[i]; if(p.flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); } // mad_cvec_copy(x, p.f_hat, nx); mad_cvec_copy(x+nx/2, p.f_hat, nx/2); // for compatibility with FFTW ?? (TBC) mad_cvec_copy(x, p.f_hat+nx/2, nx/2); const char *error_str = nfft_check(&p); if (error_str) error("%s", error_str); nfft_trafo(&p); // nfft_trafo_direct(&p); mad_cvec_copy(p.f, r, m*n); mad_cvec_muln(r, 1.0/(m*n), r, m*n); }
void FC_FUNC(oct_nfft_check, OCT_NFFT_CHECK) (nfft_plan *ths) { nfft_check (ths); }