• No results found

Signal processing task, ECG. Camilla Almquist, Magnus Björnfot, Teodor Erngren


Academic year: 2021

Share "Signal processing task, ECG. Camilla Almquist, Magnus Björnfot, Teodor Erngren"


Loading.... (view fulltext now)

Full text





Signal processing task, ECG 


Camilla Almquist, Magnus Björnfot, Teodor Erngren                                                               



  ECG is one of the most common examinations a cardiologist perform on their  patients in order to check the condition of the patient's heart. An ECG signal can look  very different depending on which lead you are looking at. Also a lot of diagnoses  can be obtained from an ECG and therefore it’s a very strong tool for a physician to  use. One of the big problems with extracting diagnostic information from a ECG  signal is that it can be filled with noise. A nosiey signal can be very hard for a  physician to analyze. Correct analysis of an ECG can be the difference between life  and death for some patients, therefore it’s crucial to have nice and easily readable  signals. In order to achieve that,it’s necessary to have a good and versatile algorithm  to filtrate and retrieve useful information from an ECG,  that can be analyzed by a  physician.   


Theoretical background 


The cardiac muscle  The cardiac muscle more known as the heart is the body’s strongest muscle and  works non­stop under our whole life. It transports the blood throughout our bodies to  provide it with oxygen and nutrients. The heart consists of four main parts, two  chambers and two atriums. The blood goes through these part to get either to the  lungs, to be oxygenated, or out in the body(1).      The heart differs a lot from other muscles in the body, its muscle fibers are much  shorter and exhibits branching which give the fibers a stair­step appearance. One of  the most important properties of the cardiac muscle is that it has special fibers called  autorhythmic fibers. This means that they are self­excitable and produces action  potentials repeatedly that triggers contractions in the heart. These nerves act like the  heart's pacemaker and also makes up the heart’s conduction system. The heart’s  electrical excitation usually begins in the sinoatrial node (SA). The SA doesn’t have a  stable resting membrane potential, instead it depolarizes to threshold spontaneously  and repeatedly. Theses signals propagate along the atrium via the cardiac fibers,  this makes the two atriums to contract at the same time. The signal propagate to the  atrioventricular node (AV), the AV node slows the signal down. The delay produced  by this is in order for the blood to have time to leave the atriums. From the AV node  the signals goes to the AV bundle, this is the only site in the heart where the signal  can conduct from the atria to the ventricles. From the AV bundle the signal  propagate further and finally reaches the large Purkinje fibers that quickly transmits  the signal making the ventricles contract and the blood pushes out(1).    


    ECG  The father of ECG is Willem Einthoven, he invented the first practical  electrocardiograf in 1903 and got the Nobel Price in medicine in 1924 for his work.  He was the one to denote the different part of the ECG such as P , Q , R , S and  T(2).     ECG can be used to monitor the heart’s conduction system and from that get  diagnostic information. Like mentioned before Einthoven named the different part of  the standard ECG signal, the P­wave is the depolarization of the atrium,  QRS­complex is the ventricles depolarization and T is the repolarizing of the  ventricles. The ECG signals looks different depending on what leads that are  registering the signal. Einthoven developed three leads only using three electrodes,  one on the ankle and one on each wrists, they are called lead I, II and III. 30 years  later E. Goldberger derived three more leads (aVF, aVL and ­aVR) from Einthoven's  original three leads. These different leads look at the heart from different angles and  can therefore be used to retrieve different information. Later on an American named  F. Wilson added six more electrodes on the chest and therefore created yet more  leads, called V1­V6. These leads can be a compliment to the other leads providing  even more information about the heart(3).       


  Because of the uncertainty of how the ECG signal looks the implementation needs to  be general and applicable to any ECG signal. There could be different approaches in  how code is implemented, but here focus is on finding local maxima and minima in  the ECG. The easiest way to start is to localize the R wave in the QRS complex. We  start by filtering the signal allowing only the highest frequencies to pass. If the cutoff  frequency is good enough only the QRS complex will remain in the signal. We then  form an amplitude threshold and use MATLABs built in function findpeaks which  saves the value of the peaks and the locations of the peaks. After this we return to  the original signal and filter this both with lowpass and highpass filters to get a  smooth and nice looking ECG signal. Now the position of the R component is known  and the signal is good enough to analyze further. The property of the ECG signal is  then used to find the Q and S components.    To find the Q and S components the geometry of the QRS complex is used. The Q  and S peaks are the local minima in either direction of the R peak. The T peak can  also be studied using the same method, but finding a local maxima. Then all the 


