Mercurial > hg > aimmat
view aim-mat/tools/AIpitch.m @ 4:537f939baef0 tip
various bug fixes and changed copyright message
author | Stefan Bleeck <bleeck@gmail.com> |
---|---|
date | Tue, 16 Aug 2011 14:37:17 +0100 |
parents | 20ada0af3d7d |
children |
line wrap: on
line source
% tool % % INPUT VALUES: % % RETURN VALUE: % % % (c) 2011, University of Southampton % Maintained by Stefan Bleeck (bleeck@gmail.com) % download of current version is on the soundsoftware site: % http://code.soundsoftware.ac.uk/projects/aimmat % documentation and everything is on http://www.acousticscale.org function pitch=AIpitch(framestruct_a); % plots the current frame (cframe) together with its sum % all relevant data must be in the frame-object % the return value "pitch" is the result from the call to "calcresidualprobability" if ~isstruct(framestruct_a) % error('AIsum must be called with a structure'); framestruct.current_frame=framestruct_a; else framestruct=framestruct_a; end if ~isfield(framestruct,'show_time'); show_time=1; else show_time=framestruct.show_time; end if ~isfield(framestruct,'plot_scale'); plot_scale=1; else plot_scale=framestruct.plot_scale; end if ~isfield(framestruct,'minimum_time_interval'); minimum_time_interval=1; else minimum_time_interval=framestruct.minimum_time_interval; end if ~isfield(framestruct,'maximum_time_interval'); maximum_time_interval=35; else maximum_time_interval=framestruct.maximum_time_interval; end if ~isfield(framestruct,'is_log'); is_log=1; else is_log=framestruct.is_log;; end current_frame=framestruct.current_frame; % schmeisse die physikalisch nicht sinnvollen Bereiche raus! % current_frame=extractpitchregion(current_frame); pitch=calcresidualprobability(current_frame,0); % max_pitch_strength=pitch(1).pitchstrength; % max_pitch_fre=pitch(1).fre; scale_summe=getsumscale(current_frame); % start plotting: clf; rect=[-0.04 0.15 0.9 0.85]; hint=1; % this indicate that we dont want a title mysubplot(1,1,1,rect, hint); plot_struct.t_min=minimum_time_interval/1000; plot_struct.t_max=maximum_time_interval/1000; plot_struct.has_axis=0; plot_struct.is_log=is_log; plot_struct.has_y_axis=0; plot(current_frame,plot_struct); set(gca,'zlim',[0 1/plot_scale]); if show_time srate=getsr(current_frame); text_x=0.9*maximum_time_interval*srate/1000; text_y=getnrchannels(current_frame)+5; str=getstructure(current_frame); if ~isfield(str,'current_frame_start_time') str.current_frame_start_time=0.0; end frame_number=str.current_frame_number; frame_time=str.current_frame_start_time*1000; text(text_x,text_y,sprintf('%d : %4.0fms',frame_number,frame_time),'FontSize',8); % text(text_x,text_y,sprintf('%d',frame_number),'FontSize',8); end % and the sum rect=[-0.04 0 0.9 0.2]; mysubplot(1,1,1,rect, hint); summe=getsum(current_frame); % here it is calculated srate=getsr(current_frame); if is_log t=minimum_time_interval; ti=[t 2*t 4*t 8*t 16*t 32*t 64*t]; tix=(ti)/1000*srate; % there shell be the tix ti=(ti); ti=round(ti*100)/100; psumme=getpart(summe,getminimumtime(summe),0); rsumme=reverse(psumme); sumvalues=getvalues(rsumme); min_x_screen=minimum_time_interval/1000*srate; % thats the first point we want to see on the screen max_x_screen=maximum_time_interval/1000*srate; % thats the first point we want to see on the screen else % its not logarithmic! summe=getpart(summe,-maximum_time_interval/1000,-minimum_time_interval/1000); nr_labels=8; xbis=getnrpoints(summe); tix=0:xbis/nr_labels:xbis; xstep=(maximum_time_interval-minimum_time_interval)*1000/nr_labels; %works from -35 to 5 xstep=round(xstep); ti=([minimum_time_interval*1000:xstep:maximum_time_interval*1000])/1000; ti=round(ti*10)/10; sumvalues=getvalues(reverse(summe)); min_x_screen=0; max_x_screen=(maximum_time_interval-minimum_time_interval)/1000*srate; % thats the first point we want to see on the screen end h=plot(sumvalues); hold on axis([min_x_screen max_x_screen 0 scale_summe]); % Ein roter Punkt dort, wo der pitch vermutet wird % maximal n verschiedene Punkte n=length(pitch.fre); % pfre(1)=pitch.fre(1); % das ist die höchtste % % nr_res2=length(res); % for i=1:nr_res2 % if pitch(fre(i % end for i=n:-1:1 timex=-1/pitch.fre(i); hei=gettimevalue(summe,timex); bin=time2bin(summe,timex); if i==1 radius=max(1,20*pitch.pitchstrength(i)); if pitch.pitchstrength(i) > pitch.domfre(i) plot(max_x_screen-bin+2,hei,'r.','MarkerSize',radius); else plot(max_x_screen-bin+2,hei,'b.','MarkerSize',radius); end texthei=hei*1.2; if texthei>max(summe)/1.4 texthei=max(summe)/1.4; end 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 else radius=max(2,10*pitch.pitchstrength(i)); plot(max_x_screen-bin+2,hei,'b.','MarkerSize',radius); end end set(gca,'XDir','reverse') % turn them around, because the higher values shell end on the right if is_log set(gca,'XScale','log') end set(gca,'XTick',tix); set(gca,'XTickLabel',ti); set(gca,'YTickLabel',[]); if is_log text(min_x_screen*1.9,-scale_summe/5,'time interval (ms)'); % this is at a nice position else text(120,-scale_summe/5,'time interval (ms)'); % this is at a nice position end % and the other sum on the y-axis rect=[0.856 0.19 0.1 0.81]; mysubplot(1,1,1,rect, hint); fresumme=sumfresig(current_frame); % here it is calculated fresumme=smooth(fresumme,1);% glätte die Summe fresumme=setname(fresumme,''); fresumme=setunit_x(fresumme,''); fresumme=setunit_y(fresumme,''); plot(fresumme); hold on v=getvalues(fresumme); x1=0; x2=size(v,1)*47/42; y1=0; y2=100000; axis([x1 x2 y1 y2]); view(-90,90); % make y-Ticks nr_labels=8; nr_channels=getnrpoints(fresumme); xstep=(nr_channels-1)/(nr_labels-1); tix=1:xstep:nr_channels; cfs=getcf(current_frame); ti=cfs(floor(tix))/1000; ti=round(ti*10)/10; set(gca,'XTick',tix); set(gca,'XTickLabel',ti); set(gca,'YTickLabel',[]); set(gca,'XAxisLocation','top'); % [fremins,fremaxs,frewomin,frewomax]=getminmax(fresumme,0.0); fremins=pitch.fresum.fremins; fremaxs=pitch.fresum.fremaxs; frewomin=pitch.fresum.frewomins; frewomax=pitch.fresum.frewomaxs; contrasts=pitch.fresum.contrasts; nr=size(fremaxs,2); for i=1:nr x1=time2bin(fresumme,frewomax(i)); y1=fremaxs(i); % plot(x1,y1,'r.','MarkerSize',contr); radius=max(1,10*pitch.fresum.spektralpitch(i)); % if pitch.pitchstrength(1) < pitch.fresum.spektralpitch(i) plot(x1,y1,'r.','MarkerSize',radius); text(x1-2,y1,sprintf('%5.3f',pitch.fresum.spektralpitch(i))); % this is at a nice position % else % plot(x1,y1,'b.','MarkerSize',radius); % end end nr=size(fremins,2); for i=1:nr x2=time2bin(fresumme,frewomin(i)); y2=fremins(i); plot(x2,y2,'g.','MarkerSize',5); end hold off