annotate aim-mat/tools/@signal/getminmax.old.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
tomwalters@0 1 % method of class @signal
tomwalters@0 2 %
tomwalters@0 3 % INPUT VALUES:
tomwalters@0 4 %
tomwalters@0 5 % RETURN VALUE:
tomwalters@0 6 %
tomwalters@0 7 %
bleeck@3 8 % This external file is included as part of the 'aim-mat' distribution package
bleeck@3 9 % (c) 2011, University of Southampton
bleeck@3 10 % Maintained by Stefan Bleeck (bleeck@gmail.com)
bleeck@3 11 % download of current version is on the soundsoftware site:
bleeck@3 12 % http://code.soundsoftware.ac.uk/projects/aimmat
bleeck@3 13 % documentation and everything is on http://www.acousticscale.org
bleeck@3 14
tomwalters@0 15
tomwalters@0 16 function [h_min,h_max,t_min,t_max]=getminmax(sig,distance)
tomwalters@0 17 % usage: function [h,t]=getminmax(sig,distance)
tomwalters@0 18 % returns the height and lows in locations and time of all local maxima in the signal
tomwalters@0 19 % in case of continuus maxima, the last value of the series is taken
tomwalters@0 20 % distance is the minimum percent value, that must be between
tomwalters@0 21 % successive minima and maxima
tomwalters@0 22 % the distance must be in percent from the maximum minus the minimum value
tomwalters@0 23 % of the signal to count as a maximum
tomwalters@0 24
tomwalters@0 25 h_max=[];
tomwalters@0 26 t_max=[];
tomwalters@0 27 h_min=[];
tomwalters@0 28 t_min=[];
tomwalters@0 29
tomwalters@0 30 if nargin < 2
tomwalters@0 31 distance=0; % take alle maxima
tomwalters@0 32 end
tomwalters@0 33
tomwalters@0 34
tomwalters@0 35 mmax=max(sig);
tomwalters@0 36 mmin=min(sig);
tomwalters@0 37 threshold=(mmax-mmin)*distance;
tomwalters@0 38
tomwalters@0 39
tomwalters@0 40 werte=getdata(sig);
tomwalters@0 41 nr= getnrpoints(sig); % so many points
tomwalters@0 42
tomwalters@0 43 a=-inf;
tomwalters@0 44 b=-inf;
tomwalters@0 45 count_min=0;
tomwalters@0 46 count_max=0;
tomwalters@0 47
tomwalters@0 48 sr=getsr(sig);
tomwalters@0 49 last_t=0;
tomwalters@0 50
tomwalters@0 51 next_is_minimum=1; % can be both
tomwalters@0 52 next_is_maximum=1;
tomwalters@0 53
tomwalters@0 54 for i=1:nr
tomwalters@0 55 c=werte(i);
tomwalters@0 56
tomwalters@0 57 % lokales Minimum
tomwalters@0 58 if a > b & b <= c
tomwalters@0 59 curr_min=b;
tomwalters@0 60
tomwalters@0 61 if count_max > 0 % das erste Minimum
tomwalters@0 62 last_max=h_max(count_max);
tomwalters@0 63 else
tomwalters@0 64 last_max=+inf;
tomwalters@0 65 end
tomwalters@0 66
tomwalters@0 67 % wenn ein Minimum auftaucht, das klar eines ist, aber das Maximum
tomwalters@0 68 % dazwischen fehlte, dann wird das letzte Minimum ignoriert!
tomwalters@0 69 if (last_max - curr_min) > threshold & next_is_maximum & count_min > 0
tomwalters@0 70 count_min=count_min-1;
tomwalters@0 71 next_is_minimum=1;
tomwalters@0 72 end
tomwalters@0 73
tomwalters@0 74 if (last_max - curr_min) > threshold & next_is_minimum
tomwalters@0 75 count_min=count_min+1;
tomwalters@0 76 next_is_minimum=0; % the next must be a maximum!
tomwalters@0 77 next_is_maximum=1;
tomwalters@0 78
tomwalters@0 79 h_min(count_min) = curr_min;
tomwalters@0 80 t_min(count_min) = bin2time(sig,i-1);
tomwalters@0 81 end
tomwalters@0 82 end
tomwalters@0 83
tomwalters@0 84 % lokales Maximum
tomwalters@0 85 if a < b & b >= c
tomwalters@0 86 curr_max=b;
tomwalters@0 87
tomwalters@0 88 if count_min > 0 % das erste Maximum
tomwalters@0 89 last_min=h_min(count_min);
tomwalters@0 90 else
tomwalters@0 91 last_min=-inf;
tomwalters@0 92 end
tomwalters@0 93
tomwalters@0 94 % wenn ein Maximum auftaucht, das klar eines ist, aber das Minimum
tomwalters@0 95 % dazwischen fehlte, dann wird das letzte Maximum ignoriert!
tomwalters@0 96 if (curr_max - last_min) > threshold & next_is_minimum & count_max > 0
tomwalters@0 97 count_max=count_max-1;
tomwalters@0 98 next_is_maximum=1;
tomwalters@0 99 end
tomwalters@0 100
tomwalters@0 101
tomwalters@0 102 if (curr_max - last_min) > threshold & next_is_maximum
tomwalters@0 103 count_max=count_max+1;
tomwalters@0 104 next_is_minimum=1; % the next must be a minimum
tomwalters@0 105 next_is_maximum=0;
tomwalters@0 106
tomwalters@0 107 h_max(count_max) = curr_max;
tomwalters@0 108 t_max(count_max) = bin2time(sig,i-1);
tomwalters@0 109 end
tomwalters@0 110 end
tomwalters@0 111
tomwalters@0 112
tomwalters@0 113 % shift the last values
tomwalters@0 114 a=b;
tomwalters@0 115 b=c;
tomwalters@0 116 end