Documentation of IPeakPicker

Index of all files: short | long | this subdirectory only: short | long

Function Synopsis

```out = PeakPicker(sig_in,threshold)
```

Help text

``` function out = PeakPicker(sig_in, params)

Find the peaks of a signal and their neighbours

INPUT VALUES:
sig_in                  Input signal
threshold     dynamic threshold. Off if not used

RETURN VALUE:
out is an array of a struct
out.x                    x position of the Peak
out.t                    according time value
out.y                    y value of the peak
out.left.[x,t,y]         left Minumum
out.right.[x,t,y]        right Minumum

(c) 2011, University of Southampton
Maintained by Stefan Bleeck (bleeck@gmail.com)
http://code.soundsoftware.ac.uk/projects/aimmat
documentation and everything is on http://www.acousticscale.org
```

Cross-Reference Information

This function calls This function is called by

Listing of function IPeakPicker

```

function out = PeakPicker(sig_in,threshold)
% threshold is the percentage of the maximum value of the signal,
% under which a peak is not counted

if nargin <2
threshold=0;
end

plot_switch = 0;

% the original values befor filtering
orig_values = getdata(sig_in)';
values=getdata(sig_in)';

% ------------------- Find the local maxima ------------------------------
% find x positions of ALL local maxima, incl. zero!!
max_x = find((values >= [0 values(1:end-1)]) & (values > [values(2:end) 0]));
max_y = orig_values(max_x);
orig_max_y = orig_values(max_x);

% ------------------- Find the local minima -----------------------------
min_x = find((values < [inf values(1:end-1)]) & (values <= [values(2:end) inf]));
min_y = values(min_x);

peakpos_x=[];
for i=1:length(max_x),
% only take the highest peak
my = [max_y==max(max_y)];  % find the highest peak
%     peakpos_x(i) = max_x(my);   % x pos of highest peak
peakpos_x = [peakpos_x max_x(my)];
max_y = max_y([max_y<max(max_y)]);   % del max value in y domain
max_x = max_x([max_x ~= peakpos_x(end)]); % and in x domain
end
peakpos_y = orig_values(peakpos_x);  % extract the y vector

% maxima = cell(1, length(peakpos_x));
maxima = [];

if plot_switch
figure(123);
clf
plot(sig_in,'k');
hold on;
end

threshold_val=threshold*max(sig_in);
counter=1;

% find the left end right minima that belong to a maximum
for i=1:length(peakpos_x)
y_val= orig_values(peakpos_x(i));

if y_val< threshold_val
continue
end

maxima{counter}.y =y_val;
maxima{counter}.x = peakpos_x(i);
maxima{counter}.t = bin2time(sig_in, maxima{i}.x);
maxima{counter}.fre = 1/maxima{counter}.t;

if plot_switch
plot(maxima{counter}.x,maxima{counter}.y,'go');
end
% find left and right minimum for this maximum
maxima{counter}.left.x = max(min_x([min_x < maxima{counter}.x]));
if isempty(maxima{counter}.left.x)
maxima{counter}.left.x = 1;
maxima{counter}.left.t = 0;
maxima{counter}.left.y = orig_values(maxima{counter}.left.x);
else
maxima{counter}.left.y = orig_values(maxima{counter}.left.x);
maxima{counter}.left.t = bin2time(sig_in, maxima{counter}.left.x);
end
maxima{counter}.right.x = min(min_x([min_x > maxima{counter}.x]));
if isempty(maxima{counter}.right.x)
maxima{counter}.right.x = length(orig_values);
maxima{counter}.right.t = 0;
maxima{counter}.right.y = orig_values(maxima{counter}.right.x);
else
maxima{counter}.right.y = orig_values(maxima{counter}.right.x);
maxima{counter}.right.t = bin2time(sig_in, maxima{counter}.right.x);
end

if plot_switch
plot(maxima{counter}.right.x,maxima{counter}.right.y,'ro');
plot(maxima{counter}.left.x,maxima{counter}.left.y,'ro');
end
counter=counter+1;
end

% umrechnung in die Darstellung, die wir brauchen:
for i=1:counter-1
logtime=maxima{i}.t;
time=logtime2time(logtime);
maxima{i}.t=time;
maxima{i}.fre=1/time;
maxima{i}.y=gettimevalue(sig_in,logtime);

left=maxima{i}.left;
lefttime=logtime2time(left.t);
maxima{i}.left.t=lefttime;
maxima{i}.left.fre=1/lefttime;
maxima{i}.left.y=gettimevalue(sig_in,left.t);

right=maxima{i}.right;
righttime=logtime2time(right.t);
maxima{i}.right.t=righttime;
maxima{i}.right.fre=1/righttime;
maxima{i}.right.y=gettimevalue(sig_in,right.t);
end

out = maxima;

function time=logtime2time(logtime)
time=f2f(logtime,0,0.035,0.001,0.035,'linlog');

```

Produced by mtree2html by Hartmut Pohlheim