20#include "hdrl_cat_filter.h"
22#include "hdrl_cat_statistics.h"
27static void filt1d(
double ybuf[], cpl_size mpt, cpl_size mfilt);
28static void hanning(
double xbuf[], cpl_size npt);
57cpl_error_code
hdrl_bfilt(
double **xbuf, cpl_size nx, cpl_size ny)
60 double *ybuf = (
double *)cpl_malloc(CPL_MAX(nx, ny) *
sizeof(double));
61 double *save = (
double *)cpl_malloc((nx + 1) * ny *
sizeof(double));
66 for (cpl_size k = 0; k < ny; k++) {
68 for (cpl_size j = 0; j < nx; j++) {
70 save[(nx + 1) * k + j] = xbuf[k][j];
75 filt1d(ybuf, nx, mfilt);
77 for (cpl_size j = 0; j < nx; j++) {
83 for (cpl_size k = 0; k < nx; k++) {
85 for (cpl_size j = 0; j < ny; j++) {
89 filt1d(ybuf, ny, mfilt);
91 for (cpl_size j = 0; j < ny; j++) {
94 if (save[(nx + 1) * j + k] > -1000.) {
95 xbuf[j][k] = CPL_MIN(save[(nx + 1) * j + k], ybuf[j]);
101 for (cpl_size k = 0; k < ny; k++) {
103 for (cpl_size j = 0; j < nx; j++) {
104 ybuf[j] = xbuf[k][j];
109 for (cpl_size j = 0; j < nx; j++) {
110 xbuf[k][j] = ybuf[j];
115 for (cpl_size k = 0; k < nx; k++) {
117 for (cpl_size j = 0; j < ny; j++) {
118 ybuf[j] = xbuf[j][k];
123 for (cpl_size j = 0; j < ny; j++) {
124 xbuf[j][k] = ybuf[j];
129 cpl_free((
void *)ybuf);
130 cpl_free((
void *)save);
132 return CPL_ERROR_NONE;
150 while (ii < n && x[ii] <= -1000.) {
156 for (cpl_size i = ilow + 1; i < n; i++){
158 if (x[i] <= -1000.) {
163 while (x[i + ic] <= -1000.) {
167 if (i + ic >= n - 1) {
175 double xlow = x[i - 1];
176 double xhih = x[i + ic];
178 for (cpl_size j = 0; j < ic; j++){
180 double t2 = ((double)j + 1.) / ((double)ic + 1.);
183 x[i + j] = t1 * xlow + t2 * xhih;
195 if (ilow > 0 && ilow < n){
199 slope = x[ilow + 1] - x[ilow];
204 for (cpl_size i = 0; i < ilow; i++) {
205 x[i] = x[ilow] - slope * (ilow - i);
213 slope = x[ihih] - x[ihih - 1];
218 for (cpl_size i = ihih + 1; i < n; i++) {
219 x[i] = x[ihih] + slope * (i - ihih);
238static void filt1d(
double ybuf[], cpl_size mpt, cpl_size mfilt)
241 double *wbuf = (
double *)cpl_malloc(mpt *
sizeof(
double));
244 for (cpl_size i = 0; i < mpt; i++){
245 if (ybuf[i] > -1000.){
256 for (cpl_size i = 0; i < mpt; i++){
257 if (ybuf[i] > -1000.){
267 cpl_free((
void *)wbuf);
281static void hanning(
double xbuf[], cpl_size npt)
289 cpl_size il = nfilt / 2;
291 cpl_size ilow = CPL_MAX(3, nfilt / 4);
292 ilow = (ilow / 2) * 2 + 1;
295 for (cpl_size i = 0; i < ilow; i++) {
298 double xmns = sum / (double)ilow;
301 for (cpl_size i = 0; i < ilow; i++) {
302 sum += xbuf[npt - 1 - i];
304 double xmnf = sum / (double)ilow;
307 cpl_size nelem = npt + nfilt;
308 double *ybuf = (
double *)cpl_malloc(nelem *
sizeof(
double));
311 for (cpl_size i = 0; i < il; i++) {
312 ybuf[i] = 2. * xmns - xbuf[il + ilow - 1 - i];
313 ybuf[npt + i + il] = 2. * xmnf - xbuf[npt - i - ilow - 1];
316 for (cpl_size i = 0; i < npt; i++) {
317 ybuf[i + il] = xbuf[i];
321 for (cpl_size i = 0; i < npt; i++) {
323 xbuf[i] = 0.25 * (ybuf[i] + 2. * ybuf[i + 1] + ybuf[i + 2]);
327 cpl_free((
void *) ybuf);
cpl_error_code hdrl_bfilt(double **xbuf, cpl_size nx, cpl_size ny)
Do bilinear median and linear filtering on background values.
void padext(double x[], cpl_size n)
Pads out array with missing points and linearly extrapolates the ends.
cpl_error_code hdrl_median(double xbuf[], cpl_size npt, cpl_size nfilt)
compute median