Detecting and Quantifying T-Wave Alternans: The PhysioNet/Computing in Cardiology Challenge 2008 1.0.0

File: <base>/sources/Rodrigues/quantificaralternons.m (3,116 bytes)
function valor=quantificaralternons(sinal,batidas,inicio,freqamostragem,NUMbatidas)

#quantificaralternons.m quantifies the magnitude of alternons in a sequence of 'Numbatidas' beats 
#Copyright (C) 2008 Rui Rodrigues <rapr@fct.unl.pt>
#This software is released under the terms of the GNU General Public License (http://www.gnu.org/copyleft/gpl.html)



%sinal é o ecg a considerar mas só a coluna de um dos 'leads'
%para carregar o edb/e0105 faz-se:
%sinal=load inicioe0105.txt;

%batidas é o ficheiro  por exemplo da forma:
% 'ihr -r edb/e0105 -a atr -i -v>batidas_edb_e0105.txt'
%para o carregar faz-se:
%batidas=load batidas_edb_e0105.txt;

%inicio (>0) é o numero da batida onde se vão iniciar a NUMbatidas (128) batidas a considerar

%tudo é o conjunto de todos os stt segmentos colados num só

%wabs é fft(tudo) no intervalo 1:NUMbatidas*numamostraspsegmento

%NUMbatidas=64;

[segmentos tfins pulsacaomedia]=trocos(sinal,batidas,inicio,freqamostragem,NUMbatidas);

[a b]=size(segmentos);

numamostraspsegmento=a;

amostrasporbatida=60*freqamostragem/pulsacaomedia;

tudo=reshape(segmentos,NUMbatidas*numamostraspsegmento,1);

wabs=spectrum(tudo,numamostraspsegmento,NUMbatidas);

comeco=batidas(inicio,1);

%grafico(sinal,segmentos,wabs,numamostraspsegmento,tfins,comeco,amostrasporbatida);

valor=quantificar(wabs,NUMbatidas);

endfunction





%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%quantificar o valor dos alternons

function valor=quantificar(wabs,NUMbatidas)

  mediasfora=zeros(1,11);

  desviospfora=zeros(1,11);

  centros=zeros(1,11);

  for w=0:2

    [mediasfora(w+1) desviospfora(w+1)]=mediadesviopfora(wabs,w,NUMbatidas);

    centros(w+1)=sum(wabs(NUMbatidas/2-w:NUMbatidas/2-+w))/(2*w+1);

  endfor

  diferencas=centros-mediasfora;

  

  [valor w]=max(diferencas./desviospfora);

  %w



endfunction


%%%funcao auxiliar


function [media desviopadrao]=mediadesviopfora(wabs,w,NUMbatidas)


  v=zeros(1,11);

  for i=NUMbatidas/2-20:NUMbatidas/2-10

    v(i)=sum(wabs(i-w:i+w))/(2*w+1);

  endfor


  media=sum(v)/length(v);

  aux1=media*ones(1,length(v));

  aux2=(aux1-v).*(aux1-v);

  desviopadrao=sqrt(1/(length(v))*sum(aux2));

endfunction



function res=grafico(sinal,todossegmentos,wabs,numamostraspsegmento,tfins,comeco,numamostrasbatida)

  numbatidasapor=15;

  limitesinal=comeco+ceil(numbatidasapor*numamostrasbatida);

  intervalo=[comeco:limitesinal];

  TfinsR=tfins(tfins<=limitesinal);

  ltfins=length(TfinsR);

  average=sum(sinal(comeco:limitesinal))/limitesinal;

  A=min(sinal(comeco:limitesinal));

  B=max(sinal(comeco:limitesinal));

	     
  subplot(4,1,1);plot(todossegmentos(1:numbatidasapor*numamostrasbatida));

  subplot(4,1,2);

  stem(TfinsR,(B-average)*ones(1,length(TfinsR)));hold on;

  stem(TfinsR,(A-average)*ones(1,length(TfinsR)));hold on;
  
  plot(intervalo,sinal(comeco:limitesinal)-average);

  hold off;

  subplot(4,1,3);plot([1:64*numamostraspsegmento]/128,wabs,'ro');

  a=floor(numamostraspsegmento/4);

  subplot(4,1,4);plot([a:128]/(128),wabs(a:128));

  res=1;

endfunction

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%