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 pitch=AIFrePtiPStress2(framestruct_a); tomwalters@0: % plots the current frame (cframe) together with its sum of intervals tomwalters@0: % and the sum of frequencies tomwalters@0: % all relevant data must be in the frame-object tomwalters@0: % the return value "pitch" is the result from the call to "calcresidualprobability" tomwalters@0: tomwalters@0: if ~isstruct(framestruct_a) tomwalters@0: % error('AIsum must be called with a structure'); tomwalters@0: framestruct.current_frame=framestruct_a; tomwalters@0: current_frame_number=1; tomwalters@0: else tomwalters@0: framestruct=framestruct_a; tomwalters@0: end tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % Different Parameters tomwalters@0: % if the label of the time should be shown in the upper left corner 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: % if any grafic should be displayed. Otherwise only the value is returned tomwalters@0: if ~isfield(framestruct,'show_graphic'); tomwalters@0: show_graphic=1; tomwalters@0: else tomwalters@0: show_graphic=framestruct.show_graphic; tomwalters@0: end tomwalters@0: tomwalters@0: % both profiles can be scaled to a higher value tomwalters@0: if ~isfield(framestruct,'profile_scale'); tomwalters@0: profile_scale=1; tomwalters@0: else tomwalters@0: profile_scale=framestruct.profile_scale; tomwalters@0: end tomwalters@0: tomwalters@0: % the picture can be scaled overall to a higher value tomwalters@0: if ~isfield(framestruct,'plot_scale'); tomwalters@0: plot_scale=1; tomwalters@0: else tomwalters@0: plot_scale=framestruct.plot_scale; tomwalters@0: end tomwalters@0: tomwalters@0: % the minimum time interval (usually 1 ms) on the right tomwalters@0: if ~isfield(framestruct,'minimum_time_interval'); tomwalters@0: minimum_time_interval=1; tomwalters@0: else tomwalters@0: minimum_time_interval=framestruct.minimum_time_interval; tomwalters@0: end tomwalters@0: tomwalters@0: % the maximum time interval (usually 35 ms) on the left tomwalters@0: if ~isfield(framestruct,'maximum_time_interval'); tomwalters@0: maximum_time_interval=35; tomwalters@0: else tomwalters@0: maximum_time_interval=framestruct.maximum_time_interval; tomwalters@0: end tomwalters@0: tomwalters@0: % linear or logarithmic structure tomwalters@0: if ~isfield(framestruct,'is_log'); tomwalters@0: is_log=1; tomwalters@0: else tomwalters@0: is_log=framestruct.is_log;; tomwalters@0: end tomwalters@0: current_frame=framestruct.current_frame; tomwalters@0: tomwalters@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tomwalters@0: % Parameter für die PitchBerechnung tomwalters@0: dot_scaler=200; % wie gross Punkte dargestellt werden sollen in Punkt tomwalters@0: grafix=0; tomwalters@0: % wie weit die Intervallsumme runterskaliert werden muss, damit die Zahlen vernünftigt werden tomwalters@0: norm_intervalhight=1/1e4; tomwalters@0: % wie weit die spektrale Summe runterskaliert werden muss, damit die Zahlen vernünftigt werden tomwalters@0: norm_spektralhight=1.5/1e5; tomwalters@0: tomwalters@0: % how big must the contrast of the envelope be to be recognised as one pitch tomwalters@0: envcontrast_threshold=0.15; tomwalters@0: tomwalters@0: % A single factor, that can vary between tomwalters@0: % 0 = complete attention to temporal structure tomwalters@0: % 1 = complete attention to spectral structure tomwalters@0: spectral_attention_factor=0.5; 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: parameters.norm_intervalhight=norm_intervalhight; tomwalters@0: parameters.norm_spektralhight=norm_spektralhight; tomwalters@0: parameters.graphix=grafix; tomwalters@0: parameters.dot_scaler=dot_scaler; tomwalters@0: parameters.spectral_attention_factor=spectral_attention_factor; tomwalters@0: parameters.extract_pitch_region=1; % schmeiss die Ecke unten rechts raus tomwalters@0: parameters.use_whole_spektral_profile=1; % nimm das gesamte Profil zum mitteln! tomwalters@0: tomwalters@0: tomwalters@0: % Berechnet den Pitch tomwalters@0: pitch=calcresidualprobability(pitch_current_frame,parameters); tomwalters@0: % if we dont need any graphic, than return here tomwalters@0: if ~show_graphic tomwalters@0: return; tomwalters@0: end tomwalters@0: tomwalters@0: % start plotting: tomwalters@0: clf; tomwalters@0: rect=[-0.04 0.15 0.9 0.85]; tomwalters@0: hint=1; % this indicate that we dont want a title tomwalters@0: mysubplot(1,1,1,rect, hint); tomwalters@0: plot_struct.t_min=minimum_time_interval/1000; tomwalters@0: plot_struct.t_max=maximum_time_interval/1000; tomwalters@0: % current_frame=setdisplayminimumtime(current_frame,minimum_time_interval); tomwalters@0: % current_frame=setdisplaymaximumtime(current_frame,maximum_time_interval); tomwalters@0: tomwalters@0: plot_struct.has_axis=0; tomwalters@0: plot_struct.is_log=is_log; tomwalters@0: plot_struct.has_y_axis=0; tomwalters@0: tomwalters@0: rethand=plot(current_frame,plot_struct); tomwalters@0: set(gca,'zlim',[0 1/plot_scale]); tomwalters@0: tomwalters@0: % if show_time tomwalters@0: % srate=getsr(current_frame); tomwalters@0: % text_x=0.9*maximum_time_interval*srate/1000; tomwalters@0: % text_y=getnrchannels(current_frame)+5; tomwalters@0: % str=getstructure(current_frame); tomwalters@0: % if ~isfield(str,'current_frame_start_time') tomwalters@0: % str.current_frame_start_time=0.0; tomwalters@0: % end tomwalters@0: % frame_number=str.current_frame_number; tomwalters@0: % frame_time=str.current_frame_start_time*1000; tomwalters@0: % text(text_x,text_y,sprintf('%d : %4.0fms',frame_number,frame_time),'FontSize',8); tomwalters@0: % % text(text_x,text_y,sprintf('%d',frame_number),'FontSize',8); tomwalters@0: % end tomwalters@0: tomwalters@0: % and the sum tomwalters@0: rect=[-0.04 0 0.9 0.2]; tomwalters@0: mysubplot(1,1,1,rect, hint); tomwalters@0: summe=getsum(current_frame); % here it is calculated tomwalters@0: tomwalters@0: srate=getsr(current_frame); tomwalters@0: if is_log tomwalters@0: tomwalters@0: t=minimum_time_interval; tomwalters@0: ti=[t 2*t 4*t 8*t 16*t 32*t 64*t]; tomwalters@0: tix=(ti)/1000*srate; % there shell be the tix tomwalters@0: tomwalters@0: ti=(ti); tomwalters@0: ti=round(ti*100)/100; tomwalters@0: tomwalters@0: psumme=getpart(summe,getminimumtime(summe),getmaximumtime(summe)); tomwalters@0: rsumme=reverse(psumme); tomwalters@0: sumvalues=getvalues(rsumme); tomwalters@0: tomwalters@0: min_x_screen=minimum_time_interval/1000*srate; % thats the first point we want to see on the screen tomwalters@0: max_x_screen=maximum_time_interval/1000*srate; % thats the first point we want to see on the screen tomwalters@0: tomwalters@0: else % its not logarithmic! tomwalters@0: summe=getpart(summe,-maximum_time_interval/1000,-minimum_time_interval/1000); tomwalters@0: tomwalters@0: nr_labels=8; tomwalters@0: xbis=getnrpoints(summe); tomwalters@0: tix=0:xbis/nr_labels:xbis; tomwalters@0: xstep=(maximum_time_interval-minimum_time_interval)*1000/nr_labels; %works from -35 to 5 tomwalters@0: xstep=round(xstep); tomwalters@0: ti=([minimum_time_interval*1000:xstep:maximum_time_interval*1000])/1000; tomwalters@0: ti=round(ti*10)/10; tomwalters@0: sumvalues=getvalues(reverse(summe)); tomwalters@0: tomwalters@0: min_x_screen=0; tomwalters@0: max_x_screen=(maximum_time_interval-minimum_time_interval)/1000*srate; % thats the first point we want to see on the screen tomwalters@0: tomwalters@0: end tomwalters@0: tomwalters@0: % alle Werte sind auf empirische Werte genormt, so dass sie immer gleich hoch sind tomwalters@0: sumvalues=sumvalues*norm_intervalhight; tomwalters@0: % alle Werte auf die Benutzerscalierung scalen tomwalters@0: sumvalues=sumvalues*profile_scale; tomwalters@0: tomwalters@0: summe=setvalues(summe,sumvalues,floor(min_x_screen)); tomwalters@0: h=plot(sumvalues); hold on tomwalters@0: tomwalters@0: axis([min_x_screen max_x_screen 0 1]); tomwalters@0: sr=getsr(current_frame); tomwalters@0: tomwalters@0: % % Ein roter Punkt dort, wo der pitch vermutet wird tomwalters@0: n=length(pitch); tomwalters@0: for i=n:-1:1 tomwalters@0: peak=pitch{i}; tomwalters@0: timex=peak.interval_profile.time; tomwalters@0: tomwalters@0: % binx=displaytime2bin(current_frame,timex)-2; tomwalters@0: binx=time2bin(timex,sr)-2; tomwalters@0: hei=getbinvalue(summe,max_x_screen-binx+min_x_screen); tomwalters@0: % hei=gettimevalue(summe,getminimumtime(summe)-timex); tomwalters@0: % bin=time2bin(summe,timex); tomwalters@0: if i==1 tomwalters@0: radius=max(5,dot_scaler*peak.residuumpitchstrength); tomwalters@0: plot(max_x_screen-binx,hei,'r.','MarkerSize',radius); tomwalters@0: texthei=hei*1.2; tomwalters@0: if texthei>max(summe)/1.4 tomwalters@0: texthei=max(summe)/1.4; tomwalters@0: end tomwalters@0: if peak.interval_profile.envcontrast > envcontrast_threshold tomwalters@0: % text(binx/1.06,texthei*1.2,sprintf('%3.0f Hz %5.3f',peak.fre,peak.pitchstrength)); % this is at a nice position tomwalters@0: text((max_x_screen-binx)/1.06,texthei*1.2,sprintf('%3.0f Hz',peak.interval_profile.fre)); % this is at a nice position tomwalters@0: end tomwalters@0: else tomwalters@0: radius=max(5,dot_scaler*peak.residuumpitchstrength); tomwalters@0: plot(max_x_screen-binx,hei,'b.','MarkerSize',radius); tomwalters@0: end tomwalters@0: end tomwalters@0: % tomwalters@0: set(gca,'XDir','reverse') % turn them around, because the higher values shell end on the right tomwalters@0: if is_log tomwalters@0: set(gca,'XScale','log') tomwalters@0: end tomwalters@0: set(gca,'XTick',tix); tomwalters@0: set(gca,'XTickLabel',ti); tomwalters@0: set(gca,'YTickLabel',[]); tomwalters@0: % tomwalters@0: % if is_log tomwalters@0: % scale_summe=getfrequencysum(current_frame); tomwalters@0: % text(min_x_screen*1.9,-scale_summe/5,'time interval (ms)'); % this is at a nice position tomwalters@0: % else tomwalters@0: % text(120,-scale_summe/5,'time interval (ms)'); % this is at a nice position tomwalters@0: % end tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: % and the other sum on the y-axis tomwalters@0: rect=[0.857 0.2 0.10 0.75]; tomwalters@0: mysubplot(1,1,1,rect, hint); tomwalters@0: fresumme=getfrequencysum(current_frame); % here it is calculated tomwalters@0: % fresumme=smooth(fresumme,1);% glätte die Summe tomwalters@0: tomwalters@0: % alle Werte auf den empirischen Wert skalieren und auf den Benutzerwert tomwalters@0: fresumme=fresumme*norm_spektralhight; tomwalters@0: fresumme=fresumme*profile_scale; tomwalters@0: tomwalters@0: fresumme=setname(fresumme,''); tomwalters@0: fresumme=setunit_x(fresumme,''); tomwalters@0: fresumme=setunit_y(fresumme,''); tomwalters@0: tomwalters@0: plot(fresumme,'r'); hold on tomwalters@0: v=getvalues(fresumme); tomwalters@0: x1=0; tomwalters@0: x2=size(v,1)*47/42; tomwalters@0: y1=0; tomwalters@0: y2=1; tomwalters@0: axis([x1 x2 y1 y2]); tomwalters@0: view(-90,90); tomwalters@0: % make y-Ticks tomwalters@0: nr_labels=8; tomwalters@0: nr_channels=getnrpoints(fresumme); tomwalters@0: xstep=(nr_channels-1)/(nr_labels-1); tomwalters@0: tix=1:xstep:nr_channels; tomwalters@0: cfs=getcf(current_frame); tomwalters@0: ti=cfs(floor(tix))/1000; tomwalters@0: ti=round(ti*10)/10; tomwalters@0: set(gca,'XTick',tix); tomwalters@0: set(gca,'XTickLabel',ti); tomwalters@0: set(gca,'YTickLabel',[]); tomwalters@0: set(gca,'XAxisLocation','top'); tomwalters@0: tomwalters@0: n=length(pitch); tomwalters@0: for i=n:-1:1 tomwalters@0: peak=pitch{i}; tomwalters@0: x=peak.spektral_profile.position; tomwalters@0: hei=peak.spektral_profile.hight/2; tomwalters@0: radius=max(5,dot_scaler*hei); tomwalters@0: y=getbinvalue(fresumme,x); tomwalters@0: plot(x,y,'r.','MarkerSize',radius); tomwalters@0: end tomwalters@0: tomwalters@0: % Special Effect: Make Region cool! tomwalters@0: n=length(pitch); tomwalters@0: cdat=get(rethand,'cdata'); tomwalters@0: cdat=zeros(size(cdat)); tomwalters@0: tomwalters@0: bereich=n:-1:1; tomwalters@0: % bereich=1; tomwalters@0: for i=bereich tomwalters@0: peak=pitch{i}; tomwalters@0: cdat=coolregion(current_frame,cdat,peak); tomwalters@0: end tomwalters@0: tomwalters@0: set(rethand,'cdata',cdat); tomwalters@0: % erzeuge eine Colormap, die genausoviel Farben hat, wie wir Quellen tomwalters@0: colmap=hsv(n+1); tomwalters@0: colmap(1,:)=0.85; tomwalters@0: colormap(colmap);