Effacer les filtres
Effacer les filtres

Which filter to use to remove baseline wander on ECG

18 vues (au cours des 30 derniers jours)
FSB
FSB le 18 Sep 2018
Commenté : FSB le 13 Nov 2018
I have ECG values recorded for two minutes from an ECG sensor with an Arduino board with a sample rate of 60S/s. Those are in form of a value with a time stamp. I changed them to mili-voltage. Now I have a lot of baseline wander and it is not linear so I am not sure how to remove it?I have used butter filter of order 2 and does remove some of the noise but does not help at all with baseline. Any help will be appreciated.

Réponse acceptée

Star Strider
Star Strider le 18 Sep 2018
Your signal is unfortunately sampled at a relatively low rate, so signal processing is difficult. Your signal also has harmonics of what appear to be a 1.5 Hz signal that are propagated through the entire signal. This noise may give the appearance of baseline wander that actually does not exist, since it is simply the summation of these harmonics. Those are essentially impossible to eliminate without also eliminating parts of your signal.
This analysis and filter appear to work acceptably well:
F = openfig('Normal ECG Signal2.fig');
f = gca;
EKG = findobj(f, 'Type','line');
t = EKG.XData; % Recover Data
s = EKG.YData;
L = numel(t); % Signal Length
Ts = mean(diff(t));
St = std(diff(t)); % Test For Uniform Sampling
tr = linspace(min(t), max(t), L); % New, Regularly-Sampled Time Vector
Tsr = mean(diff(tr)) * 1E-3; % Convert To Seconds
sr = resample(s, tr); % Resample To Regularly-Sampled Signal
Fsr = 1/Tsr; % Sampling Frequency (Hz)
Fnr = Fsr/2;
figure
plot(tr, sr)
grid
FTsr = fft(sr-mean(sr))/L; % Fourier Transform Of Mean-Corrected Signal
Fv = linspace(0, 1, fix(L/2)+1)*Fnr;
Iv = 1:numel(Fv);
figure
plot(Fv, abs(FTsr(Iv))*2)
grid
Fs = Fsr; % Sampling Frequency (Hz)
Fn = Fs/2; % Nyquist Frequency (Hz)
Ws = 0.5/Fn; % Passband Frequency Vector (Normalised)
Wp = 1.5/Fn; % Stopband Frequency Vector (Normalised)
Rp = 1; % Passband Ripple (dB)
Rs = 150; % Stopband Attenuation (dB)
[n,Wp] = ellipord(Wp,Ws,Rp,Rs); % Calculate Filter Order
[z,p,k] = ellip(n,Rp,Rs,Wp,'high'); % Default Here Is A Lowpass Filter
[sos,g] = zp2sos(z,p,k); % Use Second-Order-Section Implementation For Stability
sr_filtered = filtfilt(sos,g,sr); % Filter Signal (Here: ‘sr’)
figure
freqz(sos, 2^14, Fs) % Bode Plot Of Filter
set(subplot(2,1,1), 'XLim',[0 Fn]) % Optional, Change Limits As Necessary
set(subplot(2,1,2), 'XLim',[0 Fn]) % Optional, Change Limits As Necessary
figure
plot(tr, sr_filtered)
grid
I use an elliptical filter here rather than a Butterworth filter because it is shorter and therefore computationally more efficient. It also gives the filter characteristics I want.
  6 commentaires
FSB
FSB le 27 Oct 2018
I might have added two different before and after. Here is the updated one and yes after I updated wp a bit higher it got better. Thank you
FSB
FSB le 13 Nov 2018
Hi just an update . The ripples that was in the signals later by applying the filter are most probably ringing effect or gibbs phenomena. Any thoughts will be welcomed

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by