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.