From 2d16e4a010abd8e0b8ed26cdc45fa082e10b8cd5 Mon Sep 17 00:00:00 2001 From: Claudio Gheller <cgheller@login01.m100.cineca.it> Date: Thu, 16 Mar 2023 09:42:41 +0100 Subject: [PATCH] Kaiser-Bessel kernel added (adapted from WSClean). Not yet used --- w-stacking.cu | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/w-stacking.cu b/w-stacking.cu index 4fe3625..d5e8e8c 100644 --- a/w-stacking.cu +++ b/w-stacking.cu @@ -14,12 +14,51 @@ double __device__ #else double #endif +// Gaussian Kernel gauss_kernel_norm(double norm, double std22, double u_dist, double v_dist) { double conv_weight; conv_weight = norm * exp(-((u_dist*u_dist)+(v_dist*v_dist))*std22); return conv_weight; } + +// Kaiser-Bessel Kernel: it is adapted from WSClean +double bessel0(double x, double precision) { + // Calculate I_0 = SUM of m 0 -> inf [ (x/2)^(2m) ] + // This is the unnormalized bessel function of order 0. + double d = 0.0, ds = 1.0, sum = 1.0; + do { + d += 2.0; + ds *= x * x / (d * d); + sum += ds; + } while (ds > sum * precision); + return sum; +} +void makeKaiserBesselKernel(double * kernel, + int KernelLen, + double alpha, + double overSamplingFactor, + int withSinc) { + int n = KernelLen, mid = n / 2; + double * sincKernel = malloc((mid + 1)*sizeof(*sincKernel)); + const double filterRatio = 1.0 / overSamplingFactor; + sincKernel[0] = filterRatio; + for (int i = 1; i != mid + 1; i++) { + double x = i; + sincKernel[i] = + withSinc ? (sin(PI * filterRatio * x) / (PI * x)) : filterRatio; + } + const double normFactor = overSamplingFactor / bessel0(alpha, 1e-8); + for (int i = 0; i != mid + 1; i++) { + double term = (double)i / mid; + kernel[mid + i] = sincKernel[i] * + bessel0(alpha * sqrt(1.0 - (term * term)), 1e-8) * + normFactor; + } + for (int i = 0; i != mid; i++) kernel[i] = kernel[n - 1 - i]; +} + + #ifdef ACCOMP #pragma omp end declare target #endif -- GitLab