Mercurial > hg > aimmat
diff aim-mat/modules/usermodule/pitchstrength/genpitchstrength.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/genpitchstrength.m Tue Aug 16 14:37:17 2011 +0100 @@ -0,0 +1,116 @@ +% generating function for 'aim-mat' +% +% INPUT VALUES: +% +% RETURN VALUE: +% +% +% (c) 2003, University of Cambridge, Medical Research Council +% Christoph Lindner +% (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 ps_result=genpitchstrength(sai,options) + +nr_frames=length(sai); + +target_frequency=options.target_frequency; + +% if only one frequency range is important, then find out, which +% channels are important and which not +nr_channels=getnrchannels(sai{1}); + +% find out about scaling: +maxval=-inf; +maxfreval=-inf; +maxsumval=-inf; + +for ii=1:nr_frames + maxval=max([maxval getmaximumvalue(sai{ii})]); + maxsumval=max([maxsumval getscalesumme(sai{ii})]); + maxfreval=max([maxfreval getscalefrequency(sai{ii})]); +end + + +for frame_number=1:nr_frames + current_frame = sai{frame_number}; + frame_start_time(frame_number)=getcurrentframestarttime(current_frame); + tip(frame_number)=gettimeintervalprofile(current_frame,options); + freqp(frame_number)=getfrequencyprofile(current_frame); + +% figure(234324) +% clf +% plot(tip(frame_number)); +end +frame_duration=frame_start_time(2)-frame_start_time(1); + +% calculate the averaged tips +% the first frames are not average, since not long enough time has +% passed. After that, the relevant last frames are averaged +tip_time=options.tip_average_time; +% time for pitch to drop to 1/2 (6dB) --in seconds +% this means so much per frame +ps_decay_constant=1-log(2)/(tip_time/frame_duration); + +start_frame=1; +histo=mute(tip(1)); +% mache ein Histogramm für jede Frequenz mit allem Maxima: +nr_points=getnrpoints(sai{1}); + +waithand = waitbar(0,'Generating pitch strength'); + +for frame_number=start_frame:nr_frames +% for frame_number=nr_frames:nr_frames + + waitbar(frame_number/nr_frames, waithand); + + current_frame = sai{frame_number}; + current_frame = setallmaxvalue(current_frame, maxval); + current_frame = setscalesumme(current_frame, maxsumval); + current_frame = setscalefrequency(current_frame, maxfreval); + + interval_sig = tip(frame_number); + % Normalisation + interval_sig = interval_sig/nr_channels; + + % sum the interval sum to the floating average: + histo=histo+interval_sig; + % dynamic decrease of all pitch strengthes + histo=histo*ps_decay_constant; +% +% figure(234324) +% clf +% plot(histo); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Peak Picker for IntervalProfile + opts.ps_options=options; + opts.current_time=getcurrentframestarttime(current_frame); + ti_result=find_pitches(histo,opts); + ps_result{frame_number}.ti_result=ti_result; + ps_result{frame_number}.ti_result.ti_profile=interval_sig; + ps_result{frame_number}.ti_result.averaged_signal=histo; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Peak Picker for FrequencyProfile + frequency_sig=freqp(frame_number); + % Normalisation + frequency_sig=frequency_sig/getnrpoints(interval_sig); + + ps_result{frame_number}.channel_center_fq = getcf(sai{frame_number}); + + % Analyse the dualprofile + options.nap=sai{end}; % just for the frequency information + f_result= analyse_frequency_profile(frequency_sig,options); + ps_result{frame_number}.f_result=f_result; + +end + +close(waithand); + +return