tomwalters@0: % tool tomwalters@0: % tomwalters@0: % INPUT VALUES: tomwalters@0: % tomwalters@0: % RETURN VALUE: tomwalters@0: % tomwalters@0: % 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 combfrePtiP(framestruct_a); tomwalters@0: % combined graphic of frequency axis and time interval axis tomwalters@0: % on one axis tomwalters@0: % plots one graphic that consists of two parts: tomwalters@0: % the frequency profile and the interval profile on one axis tomwalters@0: tomwalters@0: graphix=1; % for debugging tomwalters@0: tomwalters@0: tomwalters@0: if ~isstruct(framestruct_a) tomwalters@0: framestruct.current_frame=framestruct_a; tomwalters@0: else tomwalters@0: framestruct=framestruct_a; tomwalters@0: end tomwalters@0: tomwalters@0: if ~isfield(framestruct,'show_time'); tomwalters@0: show_time=1; tomwalters@0: else tomwalters@0: show_time=framestruct.show_time; tomwalters@0: end tomwalters@0: tomwalters@0: % scaling of the two individual profiles: tomwalters@0: if isfield(framestruct,'frequency_profile_scale'); tomwalters@0: frequency_profile_scale=framestruct.frequency_profile_scale; tomwalters@0: else tomwalters@0: frequency_profile_scale=1; tomwalters@0: end tomwalters@0: if isfield(framestruct,'time_profile_scale'); tomwalters@0: time_profile_scale=framestruct.time_profile_scale; tomwalters@0: else tomwalters@0: time_profile_scale=1; tomwalters@0: end tomwalters@0: tomwalters@0: current_frame=framestruct.current_frame; tomwalters@0: tomwalters@0: pitch_current_frame=current_frame; tomwalters@0: % schmeisse die physikalisch nicht sinnvollen Bereiche raus! tomwalters@0: % current_frame=extractpitchregion(current_frame); tomwalters@0: tomwalters@0: % berechne die pitches vom Orginal tomwalters@0: % pitch=calcresidualprobability(pitch_current_frame,graphix); tomwalters@0: tomwalters@0: % calculate the sum of the frequencies tomwalters@0: fresumme=getfrequencysum(current_frame); tomwalters@0: tomwalters@0: nrchannels=getnrchannels(current_frame); tomwalters@0: % smoothwidth=128/nrchannels; tomwalters@0: % smooth the sum with a smoothwidth of 1 tomwalters@0: % fresumme=smooth(fresumme,smoothwidth); tomwalters@0: tomwalters@0: % calculate the sum from interval profile tomwalters@0: intsumme=getsum(current_frame); tomwalters@0: tomwalters@0: % bastel zwei lineare Funktionen zusammen: eine aus dem zeitlichen Verlauf, tomwalters@0: % und eine aus dem spektralen. tomwalters@0: minimum_time_interval=1; tomwalters@0: maximum_time_interval=32; tomwalters@0: tomwalters@0: % if the intervals are plotted positiv to the right, turn around the signal tomwalters@0: if getminimumtime(intsumme) >= 0 tomwalters@0: intsumme=reverse(intsumme); tomwalters@0: intsumme=setstarttime(intsumme,-0.035); tomwalters@0: end tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % Die Intervallsumme muss von linear auf logarithmisch umgestellt werden tomwalters@0: nr_points=getnrpoints(intsumme); tomwalters@0: intervalsum=logsigx(intsumme,-maximum_time_interval/1000,-minimum_time_interval/1000,nr_points); tomwalters@0: intervalsum=setstarttime(intervalsum,0); tomwalters@0: % ab nun haben wir eine lineare Zeitachse mit logarithmischen Werten tomwalters@0: tomwalters@0: global fnull;global stepsperoctave; % brauch ich unten in den Unterfunktionen tomwalters@0: % fnull=1000/32.389; % per Definition die niedrigste Frequenz tomwalters@0: fnull=1000/maximum_time_interval; % per Definition die niedrigste Frequenz = Anfangsfrequenz der gesamten Achse tomwalters@0: tomwalters@0: % soviel "cent" hat die Zeitachse. tomwalters@0: stepsperoctave=log2(maximum_time_interval/minimum_time_interval)/getnrpoints(intervalsum); % soviel octaven/Pixel tomwalters@0: intervalsum=setsr(intervalsum,1/stepsperoctave); tomwalters@0: % intervalsum now goes from -32 to -1 ms in the interval profile tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % Die Frequenzsumme tomwalters@0: % plot the frequency profile in the same Graphic tomwalters@0: cfs=getcf(current_frame); tomwalters@0: minimum_fre=cfs(1); % the lowest frequency tomwalters@0: maximum_fre=cfs(end); % the lowest frequency tomwalters@0: srate=getsr(current_frame); tomwalters@0: tomwalters@0: % Die Frequenzsumme muss von erb (oder cfs) auf logarithmisch umgestellt werden tomwalters@0: fresumme=erb2log(fresumme,cfs); tomwalters@0: tomwalters@0: tomwalters@0: total_length=f2p(maximum_fre); % gesamte Länge des Plots tomwalters@0: start_fre_profile=f2p(minimum_fre); % Startpunkt der Frequenzachse tomwalters@0: stop_int_profile=f2p(1000/minimum_time_interval); % Ende des Überlapps tomwalters@0: tomwalters@0: nr_addpoints=total_length-stop_int_profile; % soviel Punkte müssen hinten an die Intervallachse tomwalters@0: tsig=signal(zeros(floor(nr_addpoints),1),getsr(intervalsum)); % Ein Nullensignal mit den richtigen Daten tomwalters@0: intervalsum=append(intervalsum,tsig); % hänge es an die Intervallsumme hinten an tomwalters@0: % glätte die Frequenzachse noch: tomwalters@0: % intervalsum=smooth(intervalsum,smoothwidth); tomwalters@0: tomwalters@0: tomwalters@0: nr_addpoints=start_fre_profile; % soviel Punkte müssen vor die Frequenzsumme gehängt werden tomwalters@0: tomwalters@0: % wieviel Punkte pro Octave in der Frequenzachse tomwalters@0: freoctrelation=log2(maximum_fre/minimum_fre)/getnrpoints(fresumme); % soviel octaven/Pixel tomwalters@0: fresumme=setsr(fresumme,1/freoctrelation); % anpassen der Zahl der Punkte auf die Intervalachse tomwalters@0: fresumme=changesr(fresumme,getsr(intervalsum)); tomwalters@0: tomwalters@0: tsig=fresumme; tomwalters@0: tsig=setlength(tsig,bin2time(fresumme,nr_addpoints)); tomwalters@0: tsig=mute(tsig); tomwalters@0: % tsig=signal(zeros(floor(nr_addpoints),1),getsr(fresumme)); % tomwalters@0: fresumme=append(tsig,fresumme); tomwalters@0: fresumme=setstarttime(fresumme,0); tomwalters@0: tomwalters@0: % scale both signals to the specified scaling values tomwalters@0: % scaling value, if in a movie tomwalters@0: scale_summe=getscalesumme(current_frame); tomwalters@0: fre_scale=getscalefrequency(current_frame); tomwalters@0: fresumme=scale(fresumme,1/fre_scale*frequency_profile_scale); tomwalters@0: intervalsum=scale(intervalsum,1/scale_summe*time_profile_scale); tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % plot it both tomwalters@0: plot(intervalsum,'b'); tomwalters@0: [intermaxpos,interminpos,intermax,intermin]=getminmax(intervalsum); tomwalters@0: intermaxpos=time2bin(intervalsum,intermaxpos); tomwalters@0: interminpos=time2bin(intervalsum,interminpos); tomwalters@0: hold on tomwalters@0: plot(fresumme,'r'); tomwalters@0: [fremaxpos,freminpos,fremax,fremin]=getminmax(fresumme); tomwalters@0: fremaxpos=time2bin(fresumme,fremaxpos); tomwalters@0: freminpos=time2bin(fresumme,freminpos); tomwalters@0: axis([1 getnrpoints(fresumme) 0 1]) tomwalters@0: % make x-Ticks tomwalters@0: nr_labels=8;ti=50*power(2,[0:7]);tix=f2p(ti);ti=round(ti*10)/10; tomwalters@0: set(gca,'XTick',tix);set(gca,'XTickLabel',ti); tomwalters@0: xlabel('Frequency [Hz]');ylabel('PitchStrength');title(''); tomwalters@0: tomwalters@0: if show_time tomwalters@0: srate=getsr(current_frame); tomwalters@0: text_x=0.8*getnrpoints(fresumme); tomwalters@0: text_y=0.9; tomwalters@0: frame_number=getcurrentframenumber(current_frame); tomwalters@0: frame_time=getcurrentframestarttime(current_frame); tomwalters@0: text(text_x,text_y,sprintf('%3d : %4.0fms',frame_number,frame_time*1000),'FontSize',8); tomwalters@0: end tomwalters@0: tomwalters@0: return tomwalters@0: tomwalters@0: % Pixel 2 frequency tomwalters@0: function f=p2f(pix) tomwalters@0: global fnull; tomwalters@0: global stepsperoctave; tomwalters@0: f=fnull*power(2,(pix-1)*stepsperoctave); tomwalters@0: return tomwalters@0: tomwalters@0: function p=f2p(fre) tomwalters@0: global fnull; tomwalters@0: global stepsperoctave; tomwalters@0: p=1/stepsperoctave*log2(fre/fnull)+1; tomwalters@0: return