relevant peaks are determined because we have no need for the P wave for this  task.    The ST­level is one important part of this task and is very easily determined from the  data previously gathered. The ST level is sometimes hard to determine, but as long  as we study the same thing all the time we can see how the trend changes and from  that have some diagnostic value. Here the value in between the S and T peak is  saved in a vector and is illustrated in a graph for the user.    Arrhythmic beats are found based on the time distance between beats. The average  width of the normal beats is found going through them and checking the width one  fourth up the R peak. The same way the width of the arrhythmic beats is found and  they are separated into two groups depending on weather they are broader than  normal or not.    



ECG 1  This ECG is normal, there are no ST shifts or arrhythmia. The person has a pulse of  69 beats per minute.    


  ECG 2  This is a heart with pulse 69 beats per minute. The baseline is wandering, but this is  filtered out and no ST shifts or arrhythmias is found.       ECG 3  The person has a normal pulse at 76 beats per minute, but six arrhythmic beats are  found. They have the same width as the ordinary beats, but are too early, this might  be premature atrial complex. In the figure below the fourth beats from the right is an  arrhythmic beat.  


      ECG 4  This person has a pulse of 66 beats per minute and 139 arrhythmic beats. These  beats are broader, take more time, than the other beats, this could be Premature  Ventricular Complex Bigeminy. Because of the shape of the R peak, which isn’t  even, the S peak and T wave are found on top of the R peak. This results in the  detection of a ST shift, which might not really be there.  


        ECG 5  There is something happening to this person between 480 and 580 seconds. This  time yields four arrhythmic beats, one broad and three of normal size. ST shifts are  also found in the time before and during this, between 380 and 540 seconds.  



  The rest of the ECG is better, but the pace of the beats is shifting and the beats have  a more varying ST level than the other ECGs have. 





As mentioned, an ECG is a powerful diagnostic tool for a physician to use. With a good  mapping of the conduction system of the heart a lot of conclusions about its status can be  drawn. However, because of measurement noise and the fact that an ECG signal may look  very different from time to time, it might be hard to analyze. Noise might occur from many  sources, the ECG measures the action potentials from the heart which have a fairly low  voltage (+30 mV) and it’s also very close to an action potential from a skeletal muscle. Noise  from muscle are often present due to the fact that you measure on the skin and the muscle  are between the heart and the electrodes. Also the different leads produces signals that look  a lot different from each other and of course in a pathological state, the ECG can differ as  well. All these different cases are hard to cover with an algorithm just because of the  different shapes of the ECG signal. For diagnostic purposes it’s crucial to know which lead  the signal comes from, because a pathological ECG from on lead can look like a healthy one  from another lead and vice versa.    Ideally it would be desirable to have an fully adaptive algorithm that could identify from what  lead the signal came from and could perform specific filtering and signal processing for each  case.     In the assignment the group had to makes some sacrifices in some ECG signals to gain  something else in the others. Some of the given signals were very noisy and hard to filter  without losing any information. The filters needed therefore to be able to filter “good enough”  on all signals to be able to give some diagnostic information. For example in ECG4 were the  filtering distorted the arrhythmic beat. Also the way the group defined the ST­shift was good  on most of the ECG signals gives a good view of the ST­level, but again in some ECGs the  S­peak and/or T­peak wasn’t found at the right location due to noise and small peaks  between the peaks that are mistaken for the right peaks. All and all the approximation done  and the sacrifices done in some of the ECG resulted in an algorithm that handles the 


