From d28ad0a0b36fc1084f67304b10443f8499fc3ec8 Mon Sep 17 00:00:00 2001 From: leufen1 <l.leufen@fz-juelich.de> Date: Thu, 6 May 2021 22:48:27 +0200 Subject: [PATCH] new try with convolve --- mlair/helpers/filter.py | 46 +++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/mlair/helpers/filter.py b/mlair/helpers/filter.py index 1434b6a8..84b97295 100644 --- a/mlair/helpers/filter.py +++ b/mlair/helpers/filter.py @@ -3,6 +3,7 @@ import warnings from typing import Union, Callable import logging import os +import time import datetime import numpy as np @@ -266,12 +267,19 @@ class ClimateFIRFilter: # apply vectorized fir filter along the tmp dimension kwargs = {"fs": fs, "cutoff_high": cutoff_high, "order": order, "causal": False, "padlen": int(min(padlen_factor, 1) * length), "h": h} - with TimeTracking(name="numpy_vec"): - filt = fir_filter_numpy_vectorized(filter_input_data, var_dim, new_dim, kwargs) - with TimeTracking(name="xr_apply_ufunc"): - filt = xr.apply_ufunc(fir_filter_vectorized, filter_input_data, time_axis, - input_core_dims=[[new_dim], []], output_core_dims=[[new_dim]], vectorize=True, - kwargs=kwargs) + # with TimeTracking(name="numpy_vec"): + # filt = fir_filter_numpy_vectorized(filter_input_data, var_dim, new_dim, kwargs) + # with TimeTracking(name="xr_apply_ufunc"): + # filt = xr.apply_ufunc(fir_filter_vectorized, filter_input_data, time_axis, + # input_core_dims=[[new_dim], []], output_core_dims=[[new_dim]], vectorize=True, + # kwargs=kwargs) + with TimeTracking(name="convolve"): + slicer = slice(int(-(length - 1) / 2), int((length - 1) / 2)) + filt = xr.apply_ufunc(fir_filter_convolve_vectorized, filter_input_data.sel(window=slicer), + input_core_dims=[["window"]], + output_core_dims=[["window"]], + vectorize=True, + kwargs={"h": h}) # plot if self.plot_path is not None: @@ -404,6 +412,10 @@ def fir_filter_numpy_vectorized(filter_input_data, var_dim, new_dim, kwargs): return filt_np +def fir_filter_convolve_vectorized(data, h): + return signal.convolve(data, h, mode='same', method="direct") / sum(h) + + def fir_filter_vectorized(data, time_stamp=None, fs=1, order=5, cutoff_low=None, cutoff_high=None, window="hamming", h=None, causal=True, @@ -435,31 +447,21 @@ def fir_filter_vectorized(data, time_stamp=None, fs=1, order=5, cutoff_low=None, y = signal.lfilter(h, 1., data) else: padlen = padlen if padlen is not None else 3 * len(h) + # print(sum(sel)) # if sum(sel) <= padlen: # y = np.empty_like(data[sel]) # else: - # with TimeTracking(): - # y = signal.filtfilt(h, 1., data[sel], padlen=padlen) - y = signal.filtfilt(h, 1., data, padlen=padlen) + # y = signal.filtfilt(h, 1., data[sel], padlen=padlen) + y = signal.filtfilt(h, 1., data, padlen=padlen) # res[sel] = y # return res return y -def fir_filter_vectorized_short(data, time_stamp=None, fs=1, order=5, cutoff_low=None, cutoff_high=None, - window="hamming", - h=None, - causal=True, - padlen=None): +def fir_filter_vectorized_short(data, h=None, padlen=None): """Expects numpy array.""" - sel = ~np.isnan(data) - res = np.empty_like(data) - if sum(sel) <= padlen: - y = np.empty_like(data[sel]) - else: - y = signal.filtfilt(h, 1., data[sel], padlen=padlen) - res[sel] = y - return res + y = signal.filtfilt(h, 1., data, padlen=padlen) + return y class KolmogorovZurbenkoBaseClass: -- GitLab