Mercurial > hg > aimmat
diff aim-mat/modules/usermodule/pitchstrength/analyse_frequency_profile.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/analyse_frequency_profile.m Tue Aug 16 14:37:17 2011 +0100 @@ -0,0 +1,170 @@ +% function [result, center_c] = analyse_frequency_profiletunedDP(fq_profile, peaks, apFQP) +% +% To analyse the time frequency profile of the auditory image +% Returns value between 0 and 1 discribing the strength of the spectral +% pitch. Used for quantitative analysis of ramped and damped sinusoids +% and for sinusoidally amplitude modulated sinusoids +% +% +% INPUT VALUES: +% fq_profile frequency profile (signal class) +% peaks output of peakpicker +% apFQP a priori information where to find the peak +% +% RETURN VALUE: +% result all relevant information +% +% +% (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 result = analyse_frequency_profile(fq_profile, options) + +% for debug reasons - +plot_switch = 0; + + +% these finally are the results, that we want back: +% 1:the hight at the highest point +result.free.highest_peak_hight=0; +result.free.highest_peak_frequency=0; +% hight to the region below value +result.free.height_width_ratio=0; + +% now all these at a fixed frequency: +result.fixed.highest_peak_hight=0; +result.fixed.highest_peak_frequency=0; +result.fixed.height_width_ratio=0; + +% other things useful for plotting +result.smoothed_signal=fq_profile; % no smoothing used here +result.peaks = []; + + +% first find the peaks of the frequency profile +peaks = PeakPicker(fq_profile); + +% translate the time in the peaks back to a frequency +nap=options.nap; % ugly, but we need the frequency informatin somewhere +for i=1:length(peaks) + peaks{i}.t=1/chan2fre(nap,peaks{i}.x); +end + +result.peaks = peaks; + +fq_profile_vals = getdata(fq_profile); +if plot_switch + cf_save = gcf; + figure(13) + cla; + plot(fq_profile_vals,'r-'); + hold on + axis auto +end +% stop if there are no peaks, e.g. in the first frames +if length(peaks)<1 + return +end + +% Peak of interest is highest peak of the profile +peaks_oi = peaks{1}; + +apFQP=options.target_frequency; +if apFQP>0 + % no peak finding - peak is given a priori + % take nearest peak to a apriori frequency + dist=+inf; + indexOI = 1; + for p=1:length(peaks) + d=abs(apFQP-peaks{p}.t); + if d<dist + indexOI=p; + dist=d; + end + end %p + peak_oi = peaks{indexOI}; +end + + +% %% Method --- works with SAM sounds +% %% Highest peak / number of neighbourgh channels which are bigger than -xdB +% max_attenuation_dB = -6; +% atten_fac = 10^(max_attenuation_dB/20); % attenuation as factor +% % Take highest Peak +% %poi = peaks2{1}; +% %poi = peaks{1}; +% poi = peaks_oi; +% +% fq_profile_vals = fq_profile_vals./poi.y; +% maxy =1; +% % maxy = poi.y; +% pwidth = 0; +% x = poi.x; +% while (x<=length(fq_profile_vals))&&(fq_profile_vals(x)>maxy*atten_fac) +% pwidth=pwidth+1; % one more channel +% x=x+1; +% end +% if plot_switch +% line([x x],[0 peaks_oi.y]); +% end +% +% x = poi.x-1; +% while (x>=1)&&(fq_profile_vals(x)>maxy*atten_fac) +% pwidth=pwidth+1; % one more channel +% x=x-1; +% end +% if plot_switch +% line([x x],[0 peaks_oi.y]); +% end +% result_width = 1-(pwidth/length(fq_profile_vals)); +% + +% ---------------------------- +% Method developed with Roy 13/06 +% Calculate the mean of the Channels in a 20 to 80 percent +% range left of the main peak + +start_frequency_integration=options.start_frequency_integration; +stop_frequency_integration=options.stop_frequency_integration; + +startx=floor(start_frequency_integration*peaks_oi.x); +if startx<=0 + startx=1; +end +stopx=floor(stop_frequency_integration*peaks_oi.x); +ps_result = 1 - mean(fq_profile_vals(startx:stopx))/fq_profile_vals(peaks_oi.x); + +center_c = peaks_oi.x; + +if plot_switch + plot(peaks_oi.x,peaks_oi.y,'r.'); + plot(startx,fq_profile_vals(startx),'bx'); + line([startx startx],[0 fq_profile_vals(startx)]) + plot(stopx,fq_profile_vals(stopx),'bx'); + line([stopx stopx],[0 fq_profile_vals(stopx)]) + figure(cf_save); +end + +% % % For debug plot minima +% for i=1:nops +% plot(peaks{i}.left.x, peaks{i}.left.y, 'ob'); +% plot(peaks{i}.right.x, peaks{i}.right.y, 'xb'); +% end + + +% finally define the return values +result.free.highest_peak_hight=peaks_oi.y; % height of the first peak +result.free.highest_peak_frequency=chan2fre(nap,peaks_oi.x); + +% hight to the region below value +result.free.height_width_ratio=ps_result; + +% now all these at a fixed frequency: +result.fixed.highest_peak_hight=0; +result.fixed.highest_peak_frequency=0; +result.fixed.height_width_ratio=0; + +