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.
Ö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.


