summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Farago <sensej007@email.cz>2020-02-03 10:54:07 +0100
committerGitHub <noreply@github.com>2020-02-03 10:54:07 +0100
commitcea58a20c8cf42b0c0914de776ad6051973289fa (patch)
tree48e1da9c3bfa1b65ebea39502716dba94d25f376
parent8b6edc6dee57facb45980ff07be9150c6f96b5f2 (diff)
parent4127bc8721d8e7bc70cc26d7938f18b304e5defe (diff)
downloadufo-filters-cea58a20c8cf42b0c0914de776ad6051973289fa.tar.gz
ufo-filters-cea58a20c8cf42b0c0914de776ad6051973289fa.tar.bz2
ufo-filters-cea58a20c8cf42b0c0914de776ad6051973289fa.tar.xz
ufo-filters-cea58a20c8cf42b0c0914de776ad6051973289fa.zip
Merge pull request #191 from ufo-kit/fix-phaseretrieval
Fix phaseretrieval
-rw-r--r--src/kernels/phase-retrieval.cl16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/kernels/phase-retrieval.cl b/src/kernels/phase-retrieval.cl
index 43cdc88..6f43efb 100644
--- a/src/kernels/phase-retrieval.cl
+++ b/src/kernels/phase-retrieval.cl
@@ -49,10 +49,11 @@ kernel void
ctf_method(float prefac, float regularize_rate, float binary_filter_rate, float frequency_cutoff, global float *output)
{
COMMON_SETUP;
- if (sin_arg >= frequency_cutoff)
+
+ if (fabs (sin_value + pow(10, -regularize_rate)) < 1e-7 || sin_arg >= frequency_cutoff || (idx == 0 && idy == 0))
output[idy * width + idx] = 0.0f;
else
- output[idy * width + idx] = 0.5f * sign(sin_value) / (fabs(sin_value) + pow(10, -regularize_rate));
+ output[idy * width + idx] = 0.5f / (sin_value + pow(10, -regularize_rate));
}
kernel void
@@ -60,19 +61,22 @@ qp_method(float prefac, float regularize_rate, float binary_filter_rate, float f
{
COMMON_SETUP;
- if (sin_arg > M_PI_2_F && fabs (sin_value) < binary_filter_rate || sin_arg >= frequency_cutoff)
+ if (sin_arg > M_PI_2_F && fabs (sin_value + pow(10, -regularize_rate)) < binary_filter_rate ||
+ sin_arg >= frequency_cutoff || (idx == 0 && idy == 0))
+ /* Zero frequency (idx == 0 && idy == 0) must be set to zero explicitly */
output[idy * width + idx] = 0.0f;
else
- output[idy * width + idx] = 0.5f * sign(sin_value) / (fabs(sin_value) + pow(10, -regularize_rate));
+ output[idy * width + idx] = 0.5f / (sin_value + pow(10, -regularize_rate));
}
kernel void
qp2_method(float prefac, float regularize_rate, float binary_filter_rate, float frequency_cutoff, global float *output)
{
COMMON_SETUP;
- float cacl_filter_value = 0.5f * sign(sin_value) / (fabs(sin_value) + pow(10, -regularize_rate));
+ float cacl_filter_value = 0.5f / (sin_value + pow(10, -regularize_rate));
- if (sin_arg > M_PI_2_F && fabs(sin_value) < binary_filter_rate || sin_arg >= frequency_cutoff)
+ if (sin_arg > M_PI_2_F && fabs(sin_value + pow(10, -regularize_rate)) < binary_filter_rate ||
+ sin_arg >= frequency_cutoff || (idx == 0 && idy == 0))
output[idy * width + idx] = sign(cacl_filter_value) / (2 * (binary_filter_rate + pow(10, -regularize_rate)));
else
output[idy * width + idx] = cacl_filter_value;