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
|