الگوریتم Pan-Tompkins در تشخیص پیکهای R سیگنال ECG
در پردازش سیگنال قلبی (ECG) اولین مرحله آشکارسازی پیکهای R است. از طریق موقعیت پیکهای R کمپلکس QRS، سیگنال RRI (فاصله زمانی بین پیکهای R) و HR استخراج میشود. آشکارسازی درست موقعیت پیکهای R برای تحلیل های بعدی بسیار با اهمیت است. الگوریتم Pan-Tompkins یکی از معروفترین روشها در تشخیص پیکهای R در سیگنال قلبی هست.الگوریتم Pan-Tompkins یک سری فیلتر روی سیگنال ECG اعمال میکند و نواحی مرتبط با QRS را برجسته تر میکند و در نهایت پیکهای R را تشخیص میدهد. در این پست میخواهیم با مراحل این روش توسط یک مثال عملی آشنا شویم.
هدف از تشخیص پیکهای R در سیگنال قلبی
معمولا برای تحلیل بیماریهای قلبی، خود سیگنال خام ECG مورد تحلیل قرار نمیگیرد. از کمپلکس QRS برای بررسی الگوی زمانی سیکل قلبی در تشخیص آریتمیها استفاده میشود، یا از سیگنال RRI، فاصله زمانی بین پیکهای R برای تشخیص بیماریهای قلبی مثل آپنه خواب استفاده میکنند.
برای همین در گام اول پردازش سیگنال قلبی، باید موقعیت پیکهای R آشکار شود. و بسیار مهم است که این موقعیت به درستی تشخیص داده شوند، چرا که تشخیص اشتباه سایر مراحل پردازش را بسیار تحت تاثیر قرار میدهد.
چالش تشخیص پیکهای R در سیگنال قلبی
خب وقتی به سیگنال قلبی نگاه میکنیم، مبینیم در که این سیگنال، پیکهای R بسیار Dominant هستند و به نظر میرسه که تشخیص آنها خیلی هم چالش برانگیز نباشد!
ولی واقعیت اینه که در عمل، سیگنال تحت تاثیرنویزهای مختلف قرار میگیرد و تشخیص پیکهای r در آن بسیار چالش برانگیز میشود. الگوریتم Pan-Tompkins در فرایند 6 مرحله ای این پیکها را با دقت بسیار خوبی تشخیص میدهد.
الگوریتم Pan-Tompkins
به طور کلی الگوریتم Pan-Tompkins در 6 مرحله، موقعیت پیکهای r در سیگنال ecg را پیدا میکند.
- اعمال فیلتر پایین گذر: در مرحله اول، با یک فیلتر پایین گذر نویزهای فرکانس بالا را حذف میکند.
- اعمال فیلتر بالا گذر: در مرحله دوم، با یک فیلتر بالا گذر نویزهای فرکانس پایین (baseline wander) را حذف میکند.
- محاسبه مشتق سیگنال: در مرحله سوم، مشتق سیگنال را محاسبه میکند تا موقعیت پیکهای r برجسته شوند.
- محاسبه توان سیگنال: در مرحله چهارم، توان سیگنال را محاسبه میکند تا پیکهای r برجسته تر شوند.
- محاسبه انتگرال سیگنال: در مرحله پنجم، یک فیلتر میانگین گیری روی سیگنال اعمال می شود تا سیگنال را smooth میکند تا تشخیص پیکهای r ساده تر شود.
- تشخیص پیکهای سیگنال: در مرحله ششم، موقعیت پیکهای r (قله ها-ماکزیمم های محلی) را پیدا میکند.
مرحله اول الگوریتم Pan-Tompkins، اعمال فیلتر پایین گذر
سیگنال ECG خام، حاوی نویزهای فرکانس بالا هست و همین باعث میشه که تشخیص موقعیت پیکهای r چالش برانگیز باشد. از اونجا که اطلاعات QRS در فرکانسهای کمتر از 40 هرتز هست، یک فیلتر پایین گذر با فرکانس قطع 40 هرتز، سیگنال را فیلتر میکنند تا اطلاعات اصلی سیگنال حفظ شوند و اطلاعات مرتبط با نویزهای فرکانس بالا از سیگنال حذف شوند.
Python
fh= 20
b1,a1= signal.butter(3,fh/(fs/2),'low')
sig1= signal.filtfilt(b1,a1,sig)
plt.plot(sig1)
plt.show()
مرحله دوم الگوریتم Pan-Tompkins، اعمال فیلتر بالاگذر
یکی از رایجترین نویزها در سیگنال ECG نویز Baseline wander هست. این نویز در فرکانسهای کمتر از 0.5 هرتز قرار دارد و اگر حذف نشود، تشخیص پیکهای r به خاطر شیفتهای رخ داده در بازه های زمانی بسیار چالش برانگیز میشود. در این مرحله، با یک فیلتر بالاگذر اطلاعات مرتبط با نویزهای فرکانس پایین حذف می شود.
Python
fl= 0.5
b2,a2= signal.butter(3,fl/(fs/2),'high')
sig1= signal.filtfilt(b2,a2,sig1)
plt.plot(sig1)
plt.show()
مرحله سوم الگوریتم Pan-Tompkins، محاسبه مشتق مرتبه اول سیگنال
هدف تشخیص موقعیت پیکهای r در سیگنال ECG هست. هرچقدر این پیکها برجسته تر شوند، تشخیص راحتتر خواهد بود. در این مرحله با محاسبه مشتق مرتبه اول سیگنال ECG، موقعیت پیکهای R برجسته می شود.
Python
sig2= np.diff(sig1,n=1) plt.plot(sig2) plt.show()
مرحله چهارم الگوریتم Pan-Tompkins، محاسبه توان سیگنال
هدف تشخیص موقعیت پیکهای r در سیگنال ECG هست، اگر چه در مرحله قبل، این موقعیتهای برجسته شده، ولی هنوز جای کار داره. اول اینکه مقادیر مثبت و منفی هست و تشخیص سخت هست. دوم اینکه هنوز این خیلی برجسته نیست. و نسبت به درایهای کناری اختلاف زیادی ندارند.
Python
sig2= np.square(sig2) plt.plot(sig3) plt.show()
از اونجا که مشتق در نواحی QRS مقداری بزرگتر از 1 یا کوچکتر ازمنفی 1 هست، در نتیجه توان آنها عددی خیلی بزرگتر 1 خواهد شد، ولی در سایر نواحی مقدار مشتق در بازه بین 1 و منفی 1 هست. در نتیجه توان حاصل آنها عددی به مراتبط کوچکتر از یک خواهد شد. و همین باعث میشه که میزان اختلاف بین پیک R و مقادیر کناری خیلی بیشتر و بیشتر شود. و قطعا تشخیص این نقاط رو ساده تر میکند.
مرحله پنجم الگوریتم Pan-Tompkins، محاسبه انتگرال سیگنال
سیگنال بدست آمده در مرحله قبل، بسیار بهتر شده است، ولی مشکل بزرگتری وجود دارد! در هر بخش مرتبط با qrs تا قله هست! اگر در این سیگنال دنبال موقعیت پیک r بگردیم، به ازای هر کمپلکس QRS دو تا پیک پیدا میکند!!! نه یه دونه!!
خب راه چاره چیه؟ تبدیل این دو قله به یک قله! چجوری؟ با انتگرال گیری از سیگنال. به عبارتی اعمال یک فیلتر میانگینگیری
فقط باید حواسمون باشه که کرنل اندازه و نوع مناسبی داشته باشه.
چه نوع کرنلی انتخاب کنیم؟ کرنلی که باعث بشه، این دو قله به یک قله نوک تیز تبدیل شود. و این هم با یک کرنلی که خودش شبیه به قله هست میتواند اتفاق بیافتد. میتونیم از کرنل گوسی، Hamming و hanning استفاده کنیم.
این کرنلها به درایه وسطی بیشترین وزن و به بقیه بسته به فاصله ای که به مرکز دارند وزن کمتری میدهند. اینطوری درایه های نزدیک به داریه وسط نقش زیادی در میانگین گیری خواهند داشت و همین باعث میشه که نتیجه فیلترینگ یک نتیجه ایده آل باشه. به ازای هر QRS یک قله نوک تیز ساخته میشود.
اندازه کرنل چقدر باشد؟ اندازه کرنل بهتره به اندازه ای باشه که یک کمپلکس QRS رو پوشش بده. اینطوری برای هر QRS یک قله نوک تیز ساخته میشود.
از رابطه زیر میتونیم برای تعیین اندازه کرنل استفاده کنیم و خیالمون راحت باشه که هر سیگنال داشتیم، اندازه مناسب برای کرنل تعریف شود.
k-size= 0.15*samplingFrequency
Python
k_size= round(0.15*fs)+1 kernel= np.hamming(k_size) kernel= kernel/np.sum(kernel) n= int(k_size/2) sig_pad= np.pad(sig3,pad_width=[n]) sig4= np.zeros_like(sig3) for i in range(n,sig_pad.shape[0]-n): tp= sig_pad[i-n:i+n+1] tp= np.sum(tp*kernel) sig4[i-n]=tp plt.plot(sig4) plt.show()
مرحله ششم الگوریتم Pan-Tompkins، تشخیص نقاط ماکزیما
حال یک سیگنال تر و تمیزی داریم که به ازی هر کمپلکس QRS یک قله نوک تیز داریم که دقیقا موقعیت پیک R رو مشخص میکند. کافیه دنبال این نقاط ماکزیمم باشیم. به شکل های مختلف میشه اینکارو کرد. یک حد آستانه تعریف میکنیم و نقاط ماکزیمما را پیدا میکنیم.
Python
k_size= round(0.15*fs)+1 thr= np.mean(sig4) flag=0 locs=[] for i in range(sig4.shape[-1]-1): if sig4[i]>=thr and flag==0 and sig4[i+1]<sig4[i]: flag=1 locs.append(i) elif sig4[i]<thr: flag=0 plt.plot(sig4) plt.plot(locs,sig4,'r^') plt.show()
همین!
موفق باشید…
در دوره پردازش سیگنال ECG روشهای پردازش سیگنال قلبی به صورت تخصصی و پروژه محور آموزش داده میشود. یکی از الگوریتمهایی که در فصل دوم دوره آموزش داده میشود، الگوریتم Pan-Tompkins هست که صفر تا صد پیاده سازی شده و روی داده های مختلف اعمال میشود.
دیدگاه ها