peterf@2
|
1 function testData(source_path, output_path)
|
peterf@2
|
2 % testData(source_path, audio_file, output_path)
|
peterf@2
|
3 % source_path = path to DPWE code
|
peterf@2
|
4 % output_path = directory to store generated files
|
peterf@2
|
5 %
|
peterf@2
|
6 % CREATED:2013-03-08 14:32:21 by Brian McFee <brm2132@columbia.edu>
|
peterf@2
|
7 % Generate the test suite data for librosa routines:
|
peterf@2
|
8 %
|
peterf@2
|
9 % hz_to_mel
|
peterf@2
|
10 % mel_to_hz
|
peterf@2
|
11 % hz_to_octs
|
peterf@2
|
12 %
|
peterf@2
|
13 % stft
|
peterf@2
|
14 % istft
|
peterf@2
|
15 %
|
peterf@2
|
16 % ifgram
|
peterf@2
|
17 %
|
peterf@2
|
18 % load
|
peterf@2
|
19 % resample
|
peterf@2
|
20 %
|
peterf@2
|
21 % melfb
|
peterf@2
|
22 % dctfb
|
peterf@2
|
23 %
|
peterf@2
|
24 % localmax
|
peterf@2
|
25 %
|
peterf@2
|
26
|
peterf@2
|
27 % Make sure we have the path to DPWE code
|
peterf@2
|
28 addpath(source_path);
|
peterf@2
|
29
|
peterf@2
|
30 display('hz_to_mel');
|
peterf@2
|
31 testHz2Mel(output_path);
|
peterf@2
|
32
|
peterf@2
|
33 display('mel_to_hz');
|
peterf@2
|
34 testMel2Hz(output_path);
|
peterf@2
|
35
|
peterf@2
|
36 display('hz_to_octs');
|
peterf@2
|
37 testHzToOcts(output_path);
|
peterf@2
|
38
|
peterf@2
|
39 display('load');
|
peterf@2
|
40 testLoad(output_path);
|
peterf@2
|
41
|
peterf@2
|
42 display('stft');
|
peterf@2
|
43 testSTFT(output_path);
|
peterf@2
|
44
|
peterf@2
|
45 display('istft');
|
peterf@2
|
46 testISTFT(output_path);
|
peterf@2
|
47
|
peterf@2
|
48
|
peterf@2
|
49 display('ifgram');
|
peterf@2
|
50 testIFGRAM(output_path);
|
peterf@2
|
51
|
peterf@2
|
52 display('melfb');
|
peterf@2
|
53 testMelfb(output_path);
|
peterf@2
|
54
|
peterf@2
|
55 display('chromafb');
|
peterf@2
|
56 testChromafb(output_path);
|
peterf@2
|
57
|
peterf@2
|
58 display('resample');
|
peterf@2
|
59 testResample(output_path);
|
peterf@2
|
60
|
peterf@2
|
61 display('beat');
|
peterf@2
|
62 testBeat(output_path);
|
peterf@2
|
63
|
peterf@2
|
64 %% Done!
|
peterf@2
|
65 display('Done.');
|
peterf@2
|
66 end
|
peterf@2
|
67
|
peterf@2
|
68 function testHz2Mel(output_path)
|
peterf@2
|
69
|
peterf@2
|
70 % Test with either a scalar argument or a vector
|
peterf@2
|
71 P_HZ = {[440], [2.^(1:13)]};
|
peterf@2
|
72
|
peterf@2
|
73 % Slaney-style or HTK
|
peterf@2
|
74 P_HTK = {0, 1};
|
peterf@2
|
75
|
peterf@2
|
76 counter = 0;
|
peterf@2
|
77 for i = 1:length(P_HZ)
|
peterf@2
|
78 f = P_HZ{i};
|
peterf@2
|
79
|
peterf@2
|
80 for j = 1:length(P_HTK)
|
peterf@2
|
81 htk = P_HTK{j};
|
peterf@2
|
82
|
peterf@2
|
83 % Run the function
|
peterf@2
|
84 result = hz2mel(f, htk);
|
peterf@2
|
85
|
peterf@2
|
86 % save the output
|
peterf@2
|
87 counter = counter + 1;
|
peterf@2
|
88
|
peterf@2
|
89 filename = sprintf('%s/feature-hz_to_mel-%03d.mat', output_path, counter);
|
peterf@2
|
90 display([' `-- saving ', filename]);
|
peterf@2
|
91
|
peterf@2
|
92 save(filename, 'f', 'htk', 'result');
|
peterf@2
|
93 end
|
peterf@2
|
94 end
|
peterf@2
|
95 end
|
peterf@2
|
96
|
peterf@2
|
97 function testMel2Hz(output_path)
|
peterf@2
|
98
|
peterf@2
|
99 % Test with either a scalar argument or a vector
|
peterf@2
|
100 P_MELS = {[5], [2.^(-2:9)]};
|
peterf@2
|
101
|
peterf@2
|
102 % Slaney-style or HTK
|
peterf@2
|
103 P_HTK = {0, 1};
|
peterf@2
|
104
|
peterf@2
|
105 counter = 0;
|
peterf@2
|
106 for i = 1:length(P_MELS)
|
peterf@2
|
107 f = P_MELS{i};
|
peterf@2
|
108
|
peterf@2
|
109 for j = 1:length(P_HTK)
|
peterf@2
|
110 htk = P_HTK{j};
|
peterf@2
|
111
|
peterf@2
|
112 % Run the function
|
peterf@2
|
113 result = mel2hz(f, htk);
|
peterf@2
|
114
|
peterf@2
|
115 % save the output
|
peterf@2
|
116 counter = counter + 1;
|
peterf@2
|
117
|
peterf@2
|
118 filename = sprintf('%s/feature-mel_to_hz-%03d.mat', output_path, counter);
|
peterf@2
|
119 display([' `-- saving ', filename]);
|
peterf@2
|
120
|
peterf@2
|
121 save(filename, 'f', 'htk', 'result');
|
peterf@2
|
122 end
|
peterf@2
|
123 end
|
peterf@2
|
124 end
|
peterf@2
|
125
|
peterf@2
|
126 function testHzToOcts(output_path)
|
peterf@2
|
127
|
peterf@2
|
128 % Scalar argument or a vector
|
peterf@2
|
129 P_HZ = {[5], [2.^(2:14)]};
|
peterf@2
|
130
|
peterf@2
|
131 counter = 0;
|
peterf@2
|
132 for i = 1:length(P_HZ)
|
peterf@2
|
133 f = P_HZ{i};
|
peterf@2
|
134
|
peterf@2
|
135 % Run the function
|
peterf@2
|
136 result = hz2octs(f);
|
peterf@2
|
137
|
peterf@2
|
138 % save the output
|
peterf@2
|
139 counter = counter + 1;
|
peterf@2
|
140
|
peterf@2
|
141 filename = sprintf('%s/feature-hz_to_octs-%03d.mat', output_path, counter);
|
peterf@2
|
142 display([' `-- saving ', filename]);
|
peterf@2
|
143
|
peterf@2
|
144 save(filename, 'f', 'result');
|
peterf@2
|
145 end
|
peterf@2
|
146 end
|
peterf@2
|
147
|
peterf@2
|
148 function testLoad(output_path)
|
peterf@2
|
149
|
peterf@2
|
150 % Test: load a wav file
|
peterf@2
|
151 % get audio stream (floats) and sample rate
|
peterf@2
|
152 % preserve stereo or convert to mono
|
peterf@2
|
153 wavfile = 'data/test1_44100.wav';
|
peterf@2
|
154 [y, sr] = wavread(wavfile);
|
peterf@2
|
155 y = y'; % Transpose to make python code easier
|
peterf@2
|
156 mono = 0;
|
peterf@2
|
157
|
peterf@2
|
158 % Stereo output
|
peterf@2
|
159 counter = 1;
|
peterf@2
|
160
|
peterf@2
|
161 filename = sprintf('%s/core-load-%03d.mat', output_path, counter);
|
peterf@2
|
162 display([' `-- saving ', filename]);
|
peterf@2
|
163 save(filename, 'wavfile', 'mono', 'y', 'sr');
|
peterf@2
|
164
|
peterf@2
|
165 % Mono output
|
peterf@2
|
166 counter = 2;
|
peterf@2
|
167 mono = 1;
|
peterf@2
|
168 y = mean(y, 1);
|
peterf@2
|
169 filename = sprintf('%s/core-load-%03d.mat', output_path, counter);
|
peterf@2
|
170 display([' `-- saving ', filename]);
|
peterf@2
|
171 save(filename, 'wavfile', 'mono', 'y', 'sr');
|
peterf@2
|
172
|
peterf@2
|
173 end
|
peterf@2
|
174
|
peterf@2
|
175 function testMelfb(output_path)
|
peterf@2
|
176
|
peterf@2
|
177 % Test three sample rates
|
peterf@2
|
178 P_SR = [8000, 11025, 22050];
|
peterf@2
|
179
|
peterf@2
|
180 % Two FFT lengths
|
peterf@2
|
181 P_NFFT = [256, 512];
|
peterf@2
|
182
|
peterf@2
|
183 % Three filter bank sizes
|
peterf@2
|
184 P_NFILTS = [20, 40, 120];
|
peterf@2
|
185
|
peterf@2
|
186 % One width
|
peterf@2
|
187 P_WIDTH = [1.0];
|
peterf@2
|
188
|
peterf@2
|
189 % F_min
|
peterf@2
|
190 P_FMIN = [0, 512];
|
peterf@2
|
191
|
peterf@2
|
192 % F_max
|
peterf@2
|
193 P_FMAX = [2000, inf];
|
peterf@2
|
194
|
peterf@2
|
195 % Slaney or HTK mels
|
peterf@2
|
196 P_HTK = [0, 1];
|
peterf@2
|
197
|
peterf@2
|
198 % Generate tests
|
peterf@2
|
199 counter = 0;
|
peterf@2
|
200
|
peterf@2
|
201 for sr = P_SR
|
peterf@2
|
202 for nfft = P_NFFT
|
peterf@2
|
203 for nfilts = P_NFILTS
|
peterf@2
|
204 for width = P_WIDTH
|
peterf@2
|
205 for fmin = P_FMIN
|
peterf@2
|
206 for fmax = P_FMAX
|
peterf@2
|
207 if isinf(fmax)
|
peterf@2
|
208 fmax = sr / 2;
|
peterf@2
|
209 end
|
peterf@2
|
210 for htk = P_HTK
|
peterf@2
|
211
|
peterf@2
|
212 % Run the function
|
peterf@2
|
213 [wts, frqs] = fft2melmx(nfft, sr, nfilts, width, fmin, fmax, htk, 0);
|
peterf@2
|
214
|
peterf@2
|
215 % save the output
|
peterf@2
|
216 counter = counter + 1;
|
peterf@2
|
217
|
peterf@2
|
218 filename = sprintf('%s/feature-melfb-%03d.mat', output_path, counter);
|
peterf@2
|
219 display([' `-- saving ', filename]);
|
peterf@2
|
220
|
peterf@2
|
221 save(filename, ...
|
peterf@2
|
222 'sr', 'nfft', 'nfilts', 'width', ...
|
peterf@2
|
223 'fmin', 'fmax', 'htk', 'wts', 'frqs');
|
peterf@2
|
224 end
|
peterf@2
|
225 end
|
peterf@2
|
226 end
|
peterf@2
|
227 end
|
peterf@2
|
228 end
|
peterf@2
|
229 end
|
peterf@2
|
230 end
|
peterf@2
|
231
|
peterf@2
|
232 end
|
peterf@2
|
233
|
peterf@2
|
234 function testResample(output_path)
|
peterf@2
|
235
|
peterf@2
|
236 wavfile = 'data/test1_22050.wav';
|
peterf@2
|
237
|
peterf@2
|
238 [y_in, sr_in] = wavread(wavfile);
|
peterf@2
|
239 y_in = mean(y_in, 2); % Convert to mono
|
peterf@2
|
240
|
peterf@2
|
241 % Test a downsample, same SR, and upsample
|
peterf@2
|
242 P_SR = [8000, 22050, 44100];
|
peterf@2
|
243
|
peterf@2
|
244 counter = 0;
|
peterf@2
|
245
|
peterf@2
|
246 for sr_out = P_SR
|
peterf@2
|
247
|
peterf@2
|
248 y_out = resample(y_in, sr_out, sr_in);
|
peterf@2
|
249
|
peterf@2
|
250 counter = counter + 1;
|
peterf@2
|
251 filename = sprintf('%s/core-resample-%03d.mat', output_path, counter);
|
peterf@2
|
252 display([' `-- saving ', filename]);
|
peterf@2
|
253 save(filename, 'wavfile', 'y_in', 'sr_in', 'y_out', 'sr_out');
|
peterf@2
|
254 end
|
peterf@2
|
255 end
|
peterf@2
|
256
|
peterf@2
|
257 function testSTFT(output_path)
|
peterf@2
|
258
|
peterf@2
|
259 wavfile = 'data/test1_22050.wav';
|
peterf@2
|
260
|
peterf@2
|
261 [y, sr] = wavread(wavfile);
|
peterf@2
|
262 y = mean(y, 2); % Convert to mono
|
peterf@2
|
263
|
peterf@2
|
264 % Test a couple of different FFT window sizes
|
peterf@2
|
265 P_NFFT = [128, 256, 1024];
|
peterf@2
|
266
|
peterf@2
|
267 % And hop sizes
|
peterf@2
|
268 P_HOP = [64, 128, 256];
|
peterf@2
|
269
|
peterf@2
|
270 % Note: librosa.stft does not support user-supplied windows,
|
peterf@2
|
271 % so we do not generate tests for this case.
|
peterf@2
|
272
|
peterf@2
|
273 counter = 0;
|
peterf@2
|
274
|
peterf@2
|
275 for nfft = P_NFFT
|
peterf@2
|
276 for hop_length = P_HOP
|
peterf@2
|
277 % Test once with no hann window (rectangular)
|
peterf@2
|
278 hann_w = 0;
|
peterf@2
|
279 D = stft(y, nfft, hann_w, hop_length, sr);
|
peterf@2
|
280
|
peterf@2
|
281 counter = counter + 1;
|
peterf@2
|
282 filename = sprintf('%s/core-stft-%03d.mat', output_path, counter);
|
peterf@2
|
283 display([' `-- saving ', filename]);
|
peterf@2
|
284 save(filename, 'wavfile', 'D', 'sr', 'nfft', 'hann_w', 'hop_length');
|
peterf@2
|
285
|
peterf@2
|
286 % And again with default hann window (nfft)
|
peterf@2
|
287 hann_w = nfft;
|
peterf@2
|
288 D = stft(y, nfft, hann_w, hop_length, sr);
|
peterf@2
|
289
|
peterf@2
|
290 counter = counter + 1;
|
peterf@2
|
291 filename = sprintf('%s/core-stft-%03d.mat', output_path, counter);
|
peterf@2
|
292 display([' `-- saving ', filename]);
|
peterf@2
|
293 save(filename, 'wavfile', 'D', 'sr', 'nfft', 'hann_w', 'hop_length');
|
peterf@2
|
294 end
|
peterf@2
|
295 end
|
peterf@2
|
296 end
|
peterf@2
|
297
|
peterf@2
|
298 function testIFGRAM(output_path)
|
peterf@2
|
299
|
peterf@2
|
300 wavfile = 'data/test1_22050.wav';
|
peterf@2
|
301
|
peterf@2
|
302 [y, sr] = wavread(wavfile);
|
peterf@2
|
303 y = mean(y, 2); % Convert to mono
|
peterf@2
|
304
|
peterf@2
|
305 % Test a couple of different FFT window sizes
|
peterf@2
|
306 P_NFFT = [128, 256, 1024];
|
peterf@2
|
307
|
peterf@2
|
308 % And window sizes
|
peterf@2
|
309 % P_WIN = [0.25, 0.5, 1.0];
|
peterf@2
|
310 P_WIN = [1.0];
|
peterf@2
|
311
|
peterf@2
|
312 % And hop sizes
|
peterf@2
|
313 P_HOP = [0.25, 0.5, 1.0];
|
peterf@2
|
314
|
peterf@2
|
315 % Note: librosa.stft does not support user-supplied windows,
|
peterf@2
|
316 % so we do not generate tests for this case.
|
peterf@2
|
317
|
peterf@2
|
318 counter = 0;
|
peterf@2
|
319
|
peterf@2
|
320 for nfft = P_NFFT
|
peterf@2
|
321 for win_ratio = P_WIN
|
peterf@2
|
322 for hop_ratio = P_HOP
|
peterf@2
|
323 % Test once with no hann window (rectangular)
|
peterf@2
|
324 hop_length = round(hop_ratio * nfft);
|
peterf@2
|
325 hann_w = round(win_ratio * nfft);
|
peterf@2
|
326
|
peterf@2
|
327 [F, D] = ifgram(y, nfft, hann_w, hop_length, sr);
|
peterf@2
|
328
|
peterf@2
|
329 counter = counter + 1;
|
peterf@2
|
330 filename = sprintf('%s/core-ifgram-%03d.mat', output_path, counter);
|
peterf@2
|
331 display([' `-- saving ', filename]);
|
peterf@2
|
332 save(filename, 'wavfile', 'F', 'D', 'sr', 'nfft', 'hann_w', 'hop_length');
|
peterf@2
|
333 end
|
peterf@2
|
334 end
|
peterf@2
|
335 end
|
peterf@2
|
336 end
|
peterf@2
|
337
|
peterf@2
|
338 function testISTFT(output_path)
|
peterf@2
|
339
|
peterf@2
|
340 wavfile = 'data/test1_22050.wav';
|
peterf@2
|
341
|
peterf@2
|
342 [y_in, sr] = wavread(wavfile);
|
peterf@2
|
343 y_in = mean(y_in, 2); % Convert to mono
|
peterf@2
|
344
|
peterf@2
|
345 % Test a couple of different FFT window sizes
|
peterf@2
|
346 P_NFFT = [128, 256, 1024];
|
peterf@2
|
347
|
peterf@2
|
348 % And hop sizes
|
peterf@2
|
349 P_HOP = [64, 128, 256];
|
peterf@2
|
350
|
peterf@2
|
351 % Note: librosa.stft does not support user-supplied windows,
|
peterf@2
|
352 % so we do not generate tests for this case.
|
peterf@2
|
353
|
peterf@2
|
354 counter = 0;
|
peterf@2
|
355
|
peterf@2
|
356 for nfft = P_NFFT
|
peterf@2
|
357 for hop_length = P_HOP
|
peterf@2
|
358 % Test once with no hann window (rectangular)
|
peterf@2
|
359 hann_w = 0;
|
peterf@2
|
360 D = stft(y_in, nfft, hann_w, hop_length, sr);
|
peterf@2
|
361 Dinv = istft(D, nfft, hann_w, hop_length);
|
peterf@2
|
362
|
peterf@2
|
363 counter = counter + 1;
|
peterf@2
|
364 filename = sprintf('%s/core-istft-%03d.mat', output_path, counter);
|
peterf@2
|
365 display([' `-- saving ', filename]);
|
peterf@2
|
366 save(filename, 'D', 'Dinv', 'nfft', 'hann_w', 'hop_length');
|
peterf@2
|
367
|
peterf@2
|
368 % And again with default hann window (nfft)
|
peterf@2
|
369 hann_w = nfft;
|
peterf@2
|
370 D = stft(y_in, nfft, hann_w, hop_length, sr);
|
peterf@2
|
371 Dinv = istft(D, nfft, hann_w, hop_length);
|
peterf@2
|
372
|
peterf@2
|
373 counter = counter + 1;
|
peterf@2
|
374 filename = sprintf('%s/core-istft-%03d.mat', output_path, counter);
|
peterf@2
|
375 display([' `-- saving ', filename]);
|
peterf@2
|
376 save(filename, 'D', 'Dinv', 'nfft', 'hann_w', 'hop_length');
|
peterf@2
|
377 end
|
peterf@2
|
378 end
|
peterf@2
|
379 end
|
peterf@2
|
380
|
peterf@2
|
381 function testBeat(output_path)
|
peterf@2
|
382
|
peterf@2
|
383 wavfile = 'data/test2_8000.wav';
|
peterf@2
|
384
|
peterf@2
|
385 [y, sr] = wavread(wavfile);
|
peterf@2
|
386 y = mean(y, 2); % Convert to mono
|
peterf@2
|
387
|
peterf@2
|
388 % Generate the onset envelope first
|
peterf@2
|
389 [t, xcr, D, onsetenv, oesr] = tempo2(y, sr);
|
peterf@2
|
390
|
peterf@2
|
391 filename = sprintf('%s/beat-onset-000.mat', output_path);
|
peterf@2
|
392 display([' `-- saving ', filename]);
|
peterf@2
|
393 save(filename, 'wavfile', 'onsetenv', 'D');
|
peterf@2
|
394
|
peterf@2
|
395 filename = sprintf('%s/beat-tempo-000.mat', output_path);
|
peterf@2
|
396 display([' `-- saving ', filename]);
|
peterf@2
|
397 save(filename, 'wavfile', 't', 'onsetenv');
|
peterf@2
|
398
|
peterf@2
|
399 [beats, onsetenv_out, D, cumscore] = beat2(onsetenv, oesr);
|
peterf@2
|
400 filename = sprintf('%s/beat-beat-000.mat', output_path);
|
peterf@2
|
401 display([' `-- saving ', filename]);
|
peterf@2
|
402 save(filename, 'wavfile', 'beats', 'onsetenv');
|
peterf@2
|
403
|
peterf@2
|
404 end
|
peterf@2
|
405
|
peterf@2
|
406 function testChromafb(output_path)
|
peterf@2
|
407
|
peterf@2
|
408 % Test three sample rates
|
peterf@2
|
409 P_SR = [8000, 11025, 22050];
|
peterf@2
|
410
|
peterf@2
|
411 % Two FFT lengths
|
peterf@2
|
412 P_NFFT = [256, 512];
|
peterf@2
|
413
|
peterf@2
|
414 % Two filter bank sizes
|
peterf@2
|
415 P_NCHROMA = [12, 24];
|
peterf@2
|
416
|
peterf@2
|
417 % Two A440s
|
peterf@2
|
418 P_A440 = [435.0, 440.0];
|
peterf@2
|
419
|
peterf@2
|
420 % Two center octaves
|
peterf@2
|
421 P_CTROCT = [4.0, 5.0];
|
peterf@2
|
422
|
peterf@2
|
423 % Two octave widths
|
peterf@2
|
424 P_OCTWIDTH = [0, 2.0];
|
peterf@2
|
425
|
peterf@2
|
426 % Generate tests
|
peterf@2
|
427 counter = 0;
|
peterf@2
|
428
|
peterf@2
|
429 for sr = P_SR
|
peterf@2
|
430 for nfft = P_NFFT
|
peterf@2
|
431 for nchroma = P_NCHROMA
|
peterf@2
|
432 for a440 = P_A440
|
peterf@2
|
433 for ctroct = P_CTROCT
|
peterf@2
|
434 for octwidth = P_OCTWIDTH
|
peterf@2
|
435
|
peterf@2
|
436 % Run the function
|
peterf@2
|
437 wts = fft2chromamx(nfft, nchroma, sr, a440, ctroct, octwidth);
|
peterf@2
|
438
|
peterf@2
|
439 % save the output
|
peterf@2
|
440 counter = counter + 1;
|
peterf@2
|
441
|
peterf@2
|
442 filename = sprintf('%s/feature-chromafb-%03d.mat', output_path, counter);
|
peterf@2
|
443 display([' `-- saving ', filename]);
|
peterf@2
|
444
|
peterf@2
|
445 save(filename, ...
|
peterf@2
|
446 'sr', 'nfft', 'nchroma', 'a440', ...
|
peterf@2
|
447 'ctroct', 'octwidth', 'wts');
|
peterf@2
|
448 end
|
peterf@2
|
449 end
|
peterf@2
|
450 end
|
peterf@2
|
451 end
|
peterf@2
|
452 end
|
peterf@2
|
453 end
|
peterf@2
|
454 end
|