From e6316b1f5f954b5b87d9e0164f66460e0828c330 Mon Sep 17 00:00:00 2001 From: "Mads M. Pedersen" <mmpe@dtu.dk> Date: Fri, 13 Jan 2017 11:34:02 +0100 Subject: [PATCH] added cy_filters.pyx + setup.py thing --- setup.py | 3 +- wetb/signal_tools/filters/cy_filters.pyx | 59 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 wetb/signal_tools/filters/cy_filters.pyx diff --git a/setup.py b/setup.py index eb4cead..8b4a3a6 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,8 @@ from Cython.Distutils import build_ext def setup_package(): - ex_info = [('wetb.fatigue_tools.rainflowcounting', ['pair_range', 'peak_trough', 'rainflowcount_astm'])] + ex_info = [('wetb.fatigue_tools.rainflowcounting', ['pair_range', 'peak_trough', 'rainflowcount_astm']), + ('wetb.signal_tools.filters', ['cy_filters'])] extlist = [Extension('%s.%s' % (module, n), [os.path.join(module.replace(".","/"), n)+'.pyx'], include_dirs=[np.get_include()]) for module, names in ex_info for n in names] diff --git a/wetb/signal_tools/filters/cy_filters.pyx b/wetb/signal_tools/filters/cy_filters.pyx new file mode 100644 index 0000000..28fe4b3 --- /dev/null +++ b/wetb/signal_tools/filters/cy_filters.pyx @@ -0,0 +1,59 @@ +import cython +import numpy as np +cimport numpy as np +''' +Created on 29/05/2013 + +@author: Mads M. Pedersen (mmpe@dtu.dk) +''' + + +import cython +import numpy as np +cimport numpy as np + + +@cython.ccall +@cython.locals(alpha=cython.float, i=cython.int) +cpdef cy_low_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, double tau): + cdef np.ndarray[double,ndim=1] output + output = np.empty_like(inp, dtype=np.float) + output[0] = inp[0] + + alpha = delta_t / (tau + delta_t) + for i in range(1, inp.shape[0]): + output[i] = output[i - 1] + alpha * (inp[i] - output[i - 1]) # Same as output[i] = alpha*inp[i]+(1-alpha)*output[i-1] + + return output + +cpdef cy_dynamic_low_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, np.ndarray[double,ndim=1] tau, int method): + cdef np.ndarray[double,ndim=1] output, alpha + cdef int i + + output = np.empty_like(inp, dtype=np.float) + output[0] = inp[0] + + if method == 1: + alpha = delta_t / (tau + delta_t) + for i in range(1, inp.shape[0]): + output[i] = output[i - 1] + alpha[i] * (inp[i] - output[i - 1]) # Same as output[i] = alpha*inp[i]+(1-alpha)*output[i-1] + elif method == 2: + for i in range(1, inp.shape[0]): + output[i] = (delta_t * (inp[i] + inp[i - 1] - output[i - 1]) + 2 * tau[i] * output[i - 1]) / (delta_t + 2 * tau[i]) + elif method == 3: + for i in range(1, inp.shape[0]): + output[i] = output[i - 1] * np.exp(-delta_t / tau[i]) + inp[i] * (1 - np.exp(-delta_t / tau[i])) + return output + + +@cython.ccall +@cython.locals(alpha=cython.float, i=cython.int) +cpdef cy_high_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, double tau): + cdef np.ndarray[double,ndim=1] output + output = np.empty_like(inp, dtype=np.float) + output[0] = inp[0] + alpha = tau / (tau + delta_t) + for i in range(1, inp.shape[0]): + output[i] = alpha * (output[i - 1] + inp[i] - inp[i - 1]) + + return output -- GitLab