Dawn@4: function [ymax,inx] = func_pickpeaks(y, winlen) Dawn@4: % [ymax,inx] = func_pickpeaks(y, winlen) Dawn@4: % Input: y - from wavread Dawn@4: % winlen - size of window to use Dawn@4: % Output: ymax - peak values Dawn@4: % inx - peak positions Dawn@4: % Notes: Dawn@4: % Dawn@4: % Author: Yen-Liang Shue and Markus Iseli, Speech Processing and Auditory Perception Laboratory, UCLA Dawn@4: % Copyright UCLA SPAPL 2009 Dawn@4: Dawn@4: % first, get all maxima Dawn@4: ymin = min(y); Dawn@4: y = y - ymin; Dawn@4: dy = [y(1); transpose(diff(y))]; % diff() gives a shift by 1: insert one sample Dawn@4: inx1 = diff(dy < 0); % is +1 for maxima, -1 for minima Dawn@4: inx1(1) = 0; % do not accept maxima at begining Dawn@4: inx1(end) = 0; % do not accept maxima at end Dawn@4: inx = inx1 > 0; % choose maxima only Dawn@4: ymax= y(inx); Dawn@4: inx = find(inx); Dawn@4: %plot(y); Dawn@4: %hold on; Dawn@4: %plot(inx,ymax,'or'); Dawn@4: %hold off; Dawn@4: Dawn@4: nofmax = length(ymax); Dawn@4: if nofmax==1 Dawn@4: return; Dawn@4: end Dawn@4: % now filter maxima with window of length winlen Dawn@4: for cnt = 1 : nofmax Dawn@4: arr = inx(1:cnt); Dawn@4: cmp = inx(cnt)-winlen; Dawn@4: arr2 = arr>cmp; Dawn@4: %ymax(arr2) Dawn@4: [m, mi] = max(ymax(arr2)); Dawn@4: ymax(arr2)=-60000; Dawn@4: ymax(mi+length(arr2)-sum(arr2))=m; Dawn@4: %ymax(arr2) Dawn@4: end Dawn@4: temp = find(ymax>0); Dawn@4: inx = inx(temp); Dawn@4: ymax = ymax(temp); Dawn@4: %plot(y); Dawn@4: %hold on; Dawn@4: %plot(inx,ymax,'or'); Dawn@4: %hold off; Dawn@4: ymax = ymax + ymin;