Mercurial > hg > camir-aes2014
view 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 source
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)