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=AIpitch(framestruct_a); tomwalters@0: % plots the current frame (cframe) together with its sum 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: 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: 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: 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: 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: 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: % schmeisse die physikalisch nicht sinnvollen Bereiche raus! tomwalters@0: % current_frame=extractpitchregion(current_frame); tomwalters@0: tomwalters@0: pitch=calcresidualprobability(current_frame,0); tomwalters@0: tomwalters@0: % max_pitch_strength=pitch(1).pitchstrength; tomwalters@0: % max_pitch_fre=pitch(1).fre; tomwalters@0: tomwalters@0: scale_summe=getsumscale(current_frame); 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: 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: 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),0); 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: h=plot(sumvalues); hold on tomwalters@0: axis([min_x_screen max_x_screen 0 scale_summe]); tomwalters@0: tomwalters@0: % Ein roter Punkt dort, wo der pitch vermutet wird tomwalters@0: % maximal n verschiedene Punkte tomwalters@0: n=length(pitch.fre); tomwalters@0: % pfre(1)=pitch.fre(1); % das ist die höchtste tomwalters@0: % tomwalters@0: % nr_res2=length(res); tomwalters@0: % for i=1:nr_res2 tomwalters@0: % if pitch(fre(i tomwalters@0: % end tomwalters@0: tomwalters@0: for i=n:-1:1 tomwalters@0: timex=-1/pitch.fre(i); tomwalters@0: hei=gettimevalue(summe,timex); tomwalters@0: bin=time2bin(summe,timex); tomwalters@0: if i==1 tomwalters@0: radius=max(1,20*pitch.pitchstrength(i)); tomwalters@0: if pitch.pitchstrength(i) > pitch.domfre(i) tomwalters@0: plot(max_x_screen-bin+2,hei,'r.','MarkerSize',radius); tomwalters@0: else tomwalters@0: plot(max_x_screen-bin+2,hei,'b.','MarkerSize',radius); tomwalters@0: end 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: text((max_x_screen-bin)/1.06,texthei*1.2,sprintf('%3.0f Hz %5.3f',pitch.fre(1),pitch.pitchstrength(i))); % this is at a nice position tomwalters@0: else tomwalters@0: radius=max(2,10*pitch.pitchstrength(i)); tomwalters@0: plot(max_x_screen-bin+2,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: 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.856 0.19 0.1 0.81]; tomwalters@0: mysubplot(1,1,1,rect, hint); tomwalters@0: fresumme=sumfresig(current_frame); % here it is calculated tomwalters@0: fresumme=smooth(fresumme,1);% glätte die Summe 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); 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=100000; 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: % [fremins,fremaxs,frewomin,frewomax]=getminmax(fresumme,0.0); tomwalters@0: fremins=pitch.fresum.fremins; tomwalters@0: fremaxs=pitch.fresum.fremaxs; tomwalters@0: frewomin=pitch.fresum.frewomins; tomwalters@0: frewomax=pitch.fresum.frewomaxs; tomwalters@0: contrasts=pitch.fresum.contrasts; tomwalters@0: tomwalters@0: nr=size(fremaxs,2); tomwalters@0: for i=1:nr tomwalters@0: x1=time2bin(fresumme,frewomax(i)); tomwalters@0: y1=fremaxs(i); tomwalters@0: % plot(x1,y1,'r.','MarkerSize',contr); tomwalters@0: tomwalters@0: radius=max(1,10*pitch.fresum.spektralpitch(i)); tomwalters@0: % if pitch.pitchstrength(1) < pitch.fresum.spektralpitch(i) tomwalters@0: plot(x1,y1,'r.','MarkerSize',radius); tomwalters@0: text(x1-2,y1,sprintf('%5.3f',pitch.fresum.spektralpitch(i))); % this is at a nice position tomwalters@0: tomwalters@0: % else tomwalters@0: % plot(x1,y1,'b.','MarkerSize',radius); tomwalters@0: % end tomwalters@0: tomwalters@0: end tomwalters@0: nr=size(fremins,2); tomwalters@0: for i=1:nr tomwalters@0: x2=time2bin(fresumme,frewomin(i)); tomwalters@0: y2=fremins(i); tomwalters@0: plot(x2,y2,'g.','MarkerSize',5); tomwalters@0: end tomwalters@0: hold off