74 const t_real oversample_ratio = 2;
75 Vector<t_real>
u = Vector<t_real>::Random(10);
76 Vector<t_real>
v = Vector<t_real>::Random(10);
77 const t_uint M =
u.size();
78 const Vector<t_complex> y = Vector<t_complex>::Ones(
u.size());
81 for (
auto& J : {4, 5, 6, 7, 8}) {
82 for (
auto& imsize : {128, 256, 512}) {
83 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
84 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
85 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
86 imsize, imsize, oversample_ratio,
kernel, J, J);
87 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
88 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
89 const Vector<t_complex> y_test = (*measure_op * input).eval();
90 CAPTURE(y_test.cwiseAbs().mean());
95 CHECK(y_test.isApprox(y, 1e-3));
96 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
97 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
98 Approx(1.).margin(0.001));
104 for (
auto& J : {4, 5, 6, 7, 8}) {
105 for (
auto& imsize : {128, 256, 512}) {
108 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
109 imsize, imsize, oversample_ratio,
kernel, J, J));
111 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
112 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
113 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M),
114 Vector<t_complex>::Ones(M), imsize, imsize, oversample_ratio,
kernel, J, J);
115 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
116 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
117 const Vector<t_complex> y_test = (*measure_op * input).eval();
118 CAPTURE(y_test.cwiseAbs().mean());
123 CHECK(y_test.isApprox(y, 1e-3));
124 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
125 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
126 Approx(1.).margin(0.001));
133 for (
auto& J : {4, 5, 6, 7, 8}) {
134 for (
auto& imsize : {128, 256, 512}) {
135 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
136 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
137 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
138 imsize, imsize, oversample_ratio,
kernel, J, J);
139 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
140 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
141 const Vector<t_complex> y_test = (*measure_op * input).eval();
142 CAPTURE(y_test.cwiseAbs().mean());
147 CHECK(y_test.isApprox(y, 1e-2));
148 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
149 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
150 Approx(1.).margin(0.01));
156 for (
auto& J : {4, 5, 6, 7, 8}) {
157 for (
auto& imsize : {128, 256, 512}) {
158 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
159 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
160 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
161 imsize, imsize, oversample_ratio,
kernel, J, J);
162 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
163 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
164 const Vector<t_complex> y_test = (*measure_op * input).eval();
165 CAPTURE(y_test.cwiseAbs().mean());
170 CHECK(y_test.isApprox(y, 1e-3));
171 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
172 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
173 Approx(1.).margin(0.001));
177 SECTION(
"wproj kb") {
179 for (
auto& J : {4, 5, 6, 7, 8}) {
180 for (
auto& imsize : {128, 256, 512}) {
181 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
182 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
183 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
184 imsize, imsize, oversample_ratio,
kernel, J, J,
false, 1e-6, 1e-6);
185 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
186 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
187 const Vector<t_complex> y_test = (*measure_op * input).eval();
188 CAPTURE(y_test.cwiseAbs().mean());
193 CHECK(y_test.isApprox(y, 1e-3));
194 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
195 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
196 Approx(1.).margin(0.001));
200 SECTION(
"wproj pswf") {
202 for (
auto& J : {4, 5, 6, 7, 8}) {
203 for (
auto& imsize : {128, 256, 512}) {
206 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
207 imsize, imsize, oversample_ratio,
kernel, J, J,
false, 1e-6, 1e-6));
209 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
210 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
211 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M),
212 Vector<t_complex>::Ones(M), imsize, imsize, oversample_ratio,
kernel, J, J,
false,
214 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
215 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
216 const Vector<t_complex> y_test = (*measure_op * input).eval();
217 CAPTURE(y_test.cwiseAbs().mean());
222 CHECK(y_test.isApprox(y, 1e-3));
223 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
224 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
225 Approx(1.).margin(0.001));
230 SECTION(
"wproj gauss") {
232 for (
auto& J : {4, 5, 6, 7, 8}) {
233 for (
auto& imsize : {128, 256, 512}) {
234 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
235 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
236 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
237 imsize, imsize, oversample_ratio,
kernel, J, J,
false, 1e-6, 1e-6);
238 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
239 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
240 const Vector<t_complex> y_test = (*measure_op * input).eval();
241 CAPTURE(y_test.cwiseAbs().mean());
246 CHECK(y_test.isApprox(y, 1e-2));
247 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
248 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
249 Approx(1.).margin(0.01));
253 SECTION(
"wproj box") {
255 for (
auto& J : {4, 5, 6, 7, 8}) {
256 for (
auto& imsize : {128, 256, 512}) {
257 const std::shared_ptr<sopt::LinearTransform<Vector<t_complex>>> measure_op =
258 measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
259 u * imsize / 2,
v * imsize / 2, Vector<t_real>::Zero(M), Vector<t_complex>::Ones(M),
260 imsize, imsize, oversample_ratio,
kernel, J, J,
false, 1e-6, 1e-6);
261 Vector<t_complex> input = Vector<t_complex>::Zero(imsize * imsize);
262 input(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize)) = 1.;
263 const Vector<t_complex> y_test = (*measure_op * input).eval();
264 CAPTURE(y_test.cwiseAbs().mean());
269 CHECK(y_test.isApprox(y, 1e-2));
270 const Vector<t_complex> psf = (measure_op->adjoint() * y) * 1. / M;
271 CHECK(std::real(psf(
static_cast<t_int
>(imsize * 0.5 + imsize * 0.5 * imsize))) ==
272 Approx(1.).margin(0.001));
#define CHECK(CONDITION, ERROR)
#define CHECK_THROWS(STATEMENT, ERROR)
const std::vector< t_real > u
data for u coordinate
const std::vector< t_real > v
data for v coordinate
t_real pswf(const t_real x, const t_real J)
PSWF kernel.
std::shared_ptr< sopt::LinearTransform< T > > init_degrid_operator_2d(const Vector< t_real > &u, const Vector< t_real > &v, const Vector< t_real > &w, const Vector< t_complex > &weights, const t_uint &imsizey, const t_uint &imsizex, const t_real &oversample_ratio=2, const kernels::kernel kernel=kernels::kernel::kb, const t_uint Ju=4, const t_uint Jv=4, const bool w_stacking=false, const t_real &cellx=1, const t_real &celly=1)
Returns linear transform that is the standard degridding operator.