8 const Vector<t_complex> &weights,
const t_uint &imsizey_,
9 const t_uint &imsizex_,
const t_real &oversample_ratio,
10 const std::function<t_real(t_real)> kernelu,
11 const std::function<t_real(t_real)> kernelv,
12 const t_uint Ju ,
const t_uint Jv ) {
13 const t_uint ftsizev_ = std::floor(imsizey_ * oversample_ratio);
14 const t_uint ftsizeu_ = std::floor(imsizex_ * oversample_ratio);
15 const t_uint rows =
u.size();
16 const t_uint cols = ftsizeu_ * ftsizev_;
17 if (
u.size() !=
v.size())
18 throw std::runtime_error(
19 "Size of u and v vectors are not the same for creating gridding matrix.");
22 interpolation_matrix.reserve(Vector<t_int>::Constant(rows, Ju * Jv));
24 const t_complex
I(0, 1);
25 const t_int ju_max = std::min(Ju, ftsizeu_);
26 const t_int jv_max = std::min(Jv, ftsizev_);
29 #pragma omp parallel for
30 for (t_int m = 0; m < rows; ++m) {
31 for (t_int ju = 1; ju < ju_max + 1; ++ju) {
32 for (t_int jv = 1; jv < jv_max + 1; ++jv) {
33 const t_real k_u = std::floor(
u(m) - ju_max * 0.5);
34 const t_real k_v = std::floor(
v(m) - jv_max * 0.5);
38 interpolation_matrix.insert(m, index) =
39 std::exp(-2 *
constant::pi *
I * ((k_u + ju) * 0.5 + (k_v + jv) * 0.5)) *
40 kernelu(
u(m) - (k_u + ju)) * kernelv(
v(m) - (k_v + jv)) * weights(m);
44 return interpolation_matrix;
48 const t_uint &imsizex_,
49 const std::function<t_real(t_real)> ftkernelu,
50 const std::function<t_real(t_real)> ftkernelv,
51 const t_real &w_mean,
const t_real &cellx,
const t_real &celly) {
52 const t_uint ftsizeu_ = std::floor(imsizex_ * oversample_ratio);
53 const t_uint ftsizev_ = std::floor(imsizey_ * oversample_ratio);
54 const t_uint x_start = std::floor(ftsizeu_ * 0.5 - imsizex_ * 0.5);
55 const t_uint y_start = std::floor(ftsizev_ * 0.5 - imsizey_ * 0.5);
58 range.setLinSpaced(std::max(ftsizeu_, ftsizev_), 0.5, std::max(ftsizeu_, ftsizev_) - 0.5);
59 return ((1e0 / range.segment(y_start, imsizey_).unaryExpr(ftkernelv)).matrix() *
60 (1e0 / range.segment(x_start, imsizex_).unaryExpr(ftkernelu)).matrix().transpose())
const std::vector< t_real > u
data for u coordinate
const std::vector< t_real > v
data for v coordinate
const t_real pi
mathematical constant
Image< t_complex > init_correction2d(const t_real &oversample_ratio, const t_uint &imsizey_, const t_uint &imsizex_, const std::function< t_real(t_real)> ftkernelu, const std::function< t_real(t_real)> ftkernelv, const t_real &w_mean, const t_real &cellx, const t_real &celly)
Sparse< t_complex > init_gridding_matrix_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_complex > &weights, const t_uint &imsizey_, const t_uint &imsizex_, const t_real &oversample_ratio, const std::function< t_real(t_real)> kernelu, const std::function< t_real(t_real)> kernelv, const t_uint Ju, const t_uint Jv)
Construct gridding matrix.
t_int sub2ind(const t_int &row, const t_int &col, const t_int &rows, const t_int &cols)
Converts from subscript to index for matrix.
t_real mod(const t_real &x, const t_real &y)
Mod function modified to wrap circularly for negative numbers.
Matrix< t_complex > generate_chirp(const t_real w_rate, const t_real cell_x, const t_real cell_y, const t_uint x_size, const t_uint y_size)
Generates image of chirp.
Eigen::SparseMatrix< T, Eigen::RowMajor, I > Sparse
A matrix of a given type.