peterf@2: function testData(source_path, output_path) peterf@2: % testData(source_path, audio_file, output_path) peterf@2: % source_path = path to DPWE code peterf@2: % output_path = directory to store generated files peterf@2: % peterf@2: % CREATED:2013-03-08 14:32:21 by Brian McFee peterf@2: % Generate the test suite data for librosa routines: peterf@2: % peterf@2: % hz_to_mel peterf@2: % mel_to_hz peterf@2: % hz_to_octs peterf@2: % peterf@2: % stft peterf@2: % istft peterf@2: % peterf@2: % ifgram peterf@2: % peterf@2: % load peterf@2: % resample peterf@2: % peterf@2: % melfb peterf@2: % dctfb peterf@2: % peterf@2: % localmax peterf@2: % peterf@2: peterf@2: % Make sure we have the path to DPWE code peterf@2: addpath(source_path); peterf@2: peterf@2: display('hz_to_mel'); peterf@2: testHz2Mel(output_path); peterf@2: peterf@2: display('mel_to_hz'); peterf@2: testMel2Hz(output_path); peterf@2: peterf@2: display('hz_to_octs'); peterf@2: testHzToOcts(output_path); peterf@2: peterf@2: display('load'); peterf@2: testLoad(output_path); peterf@2: peterf@2: display('stft'); peterf@2: testSTFT(output_path); peterf@2: peterf@2: display('istft'); peterf@2: testISTFT(output_path); peterf@2: peterf@2: peterf@2: display('ifgram'); peterf@2: testIFGRAM(output_path); peterf@2: peterf@2: display('melfb'); peterf@2: testMelfb(output_path); peterf@2: peterf@2: display('chromafb'); peterf@2: testChromafb(output_path); peterf@2: peterf@2: display('resample'); peterf@2: testResample(output_path); peterf@2: peterf@2: display('beat'); peterf@2: testBeat(output_path); peterf@2: peterf@2: %% Done! peterf@2: display('Done.'); peterf@2: end peterf@2: peterf@2: function testHz2Mel(output_path) peterf@2: peterf@2: % Test with either a scalar argument or a vector peterf@2: P_HZ = {[440], [2.^(1:13)]}; peterf@2: peterf@2: % Slaney-style or HTK peterf@2: P_HTK = {0, 1}; peterf@2: peterf@2: counter = 0; peterf@2: for i = 1:length(P_HZ) peterf@2: f = P_HZ{i}; peterf@2: peterf@2: for j = 1:length(P_HTK) peterf@2: htk = P_HTK{j}; peterf@2: peterf@2: % Run the function peterf@2: result = hz2mel(f, htk); peterf@2: peterf@2: % save the output peterf@2: counter = counter + 1; peterf@2: peterf@2: filename = sprintf('%s/feature-hz_to_mel-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: peterf@2: save(filename, 'f', 'htk', 'result'); peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: function testMel2Hz(output_path) peterf@2: peterf@2: % Test with either a scalar argument or a vector peterf@2: P_MELS = {[5], [2.^(-2:9)]}; peterf@2: peterf@2: % Slaney-style or HTK peterf@2: P_HTK = {0, 1}; peterf@2: peterf@2: counter = 0; peterf@2: for i = 1:length(P_MELS) peterf@2: f = P_MELS{i}; peterf@2: peterf@2: for j = 1:length(P_HTK) peterf@2: htk = P_HTK{j}; peterf@2: peterf@2: % Run the function peterf@2: result = mel2hz(f, htk); peterf@2: peterf@2: % save the output peterf@2: counter = counter + 1; peterf@2: peterf@2: filename = sprintf('%s/feature-mel_to_hz-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: peterf@2: save(filename, 'f', 'htk', 'result'); peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: function testHzToOcts(output_path) peterf@2: peterf@2: % Scalar argument or a vector peterf@2: P_HZ = {[5], [2.^(2:14)]}; peterf@2: peterf@2: counter = 0; peterf@2: for i = 1:length(P_HZ) peterf@2: f = P_HZ{i}; peterf@2: peterf@2: % Run the function peterf@2: result = hz2octs(f); peterf@2: peterf@2: % save the output peterf@2: counter = counter + 1; peterf@2: peterf@2: filename = sprintf('%s/feature-hz_to_octs-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: peterf@2: save(filename, 'f', 'result'); peterf@2: end peterf@2: end peterf@2: peterf@2: function testLoad(output_path) peterf@2: peterf@2: % Test: load a wav file peterf@2: % get audio stream (floats) and sample rate peterf@2: % preserve stereo or convert to mono peterf@2: wavfile = 'data/test1_44100.wav'; peterf@2: [y, sr] = wavread(wavfile); peterf@2: y = y'; % Transpose to make python code easier peterf@2: mono = 0; peterf@2: peterf@2: % Stereo output peterf@2: counter = 1; peterf@2: peterf@2: filename = sprintf('%s/core-load-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'mono', 'y', 'sr'); peterf@2: peterf@2: % Mono output peterf@2: counter = 2; peterf@2: mono = 1; peterf@2: y = mean(y, 1); peterf@2: filename = sprintf('%s/core-load-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'mono', 'y', 'sr'); peterf@2: peterf@2: end peterf@2: peterf@2: function testMelfb(output_path) peterf@2: peterf@2: % Test three sample rates peterf@2: P_SR = [8000, 11025, 22050]; peterf@2: peterf@2: % Two FFT lengths peterf@2: P_NFFT = [256, 512]; peterf@2: peterf@2: % Three filter bank sizes peterf@2: P_NFILTS = [20, 40, 120]; peterf@2: peterf@2: % One width peterf@2: P_WIDTH = [1.0]; peterf@2: peterf@2: % F_min peterf@2: P_FMIN = [0, 512]; peterf@2: peterf@2: % F_max peterf@2: P_FMAX = [2000, inf]; peterf@2: peterf@2: % Slaney or HTK mels peterf@2: P_HTK = [0, 1]; peterf@2: peterf@2: % Generate tests peterf@2: counter = 0; peterf@2: peterf@2: for sr = P_SR peterf@2: for nfft = P_NFFT peterf@2: for nfilts = P_NFILTS peterf@2: for width = P_WIDTH peterf@2: for fmin = P_FMIN peterf@2: for fmax = P_FMAX peterf@2: if isinf(fmax) peterf@2: fmax = sr / 2; peterf@2: end peterf@2: for htk = P_HTK peterf@2: peterf@2: % Run the function peterf@2: [wts, frqs] = fft2melmx(nfft, sr, nfilts, width, fmin, fmax, htk, 0); peterf@2: peterf@2: % save the output peterf@2: counter = counter + 1; peterf@2: peterf@2: filename = sprintf('%s/feature-melfb-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: peterf@2: save(filename, ... peterf@2: 'sr', 'nfft', 'nfilts', 'width', ... peterf@2: 'fmin', 'fmax', 'htk', 'wts', 'frqs'); peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: end peterf@2: peterf@2: function testResample(output_path) peterf@2: peterf@2: wavfile = 'data/test1_22050.wav'; peterf@2: peterf@2: [y_in, sr_in] = wavread(wavfile); peterf@2: y_in = mean(y_in, 2); % Convert to mono peterf@2: peterf@2: % Test a downsample, same SR, and upsample peterf@2: P_SR = [8000, 22050, 44100]; peterf@2: peterf@2: counter = 0; peterf@2: peterf@2: for sr_out = P_SR peterf@2: peterf@2: y_out = resample(y_in, sr_out, sr_in); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-resample-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'y_in', 'sr_in', 'y_out', 'sr_out'); peterf@2: end peterf@2: end peterf@2: peterf@2: function testSTFT(output_path) peterf@2: peterf@2: wavfile = 'data/test1_22050.wav'; peterf@2: peterf@2: [y, sr] = wavread(wavfile); peterf@2: y = mean(y, 2); % Convert to mono peterf@2: peterf@2: % Test a couple of different FFT window sizes peterf@2: P_NFFT = [128, 256, 1024]; peterf@2: peterf@2: % And hop sizes peterf@2: P_HOP = [64, 128, 256]; peterf@2: peterf@2: % Note: librosa.stft does not support user-supplied windows, peterf@2: % so we do not generate tests for this case. peterf@2: peterf@2: counter = 0; peterf@2: peterf@2: for nfft = P_NFFT peterf@2: for hop_length = P_HOP peterf@2: % Test once with no hann window (rectangular) peterf@2: hann_w = 0; peterf@2: D = stft(y, nfft, hann_w, hop_length, sr); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-stft-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'D', 'sr', 'nfft', 'hann_w', 'hop_length'); peterf@2: peterf@2: % And again with default hann window (nfft) peterf@2: hann_w = nfft; peterf@2: D = stft(y, nfft, hann_w, hop_length, sr); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-stft-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'D', 'sr', 'nfft', 'hann_w', 'hop_length'); peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: function testIFGRAM(output_path) peterf@2: peterf@2: wavfile = 'data/test1_22050.wav'; peterf@2: peterf@2: [y, sr] = wavread(wavfile); peterf@2: y = mean(y, 2); % Convert to mono peterf@2: peterf@2: % Test a couple of different FFT window sizes peterf@2: P_NFFT = [128, 256, 1024]; peterf@2: peterf@2: % And window sizes peterf@2: % P_WIN = [0.25, 0.5, 1.0]; peterf@2: P_WIN = [1.0]; peterf@2: peterf@2: % And hop sizes peterf@2: P_HOP = [0.25, 0.5, 1.0]; peterf@2: peterf@2: % Note: librosa.stft does not support user-supplied windows, peterf@2: % so we do not generate tests for this case. peterf@2: peterf@2: counter = 0; peterf@2: peterf@2: for nfft = P_NFFT peterf@2: for win_ratio = P_WIN peterf@2: for hop_ratio = P_HOP peterf@2: % Test once with no hann window (rectangular) peterf@2: hop_length = round(hop_ratio * nfft); peterf@2: hann_w = round(win_ratio * nfft); peterf@2: peterf@2: [F, D] = ifgram(y, nfft, hann_w, hop_length, sr); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-ifgram-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'F', 'D', 'sr', 'nfft', 'hann_w', 'hop_length'); peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: function testISTFT(output_path) peterf@2: peterf@2: wavfile = 'data/test1_22050.wav'; peterf@2: peterf@2: [y_in, sr] = wavread(wavfile); peterf@2: y_in = mean(y_in, 2); % Convert to mono peterf@2: peterf@2: % Test a couple of different FFT window sizes peterf@2: P_NFFT = [128, 256, 1024]; peterf@2: peterf@2: % And hop sizes peterf@2: P_HOP = [64, 128, 256]; peterf@2: peterf@2: % Note: librosa.stft does not support user-supplied windows, peterf@2: % so we do not generate tests for this case. peterf@2: peterf@2: counter = 0; peterf@2: peterf@2: for nfft = P_NFFT peterf@2: for hop_length = P_HOP peterf@2: % Test once with no hann window (rectangular) peterf@2: hann_w = 0; peterf@2: D = stft(y_in, nfft, hann_w, hop_length, sr); peterf@2: Dinv = istft(D, nfft, hann_w, hop_length); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-istft-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'D', 'Dinv', 'nfft', 'hann_w', 'hop_length'); peterf@2: peterf@2: % And again with default hann window (nfft) peterf@2: hann_w = nfft; peterf@2: D = stft(y_in, nfft, hann_w, hop_length, sr); peterf@2: Dinv = istft(D, nfft, hann_w, hop_length); peterf@2: peterf@2: counter = counter + 1; peterf@2: filename = sprintf('%s/core-istft-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'D', 'Dinv', 'nfft', 'hann_w', 'hop_length'); peterf@2: end peterf@2: end peterf@2: end peterf@2: peterf@2: function testBeat(output_path) peterf@2: peterf@2: wavfile = 'data/test2_8000.wav'; peterf@2: peterf@2: [y, sr] = wavread(wavfile); peterf@2: y = mean(y, 2); % Convert to mono peterf@2: peterf@2: % Generate the onset envelope first peterf@2: [t, xcr, D, onsetenv, oesr] = tempo2(y, sr); peterf@2: peterf@2: filename = sprintf('%s/beat-onset-000.mat', output_path); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'onsetenv', 'D'); peterf@2: peterf@2: filename = sprintf('%s/beat-tempo-000.mat', output_path); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 't', 'onsetenv'); peterf@2: peterf@2: [beats, onsetenv_out, D, cumscore] = beat2(onsetenv, oesr); peterf@2: filename = sprintf('%s/beat-beat-000.mat', output_path); peterf@2: display([' `-- saving ', filename]); peterf@2: save(filename, 'wavfile', 'beats', 'onsetenv'); peterf@2: peterf@2: end peterf@2: peterf@2: function testChromafb(output_path) peterf@2: peterf@2: % Test three sample rates peterf@2: P_SR = [8000, 11025, 22050]; peterf@2: peterf@2: % Two FFT lengths peterf@2: P_NFFT = [256, 512]; peterf@2: peterf@2: % Two filter bank sizes peterf@2: P_NCHROMA = [12, 24]; peterf@2: peterf@2: % Two A440s peterf@2: P_A440 = [435.0, 440.0]; peterf@2: peterf@2: % Two center octaves peterf@2: P_CTROCT = [4.0, 5.0]; peterf@2: peterf@2: % Two octave widths peterf@2: P_OCTWIDTH = [0, 2.0]; peterf@2: peterf@2: % Generate tests peterf@2: counter = 0; peterf@2: peterf@2: for sr = P_SR peterf@2: for nfft = P_NFFT peterf@2: for nchroma = P_NCHROMA peterf@2: for a440 = P_A440 peterf@2: for ctroct = P_CTROCT peterf@2: for octwidth = P_OCTWIDTH peterf@2: peterf@2: % Run the function peterf@2: wts = fft2chromamx(nfft, nchroma, sr, a440, ctroct, octwidth); peterf@2: peterf@2: % save the output peterf@2: counter = counter + 1; peterf@2: peterf@2: filename = sprintf('%s/feature-chromafb-%03d.mat', output_path, counter); peterf@2: display([' `-- saving ', filename]); peterf@2: peterf@2: save(filename, ... peterf@2: 'sr', 'nfft', 'nchroma', 'a440', ... peterf@2: 'ctroct', 'octwidth', 'wts'); peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end peterf@2: end