How to clean this noisy ECG with movement artifact
44 views (last 30 days)
Show older comments
Siria Fumagalli
on 16 Dec 2021
Commented: Star Strider
on 22 Dec 2021
Hi everybody,
I am working on HRV analysis from raw ECG signals, but I came across a signal with many motion artifacts that I absolutely can’t clean up in order to get a valid signal for analysis. In fact from this signal I have then to proceed with the extraction of the peaks R and then to obtain the intervals RR.
The ECG signal is attached where EKG(1,:)=time in ms and EKG(2,:)=ecg signal.
I have already obtained some noise signals but with simple low-pass or high-pass filters I was able to obtain at least acceptable results, but in this case I can not build a suitable filter probably for my inexperience in this area.
If anyone can help me, I’d be very grateful as I need it for a research.
thank you in advance
0 Comments
Accepted Answer
Star Strider
on 16 Dec 2021
Unforutnately, that is broadband, relatively high-amplitude noise that completely obscures the underlying EKG signal in that part of the record. There is simply no way (that I am aware of) to recover it, without removing essential parts of the EKG itself. If the noise amplitude were lower, so that it did not completely obscure the underlying EKG signal, then it might be possible to recover at least the R-deflections and possibly more, using either wavelet denoising or the Savitzky-Golay filter. However here that is not the situation.
My analysis (done offline since the online Run feature has problems with .mat files) —
LD = load('Siria Fumagalli EKG.mat');
t = LD.EKG(1,:);
EKG = LD.EKG(2,:);
L = numel(t);
Fs = 1/mean(diff(t));
Fn = Fs/2;
NFFT = 2^nextpow2(L);
FTEKG = fft(EKG - mean(EKG), NFFT) / L;
Fv = linspace(0, 1, NFFT/2+1)*Fn;
Iv = 1:numel(Fv);
figure
plot(Fv, abs(FTEKG(Iv))*2)
grid
xlabel('Frequency (Hz)')
ylabel('Amplitude')
xlim([0 15])
EKGFilt = lowpass(EKG, 0.2, Fs, 'ImpulseResponse','iir');
figure
subplot(2,1,1)
plot(t, EKG)
grid
xlabel('t (s)')
ylabel('Amplitude')
subplot(2,1,2)
plot(t, EKGFilt)
grid
xlabel('t (s)')
ylabel('Amplitude')
You have my sympathies.
.
4 Comments
Star Strider
on 22 Dec 2021
As always, my pleasure!
Thank you very much for the follow-up! I guessed correctly then that this is an electrode problem and not specifically a movement artifact problem. I have not heard of such a T-shirt with electrodes (it would be interesting to have a link or other reference to it, since the instructions that accompany it could suggest a way to minimise these problems), however the solution may be to clean the electrodes thoroughly, clean the skin thoroughly, and tell the patient not to move. (A succinylcholine drip and a ventilator would be the perfect solution to this problem! Not serious, of course, however there have been time in my clinical and research career that I was very much tempted to use that option.)
.
More Answers (0)
See Also
Categories
Find more on ECG / EKG in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!