How to clean this noisy ECG with movement artifact

조회 수: 41 (최근 30일)
Siria Fumagalli
Siria Fumagalli 2021년 12월 16일
댓글: Star Strider 2021년 12월 22일
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

채택된 답변

Star Strider
Star Strider 2021년 12월 16일
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
Siria Fumagalli
Siria Fumagalli 2021년 12월 22일
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 2021년 12월 22일
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.)
.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 ECG / EKG에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by