Biomedical Signal Analysis dersinde Timur Düzenli ve Salih Aslan ile beraber yaptığımız bir proje bu. EKG verileri üzerinden QRS Complex kısımlarının tespitinden bahsedeceğim. Öncelikle nedir ve neden önemlidir buna değinelim.
Çoğumuzun bildiği üzere EKG (ECG – Electrocardiogram) kalp aktivitelerinin elektriksel olarak kaydıdır. Electrocardiograph ile ölçülerek kaydedilir.
EKG analiz edilerek kalp hakkında oldukça detaylı bilgiler elde edilebilir. Tıp okumadığım için çok detaylı bilemem tabii ki. Fakat EKG sinyalinin birazdan bahsedeceğim kısımlarının zamanlaması hastalıklar hakkında oldukça yararlı bilgiler sağlamaktadır.
Tipik bir EKG sinyali aşağıdaki şekilde gösterilebilir.

Burada görüleceği gibi EKG sinyali belirli tipik kısımlar içerir. Bunlar P,Q,R,S ve T kısımlarıdır. Hepsi kalp hakkında önemli bilgiler taşır. Bu yazıda, sinyalde QRS Complex’in yerinin bulunmasından bahsedeceğim. Bu bilgi önemlidir çünkü QRS Complex’in kaç milisaniye sürdüğü çıplak gözle anlaşılamaz.
Konuya girmeden önce şundan da bahsetmek isterim. Doktorların, ellerine gelen EKG kaydına bakarak karar vermesinde bahsedeceğim konu oldukça önem taşır. EKG sinyalleri elektriksel olarak zayıf sinyaller olduğu için kaydedilmesi ve çevre gürültülerden arındırılması işi oldukça zahmetlidir. Demek istediğim, ham bir EKG kaydından hiç bir doktor hiç bir teşhis koyamaz. O şeritteki net ve anlaşılır EKG’nin nasıl o hale geldiğini ele alacağız. Fakat tüm aşamaları koca bir kitap yapan bu analizin sadece küçük bir kısmı bu yazıca mevcut.
Analiz için kullanacağım önceden kaydedilmiş EKG verileri elimde mevcut. 4000 örnekten oluşan veriyi şuradan alabilirsiniz.
Analize başlayalım,
close all clear all clc %% Degisken ve Sabitlerin Tanimlanmasi fs=200; % sample rate %% Sinyalin Matlab Ortamina Alinmasi hamsinyal=load('ECG3'); plot(hamsinyal); title('Ham Sinyal'); figure

Ham Sinyal
Görüldüğü gibi sinyal oldukça fazla gürültü içeriyor. Hem yüksek frekanslı hem de şebekeden kaynaklanan ek bileşenler sinyale karışmış durumda. Öncelikle sinyali DC sıfır seviyesine çekelim
%% DC Bilesenlerin Atilmasi dcsizsinyal=(hamsinyal-mean(hamsinyal)); plot(dcsizsinyal); title('DC Bilesenleri Atilan Sinyal'); figure

DCsiz Sinyal
Şimdi de sinyalden yüksek frekanslı gürültüleri temizleyelim. Bunun için bir alçak geçiren (low pass) filtre tasarlayıp sinyali bu filtreden geçirmemiz gerekli. Filtre tipi olarak 10 point avarage filtre kullanalım.
%% Filtre % 10 point avarage filter B=(1/10)*ones(1,10); A=1; freqz(B,A); title('10 Point Moving Avarage Filtre'); figure avaragefiltrelisinyal=filter(B,A,dcsizsinyal); plot(avaragefiltrelisinyal) title('Moving Avarage (Low Pass) Filtreden Gecmis Sinyal'); figure

Low Pass Filtre

