tomwalters@0: % method of class @signal tomwalters@0: % function env=envelope(sig,[mintime],[maxtime],[mincontrast]) tomwalters@0: % tomwalters@0: % retuns the envelope determined by connecting the maximum points tomwalters@0: % when the maxima are seperated by more then the mintime, then connect tomwalters@0: % minima, that lie in the middle tomwalters@0: % if the difference between maxima is smaller then maxtime tomwalters@0: % look for the next maximum, that is further away tomwalters@0: % if mincontrast is given, than the maxima must have at least such a tomwalters@0: % contrast that is the distance in height to its neighbours in % of the whole signal!! tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % sig: original @signal tomwalters@0: % mintime: minimum time, that must be between two successive maxima tomwalters@0: % maxtime: maximum time, that must be between two successive maxima tomwalters@0: % mincontrast: minimum contrast between two maxima tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % env: @signal 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 env=envelope(sig,mintime,maxtime,mincontrast) tomwalters@0: tomwalters@0: if nargin < 4 tomwalters@0: mincontrast=0; tomwalters@0: end tomwalters@0: if nargin < 3 tomwalters@0: maxtime=0; tomwalters@0: end tomwalters@0: if nargin < 2 tomwalters@0: mintime=0; tomwalters@0: end tomwalters@0: tomwalters@0: [maxpos,minpos,maxs,mins]=getminmax(sig); tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: env=signal(sig); tomwalters@0: env=mute(env); tomwalters@0: env=setname(env,sprintf('Envelope of: %s',getname(sig))); tomwalters@0: tomwalters@0: if isempty(maxs) tomwalters@0: return tomwalters@0: end tomwalters@0: tomwalters@0: threshold=max(sig)*mincontrast; tomwalters@0: tomwalters@0: nr_max=length(maxs); tomwalters@0: lastmax=maxpos(1); tomwalters@0: lastval=maxs(1); tomwalters@0: lastminval=getminimumleftof(lastmax,maxpos,minpos,maxs,mins); tomwalters@0: if isempty(lastminval) tomwalters@0: lastminval=0; tomwalters@0: end tomwalters@0: for i=2:nr_max tomwalters@0: newmax=maxpos(i); tomwalters@0: newval=maxs(i); tomwalters@0: newminval=getminimumleftof(newmax,maxpos,minpos,maxs,mins); tomwalters@0: tomwalters@0: % wenn die maxima zu nah beeinander liegen, dann such das nächste Maximum tomwalters@0: if newmax-lastmax > maxtime tomwalters@0: if newval > lastminval+threshold tomwalters@0: if newmax-lastmax > mintime tomwalters@0: tmin=getminimumleftof(newmax,maxpos,minpos,maxs,mins);% das ist das Minimum links vom rechten Maximum tomwalters@0: % wenn das Minimum zwischen den Maxima liegt, dann verbinde zwei Linien vom Maximum zum Minimum und weiter tomwalters@0: if tmin>lastmax tomwalters@0: % erste Gerade tomwalters@0: tmitte=tmin; tomwalters@0: x1=time2bin(sig,lastmax); tomwalters@0: x2=time2bin(sig,tmitte); tomwalters@0: y1=lastval; tomwalters@0: y2=gettimevalue(sig,tmitte); tomwalters@0: line=linspace(y1,y2,x2-x1+1); tomwalters@0: env=setvalues(env,line,x1); tomwalters@0: tomwalters@0: % zweite Gerade tomwalters@0: x1=time2bin(sig,tmitte); tomwalters@0: x2=time2bin(sig,newmax); tomwalters@0: y1=gettimevalue(sig,tmitte); tomwalters@0: y2=newval; tomwalters@0: line=linspace(y1,y2,x2-x1+1); tomwalters@0: env=setvalues(env,line,x1); tomwalters@0: end tomwalters@0: % maxima weit genug zusammen, also werden nur die Maxima verbunden tomwalters@0: else tomwalters@0: x1=time2bin(sig,lastmax); tomwalters@0: x2=time2bin(sig,newmax); tomwalters@0: y1=lastval; tomwalters@0: y2=newval; tomwalters@0: line=linspace(y1,y2,x2-x1+1); tomwalters@0: env=setvalues(env,line,x1); tomwalters@0: end tomwalters@0: lastmax=newmax; tomwalters@0: lastval=newval; tomwalters@0: lastminval=newminval; tomwalters@0: end tomwalters@0: end tomwalters@0: end