Mercurial > hg > adaptinstrspec
diff adaptInstrSpecExample.m @ 0:b4e26b53072f tip
Initial commit.
author | Holger Kirchhoff <holger.kirchhoff@eecs.qmul.ac.uk> |
---|---|
date | Tue, 04 Dec 2012 13:57:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/adaptInstrSpecExample.m Tue Dec 04 13:57:15 2012 +0000 @@ -0,0 +1,135 @@ +% This is an example script to illustrate the use of the CAdaptInstrSpec +% class. The script loads the spectra extracted two recordings of two +% different violins. It then applied the CAdaptInstrSpec class to adapt the +% spectra of the first violin to those of the second. + +clearvars; +close all; + +addpath('./functions/'); + + +%% constants + +% file paths of instrument spectra +noteSpectraFilePaths = {'./instrSpectra/Violin.CQT.mat'; ... + './instrSpectra/Violin2.CQT.mat'}; +numInstr = length(noteSpectraFilePaths); + +% analysis +tuningFreqInHz = 440; +costFctName = 'LS'; +beta = 2; % only needed for plotting. should match the cost function above +numIter = 5; + + + + +%% load instrument spectra +instrSpec = cell(numInstr,1); +f0Idcs = cell(numInstr,1); + +for instrIdx = 1:numInstr + load(noteSpectraFilePaths{instrIdx}); % loads variables: noteSpectra, midiPitches, freqsInHz + instrSpec{instrIdx} = noteSpectra; + f0Idcs{instrIdx} = midiPitch2Shift(midiPitches, tuningFreqInHz, freqsInHz)+1; +end +numBinsPerSemitone = getNumBinsPerSemitoneFromFreqVec(freqsInHz); + + +%% estimate filter curve + +% create instrSpecFilter object +instrFiltObj = CAdaptInstrSpec(instrSpec{1}, instrSpec{2}, f0Idcs{1}, f0Idcs{2}, numBinsPerSemitone, costFctName); + +% apply update function for h +for iterIdx = 1:numIter; + instrFiltObj = instrFiltObj.updateH; +end + +h = instrFiltObj.getH; +h_smooth = instrFiltObj.getSmoothedH; + + +%% estimate spectra with given filter curve +estSpectra = instrFiltObj.estimateSpectra(f0Idcs{1}); + + + + +%% plot results + +% plot original spectra and estimated spectra +yticks = [250 500 1000 2000 4000]; +yticklabel = {'250'; '500'; '1k'; '2k'; '4k'}; + +figure; +subplot(311); +imagesc(f0Idcs{1}, freqsInHz, instrSpec{1}); +axis xy; +set(gca, 'YScale', 'log', 'YTick', yticks, 'YTickLabel', yticklabel); +xlabel('pitch index'); +ylabel('frequency [Hz]'); +title('spectra of instrument 1'); + + +subplot(312); +imagesc(f0Idcs{1}, freqsInHz, instrSpec{2}); +axis xy; +set(gca, 'YScale', 'log', 'YTick', yticks, 'YTickLabel', yticklabel); +xlabel('pitch index'); +ylabel('frequency [Hz]'); +title('spectra of instrument 2'); + +subplot(313); +imagesc(f0Idcs{1}, freqsInHz, estSpectra); +axis xy; +set(gca, 'YScale', 'log', 'YTick', yticks, 'YTickLabel', yticklabel); +xlabel('pitch index'); +ylabel('frequency [Hz]'); +title('spectra of instrument 2 adapted to instrument 1') + + +% plot filter curve and errors +xticks = [125 250 500 1000 2000 4000]; +xticklabel = {'125'; '250'; '500'; '1k'; '2k'; '4k'}; + +% compute beta divergence for each element +betaDivsOriginal = betaDivergencePerElement(instrSpec{1}, instrSpec{2}, beta); +betaDivsEstimate = betaDivergencePerElement(instrSpec{1}, estSpectra, beta); + +% scale per-element beta divergence for image plot +numColors = size(colormap,1); +maxDist = max([betaDivsOriginal(:); betaDivsEstimate(:)]); +betaDivsOriginal = betaDivsOriginal / maxDist * numColors; +betaDivsEstimate = betaDivsEstimate / maxDist * numColors; + + + +figure; +subplot(311) +%stem(freqsInHz(h ~= 0), h(h ~= 0), 'k', 'filled'); +plot(freqsInHz(h ~= 0), h(h ~= 0), 'k.'); +hold on; +plot(freqsInHz, h_smooth, 'k'); +hold off; +axis tight; +set(gca, 'XScale', 'log', 'XTick', xticks, 'XTickLabel', xticklabel); +title('estimated filter curve ''h'''); +legend('original', 'smoothed', 'Location', 'NorthWest'); + +subplot(312); +image(f0Idcs{1}, freqsInHz, betaDivsOriginal); +axis xy; +set(gca, 'YScale', 'log', 'YTick', yticks, 'YTickLabel', yticklabel); +xlabel('pitch index'); +ylabel('frequency [Hz]'); +title('elementwise differences between original sets of spectra'); + +subplot(313); +image(f0Idcs{1}, freqsInHz, betaDivsEstimate); +axis xy; +set(gca, 'YScale', 'log', 'YTick', yticks, 'YTickLabel', yticklabel); +xlabel('pitch index'); +ylabel('frequency [Hz]'); +title('differences between original and adapted set of spectra'); \ No newline at end of file