Low Pass Cikisi
Yüksek frekanslı gürültülerin azaldığını görebiliriz. Fakat hala kusursuz değil. Şimdi de düşük frekanslı gürültüleri yok etmek için bir yüksek geçiren (high pass) filtre tasarlayıp sinyali bu filtreden geçirelim. Bunun için de Derivative Based filtre oluşturacağız.
%% Derivative Based Filter B=(1/1.0025)*[1 -1];% 1.0025 normalizasyon degeri A=[1 -0.995]; freqz(B,A); title('Derivative Based Filter'); figure derivativefiltrelisinyal=filter(B,A,avaragefiltrelisinyal); plot(derivativefiltrelisinyal) title('Derivative Based (High Pass) Filtreden Gecmis Sinyal'); figure

Derivative Filtre

Derivative Cikisi
Sinyalden atmamız gereken bir de 60Hz’lik şebeke gürültüsü var. Kayıt esnasında cihazın şehir şebekesinden kaptığı gürültü de sinyalle beraber kaydedilmiş durumda. Zaten bakıldığında çıplak gözle de görülebiliyor. Bu arada kullandığımız örnek yabancı bir kaynaktan olduğu için şebeke gürültüsü 60Hz. Bizim şebekemiz 50Hz. Onu da hatırlatayım.
60Hz’lik gürültüyü atmak için bir filtre tasarlanacak ve önceki filtreden çıkan sinyal bu filtreden geçirilecek. Önemli bir sorun da, şebekeden kapılan gürültünün yalnızca 60Hz değil aynı zamanda bunun harmonikleri olarak ortaya çıkması. Bu yüzden yalnızca 60Hz’i bastıran bir filtre işimiz görmeyecek. Bunun için 60Hz ve tüm harmoniklerini bastırmamızı sağlayacak bir Comb filtre tasarlamamız gerekir. Aşağıda yazdığım filtre katsayılarının nasıl bulunduğuna değinmeyeceğim, zira çok uzun mesele
Zaten ben de hazır kullandım. Bulmaya çalışmak apayrı bir mesele.
%% Comb Filter % 60Hz sebeke gurultusunu ve harmoniklerini bastiran filtre B=conv([1 1],[0.6310 -0.2149 0.1512 -0.1288 0.1227 -0.1288 0.1512 -0.2149 0.6310]); A=1; freqz(B,A); title('Comb Filter'); figure comb=filter(B,A,derivativefiltrelisinyal); plot(comb) title('Comb (60Hz ve Harmoniklerini Bastiran) Filtreden Gecmis Sinyal');

Comb Filtre

Comb Cikisi
Çok kusursuz olmasa da sinyal işlenebilecek hale geldi. Şimdi ise fark alarak sinyaldeki en keskin tepeleri bulalım. Bunlar bize R noktalarını verecek. Ardından da bu R noktasının sağında ve solunda en düşük seviyedeki noktaları bulalım. Bunlar da Q ve S noktalarını verecek.
%% Differentiator differentiatorcikisi=diff(comb); %% Squaring Operation kare=differentiatorcikisi.*differentiatorcikisi; %% Moving Window Integrator window=ones(1,30); % N=30 moving window integral= medfilt1(filter(window,1,kare),10); delay = ceil(length(window)/2); integral = integral(delay:length(integral)); %% QRS Arama max_h = max(integral); thresh = 0.2; poss_reg = integral > (thresh*max_h); sol = find(diff([0 poss_reg'])==1); sag = find(diff([poss_reg' 0])==-1); for i=1:length(sol) [maxdeger(i) maxloc(i)] = max( comb(sol(i):sag(i)) ); maxloc(i) = maxloc(i)-1+sol(i); % offset ekle [mindeger(i) minloc(i)] = min( comb(sol(i):sag(i)) ); %mindeger Q noktasini verir minloc(i) = minloc(i)-1+sol(i); % offset ekle % Q noktasi icin offset end % minpozisyon=ones(1,4000)*-max(comb); % minpozisyon(1,minloc)=max(comb); maxpozisyon=ones(1,4000)*(-max(comb)); maxpozisyon(1,maxloc)=max(comb); % maxpozisyon(1,sol)=max(comb); % maxpozisyon(1,sag)=max(comb); % maxpozisyon(1,minloc)=max(comb); figure % plot(comb(1:(length(comb)/4)),'b-') plot(comb) title('R noktalari belirlenmis sinyal'); hold on % plot(minloc,mindeger,'r--') plot(maxloc,maxdeger,'g-') figure plot(comb) title('R noktalari isaretlenmis sinyal'); hold on %plot(minpozisyon,'r') % Q baslangici plot(maxpozisyon,'r') legend('Comb Filtreden Gecen Sinyal','R');

