# Low-pass filter in Matlab / Python for removing movement noise

28 views (last 30 days)
Sepp on 24 Sep 2017
Commented: Star Strider on 25 Sep 2017
Hello
I'm recording a signal (skin conductance) over time, i.e. I have a time series. Unfortunately, the signal is affected by movement. In a user guide I have now read the following:
> A low pass filter should be applied to the data to remove high > frequency noise which can be attributed to movement artifact and other > noise components. A cutoff frequency of as low as 1 - 5 Hz can be used > without affecting the data of interest due to the slowly varying > nature of GSR responses.
How can I apply such a low pass filter with a cutoff frequency to my time series in Matlab or Python?

Star Strider on 24 Sep 2017
That filter is straightforward to design with Signal Processing Toolbox functions.
A bandpass filter (eliminating d-c offset) is:
Fs = 1000; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Wp = [1.0 5.0]/Fn; % Passband Frequency (Normalised)
Ws = [0.5 5.1]/Fn; % Stopband Frequency (Normalised)
Rp = 1; % Passband Ripple (dB)
Rs = 150; % Stopband Ripple (dB)
[n,Ws] = cheb2ord(Wp,Ws,Rp,Rs); % Filter Order
[z,p,k] = cheby2(n,Rs,Ws); % Filter Design
[sosbp,gbp] = zp2sos(z,p,k); % Convert To Second-Order-Section For Stability
figure(3)
freqz(sosbp, 2^16, Fs) % Filter Bode Plot
filtered_signal = filtfilt(sosbp, gbp, original_signal); % Filter Signal
A ‘pure’ lowpass filter design (that would pass the d-c offset) is:
Fs = 1000; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Wp = 5.0/Fn; % Passband Frequency (Normalised)
Ws = 5.1/Fn; % Stopband Frequency (Normalised)
Rp = 1; % Passband Ripple (dB)
Rs = 150; % Stopband Ripple (dB)
[n,Ws] = cheb2ord(Wp,Ws,Rp,Rs); % Filter Order
[z,p,k] = cheby2(n,Rs,Ws); % Filter Design
[soslp,glp] = zp2sos(z,p,k); % Convert To Second-Order-Section For Stability
figure(3)
freqz(soslp, 2^16, Fs) % Filter Bode Plot
filtered_signal = filtfilt(soslp, glp, original_signal); % Filter Signal
Be sure to provide the correct sampling frequency ‘Fs’ value for your data. I used 1 KHz here to test my code. Both of these designs have an upper passband of 5.0 Hz and a stopband of 5.1 Hz. Change the passband and stopband frequencies to those appropriate for your data. A stopband at least 0.1 Hz higher than the passband is acceptable, and will produce a stable filter providing the sampling frequency is reasonable (not too high). Experiment with these to get the filter characteristics and behaviour that you want.
Sepp on 25 Sep 2017
Thank you very much. How can I see what the optimal passband and stopband frequencies are? Of course I can plot the data but when I don't know what the true underlying data is, it is hard to tell which plot is correct.
Star Strider on 25 Sep 2017
Begin by plotting the fft (link) of your signal. It will tell you what you need to know about the frequency content. If the first (or 0 Hz) value is very high, subtract the mean of your signal from the rest of your signal before taking the Fourier transform:
FTsignal = fft(signal-mean(signal))/length(signal);
Be careful about using length, numel, and size to get the number of elements in your signal. See the documentation on them for details.
All these functions and my filter design code assume that your data are regularly sampled (constant sample time difference). If not, you will have to do some pre-processing on them with the Signal Processing Toolbox resample function.
I will help as needed.

Image Analyst on 24 Sep 2017
Take the fft. Zero out the elements corresponding to -5 Hz to +5 Hz, then inverse transform. Attach your data if you need more help.