annotate aim-mat/tools/combfrePtiP.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
rev   line source
tomwalters@0 1 % tool
tomwalters@0 2 %
tomwalters@0 3 % INPUT VALUES:
tomwalters@0 4 %
tomwalters@0 5 % RETURN VALUE:
tomwalters@0 6 %
tomwalters@0 7 %
bleeck@3 8 % (c) 2011, University of Southampton
bleeck@3 9 % Maintained by Stefan Bleeck (bleeck@gmail.com)
bleeck@3 10 % download of current version is on the soundsoftware site:
bleeck@3 11 % http://code.soundsoftware.ac.uk/projects/aimmat
bleeck@3 12 % documentation and everything is on http://www.acousticscale.org
bleeck@3 13
tomwalters@0 14
tomwalters@0 15 function combfrePtiP(framestruct_a);
tomwalters@0 16 % combined graphic of frequency axis and time interval axis
tomwalters@0 17 % on one axis
tomwalters@0 18 % plots one graphic that consists of two parts:
tomwalters@0 19 % the frequency profile and the interval profile on one axis
tomwalters@0 20
tomwalters@0 21 graphix=1; % for debugging
tomwalters@0 22
tomwalters@0 23
tomwalters@0 24 if ~isstruct(framestruct_a)
tomwalters@0 25 framestruct.current_frame=framestruct_a;
tomwalters@0 26 else
tomwalters@0 27 framestruct=framestruct_a;
tomwalters@0 28 end
tomwalters@0 29
tomwalters@0 30 if ~isfield(framestruct,'show_time');
tomwalters@0 31 show_time=1;
tomwalters@0 32 else
tomwalters@0 33 show_time=framestruct.show_time;
tomwalters@0 34 end
tomwalters@0 35
tomwalters@0 36 % scaling of the two individual profiles:
tomwalters@0 37 if isfield(framestruct,'frequency_profile_scale');
tomwalters@0 38 frequency_profile_scale=framestruct.frequency_profile_scale;
tomwalters@0 39 else
tomwalters@0 40 frequency_profile_scale=1;
tomwalters@0 41 end
tomwalters@0 42 if isfield(framestruct,'time_profile_scale');
tomwalters@0 43 time_profile_scale=framestruct.time_profile_scale;
tomwalters@0 44 else
tomwalters@0 45 time_profile_scale=1;
tomwalters@0 46 end
tomwalters@0 47
tomwalters@0 48 current_frame=framestruct.current_frame;
tomwalters@0 49
tomwalters@0 50 pitch_current_frame=current_frame;
tomwalters@0 51 % schmeisse die physikalisch nicht sinnvollen Bereiche raus!
tomwalters@0 52 % current_frame=extractpitchregion(current_frame);
tomwalters@0 53
tomwalters@0 54 % berechne die pitches vom Orginal
tomwalters@0 55 % pitch=calcresidualprobability(pitch_current_frame,graphix);
tomwalters@0 56
tomwalters@0 57 % calculate the sum of the frequencies
tomwalters@0 58 fresumme=getfrequencysum(current_frame);
tomwalters@0 59
tomwalters@0 60 nrchannels=getnrchannels(current_frame);
tomwalters@0 61 % smoothwidth=128/nrchannels;
tomwalters@0 62 % smooth the sum with a smoothwidth of 1
tomwalters@0 63 % fresumme=smooth(fresumme,smoothwidth);
tomwalters@0 64
tomwalters@0 65 % calculate the sum from interval profile
tomwalters@0 66 intsumme=getsum(current_frame);
tomwalters@0 67
tomwalters@0 68 % bastel zwei lineare Funktionen zusammen: eine aus dem zeitlichen Verlauf,
tomwalters@0 69 % und eine aus dem spektralen.
tomwalters@0 70 minimum_time_interval=1;
tomwalters@0 71 maximum_time_interval=32;
tomwalters@0 72
tomwalters@0 73 % if the intervals are plotted positiv to the right, turn around the signal
tomwalters@0 74 if getminimumtime(intsumme) >= 0
tomwalters@0 75 intsumme=reverse(intsumme);
tomwalters@0 76 intsumme=setstarttime(intsumme,-0.035);
tomwalters@0 77 end
tomwalters@0 78
tomwalters@0 79
tomwalters@0 80
tomwalters@0 81 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tomwalters@0 82 % Die Intervallsumme muss von linear auf logarithmisch umgestellt werden
tomwalters@0 83 nr_points=getnrpoints(intsumme);
tomwalters@0 84 intervalsum=logsigx(intsumme,-maximum_time_interval/1000,-minimum_time_interval/1000,nr_points);
tomwalters@0 85 intervalsum=setstarttime(intervalsum,0);
tomwalters@0 86 % ab nun haben wir eine lineare Zeitachse mit logarithmischen Werten
tomwalters@0 87
tomwalters@0 88 global fnull;global stepsperoctave; % brauch ich unten in den Unterfunktionen
tomwalters@0 89 % fnull=1000/32.389; % per Definition die niedrigste Frequenz
tomwalters@0 90 fnull=1000/maximum_time_interval; % per Definition die niedrigste Frequenz = Anfangsfrequenz der gesamten Achse
tomwalters@0 91
tomwalters@0 92 % soviel "cent" hat die Zeitachse.
tomwalters@0 93 stepsperoctave=log2(maximum_time_interval/minimum_time_interval)/getnrpoints(intervalsum); % soviel octaven/Pixel
tomwalters@0 94 intervalsum=setsr(intervalsum,1/stepsperoctave);
tomwalters@0 95 % intervalsum now goes from -32 to -1 ms in the interval profile
tomwalters@0 96
tomwalters@0 97
tomwalters@0 98
tomwalters@0 99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tomwalters@0 100 % Die Frequenzsumme
tomwalters@0 101 % plot the frequency profile in the same Graphic
tomwalters@0 102 cfs=getcf(current_frame);
tomwalters@0 103 minimum_fre=cfs(1); % the lowest frequency
tomwalters@0 104 maximum_fre=cfs(end); % the lowest frequency
tomwalters@0 105 srate=getsr(current_frame);
tomwalters@0 106
tomwalters@0 107 % Die Frequenzsumme muss von erb (oder cfs) auf logarithmisch umgestellt werden
tomwalters@0 108 fresumme=erb2log(fresumme,cfs);
tomwalters@0 109
tomwalters@0 110
tomwalters@0 111 total_length=f2p(maximum_fre); % gesamte Länge des Plots
tomwalters@0 112 start_fre_profile=f2p(minimum_fre); % Startpunkt der Frequenzachse
tomwalters@0 113 stop_int_profile=f2p(1000/minimum_time_interval); % Ende des Überlapps
tomwalters@0 114
tomwalters@0 115 nr_addpoints=total_length-stop_int_profile; % soviel Punkte müssen hinten an die Intervallachse
tomwalters@0 116 tsig=signal(zeros(floor(nr_addpoints),1),getsr(intervalsum)); % Ein Nullensignal mit den richtigen Daten
tomwalters@0 117 intervalsum=append(intervalsum,tsig); % hänge es an die Intervallsumme hinten an
tomwalters@0 118 % glätte die Frequenzachse noch:
tomwalters@0 119 % intervalsum=smooth(intervalsum,smoothwidth);
tomwalters@0 120
tomwalters@0 121
tomwalters@0 122 nr_addpoints=start_fre_profile; % soviel Punkte müssen vor die Frequenzsumme gehängt werden
tomwalters@0 123
tomwalters@0 124 % wieviel Punkte pro Octave in der Frequenzachse
tomwalters@0 125 freoctrelation=log2(maximum_fre/minimum_fre)/getnrpoints(fresumme); % soviel octaven/Pixel
tomwalters@0 126 fresumme=setsr(fresumme,1/freoctrelation); % anpassen der Zahl der Punkte auf die Intervalachse
tomwalters@0 127 fresumme=changesr(fresumme,getsr(intervalsum));
tomwalters@0 128
tomwalters@0 129 tsig=fresumme;
tomwalters@0 130 tsig=setlength(tsig,bin2time(fresumme,nr_addpoints));
tomwalters@0 131 tsig=mute(tsig);
tomwalters@0 132 % tsig=signal(zeros(floor(nr_addpoints),1),getsr(fresumme)); %
tomwalters@0 133 fresumme=append(tsig,fresumme);
tomwalters@0 134 fresumme=setstarttime(fresumme,0);
tomwalters@0 135
tomwalters@0 136 % scale both signals to the specified scaling values
tomwalters@0 137 % scaling value, if in a movie
tomwalters@0 138 scale_summe=getscalesumme(current_frame);
tomwalters@0 139 fre_scale=getscalefrequency(current_frame);
tomwalters@0 140 fresumme=scale(fresumme,1/fre_scale*frequency_profile_scale);
tomwalters@0 141 intervalsum=scale(intervalsum,1/scale_summe*time_profile_scale);
tomwalters@0 142
tomwalters@0 143 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tomwalters@0 144 % plot it both
tomwalters@0 145 plot(intervalsum,'b');
tomwalters@0 146 [intermaxpos,interminpos,intermax,intermin]=getminmax(intervalsum);
tomwalters@0 147 intermaxpos=time2bin(intervalsum,intermaxpos);
tomwalters@0 148 interminpos=time2bin(intervalsum,interminpos);
tomwalters@0 149 hold on
tomwalters@0 150 plot(fresumme,'r');
tomwalters@0 151 [fremaxpos,freminpos,fremax,fremin]=getminmax(fresumme);
tomwalters@0 152 fremaxpos=time2bin(fresumme,fremaxpos);
tomwalters@0 153 freminpos=time2bin(fresumme,freminpos);
tomwalters@0 154 axis([1 getnrpoints(fresumme) 0 1])
tomwalters@0 155 % make x-Ticks
tomwalters@0 156 nr_labels=8;ti=50*power(2,[0:7]);tix=f2p(ti);ti=round(ti*10)/10;
tomwalters@0 157 set(gca,'XTick',tix);set(gca,'XTickLabel',ti);
tomwalters@0 158 xlabel('Frequency [Hz]');ylabel('PitchStrength');title('');
tomwalters@0 159
tomwalters@0 160 if show_time
tomwalters@0 161 srate=getsr(current_frame);
tomwalters@0 162 text_x=0.8*getnrpoints(fresumme);
tomwalters@0 163 text_y=0.9;
tomwalters@0 164 frame_number=getcurrentframenumber(current_frame);
tomwalters@0 165 frame_time=getcurrentframestarttime(current_frame);
tomwalters@0 166 text(text_x,text_y,sprintf('%3d : %4.0fms',frame_number,frame_time*1000),'FontSize',8);
tomwalters@0 167 end
tomwalters@0 168
tomwalters@0 169 return
tomwalters@0 170
tomwalters@0 171 % Pixel 2 frequency
tomwalters@0 172 function f=p2f(pix)
tomwalters@0 173 global fnull;
tomwalters@0 174 global stepsperoctave;
tomwalters@0 175 f=fnull*power(2,(pix-1)*stepsperoctave);
tomwalters@0 176 return
tomwalters@0 177
tomwalters@0 178 function p=f2p(fre)
tomwalters@0 179 global fnull;
tomwalters@0 180 global stepsperoctave;
tomwalters@0 181 p=1/stepsperoctave*log2(fre/fnull)+1;
tomwalters@0 182 return