Mercurial > hg > aimmat
diff aim-mat/modules/usermodule/pitchstrength/displaypitchstrength.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 | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aim-mat/modules/usermodule/pitchstrength/displaypitchstrength.m Tue Aug 16 14:37:17 2011 +0100 @@ -0,0 +1,203 @@ +% generating function for 'aim-mat' +% +% 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 displaypitchstrength(sai,options,frame_number,ax) +if nargin<4 + ax=gca; +end + + +% ?????? per Definition ???? +% minimum_time_interval=0.1; % in ms +% maximum_time_interval=35; + + +ti_result=options.handles.data.usermodule{frame_number}.ti_result; +% f_result=options.handles.data.usermodule{frame_number}.f_result; +if ~isfield(ti_result,'peaks') + return; +end + +% fq_sum = f_result.smoothed_signal; +int_sum = ti_result.smoothed_signal; +cla; +hold on + +% TIP +% tip=getvalues(int_sum); +% the tip is in the form of a logarithmic signal, it must therfore be +% transformed back to linear: + +% tip_x = bin2time(int_sum, 1:length(tip)); % Get the times +% tip_x = tip_x((tip_x>=(minimum_time_interval/1000)) & tip_x<=(maximum_time_interval/1000)); +% tip = tip(time2bin(int_sum,tip_x(1)):time2bin(int_sum,tip_x(end))); +% % tip_x is in ms. Change to Hz +% tip_x = 1./tip_x; +% plot(tip_x, tip, 'b'); + +% plot the smoothed interval profile, from which the pitch was derived +smoothed_signal=ti_result.smoothed_signal; +% if ~isempty(smoothed_signal) +% smoothed_signal=linsigx(smoothed_signal); % change the logarithmic signal back to linear +% % smoothed_signal=reverse(smoothed_signal); +% smoothval=getvalues(smoothed_signal); +% s_x = bin2time(smoothed_signal, 1:length(smoothval)); % Get the times +% s_x = s_x((s_x>=(minimum_time_interval/1000)) & s_x<=(maximum_time_interval/1000)); +% +% smoothval=smoothval(time2bin(smoothed_signal,s_x(1)):time2bin(smoothed_signal,s_x(end))); +% % s_x=f2f(s_x,0,0.035,0.0001,0.035); +% % s_x=(s_x+0.0001); %?????????? +% % s_x=s_x*1.01; %?????????? +% s_x=1./s_x; +% plot(ax,s_x,smoothval,'b'); +% end + +% set(gca,'XScale','log'); +plot(smoothed_signal); +hold on + +% xlabel('Frequency [Hz]'); +set(gca, 'YAxisLocation','right'); +% pks = []; + +% nr_labels = 8; +% ti=50*power(2,[0:nr_labels]); +% for i=1:length(pks) +% ti = ti((ti>(pks(i)+pks(i)*0.1))|(ti<pks(i)-pks(i)*0.1)); +% end +% ti = [ti round(pks)]; +% ti = sort(ti); +% set(gca,'XTick', ti); +% set(gca, 'XLim',[1000/maximum_time_interval sai{frame_number}.channel_center_fq(end)]) +set(options.handles.checkbox6, 'Value',0); +set(options.handles.checkbox7, 'Value',0); + + +% if there is a target frequency, then plot this one also! +target_frequency=options.target_frequency; +% at least three possibilities: take the hight: +% pitchstrength=ti_result.free.highest_peak_hight; +% dominant_frequency_found= ti_result.free.highest_peak_frequency; + + +% three different pitch strengths +% select the one with the highest peak rate + +peaks=ti_result.peaks; +% select the one with the highest neigbouring_ratio +peaks2=sortstruct(peaks,'v2012_height_base_width_ratio'); +% peaks2=sortstruct(peaks,'peak_base_height_y'); +% peaks2=sortstruct(peaks,'y'); + + +if length(peaks2)>1 +% for ii=1:length(peaks) + for i=1:min(3,length(peaks)) + t=peaks2{i}.t; + ypeak=peaks2{i}.y; +% ps=peaks{ii}.pitchstrength; + ps=peaks2{i}.v2012_height_base_width_ratio; + + + if i==1 + plot(t,ypeak,'Marker','o','Markerfacecolor','b','MarkeredgeColor','b','MarkerSize',10); + text(t,ypeak*1.05,sprintf('%3.0f Hz: %4.2f ',1/t,ps),'VerticalAlignment','bottom','HorizontalAlignment','center','color','b','Fontsize',12); + else + plot(t,ypeak,'Marker','o','Markerfacecolor','g','MarkeredgeColor','w','MarkerSize',5); + text(t,ypeak*1.05,sprintf('%3.0f Hz: %4.2f ',1/t,ps),'VerticalAlignment','bottom','HorizontalAlignment','center','color','g','Fontsize',12); + end + plot(peaks2{i}.left.t,peaks2{i}.left.y,'Marker','o','Markerfacecolor','r','MarkeredgeColor','r','MarkerSize',5); + plot(peaks2{i}.right.t,peaks2{i}.right.y,'Marker','o','Markerfacecolor','r','MarkeredgeColor','r','MarkerSize',5); + + + ybase=peaks2{i}.v2012_base_where_widths; + line([t t],[ybase ypeak],'color','m'); + line([peaks2{i}.left.t peaks2{i}.right.t],[ybase ybase],'color','m'); + + end + + set(gca,'xscale','log') + set(gca,'xlim',[0.001 0.03]) + + fres=[500 300 200 150 100 70 50 20]; + set(gca,'xtick',1./fres); + set(gca,'xticklabel',fres); + xlabel('Frequency (Hz)') + ylabel('arbitrary normalized units') +end + +if target_frequency>0 % search only at one special frequency + found_fre=ti_result.fixed.highest_peak_frequency; + if found_fre>0 + yval=gettimevalue(smoothed_signal,1/found_fre); + else + yval=0; + end + plot(found_fre,yval,'Marker','o','Markerfacecolor','y','MarkeredgeColor','w','MarkerSize',5); + + found_ps=ti_result.fixed.highest_peak_hight; + plot(found_fre,yval,'Marker','o','Markerfacecolor','g','MarkeredgeColor','w','MarkerSize',10); + text(found_fre/1.1,yval*1.01, ['Pitchstrength at fixed ' num2str(round(found_fre)) 'Hz: ' num2str(fround(found_ps,2)) ],'VerticalAlignment','bottom','HorizontalAlignment','right','color','g','Fontsize',12); + bordery=get(gca,'Ylim'); + line([target_frequency target_frequency],[bordery(1) bordery(2)],'color','g') + min_fre=target_frequency/options.allowed_frequency_deviation; + max_fre=target_frequency*options.allowed_frequency_deviation; + line([min_fre min_fre],[bordery(1) bordery(2)],'color','g') + line([max_fre max_fre],[bordery(1) bordery(2)],'color','g') +end + +% maxy=sai{end}.ti_resultlt.peaks{1}.y; +maxy=max(int_sum); +if maxy==0 + maxy=1; +end +set(ax,'Ylim',[0,maxy*1.1]); + + +% plot the frequency profile +plot_frequency_profile=0; +if plot_frequency_profile +%Plot both profiles into one figure +% FQP +fqp = getvalues(fq_sum)'; +% fqp = fqp /1000; +plot(sai{frame_number}.channel_center_fq, fqp,'r'); + +peaks=f_result.peaks; +if length(peaks)>1 +% for ii=1:length(peaks) + for ii=1:1 + fre=1/peaks{ii}.t; + yval=peaks{ii}.y; +% ps=peaks{ii}.pitchstrength; + ps=peaks{ii}.y; + if ii==1 + plot(fre,yval,'Marker','o','Markerfacecolor','r','MarkeredgeColor','r','MarkerSize',10); + text(fre,yval*1.03,sprintf('%3.0f Hz: %4.2f ',fre,ps),'VerticalAlignment','bottom','HorizontalAlignment','center','color','r','Fontsize',12); + else + plot(fre,yval,'Marker','o','Markerfacecolor','g','MarkeredgeColor','w','MarkerSize',5); + text(fre,yval*1.03,sprintf('%3.0f Hz: %4.2f ',fre,ps),'VerticalAlignment','bottom','HorizontalAlignment','center','color','g','Fontsize',12); + end + end +end +hold off +end + + +return + +function fre=x2fre(sig,x) + t_log = bin2time(sig,x); + t=f2f(t_log,0,0.035,0.001,0.035,'linlog'); + fre=1/t;