Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolboxDemos/demo4segmentation.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolboxDemos/demo4segmentation.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,154 @@ +function demo4segmentation +% To get familiar with some approaches of segmentation of audio files +% using MIRtoolbox. + +% 1. Load an audio file (for instance, guitar.wav). +a = miraudio('guitar'); + +% 2. We will perform the segmentation strategy as proposed in (Foote & +% Cooper, 2003). First, decompose the file into successive frames of 50 ms +% without overlap. +help mirframe +fr = mirframe(a,0.05,1) + +% 3. Compute the spectrum representation (FFT) of the frames. +sp = mirspectrum(fr) +clear fr +% (Remove from the memory any data that will not be used any more.) + +% 4. Compute the similarity matrix that shows the similarity between the +% spectrum of different frames. +help mirsimatrix +sm = mirsimatrix(sp) +clear sp +% Look at the structures shown in the matrix and find the relation with the +% structure heard when listening to the extract. + +% 5. Estimate the novelty score related to the similarity matrix. It +% consists in a convolution of the diagonal of the matrix with a +% checker-board Gaussian kernel. Use the novelty function for that purpose. +help mirnovelty +nv = mirnovelty(sm) + +% 6. Detect the peaks in the novelty score. +help mirpeaks +p1 = mirpeaks(nv) + +% You can change the threshold value of the peak picker function in order to +% get better results. +p2 = mirpeaks(nv,'Contrast',0.01) + +clear nv + +% 7. Segment the original audio file using the peaks as position for +% segmentation. +help mirsegment +s1 = mirsegment(a,p1) +clear p1 + +% 8. Listen to the results. +mirplay(s1) + +%s2 = mirsegment(a,p2) +%clear p2 +%mirplay(s2) + +% 9. Compute the similarity matrix of this obtained segmentation, in order +% to view the relationships between the different segments and their +% possible clustering into higher-level groups. +mirsimatrix(s1,'Similarity') +clear s1 +%mirsimatrix(s2) +%clear s2 + +display('Strike any key to continue...'); +pause +close all + +% 10. Change the size of the kernel used in the novelty function, in order +% to obtain segmentations of different levels of detail, from detailed +% analysis of the local texture, to very simple segmentation of the whole +% piece. +n100 = mirnovelty(sm,'KernelSize',100) +n50 = mirnovelty(sm,'KernelSize',50) +n10 = mirnovelty(sm,'KernelSize',10) +clear sm +% As you can see, the smaller the gaussian kernel is, the more peaks can be +% found in the novelty score. Indeed, if the kernel is small, the cumulative +% multiplication of its elements with the superposed elements in the +% similarity matrix may vary more easily, throughout the progressive +% sliding of the kernel along the diagonal of the similarity matrix, and +% local change of texture may be more easily detected. On the contrary, +% when the kernel is large, only large-scale change of texture are +% detected. + +display('Strike any key to continue...'); +pause +close all + +p100 = mirpeaks(n100,'NoBegin','NoEnd') +clear n100 +p50 = mirpeaks(n50,'NoBegin','NoEnd') +clear n50 +p10 = mirpeaks(n10,'NoBegin','NoEnd') +clear n10 +s100 = mirsegment(a,p100) +clear p100 +mirplay(s100) +clear s100 +s50 = mirsegment(a,p50) +clear p50 +mirplay(s50) +clear s50 +s10 = mirsegment(a,p10) +clear p10 +mirplay(s10) +clear s10 + +display('Strike any key to continue...'); +pause +close all + +% One more compact way of writing these commands is as follows: +mirsegment(a,'Novelty') +mirsegment(a,'Novelty','Contrast',0.01) +mirsegment(a,'Novelty','KernelSize',100) + +display('Strike any key to continue...'); +pause +close all + +% Besides, if you want to see the novelty curve with the peaks, just add a +% second output: +[s50 p50] = mirsegment(a,'Novelty','KernelSize',50) +clear s50 p50 +[s10 p10] = mirsegment(a,'Novelty','KernelSize',10) +clear a s10 p10 + +display('Strike any key to continue...'); +pause +close all + + +% 11. Try the whole process with MFCC instead of spectrum analysis. Take the +% first ten MFCC for instance. +help mirsegment +% The segment function can simply be called as follows: +sc = mirsegment('czardas','Novelty','MFCC','Rank',1:10) +clear sc + +% Here are some other examples of use: +[ssp p m b] = mirsegment('valse_triste_happy','Spectrum',... + 'KernelSize',150,'Contrast',.1) +clear p m b +mirplay(ssp) +clear ssp + +display('Strike any key to continue...'); +pause +close all + +[smfcc2 p m a] = mirsegment('valse_triste_happy','MFCC',2:10,... + 'KernelSize',150,'Contrast',.1) +clear p m a +mirplay(smfcc2) \ No newline at end of file