I need to filter some array of data before differentiating it, I do this so I don't drown the signal in noise. It's also important that no delay is applied to the signal, that's why I decided to use a forward-backward filter like scipy's sosfiltfilt and implemented the following:
order = 4
freq = 0.00025
sos = sc.signal.butter(order, freq, output='sos', fs = 1)
t = np.linspace(t0, tf, points)
data_filtered = sc.signal.sosfiltfilt(sos, data, padtype=None)
plt.figure(figsize = (10, 5))
plt.plot(data, 'k', label='Raw')
plt.plot(t, data_filtered, 'r', label='Filtered')
plt.legend(loc='best')
plt.show()
Which generates the following data:
Both the original data and the filtered data can be found there.
An artifact appears where the end is flattened, this is a problem since the derivative will artificialy fall to 0 for those values.
I tried playing around with sosfiltfilt parameters, padding doesn't help and higher orders flatten more data.
Why does this happen and how can I fix it? Is there a different solution for my needs?
PS: Don't really know how to provide the data if you want to try it yourself but I'm happy to do so, thanks!
sosfiltfilt
but if n_outs = n_inputs, there's always padding, even if not explicit. Yes it helps to get data, try pastebin.com or ufile.io . There's also trigdiff (Ctrl + F "trigonometric" -- code) $\endgroup$