majority of the signals in a correct way. The other signals still are handle good enough to  give out the relevant diagnostic information and the “errors” in the data handling is detected  and accounted for.   




There are several improvements that could be made to the code in appendix 1. There is  much filtering involved and the filters are probably not the best suited for these signals.  There was not enough time to study the filters in depth. One example of a bad filtering is  shown in the figure for ECG 4 where the negative T peak gets distorted. The filtering is also  bad when the QRS complex is too wide. When it is too wide the highest value of the R peak  is not always found.    There are also some properties that the ECG signal is assumed to have. This includes a  narrow R peak with no local maxima points between Q­R and R­S. This is what happens in  ECG 4 with the arrhythmic beats, there is a small but noticeable max point between the R  and S peaks. This is what gives the high value of the ST­level because the right peaks are  not detected. However, with this code there would still be another error. The negative T peak  is something that can not be detected with the current code.  




1. Gerard J. Tortora, Bryan Derrickson. Priciples of anatomy \& physiology :  Organization, support and movement, and control systems of the human body, 13th  ed. Asia: John Wiley & sons Pte Ltd; 2011. 

2. Wikipedia. https://en.wikipedia.org/wiki/Willem_Einthoven (accessed 

4 December 2015). 

3. Araz Rawshani, Lennart Bergfeldt. EKG­Diagnostik: Från cell till 

behandlning. http://ekg.nu/node/8 (accessed 4 December 2015). 


Appendix 1: Code 


function [pulse, No_Arr_narrow_beats, No_Arr_broad_beats] = TBMT01signaluppgift1( ECG,fs )  % Filtering to filter anything but the R peaks  [b,a] = butter(6,0.5,'low');  %filtfilt is zero phase filtering (forward and backwards)  ECGlow = filtfilt(b,a,ECG);  [b,a] = butter(6,0.05,'high');  ECG_Rpeak = filtfilt(b,a,ECGlow);  max_ECG = max(ECG_Rpeak);  min_ECG = min(ECG_Rpeak);  meanpeak = (max_ECG+min_ECG)/2;  %Findpeaks is used to find all the peaks and their location with the  %specified properties 

