⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hrtach.m

📁 matlab下实现kaplan算法
💻 M
字号:
function [nt,nv,nlabs] = hrtach(starttime,rrintervals,labels,sr,goodlabel)%[nt,nv,nlabs] = hrtach(starttime,rrintervals,labels,sr,goodlabel)% Contructs evenly sampled heart rate from rrintervals, using the% Berger tachometer.% <starttime> a scalar giving the time at which the first RR interval% started.  If the RR intervals are calculated by differencing R-wave% times, <starttime> is the first R-wave time.% <rrintervals> is the rrinterval data.  These should be in seconds.% <labels> tells whether each RR interval is valid or not.  If% these are not provided, it is assumed that all beats are valid.% <sr> the sampling rate of the tachometer (default: 4 samples/sec)% <goodlabel> the numerical value of a valid label (default: 1).% Returns:% <nt> a vector of the time of each HR sample% <nv> the HR data themselves% <nlabs> labels for each data point.  1==valid, 0==invalid.if nargin < 5  goodlabel = 1;endif nargin < 4  sr = 4; % samples per secondendif nargin < 3  labels = ones(size(rrintervals));endmoment_length=1/sr; % in seconds   nt = zeros( ceil(sum(rrintervals)/moment_length) + 100, 1);  nv = nt;  nlabs = nt;  outcount = 0;%  HELP("A tachometer.  Reads several columns. The first column is a");%  HELP("sequence of time intervals.  The remaining columns are the");%  HELP("values of the signal during the corresponding time interval.");%  HELP("The input intervals are assumed to be in seconds.");%  HELP("The -hr flag is useful for calculating heart rate.");%  IASSERT("-hr",hr_flag,"Add a column to the input that is 60/intervals.");%  DCASE("-ml", moment_length, "How much time between output samples.(secs)");%  IASSERT("-nt", no_times, "Don't put the times of the samples in the first column.");%  PROCESS_COMS( argc, argv );% A tachometer that turns rrintervals in evenly sampled HR.   % This is based on the algorithm described in Ron Berger's IEEE Transactions% on Biomedical Engineering Paper. %% original C code: Daniel Kaplan, Dec. 28, 1989% Copyright (c) 1989 by Daniel T. Kaplan% translated to Matlab% July 17, 1997% Copyright (c) 1997 by Daniel T. Kaplan% All Rights Reserved% The idea here is to assume that we are given an input stream consisting% of time intervals in the first column, and values in the second.  We% want to make an evenly sampled output that represents what we would% get if we assumed that the true analog signal is a series of steps.% Each step has duration corresponding to the time interval, and amplitude% corresponding to the value.  In order to produce the evenly sampled % signal, we want to anti-alias filter the hypothetical analog signal.% We do this by integrating the analog signal over a boxcar.%% Actually, we will make the boxcar only half as wide as it needs to be.% For the output, we will average the results of consecutive boxcars.last_moment = 0.0;  % tells when the current boxcar endstime_elapsed = 0.0; % Tells when the current step ends.  It is                     %          presumed that the step starts at the sample,                    %          and ends after the time interval has gone by.carry_overvals=0.0; % How much is left from the last                     % step to add to the integral of                     % the current boxcar. carry_overlabs=0.0; % label from the last steptime_to_fill=0.0;   % How much of the current boxcar covers the                     %          last step.  This is between 0 and 1 how_much_already_filled=0.0; % How much of the current boxcar                             %            has already been filled in by                             %            previous steps. % The next two variables are used for averaging two consecutive boxcars   previous_value=0;previous_lab = 0; outvalue=0; not_initialized=1;  % A flag to tell us to fudge the averaging                    %         of the first boxcar. % when does the current boxcar end?last_moment = last_moment + moment_length;% convert rr interval to hr units.vals = 60./rrintervals;  % beats per minute% convert labels to zero/onelabels = (labels == goodlabel);% Note: the first value is ignored --- only the time stampfor k=1:length(rrintervals)    % when does the current step end?     time_elapsed = time_elapsed + rrintervals(k);    % what is the amplitude of the current step : vals(k)    % handle all the boxcars that fit into the current step.     while (last_moment <= time_elapsed)       % if the current boxcar ends during the current step, all we need      % to do is figure out how much of the boxcar was filled during the      % previous step (carry_over), and fill up the rest of it. */      outvalue = vals(k)*(1.0 - how_much_already_filled) +carry_overvals;      outlab = labels(k)*(1.0 - how_much_already_filled) +carry_overlabs;      % outvalue is the integral of the signal over one boxcar.  But,       % the boxcars are only half as big as they need to be to prevent      % aliasing.  Therefore, average together the contents of this       % boxcar and the previous one.       if not_initialized         % When dealing with the very first boxcar, remember that we        %   don't have a previous value to average it with         previous_value = outvalue;	previous_lab = outlab;        not_initialized = 0;      end      % average two consecutive boxcars and write the output      outcount = outcount+1;      nv(outcount) = (outvalue + previous_value)/2.0;      previous_value = outvalue;      nt(outcount) = last_moment;      nlabs(outcount) = (outlab+previous_lab)/2.0;      previous_lab = outlab;      % since the boxcar ended in this step, there will be nothing      %  to carry over to the next boxcar       carry_overvals = 0.0;      carry_overlabs = 0.0;      how_much_already_filled = 0.0;      time_to_fill = 0.0;      % figure out when the next boxcar will end       last_moment = last_moment + moment_length;    end    % If the boxcar didn't end in the current step, there may be    %   some remnant of the current step that should be carried over    %   to the next boxcar.  Figure out what that is.     % If a step is completely contained within a boxcar, then we may be    %   carrying over some from that step and some from the step or steps    %   before.  how_much_already_filled tells how much of the current     %   boxcar was filled in previous steps.      time_to_fill = 1.0 - ( (last_moment - time_elapsed ) / moment_length);    time_to_fill = time_to_fill - how_much_already_filled;    carry_overvals = carry_overvals + vals(k)*time_to_fill;    carry_overlabs = carry_overlabs + labels(k)*time_to_fill;    how_much_already_filled = how_much_already_filled + time_to_fill;  end  nt = starttime + nt(1:outcount);  nv = nv(1:outcount);  nlabs = nlabs(1:outcount)>0.999;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -