Different MFCC obtained from audioFeatureExtractor and MFCC function
8 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Fabiano Guimaraes
il 17 Giu 2024
Commentato: Fabiano Guimaraes
il 19 Giu 2024
Hi,
I'm trying to use the "audioFeatureExtractor" and the MFCC function to get the MFCC data from an audio sample but noticed the coefficients are different. I´m assuming some default settings are different between these codes but cannot figure exactly what the difference is. Could you please help? Please find below a simple script to provide more detail. I'm comparing "MFCC1" MFCC2". I´ve tried several .wav and .m4a files but the MFCCs were never the same so I´m just using a generic "xxxxxxx" for file name.
[audioIn,fs] = audioread("xxxxxxx");
win1 = hamming(round(0.03*fs),"periodic");
win2 = round(0.015*fs);
aFE = audioFeatureExtractor(SampleRate=fs,Window=win1,OverlapLength=win2,mfcc=1);
features = extract(aFE,audioIn);
idx = info(aFE);
MFCC1 = features(:,idx.mfcc);
MFCC2 = mfcc(audioIn,fs,"LogEnergy","ignore","Window",win1,"Overlaplength",win2,"NumCoeffs",13);
0 Commenti
Risposta accettata
MathWorks Audio Toolbox Team
il 18 Giu 2024
The mfcc function follows the historically popular Auditory Toolbox implementation by Slaney. In this case, the mel bandpass filters are spaced linearly until 1 kHz and logarithmically thereafter. They also have a start point at 133.33 etc. Hz. The defaults spacing of the mel bands in the audioFeatureExtractor object follow the O'Shaughnessy formula. The default audioFeatureExtractor formulation is a bit more common now, especially for the mel spectrogram intermediate step.
What follows is one way to make the two implementations approximately equal. An alternative way to the below is to modify the mfcc function by setting the bandedges option.
Get the bandedges of the the Slaney implementation that the mfcc function uses.
bE = slaneybandedges();
Define your input and parameters.
[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");
win1 = hamming(round(0.03*fs),"periodic");
overlapLength = round(0.015*fs);
Get the default output of the mfcc function
mfcc_output = mfcc(audioIn,fs,LogEnergy="ignore");
Create an audioFeatureExtractor object and set the options to extract the same feature as mfcc function.
aFE = audioFeatureExtractor(SampleRate=fs, ...
Window=hamming(round(0.03*fs),"periodic"), ...
OverlapLength=round(0.02*fs), ...
mfcc=true, ...
FFTLength=numel(win1));
setExtractorParameters(aFE,"melSpectrum", ...
MelStyle="slaney", ...
SpectrumType="magnitude", ...
WindowNormalization=false, ...
FilterBankDesignDomain="linear", ...
FilterBankNormalization="bandwidth", ...
NumBands=40, ...
FrequencyRange=[bE(1),bE(end)])
features = extract(aFE,audioIn);
idx = info(aFE);
afe_output = features(:,idx.mfcc);
coeffToInspect = 1;
plot(afe_output(:,coeffToInspect),'bo'),hold on
plot(mfcc_output(:,coeffToInspect),'r*'),hold off
rms(afe_output(:)-mfcc_output(:))
Supporting Function
function bE = slaneybandedges()
% Default band edges as defined by the documentation for the
% Auditory Toolbox.
factor = 133.33333333333333;
bE = zeros(1,42);
for ii = 1:13
bE(ii) = factor + (factor/2)*(ii-1);
end
for ii = 14:42
bE(ii) = bE(ii-1)*1.0711703;
end
end
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Feature Extraction in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!