R leri Birlestir

R leri Isaretle
Görüldüğü gibi QRS Complex’in yeri artık tam olarak bilinebiliyor. İstenen ölçümler buradan çıkarılabilir.
Bu arada sondan üçüncü Complex’de bir hata var. Algoritma burada hatalı sonuç veriyor. Gürültülerin kusursuz bir şekilde atılamamasından kaynaklanan bir hata söz konusu. P noktası olması gerekenden daha büyük olduğu için R olarak algılanmış ve bir hataya sebebiyet vermiş. Fakat sinyalin geri kalanı istediğimiz veriyi elde etmemiz için yeterli veriyi sağlıyor.
Şimdi elde ettiğimiz verilerden bazı sonuçlara ulaşmaya çalışalım. Girilen veride kaç adet beat (vuruş) bulunduğunu tespit edelim. R noktalarını tespit ettiğimize göre ve R noktası kadar vuruş bulunduğunu bildiğime göre kolaylıkla sonuca ulaşabiliriz.
%% Beat Sayisi beat=length(maxloc) heartrate=beat/(length(hamsinyal)/fs)
Cevap olarak şu sonuçları elde ediyoruz.
beat =
25
heartrate =
1.2500
Analiz sırasında P noktalarından birisi de R olarak algılanmıştı. Aslında beat sayısı 24 olmalıydı.
Şimdi de RR aralığının ortalamasını bulalım.
%% RR Araligi Ortalamasi ortalama=0; for i=1:beat-1 ortalama=ortalama+(maxloc(i+1)-maxloc(i)-1)/fs; u(i)=(maxloc(i+1)-maxloc(i)-1)/fs; end ortalama=1000*ortalama/beat % ms cinsinden bulmak icin 1000 ile carpildi.
Sonuç olarak elde edilen çıktı,
ortalama =
745.8000
%% Standart Sapma variance=var(u)*1000 %ms cinsinden
variance = 22.4692
QRS genişliklerinin tespiti için ise zaten bulmuş olduğumuz noktaların farkları alınabilir.
% QRS Genisligi for i=1:beat qrs(i)=sag(i)-minloc(i) end
Çıktısında da QRS genişliklerinin birbirine yakın değerde olduğu gözlenebilir.
Görüldüğü gibi hastalık teşhisi için canla başla çalışanlar yalnızca doktorlar değil
Bizleri de unutmayın.


