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
|