diff --git a/wetb/signal/filters/__init__.py b/wetb/signal/filters/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ebe5b72cdfc049ea8a1f5a485d5949ccd8782bcd 100644 --- a/wetb/signal/filters/__init__.py +++ b/wetb/signal/filters/__init__.py @@ -0,0 +1,2 @@ +from ._despike import * +from ._differentiation import * \ No newline at end of file diff --git a/wetb/signal/filters/despike.py b/wetb/signal/filters/_despike.py similarity index 85% rename from wetb/signal/filters/despike.py rename to wetb/signal/filters/_despike.py index f7256c68b1bd499faf78987afa83b644ff8f4dee..7fda9e33462d907b229b3339c87a98d0197d0359 100644 --- a/wetb/signal/filters/despike.py +++ b/wetb/signal/filters/_despike.py @@ -4,8 +4,7 @@ Created on 13/07/2016 @author: MMPE ''' import numpy as np -from wetb.signal.filters.first_order import low_pass -from wetb.signal.filters import replacer +from wetb.signal.filters import replacer, frq_filters replace_by_nan = replacer.replace_by_nan @@ -42,15 +41,15 @@ def univeral_thresshold_finder(data, variation='mad', plt=None): thresshold = np.sqrt(2 * np.log(data.shape[0])) * variation # Universal thresshold (expected maximum of n random variables) return thresshold_finder(data, thresshold, plt) -def despike(data, dt, spike_finder=univeral_thresshold_finder, spike_replacer=replace_by_nan, plt=None): +def despike(data, spike_length, spike_finder=univeral_thresshold_finder, spike_replacer=replace_by_nan, plt=None): """Despike data Parameters --------- data : array_like data - dt : int or float - time step + spike_length : int + Typical spike duration [samples] spike_finder : function Function returning indexes of the spikes spike_replacer : function @@ -63,8 +62,10 @@ def despike(data, dt, spike_finder=univeral_thresshold_finder, spike_replacer=re if plt: plt.plot(data, label='Input') data = np.array(data).copy() - lp_data = low_pass(data, dt, 1) + lp_data = low_pass(data, spike_length, 1) hp_data = data - lp_data + hp_data = frq_filters.high_pass(data, spike_length*4, 1, order=2) + #spike_length, sample_frq/2, 1, order=1) spike_mask = spike_finder(hp_data, plt=plt) despike_data = spike_replacer(data, spike_mask) if plt: diff --git a/wetb/signal/fit/_bin_fit.py b/wetb/signal/fit/_bin_fit.py index f1124ff6fb0919a22f2ef8a1e45ad14a597ce9eb..fcaf5879f9e0f89c99ded6cf8b69f32f48997e9e 100644 --- a/wetb/signal/fit/_bin_fit.py +++ b/wetb/signal/fit/_bin_fit.py @@ -103,14 +103,9 @@ def bin_fit(x,y, bins=10, kind='linear', bin_func=np.nanmean, bin_min_count=3, l else: raise NotImplementedError("Argument for handling upper observations, %s, not implemented"%upper) - #Create mean function - def fit(x): - x = x[:].copy().astype(np.float) - x[x<bin_x_fit[0]] = np.nan - x[x>bin_x_fit[-1]] = np.nan - return interp1d(bin_x_fit, bin_y_fit, kind)(x[:]) + - return bin_x_fit, fit + return bin_x_fit, _interpolate_fit(bin_x_fit, bin_y_fit, kind) def perpendicular_bin_fit(x, y, bins = 30, fit_func=None, bin_min_count=3, plt=None): """Fit a curve to the values, (x,y) using bins that are perpendicular to an initial fit @@ -190,6 +185,15 @@ def perpendicular_bin_fit(x, y, bins = 30, fit_func=None, bin_min_count=3, plt=N plt.plot(pbfx, pbfy, 'gray', label="perpendicular fit") plt.legend() #PlotData(None, bfx,bfy) - - return np.array(pc).T + bin_x_fit, bin_y_fit = np.array(pc).T + return bin_x_fit, _interpolate_fit(bin_x_fit, bin_y_fit, kind="linear") + +#Create mean function +def _interpolate_fit(bin_x_fit, bin_y_fit, kind='linear'): + def fit(x): + x = x[:].copy().astype(np.float) + x[x<bin_x_fit[0]] = np.nan + x[x>bin_x_fit[-1]] = np.nan + return interp1d(bin_x_fit, bin_y_fit, kind)(x[:]) + return fit diff --git a/wetb/signal/tests/test_files/azi.hdf5 b/wetb/signal/tests/test_files/azi.hdf5 index a40195b540e2dc316a007861f7af3331112fbaf4..8b0d381fba42b4f31bc0bff8127d278da653791d 100644 Binary files a/wetb/signal/tests/test_files/azi.hdf5 and b/wetb/signal/tests/test_files/azi.hdf5 differ diff --git a/wetb/signal/tests/test_fit.py b/wetb/signal/tests/test_fit.py index ecdfd2cc69796b268d7351a376552d2d401a23ef..859c0cb95c31111385db25728bab055c0add7653 100644 --- a/wetb/signal/tests/test_fit.py +++ b/wetb/signal/tests/test_fit.py @@ -88,11 +88,11 @@ class TestFit(unittest.TestCase): x,y = ds('Wsp_metmast'), ds('Power') if 0: import matplotlib.pyplot as plt - fx, fy = perpendicular_bin_fit(x,y,30,plt=plt) + fx, fit = perpendicular_bin_fit(x,y,30,plt=plt) plt.show() else: - fx, fy = perpendicular_bin_fit(x,y,30) + fx, fit = perpendicular_bin_fit(x,y,30) self.assertEqual(len(fx), 30)