androidmfcctarsosdsp

How to get MFCC with TarsosDSP?


I searched everywhere and I couldn't figure out how to extract MFCC feature using TarsosDSP on Android. I know how to get FFT out of a file. Any help?


Solution

  • See official github page

    MFCC Test file

    public class MFCCTest {
    
    //  private static int counter = 0;
    
        @Test
        public void MFCCForSineTest() throws UnsupportedAudioFileException{
            int sampleRate = 44100;
            int bufferSize = 1024;
            int bufferOverlap = 128;
            final float[] floatBuffer = TestUtilities.audioBufferSine();
            final AudioDispatcher dispatcher = AudioDispatcherFactory.fromFloatArray(floatBuffer, sampleRate, bufferSize, bufferOverlap);
            final MFCC mfcc = new MFCC(bufferSize, sampleRate, 40, 50, 300, 3000);
            dispatcher.addAudioProcessor(mfcc);
            dispatcher.addAudioProcessor(new AudioProcessor() {
    
                @Override
                public void processingFinished() {
                }
    
                @Override
                public boolean process(AudioEvent audioEvent) {
                    return true;
                }
            });
            dispatcher.run();
        }
    
    }
    

    and TestUtilities audioBufferSine()

    public class TestUtilities {
    
        /**
         * Constructs and returns a buffer of a two seconds long pure sine of 440Hz
         * sampled at 44.1kHz.
         * 
         * @return A buffer of a two seconds long pure sine (440Hz) sampled at
         *         44.1kHz.
         */
        public static float[] audioBufferSine() {
            final double sampleRate = 44100.0;
            final double f0 = 440.0;
            final double amplitudeF0 = 0.5;
            final double seconds = 4.0;
            final float[] buffer = new float[(int) (seconds * sampleRate)];
            for (int sample = 0; sample < buffer.length; sample++) {
                final double time = sample / sampleRate;
                buffer[sample] = (float) (amplitudeF0 * Math.sin(2 * Math.PI * f0 * time));
            }
            return buffer;
        }