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