1

I'm processing some experimental data in Python 3. The data (raw_data in my code) is pretty noisy: unfiltered data One of my goal is to find the peaks, and for this I'd like to filter the noise. Based on what I found in the documentation of SciPy's Signal module, the theory of filtering seems to be really complicated, and unfortunately I have zero background. Of course I got to learn it sooner or later - and I intend to - but now now the profit doesn't worth the time (and learning filter theory isn't the purpose of my work), so I shamefully copied the code in Lyken Syu's answer without a chance of understanding the background:

import numpy as np
from scipy import signal as sg
from matplotlib import pyplot as plt

# [...] code, resulting in this:
raw_data = [arr_of_xvalues, arr_of_yvalues]  # xvalues are in decreasing order

# <magic beyond my understanding>
n = 20  # the larger n is, the smoother the curve will be
b = [1.0 / n] * n
a = 2
filt = sg.lfilter(b, a, raw_data)
filtered = sg.lfilter(b, a, filt)
# <\magic>

plt.plot(filtered[0], filtered[1], ".")
plt.show()

It kind of works: filtered data What concerns me is the curve from 0 to the beginning of my dataset the filter adds. I guess it's a property of the IIR filter I used, but I don't know how to prevent this. Also, I couldn't make other filters work so far. I need to use this code on other experimental results alike this, so I need a somewhat more general solution than e.g. cutting out all y<10 points.

  • Is there a better (possibly simpler) way, or choice of filter that is easy to implement without serious theoretical background?
  • How, if, could I prevent my filter adding that curve to my data?
Neinstein
  • 958
  • 2
  • 11
  • 31

0 Answers0