How to clean this noisy ECG with movement artifact

42 visualizaciones (últimos 30 días)
Siria Fumagalli
Siria Fumagalli el 16 de Dic. de 2021
Comentada: Star Strider el 22 de Dic. de 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

Respuesta aceptada

Star Strider
Star Strider el 16 de Dic. de 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 comentarios
Siria Fumagalli
Siria Fumagalli el 22 de Dic. de 2021
Thank you
The problem is that I'm using a t-shirt with built-in sensors so is a little more different to do such things, that's why i'm probably going to post other questio :)
Thanks again
Star Strider
Star Strider el 22 de Dic. de 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.)
.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre ECG / EKG en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by