d@0
|
1 function [ceps] = mfcc(audioFile, FFTsize, hop, mfccFilterWeights, mfccDCTMatrix)
|
d@0
|
2
|
d@0
|
3 %Beat synched data
|
d@0
|
4 cepstralCoefficients = 13;
|
d@0
|
5 %BeatLength = 60/BPM*Fs;
|
d@0
|
6 %FrameSize = round(BeatLength*NoteDiv);
|
d@0
|
7 hop = hop;
|
d@0
|
8 %Nfft = 2^nextpow2(FrameSize);
|
d@0
|
9 Nfft = FFTsize;
|
d@0
|
10 FrameSize = FFTsize;
|
d@0
|
11 %number_of_frame = length([1:FrameSize:length(audioFile)])-1;
|
d@0
|
12
|
d@0
|
13 seg_start = [1:FrameSize:length(audioFile)]';
|
d@0
|
14 seg_stop = min(seg_start+FrameSize,length(audioFile));
|
d@0
|
15
|
d@0
|
16 if(seg_stop(end)-seg_start(end)~=FrameSize)
|
d@0
|
17 seg_stop(end) =[];
|
d@0
|
18 seg_start(end)=[];
|
d@0
|
19 end
|
d@0
|
20
|
d@0
|
21 number_of_frame = length(seg_start);
|
d@0
|
22
|
d@0
|
23 hamWindow = 0.54 - 0.46*cos(2*pi*(0:FrameSize-1)/FrameSize);
|
d@0
|
24
|
d@0
|
25 % Filter the input with the preemphasis filter
|
d@0
|
26 preEmphasized = audioFile; %filter([1 -.97], 1, audioFile);
|
d@0
|
27
|
d@0
|
28 % Allocate all the space we need for the output arrays.
|
d@0
|
29 ceps = zeros(cepstralCoefficients, number_of_frame);
|
d@0
|
30
|
d@0
|
31 %Tuning related variables :
|
d@0
|
32 averagedPowerSpectrogram = zeros(Nfft/2,1);
|
d@0
|
33
|
d@0
|
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
d@0
|
35 %%% Mel - Frequencies Cepstrum Coefficients
|
d@0
|
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
d@0
|
37 h=waitbar(0,'MFCC Calculus - Please wait..');
|
d@0
|
38 for start=1:number_of_frame
|
d@0
|
39
|
d@0
|
40 %Frame position
|
d@0
|
41 waitbar(start/number_of_frame);
|
d@0
|
42
|
d@0
|
43 first = seg_start(start);
|
d@0
|
44 last = seg_stop(start);
|
d@0
|
45
|
d@0
|
46
|
d@0
|
47 %Hanning window mult
|
d@0
|
48 fftData = zeros(1,Nfft);
|
d@0
|
49 preEmphasizedSlice = preEmphasized(first:last-1);
|
d@0
|
50 fftData(1:FrameSize) = preEmphasizedSlice.*hamWindow';
|
d@0
|
51
|
d@0
|
52 %magnitude of the fft
|
d@0
|
53 fftMag = abs(fft(fftData));
|
d@0
|
54 fftMag = fftMag(1:Nfft/2);
|
d@0
|
55
|
d@0
|
56 %Sum the spectrogram magnitude
|
d@0
|
57 averagedPowerSpectrogram = averagedPowerSpectrogram + fftMag'.^2;
|
d@0
|
58
|
d@0
|
59 %fft data into filter bank outputs + Log Compression
|
d@0
|
60 FilteredFFT = mfccFilterWeights * fftMag';
|
d@0
|
61
|
d@0
|
62 factorLogCompr = 10;
|
d@0
|
63 addTermLogCompr = 1;
|
d@0
|
64 earMag = log10(addTermLogCompr+FilteredFFT*factorLogCompr);
|
d@0
|
65
|
d@0
|
66 %Cosine transform to reduce dimensionality
|
d@0
|
67 ceps(:,start) = mfccDCTMatrix * earMag;
|
d@0
|
68
|
d@0
|
69 end %Loop on frames
|
d@0
|
70
|
d@0
|
71 close(h);
|
d@0
|
72
|
d@0
|
73 end
|