% PanTomkinsHamilton.m - Calls PanTompkins.dll - the compiled version of Hamilton's % version placed on Internet designed for 200Hz. % % This software is released under the terms of the GNU General % Public License (http://www.gnu.org/copyleft/gpl.html). function [nbr_heart_beats, r_peak_sample_list] = PanTomkinsHamilton(input_ecg_sig, sampl_freq_ecg_sig) global UseSignalToolbox UseSignalToolbox = 1; if (sampl_freq_ecg_sig ~= 200) % Do Re-Sampling using matlab FCT "resample()" ! [p,q] = rat((200.0/sampl_freq_ecg_sig),0.0001); Resamp=which('upfirdn_rs'); if(UseSignalToolbox == 1) %| length(Resamp)==0) % No upfirdn_rs found input_ecg_sig_200hz = resample(input_ecg_sig, p, q); % , FilLen,WinBeta); ! else ResampPath = Resamp(1:length(Resamp)-12); Coeff = sprintf('%sfircoef_%d_%d.mat',ResampPath, p, q); if(exist(Coeff)) % Filter coeff file exists. load(Coeff); else command = sprintf('cd %s',ResampPath); dos(command); [h,p_aux,q_aux] = ResampFiltDsgn('p','q'); save(Coeff,'h'); end; end; sampl_freq_ecg = 200; % After ECG-Signal has been ReSampled to 200Hz ! length_200hz_ecg = length(input_ecg_sig_200hz); resampling_ratio = sampl_freq_ecg_sig / 200.0; % Ideal target value ! resampling_ratio_exact = q/p; % Take care of rounding errors ! 12-04-05 ! resampling_switch = 1; length_input_ecg = length(input_ecg_sig); % # Samples with original sampling ! % -> input_ecg_sig = input_ecg_sig_200hz; % Full copy of input_ecg vec. ! else % sampl_freq_ecg_sig == 200 as expected ! input_ecg_sig_200hz = input_ecg_sig'; % Local copy of input_ecg vec. ! sampl_freq_ecg = sampl_freq_ecg_sig; % ECG-Signal sampled at 200 Hz ! length_200hz_ecg = length(input_ecg_sig); % Idem to length_input_ecg ! resampling_ratio = 1.0; resampling_ratio_exact = 1.0; resampling_switch = 0; end % sampl_freq_ecg_sig <> 200 ! aux1 = PanTompkins(input_ecg_sig_200hz); aux2 = find(aux1>0); aux3 = (aux2 - aux1(aux2)); r_peak_sample_list = aux3(find(aux3>0)); nbr_heart_beats = length(r_peak_sample_list); return;