Skip to main content

Bu yazıda uyku sırasında kaydedilmiş bir veri üzerinde MATLAB ile kalp ritmi değişkenliği, atma enerjisi veya Teager operatörü gibi farklı incelenmeler ile hastanın “Obstructive Sleep Apnea” (OSA) rahatsızlığı olup olmadığının tespiti için yazılmış MATLAB script’ini bulabilirsiniz. Ayrıca kalp sinyallerine bakılarak hastanın uyku sırasında kriz geçirip geçirmediği gibi önemli bilgilere de erişilebilmektedir. Bu çalışma sadece uyku çalışmalarına özgü değil, spor sırasında, efor testlerinde veya normal gündelik kalp hareketlerinin gözleminde de kullanılabilmekte, böylelikle kalpte ritim problemi gibi rahatsızlıklar da tespit edilebilmektedir.

Uyku sırasında 512Hz ile örneklenerek kaydedilmiş bir veriyi kalp EKG verisini aşağıdaki bağlantıya tıklayarak indirebilirsiniz.

Kalp EKG Verisi

Öncelikle kalpten alınmış EKG verisini “epoch” adı verilen 30 saniyelik parçalara doğru şekilde çizebilmek için zaman eksenini ve gerekli hesaplamaları yapmalıyız. Örneğin 5. epok için bu süre aşağıdaki şekilde hesaplanabilir.

%% Epoch Settings
epochNo = 5;
epochLength = 300;
epochTime = ((epochNo-1)*fs*epochLength+(1:(fs*epochLength)));
time = epochTime.*epochLength./(epochTime(end)-epochTime(1)+1);

Bu zaman aralığındaki ham datayı çizmek için ise aşağıdaki kod parçasını kullanabiliriz.

%% Raw Data
figure;
h(1) = subplot(3,2,1); plot(time,data(epochTime),'linewidth',3);
title('Raw Data')
grid on

Sinyal işleme alanında kullanılan önemli bir operatör olan Teager operatörü ile ham data üzerinde sinyal analizi kolaylaşmaktadır. Aşağıda bu operatörü uygulamak için gerekli kodu bulabilirsiniz.

%% Teager Operator
psi = zeros(size(epochTime(2:end-1)));
for i=epochTime(2:end-1)
    psi(i) = data(i).^2 - data(i-1) * data(i+1);
end
h(2) = subplot(3,2,2); plot(time(2:end-1),psi(epochTime(2:end-1)),'linewidth',3);
title('Teager Operator Result')
grid on
axis tight

Teager operatörü ile üzerinde işlem yapması daha kolay hale gelen veri üzerindeki peak noktaları bulunup, bir epoktaki kalp atış değişkenliği (HRV) hesaplanabilir.

%% Hearth Rate Variability
[~, peakLocs] = findpeaks(psi(epochTime(2:end-1)),'minPeakDistance',130,'minPeakHeight',1e5); % max(psi(epochTime(2:end-1)))*0.7
hearthBeatTime = time(peakLocs);
peaks=zeros(size(time(2:end-1)));
peaks(peakLocs) = max(psi(epochTime(2:end-1)))*1.1;
hold all; plot(time(2:end-1),peaks); hold off;
hearthRateVar = 60./(hearthBeatTime(2:end) - hearthBeatTime(1:end-1));
h(3) = subplot(3,2,3); stairs(time(peakLocs(1:end-1)), hearthRateVar, 'linewidth', 3);
title('Hearth Rate Variability')
grid on
axis tight

Ayrıca hastanın krize girip girmediği, atma enerjisinden de hesaplanabilir.

%% Pulse Energy
energy = zeros(1,length(epochTime));
for i = 1:length(epochTime)
    energy(i) = sum(data(epochTime(1):(epochTime(1)+i)).^2);
end
h(4) = subplot(3,2,4); plot(time,energy,'linewidth',3);
title('Accumulative Pulse Energy')
grid on

Sinyalde oluşan varyans bilgisi de kullanılabilecek diğer bir işlemdir.

%% Variance
variance = zeros(1,length(epochTime));
for i = 1:length(epochTime)
    variance(i) = var(data(epochTime(1):(epochTime(1)+i)));
end
h(5) = subplot(3,2,5); plot(time,variance,'linewidth',3);
title('Variance')
grid on

Teager operatörüne benzeyen Pan-Tompkins operatörü ile de veri işleme konusunda faydalı olmaktadır. Aşağıda bu operatör için yapılan işlemleri bulabilirsiniz.

%% Pan-Tompkins Operator
pto = zeros(size(epochTime(3:end-2)));
for i=epochTime(3:end-2)
    pto(i) = 1/8*(data(i-2) - 2*data(i-1) + 2*data(i+1) + data(i+2));
end
h(6) = subplot(3,2,6); plot(time(3:end-2),pto(epochTime(3:end-2)),'linewidth',3);
title('Pan-Tompkins Operator Result')
grid on
axis tight

Bütün işlemlerin bir arada olduğu Matlab dosyasını aşağıdan indirebilirsiniz.

MATLAB Script Dosyası