tomwalters@0: % method of class @signal tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % tomwalters@0: % bleeck@3: % This external file is included as part of the 'aim-mat' distribution package bleeck@3: % (c) 2011, University of Southampton bleeck@3: % Maintained by Stefan Bleeck (bleeck@gmail.com) bleeck@3: % download of current version is on the soundsoftware site: bleeck@3: % http://code.soundsoftware.ac.uk/projects/aimmat bleeck@3: % documentation and everything is on http://www.acousticscale.org bleeck@3: tomwalters@0: tomwalters@0: function [h_min,h_max,t_min,t_max]=getminmax(sig,distance) tomwalters@0: % usage: function [h,t]=getminmax(sig,distance) tomwalters@0: % returns the height and lows in locations and time of all local maxima in the signal tomwalters@0: % in case of continuus maxima, the last value of the series is taken tomwalters@0: % distance is the minimum percent value, that must be between tomwalters@0: % successive minima and maxima tomwalters@0: % the distance must be in percent from the maximum minus the minimum value tomwalters@0: % of the signal to count as a maximum tomwalters@0: tomwalters@0: h_max=[]; tomwalters@0: t_max=[]; tomwalters@0: h_min=[]; tomwalters@0: t_min=[]; tomwalters@0: tomwalters@0: if nargin < 2 tomwalters@0: distance=0; % take alle maxima tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: mmax=max(sig); tomwalters@0: mmin=min(sig); tomwalters@0: threshold=(mmax-mmin)*distance; tomwalters@0: tomwalters@0: tomwalters@0: werte=getdata(sig); tomwalters@0: nr= getnrpoints(sig); % so many points tomwalters@0: tomwalters@0: a=-inf; tomwalters@0: b=-inf; tomwalters@0: count_min=0; tomwalters@0: count_max=0; tomwalters@0: tomwalters@0: sr=getsr(sig); tomwalters@0: last_t=0; tomwalters@0: tomwalters@0: next_is_minimum=1; % can be both tomwalters@0: next_is_maximum=1; tomwalters@0: tomwalters@0: for i=1:nr tomwalters@0: c=werte(i); tomwalters@0: tomwalters@0: % lokales Minimum tomwalters@0: if a > b & b <= c tomwalters@0: curr_min=b; tomwalters@0: tomwalters@0: if count_max > 0 % das erste Minimum tomwalters@0: last_max=h_max(count_max); tomwalters@0: else tomwalters@0: last_max=+inf; tomwalters@0: end tomwalters@0: tomwalters@0: % wenn ein Minimum auftaucht, das klar eines ist, aber das Maximum tomwalters@0: % dazwischen fehlte, dann wird das letzte Minimum ignoriert! tomwalters@0: if (last_max - curr_min) > threshold & next_is_maximum & count_min > 0 tomwalters@0: count_min=count_min-1; tomwalters@0: next_is_minimum=1; tomwalters@0: end tomwalters@0: tomwalters@0: if (last_max - curr_min) > threshold & next_is_minimum tomwalters@0: count_min=count_min+1; tomwalters@0: next_is_minimum=0; % the next must be a maximum! tomwalters@0: next_is_maximum=1; tomwalters@0: tomwalters@0: h_min(count_min) = curr_min; tomwalters@0: t_min(count_min) = bin2time(sig,i-1); tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: % lokales Maximum tomwalters@0: if a < b & b >= c tomwalters@0: curr_max=b; tomwalters@0: tomwalters@0: if count_min > 0 % das erste Maximum tomwalters@0: last_min=h_min(count_min); tomwalters@0: else tomwalters@0: last_min=-inf; tomwalters@0: end tomwalters@0: tomwalters@0: % wenn ein Maximum auftaucht, das klar eines ist, aber das Minimum tomwalters@0: % dazwischen fehlte, dann wird das letzte Maximum ignoriert! tomwalters@0: if (curr_max - last_min) > threshold & next_is_minimum & count_max > 0 tomwalters@0: count_max=count_max-1; tomwalters@0: next_is_maximum=1; tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: if (curr_max - last_min) > threshold & next_is_maximum tomwalters@0: count_max=count_max+1; tomwalters@0: next_is_minimum=1; % the next must be a minimum tomwalters@0: next_is_maximum=0; tomwalters@0: tomwalters@0: h_max(count_max) = curr_max; tomwalters@0: t_max(count_max) = bin2time(sig,i-1); tomwalters@0: end tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: % shift the last values tomwalters@0: a=b; tomwalters@0: b=c; tomwalters@0: end