-
Notifications
You must be signed in to change notification settings - Fork 13
Notes on measurement operator
The measurement operator maps between the model of the sky and what the telescope would measure. For a radio interferometric telescope, this is a model of the radio sky and its Fourier coefficients. Ideally, the model of the sky could be Fourier transformed directly to get the coefficients, but this is not computationally possible for large images and many coefficients. As an approximation, an FFT is used, with interpolation of coefficients off the FFT grid as an approximation.
template <class T>
sopt::LinearTransform<T>
init_degrid_operator_2d(const utilities::vis_params &uv_vis_input, const t_uint &imsizey,
const t_uint &imsizex, const t_real &cell_x, const t_real &cell_y,
const t_real &oversample_ratio = 2, const t_uint &power_iters = 100,
const t_real &power_tol = 1e-4, const std::string &kernel = "kb",
const t_uint Ju = 4, const t_uint Jv = 4,
const std::string &ft_plan = "measure", const bool w_term = false,
const t_real &energy_chirp_fraction = 1,
const t_real &energy_kernel_fraction = 1) {
The returned object is a sopt::LinearTransform<T>
operator. This represents a matrix of dimensions (M, N)
, where N = imsizey * imsizex
is the size of the image vector and M = uv_vis_input.u.size()
is the size of the measurements vector. Typically, T = Vector<t_complex>
, and the operator can be applied to Vector<t_complex>
const sopt::LinearTransform<Vector<t_complex>> measure_op = measurementoperator::init_degrid_operator_2d(uv_vis_input, imsizey, imsizex, cell_y, cell_x);
const auto x = Vector<t_complex>::Random(imsizey * imsizex);
const auto y = measure_op * x;
const auto y_indirect = Vector<t_complex>::Random(uv_vis_input.u.size());
const auto x_indirect = measure_op.adjoint() * y_indirect;
where we have applied the linear transform measure_op
and its adjoint measure_op.adjoint()
.
The vectors uv_vis_input.u, uv_vis_input.v, uv_vis_input.w
represent the coordinates in the Fourier domain. For small field of view, we assume that uv_vis_input.w=0
, and the coordinates are on a 2D (u, v) plane.
The uv_vis_input.weights
are the weights applied to each measurement. This would be the inverse of the covariance matrix of the measurements, which we assume to be diagonal.
imsizey
and imsizex
are the height and width of the model image in pixels.
cell_y
and cell_x
are the height and width of a pixel in arcseconds. This is only important if w_term = true
or if uv_vis_input.units = lambda
.
oversample_ratio
is the ratio to zero pad the image before the FFT, to increase interpolation accuracy.
power_iters
is the number of iterations needed for the power method, used to estimate the normalisation of the operator.
power_tol
is the relative difference convergence criteria for the power method.
kernel
is the type of interpolation kernel to use in degridding.
Ju
, Jv
is the support size of the interpolation kernel.
ft_plan
is the type of planning done by FFTW, and can be either measure
or estimate
.
w_term
can be true
or false
. It will tell the measurement operator to perform corrections to the interpolation kernel for when uv_vis_input.w != 0
, using what is known as the w-projection. This will slow down the measurement operator construction greatly.
energy_chirp_fraction
only applies when w_term = true
, and should speed up computation. It says how much energy the w_term
correction should keep.
energy_kernel_fraction
only applies when w_term = true
, and should speed up computation. It says how much energy the final kernel should keep after applying the w_term
correction.