annotate Source/.svn/text-base/mfcc.m.svn-base @ 15:585caf503ef5 tip

Tidy up for ROLI
author Geogaddi\David <d.m.ronan@qmul.ac.uk>
date Tue, 17 May 2016 18:50:19 +0100
parents 25bf17994ef1
children
rev   line source
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