Hakkinda sayfasindaki mail adresinden gonderebilirsiniz. Ancak birkac gun icinde kontrol edebilirim.
Mail göndermem çok zor çünkü dosyanın boyutu 64 mb .. ama bu adreste olan .dat dosyalarını indirebiliyoruz http://physionet.org/physiobank/database/mitdb/.. Eğer ilgilenirsen çok sevinirim. Ayrıca seninle başka türlü nasıl iletişim kurabilirim. Bana verebileceğin özel mail adresin var mı?..
İlgine çok teşekkürler. iyi çalışmalar
http://physionet.org/physiotools/matlab/wfdb-swig-matlab/ adresinde matlab icin toolbox vermisler. Cunku bu database Matlab tarafindan dogrudan islenebilecek bir veri degil. Kendi database formatlarini olusturmuslar ve veri islemek icin gerekli araclari da http://physionet.org/physiotools/wfdb.shtml adresinde vermisler.
Matlab icin su sekilde imis.
>> r = rdsamp(‘mitdb/100′, ‘maxt’, ‘:10′);
>> plot(r(:,1), r(:,2));
Aciklamasinda da soyle demis:
Şimdi ben http://physionet.org/physiotools/matlab/wfdb-swig-matlab/ bu siteden toolbox’ı indirdim ve kurdum. Program başarılı bir şekilde MATLAB üzerine kuruldu. Veri işlemek için gerekli araçlar için verdiğin linkten MS-Windows’u seçtim karşıma Install Cygwin ve Install XView adında iki farklı şey geldi . Burda izlemem gerekn yol nedir ?? Bu konuda da yardımcı olursan çok sevinirim.
>> r = rdsamp(‘mitdb/100′, ‘maxt’, ‘:10′);
>> plot(r(:,1), r(:,2)); ben bu kodları direkt olarak yazsam datayı görebilirmiyim ?
Cygwin, Windows icin GNU araclarini ve gcc compiler yuklemeye yariyor, XView da basit bir X gostericisi, fakat matlab ile kullanmak icin bunlara ihtiyacin yok.
Sadece matlab toolbox’i senin icin yeterli.
rdsamp komutunun yardim bilgilerine bakip parametrelerine gore kullanman gerekiyor. Ben denemedim, cunku su anda kullandigim bilgisayarda matlab yok.
>> r = rdsamp(‘mitdb/100′, ‘maxt’, ‘:10′);
>> plot(r(:,1), r(:,2));
Bunlari yazarsan senin ilk gonderdigin sayfadaki 100.dat verisi otomatik olarak alinip gosterilir diyor sayfada.
Çok teşekkür ederim. Dalga şeklini figure’de gördüm. Şimdi ben bu alınan data’lar üzerinde teşhis amaçlı bir çalışma yapcağım. Sinyal işleme aracı olarak dalgacık dönüşümü veya FFT kullanmayı düşünüyorum. Bu konu ile ilgili araştırmalarım devam ediyor. Bu aralar vizelerim başladı biraz ara vermek zorunda kaldım..
Seninde çalışman bununla alakalıymış. Bana önerebileceğin yöntem ve filtre var mı ?
Ayrıca seninle daha iyi iletişim kurabilmem için bana mail adresini verebilir misin?
İlgine çok teşekkürler.
Ben su anda cok farkli bir konuda calisma yapiyorum. Buradaki konularin uzerinden cok fazla zaman gecti. Fakat yine de yardim etmeye calisirim.
Mail adresini de daha once soyledigim gibi “Hakkinda” sayfasinda bulabilirsin.
Kolay gelsin.
Çok teşekkürler sana gerçekten danışacağım bir çok konu olacak.. Öncelikle sinyal işleme konusunda ne düşünüyorsun??
Aydın abi tekrardan merhabalar. Uzun bir sınav maratonundan sonra tekrar konu üzerine yöneldim. Şimdi sen Cygwin, Windows icin GNU araclarini ve gcc compiler yuklemeye yariyor, XView da basit bir X gostericisi, fakat matlab ile kullanmak icin bunlara ihtiyacin yok. Sadece matlab toolbox’i senin icin yeterli demiştin. Bunlar siyal işleme için mi gerekli ?..
Ben aldığım bu sinyalleri matlab üzerinden önce filtreleyip sonrada işlmemem gerekli. Filtre olarak sorun yokta sinyal işleme olarak dalgacık dönüşümü ve hızlı fourier dönüşümünün düşünüyorum. Bu alınan sinyali işlemem için direk dönüşümün formüllerini ve katsayılarını yazmam gerekli olacak mı??.. Veya bu datayı görmem için özel bir toolbox yüklediğim gibi aynı sinyali işlemek içinde özel bir yamam yüklemem gerekiyor mu??.. Yardımlarını bekliyorum. Senden telefon veya mail adresini istedim. Çünkü burda yazıp cevap beklemem uzun zamanımı oluyor..
İyi çalışmalar.. Görüşmek dileğiyle.
Datayi matlab ortamina aldiktan sonrasi artik WFDB library ile ilgili degil. Istedigini yapmakta ozgursun.
Ister filtrele, ister donustur, data artik elinde. Isin teorik kismi hakkinda bilgim yok malesef, yani hangi filtreyi kullanmalisin, hangi donusumu yapmalisin bilemiyorum.
Sinyal isleme icin eger dersinizde kullandiginiz bir toolbox varsa ondan yararlanman daha iyi olur. Yoksa yine kitabin onerdigi fonksiyonlara goz atabilirsin.
Tek bir ornege de takilip kalma, internetten degisik kaynaklardan ornek kodlar bulup goz at.
Mail adresim, daha once 2 kere yazdigim gibi Hakkinda sayfasinda var, telefon da sana oldukca pahaliya patlayabilir, hic deneme derim.
Ben çalışmalarıma devam ediyorum. Telefon neden bana pahalıya patlar ?. Ben yinede denemek isterim zorda olmasam bişey değil ama gerçekten zordayım. Benim bu sıkışıklıkta bu kadar sürede bitirmem çok zor. O yüzden deneyimli birinden ders almam gerekli. Eğer sende düşünürsen görüşelim
Bu aralar pek ilgilenemiyorum blogla da. Anca firsat bulup da yazabildim.
Dedigim gibi ben sinyal islemeyle pek ilgili degilim. Buradaki de sadece ders projesinde yapilmis ufak birsey, uzerinden de yillar gecti.
Cok temel ve basit seylerde belki fikir verebilirim ama spesifik konularda gercekten bilgim yok.
Ilerlemeni saglayacak tek sey daha fazla ornek bulmak.
Spesifikte olsa şu anda her türlü bilgi bana yararlı olacaktır. Derslerim o kadar sıkışık ki teze çok fazla zaman ayıramıyorum. Seninle bir şekilde irtibata geçersem bana hiç değilse matlab ile ilgili ufak birşeyler gösterirsin.
Bir sorum olacak.
Ben senin gibi işe başladım yani öncelikle sinyali matlaba attım. Benim örneğim MIT’den indirdiğim .dat dosyaları. Örneğin ben şuan 100 numaralı dat dosyası üzerinde çalışıyorum senin ham sinyal dediğin yere ben 100 diyerek düzeltme yaptım. Daha sonra karşıma çıkan figure’de birşey çıkmadı bunun sebebi nedir ?
Programım aşağıdaki gibidir .
close all
clear all
clc
%Degisken ve Sabitlerin Tanimlanmasi
fs=200; % sample rate
%Sinyalin Matlab Ortamina Alinmasi
r = rdsamp(‘mitdb/100′, ‘maxt’, ‘:10′);
plot(r(:,1), r(:,2));
figure
%Filtre
%10 point avarage filter
B=(1/10)*ones(1,10);
A=1;
freqz(B,A);
title(’10 Point Moving Avarage Filtre’);
figure
avaragefiltrelisinyal=filter(B,A,100);
plot(avaragefiltrelisinyal)
title(‘Moving Avarage (Low Pass) Filtreden Gecmis Sinyal’);
figure
avaragefiltrelisinyal=filter(B,A,r(:,1));
ya da
avaragefiltrelisinyal=filter(B,A,r(:,2));
olarak dene. Senin verin artik 100 degil r.
Datanin hangi indexte oldugunu bilmiyorum, o yuzden yukaridaki ikisinden biri calismali.
Öncelikle çok teşekkür ederim. buradaki r(:,1) ve r(:,2)’nin anlamı ne ?.. Ben sendeki filtreyi bu EKG sinyali üzerinde kullandım .. Sende başka filtre algoritması varmı . Ayrıca bu filtrenin benim işaretime uyması için neler ile oynamalıyım?.. Buradaki B=(1/10)*ones(1,10);
A=1;
freqz(B,A); freqz komutunun anlamı ne ?.. ones?. ayrıca A=neden 1 ??.. Bu soruların cevabını bana kısaca verirsen çok sevinirim. Yavaş yavaş öğrenecem bu işi. Çok değerli vaktini alıyorum kusura bakma. Çok teşekkürler iyi çalışmalar diliyorum.
Parantez icinde verdigin rakamlar matrisin koordinatlarini belirtiyor. Ornegin r matrisinin 2. satir 3. sutunundaki veriyi istersem r(2,3) yazarim. Tum satir ya da sutunlari almak istersen de colon “:” kullaniliyor. Yani r(:,1), r matrisinin ilk sutunundaki tum satirlari verir.
freqz, payi ve paydasi verilen transfer fonksiyonu icin filtrenin frekans cevabini donduruyor.
ones da birlerden olusan matris olusturuyor. ones(1,10) sana 1×10 boyutunda tum elemanlari 1 olan bir matris olusturur. Bunu da 1/10 ile carparsan tum elemanlari 1/10 olan 1×10 boyutunda bir matris olmus olur. A’nin 1 olmasi da tamamen filtre tasarimiyla ilgili bir durum. Transfer fonksiyonun payi ve paydasi sana bagli, tabi beli kurallar icerisinde.
Basit komutlar hakkinda en cabuk bilgiyi yine matlabin help komutuyla elde edebilirsin.
help freqz
help ones
Bir de eger Linear Algebra dersi aldiysan bir daha gozden gecir, almadiysan da en azindan giris konularina bir goz at derim. Yoksa matrisleri anlamak biraz zor olabilir.
Burada ben r = rdsamp(‘mitdb/100′, ‘maxt’, ‘:10′); plot(r(:,1), r(:,2));
yaparak bir matris mi oluşturmuş oluyorum ? . A nın 1 olması nı neye göre ayarlıyorsun. Bende senin gibi A=1 dedim ve karşıma gürültüsüz net bir analog sinyal geldi. Bu parametreyi neye göre değiştiririm. Filtrede neden 1×10′luk bir matris oluşturduk ?. Sorularım belki saçma olabilirama ne yapayım öğrenmem şart bu mereti ve senden bu işi az çok kaparsam hiç diilse ders aşamasını atlatırım. Çünkü bu işe çok ciddi kafayormam gerekli
Matlabda zaten her veri matris. Sadece tek bir degisken olarak gordugun sey de 1×1 lik bir matris. Oncelikle dedigim gibi biraz lineer cebir bilgisi gerekli.
Filtre konusunda tamamen ozgursun. Burada benim yazdigim sekilde yapmak zorunda degilsin. Sonucta yuksek frekansli gurultuyu filtrelemek istiyorsan, alcak geciren filtre tasarlayip sinyalini bu filtreden gecirmen gerekli. En basit sekilde alcak geciren filtre yapmak istersen de moving average filter kullanabilirsin. Bu filtre cok basit bir sekilde 1×10 luk bir pencereyi datanin uzerinde kaydirarak, denk gelen her elemani filtre katsayilariyla carparak toplamini alir. Mantik olarak 10 elemanli bir pencere tasarlarsan ve her katsayiyi 1/10 yaparsan, senin datandaki 10 elemani toplayip 10a boler, yani ortalamasini almis olur. Bu sekilde pencere tum veri uzerinden bastan sona kayarak ilerler ve tum veride ortalama alir. Bu sekilde sinyalindeki sivri tepeler yuvarlaklasir. Bu da yuksek frekanslarin yok edildigi anlamina gelir. Filtrenin transfer fonksiyonuna gore B ve A katsayilari belirleniyor. Yuksek dereceli bir transfer fonksiyonu kullanacaksan A’yi da belirlemen gerekir. Tamamen nasil bir filtre istediginle alakali. http://www.mathworks.com/help/techdoc/data_analysis/bqm3i7m-1.html , bu sayfadaki orneklere goz atarsan daha kolay anlayabilirsin.
merhabalar ben de izmir dokuz eylüldeyim bu arada,
şimdi bende bi ekg sistem kurma projesi yapıyorum.
burada sizin başta aldığınız sinyal direk elektrodlardan alınmış sinyal mi yoksa elektrodlardan alındıktan sonra normal bildiğimiz filtrelerden geçirilmiş sinyal mi?
normalde ekg sinyalleri 1-50 hz arasındaki bilgileri barındırıyo.
burda yapılan işlem tam olarak nasıl?
uzun bir aradan sonra merhabalar..
bir yerde takıldım. şimdiz biz burda qrs genişliklerini belirleyebiliyoruz. Benim yapmak istediğim bu genişliklerin refarans değerlerine hasta tespiti yapabilmek ( yani taşikardi bradikardi vs.) bunun için ne yapmam gerek . program o genişlikleri ölçüp benim belirlediğim referans değerlerine göre bu data şu hastalıktadır diye nasıl diyebilir ??
Burada kullanilan sinyal dogrudan problardan alinmis sinyal. Fakat cevre gurultuleri de karismis hali.
Hastalik teshisi konusunda bilgim yok, fakat eger hastaligin EKG uzerindeki etkisini tam olarak biliyorsan karsilastirma yaparak sonuca ulasabilirsin, neden olmasin?
Teşhis dediğim basit birşey. Ben dalgacık dönüşümü kullanarak EKG sinyalini iyice görülebilir hale getirdim. Sinyalin aralıklarını iyice açtım filtre ve dalgacık dönüşümü kullanarak.
Teşhis için belli referans değerleri var . Ben programa örneğin qrs kompleksinin referans değerini yazacam sonra kendi EKG datamın qrs ine bakarak bu hastadır veya değildir diyebilcek.
Bu konuda yardımlarını bekliyorum.
buradaki qrs genişlikleri ms cinsindenmi ?..
2 3 5 0 11 0 1 5 0 3 2 4 0 0
böyle birşey çıkması neyi ifade ediyor ??..Bu sorunun cevabını acil bekliyorum.
Bir sorum daha olacak. Ben buradaki QT aralığını nasıl bulabilirim.
İlgine teşekkürler. İyi çalışmalar.
Genisligin birimi kullandigin datanin ornekleme frekansina gore degisebilir. Anca bu ornekleme frekansini bilirsen QRS ya da QT genisligini tam olarak bilebilirsin.
Hastaligin ozelligi de ornegin QT suresinin uzamasi (ya da kisalmasi) ya da tepe degerinin artmasi/azalmasi gibi birsey ise, dedigim gibi karsilastirma yapabilirsin, korelasyonuna bakabilirsin, vb.
Ama sorarsan nasil yapabilirim diye, bilemiyorum. Sadece fikir vermeye calisiyorum.
Datanın örnekleme freakansı hakkında herhangi bir bilgi yok.
QRS genişliklerinin yukarıdaki gibi çıkmasının anlamı nedir sence ?.. Ben burda bu aralıkları ms cinsinden görmek istiyorum. Mesela RR aralığını ms cinsinden görebiliyorum.
Teşhis için gerekli olan şeyler: QRS kompleksinin düzenli olup olmaması, genişliği. P/QRS oranı. Ben burda P/QRS oranına da bakmam gerekli. O konu hakkındada bir yol gösterirsen çok iyi olur.
Şu an teşhis aşamasında duraklamış durumdayım. Bana biraz yardımcı ol ne gerekirse yaparım.
İlgine teşekkürler.
Yukarida verdigin sayilarin ne olduklarini anlamadim. Ama zaten dedigim gibi ornekleme frekansini bilmiyorsan ms cinsinden sonuc alman mumkun degil. Ancak iki ornek arasindaki zamani bilirsen (ki bu ornekleme frekansi demek), istedigin herhangi bir araligi zaman cinsinden bilebilirsin.
Fakat cikis yolun soyle olabilir. Eger teshis icin sadece P/QRS orani yeterli ise, surelerin ms cinsinden olmasina gerek yok. Pnin baslangic ve bitim noktalarini bulduktan sonra farkini alip P uzunlugunu sample cinsinden bulmus olursun. Ayni islemi QRS in baslangic ve bitim noktalari icin de yaparsan QRSin uzunlugunu da ayni birim uzerinden bulmus olursun. Bunlarin orani sana teshis icin gerekli degeri verebilir. (Verdigin bilgiye gore soyluyorum, yoksa bu oranin hastalikla bir ilgisi olup olmadigi konusunda bilgim yok)
Burda P dalgası çok değişken bir yapıda olduğu için bulma adına bir çözüm getiremedim.
Senin yapmış olduğun(yukardaki 4000 örnekli) datada P ve QRS değerlerini nasıl bulabilirsin. Zaten Q noktasını belirlemişsin.
QRS genişliğinde sende değerler nasıl çıkıyor ?. Senin gibi yaptığımda bende vektör halinde birşey çıkıyor.
Sen kendi datanda bana P/QRS i yazarmısın ? bende ordan yola çıkayım.
En sondaki,
kismindan gorebilecegin gibi bu zaten her beat icin qrs genisligini vermeli. Sonucunu buraya yazmamisim ama dedigim gibi birbirlerine yakin degerler cikmali.
Su anda programi modifiye etmeye ya da en azindan eskiden ne yapmisim diye ugrasmaya gercekten zamanim yok. Kontrol alaninda doktora yapiyorum. Bu sayfadaki programla ilgili de hatirladigim kadariyla yardimci olmaya calisiyorum ama epey unutmusum. Fikir ya da oneri verebilirim ama kodlamaya ayiracak vaktim pek yok malesef.
O zaman fikir ve önerilerini bekliyorum ).. Şu anda kalp hızını rahatlıkla belirleyebiliyorum atım/dk oalrak. Ama ben daha fazla yol istiyorum. Mesela QT aralığını bulmak veya P/QRS oranının 1 olduğunu göstermek. Bu konuda yardımlarını bekliyorum matlab üzerinde. Tşkler.
birşey soracağım burda neden kare alma türev ve integral alma fonksiyonları kullanılıyor ??
ecg3 verisini nerden alabiliriz yukardaki veriyi kaydettim ama matlaba ecg3 olarak yükleyemedim yardımcı olursanız sevinirim.
@salih sampling rate belliyse istedigin araligin suresini zaten belirleyebilirsin. Belirlenen Q indisi ile T indisinin farki sample cinsinden araligi verir, rate belliyse de ms cinsine donusturebilirsin.
Filtreleme icin
Internette pek cok kaynaktan bulabilirsiniz. Benim verdigim veriyi text dosyasi halinde, adi ECG3 olacak sekilde kaydederseniz (uzantisi yok) kodun calismasi gerekli. Eger txt ya da herhangi baska bir uzantisi varsa da kodu buna gore guncelleyin.
Blogu epey zaman önce keşfetmeme rağmen, boşta kaldığım şu an blogu didiklemeye karar vermiş tüm yazıları tek tek okuyordum. Açıkçası bu yazıya yorum bırakmadan geçmek istemedim. (Konudan bağımsız olacak gerçi ama blog sahibini bu konuda da tebrik etmeli.)
Tebrik ederim! Sadece bu konudaki teknik anlamda üretiminizden dolayı değil sabrınızdan dolayı! Yorumları tek tek okudum. Bazı yorumlar var ki “ibretlik”. Bilimsel ya da teknik konularda bir blog yazmak epey zormuş şu an emin oldum.
Zira bu yazının altına gelmiş yorumlarla ben karşılaşsam aynı tepkiyi verir miydim bilemedim.
O vakit iyi çalışmalar. Tabii bir de güç sizinle olsun!