[peaks,location] = findpeaks(ECG_Rpeak,'MinPeakHeight',meanpeak, 'MinPeakDistance' , 150);    


     %Filtrering to smooth the signal enough to get rid of baseline wandering  %and high frequency noice  [b,a] = butter(6,0.25,'low');  ECGlower = filtfilt(b,a,ECG);  [b,a] = butter(6,0.01,'high');  ECG_adjusted = filtfilt(b,a,ECGlower);     %Find the Q peaks by using the location of the R peak  for​ i = 1:length(location)      k=location(i);     while (ECG_adjusted(k) >= ECG_adjusted(k­1))      k= k­1;     end     Qlocation(i) = find(ECG_adjusted == ECG_adjusted(k));  end     %Find the S peaks by using the location of the R peak  for i = 1:length(location)      k=location(i)+1;     while​ (ECG_adjusted(k) >= ECG_adjusted(k+1) && ECG_adjusted(k) > 0)          if numel(ECG_adjusted) < (k+1)         break         else      k= k+1;          end     end     Slocation(i) = find(ECG_adjusted == ECG_adjusted(k));  end  %Find the T peaks by using the location of the S peak  for​ i = 1:length(Slocation)      k=Slocation(i) +1;     while (ECG_adjusted(k­1) <= ECG_adjusted(k))         %A way to not get stuck in a infinite loop         if numel(ECG_adjusted) < (k+1)         break         else      k= k+1;         end     end     Tlocation(i) = find(ECG_adjusted == ECG_adjusted(k));  end  %This segment is for determining the ST level  for i = 1:length(Tlocation)  helpvariable = ceil((Tlocation(i) ­ Slocation(i))/2);  STlevel(i) = ECG_adjusted(Slocation(i) + helpvariable);  end  %The pulse is calculated here  pulse = round(60*length(location)/(length(ECG_adjusted)/fs));     %These next steps is for the plotting  timevector = 0:1/fs:(length(ECG)/fs);  timevector = timevector(1:end­1);  figure('Name','Results',​​'NumberTitle','off'    test = subplot(3,1,1);  plot(timevector,ECG);  title('Raw ECG'    test2 = subplot(3,1,2);  plot(timevector,ECG_adjusted);  title('Filtered ECG'    subplot(3,1,3)  plot(STlevel) 


ylim([­100 150])  title('ST level'    % Finding the arryhthmias  % Distance between R peaks  for i = 2:length(location)      R_diff(i ­ 1) = location(i) ­ location(i ­ 1);  end     R_diff_av = mean(R_diff);  Arr_narrow_beats = [];  Arr_narrow_position = [];  Arr_broad_beats = [];  Arr_broad_position = [];  Width_counter = [];  height = 1/4;     % Calculate the width of the "normal" peaks   for i = 1:length(R_diff)­1      if ~(R_diff(i) < R_diff_av*0.90 && R_diff(i+1) > R_diff_av)              up = 1;          while ECG_adjusted(location(i)+up) > ECG_adjusted(location(i))*height        up = up+1;        if​ location(i)+up >= length(ECG)        break        end          end              do = ­1;          while ECG_adjusted(location(i)+do) > ECG_adjusted(location(i))*height        do = do­1;        if location(i)+do <= 1        break        end          end          Width_counter = [Width_counter, (up­do+1)/fs];      end  end  Norm_width = mean(Width_counter);     % The width of the arrythmetic peaks  for i = 1:length(R_diff)­1      if R_diff(i) < R_diff_av*0.90 && R_diff(i+1) > R_diff_av          u = 1;          while​ ECG_adjusted(location(i+1)+u) > ECG_adjusted(location(i+1))*height        u = u+1;        if location(i+1)+u >= length(ECG)        break        end          end              d = ­1;          while ECG_adjusted(location(i+1)+d) > ECG_adjusted(location(i+1))*height        d = d­1;        if​ location(i)+d <= 1        break        end          end              sum = (u­d+1)/fs;          if sum <= Norm_width*1.2        Arr_narrow_beats = [Arr_narrow_beats, R_diff(i)];        Arr_narrow_position = [Arr_narrow_position, location(i+1)];          else        Arr_broad_beats = [Arr_broad_beats, R_diff(i)]; 


      Arr_broad_position = [Arr_broad_position, location(i+1)];          end      end  end     %These next steps is for plotting  R_diff = R_diff ./ fs;  Arr_narrow_beats = Arr_narrow_beats ./ fs;  Arr_narrow_position = Arr_narrow_position ./ fs;  Arr_broad_beats = Arr_broad_beats ./ fs;  Arr_broad_position = Arr_broad_position ./ fs;     No_Arr_narrow_beats = length(Arr_narrow_beats);  No_Arr_broad_beats = length(Arr_broad_beats);     figure(2)  time = location(2:length(location)) ./ fs;  plot(time, R_diff)  ylim([0 2]);   hold on  plot(Arr_narrow_position, Arr_narrow_beats, '*' plot(Arr_broad_position, Arr_broad_beats, 'o' hold off     linkaxes([test test2], 'x');  end   



Related documents

Here, we used a set of molecular cytogenetic techniques [23-25] providing high-resolution analysis of interphase chromosomes to detect genome variations manifesting at chromosomal

In intelligent transportation systems, vehicles need only be concerned with activity on the road ahead and not behind (an example of this would be for emergency message

Displaced fractures of the femoral neck are necessarily treated through open reduction and internal fixation with cannulated screws or sliding hip screws or

From the main menu screen you can choose to Send Data to the PDMS Database (see page 26) or Turn off the Remote Monitor (see page 18)... Send Data to the

Therefore, it is significant that in the contemporary context, privileged white women who appear to share solidarity with men in their own class, more so than they do

This paper also proposes a study based on harmonics with help of Harmonic Analyzer of non-linear domestic/ industrial loads which is being later compared with results of IEEE power