1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include <catch.hpp> 7*89c4ff92SAndroid Build Coastguard Worker #include <limits> 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include "Wav2LetterMFCC.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker const std::vector<float> testWav = std::vector<float> 12*89c4ff92SAndroid Build Coastguard Worker { 13*89c4ff92SAndroid Build Coastguard Worker -3.0f, 0.0f, 1.0f, -1.0f, 2.0f, 3.0f, -2.0f, 2.0f, 14*89c4ff92SAndroid Build Coastguard Worker 1.0f, -2.0f, 0.0f, 3.0f, -1.0f, 8.0f, 3.0f, 2.0f, 15*89c4ff92SAndroid Build Coastguard Worker -1.0f, -1.0f, 2.0f, 7.0f, 3.0f, 5.0f, 6.0f, 6.0f, 16*89c4ff92SAndroid Build Coastguard Worker 6.0f, 12.0f, 5.0f, 6.0f, 3.0f, 3.0f, 5.0f, 4.0f, 17*89c4ff92SAndroid Build Coastguard Worker 4.0f, 6.0f, 7.0f, 7.0f, 7.0f, 3.0f, 7.0f, 2.0f, 18*89c4ff92SAndroid Build Coastguard Worker 8.0f, 4.0f, 4.0f, 2.0f, -4.0f, -1.0f, -1.0f, -4.0f, 19*89c4ff92SAndroid Build Coastguard Worker 2.0f, 1.0f, -1.0f, -4.0f, 0.0f, -7.0f, -6.0f, -2.0f, 20*89c4ff92SAndroid Build Coastguard Worker -5.0f, 1.0f, -5.0f, -1.0f, -7.0f, -3.0f, -3.0f, -7.0f, 21*89c4ff92SAndroid Build Coastguard Worker 0.0f, -3.0f, 3.0f, -5.0f, 0.0f, 1.0f, -2.0f, -2.0f, 22*89c4ff92SAndroid Build Coastguard Worker -3.0f, -3.0f, -7.0f, -3.0f, -2.0f, -6.0f, -5.0f, -8.0f, 23*89c4ff92SAndroid Build Coastguard Worker -2.0f, -8.0f, 4.0f, -9.0f, -4.0f, -9.0f, -5.0f, -5.0f, 24*89c4ff92SAndroid Build Coastguard Worker -3.0f, -9.0f, -3.0f, -9.0f, -1.0f, -7.0f, -4.0f, 1.0f, 25*89c4ff92SAndroid Build Coastguard Worker -3.0f, 2.0f, -8.0f, -4.0f, -4.0f, -5.0f, 1.0f, -3.0f, 26*89c4ff92SAndroid Build Coastguard Worker -1.0f, 0.0f, -1.0f, -2.0f, -3.0f, -2.0f, -4.0f, -1.0f, 27*89c4ff92SAndroid Build Coastguard Worker 1.0f, -1.0f, 3.0f, 0.0f, 3.0f, 2.0f, 0.0f, 0.0f, 28*89c4ff92SAndroid Build Coastguard Worker 0.0f, -3.0f, 1.0f, 1.0f, 0.0f, 8.0f, 3.0f, 4.0f, 29*89c4ff92SAndroid Build Coastguard Worker 1.0f, 5.0f, 6.0f, 4.0f, 7.0f, 3.0f, 3.0f, 0.0f, 30*89c4ff92SAndroid Build Coastguard Worker 3.0f, 6.0f, 7.0f, 6.0f, 4.0f, 5.0f, 9.0f, 9.0f, 31*89c4ff92SAndroid Build Coastguard Worker 5.0f, 5.0f, 8.0f, 1.0f, 6.0f, 9.0f, 6.0f, 6.0f, 32*89c4ff92SAndroid Build Coastguard Worker 7.0f, 1.0f, 8.0f, 1.0f, 5.0f, 0.0f, 5.0f, 5.0f, 33*89c4ff92SAndroid Build Coastguard Worker 0.0f, 3.0f, 2.0f, 7.0f, 2.0f, -3.0f, 3.0f, 0.0f, 34*89c4ff92SAndroid Build Coastguard Worker 3.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, -1.0f, -1.0f, 35*89c4ff92SAndroid Build Coastguard Worker -2.0f, -3.0f, -8.0f, 0.0f, 1.0f, 0.0f, -3.0f, -3.0f, 36*89c4ff92SAndroid Build Coastguard Worker -3.0f, -2.0f, -3.0f, -3.0f, -4.0f, -6.0f, -2.0f, -8.0f, 37*89c4ff92SAndroid Build Coastguard Worker -9.0f, -4.0f, -1.0f, -5.0f, -3.0f, -3.0f, -4.0f, -3.0f, 38*89c4ff92SAndroid Build Coastguard Worker -6.0f, 3.0f, 0.0f, -1.0f, -2.0f, -9.0f, -4.0f, -2.0f, 39*89c4ff92SAndroid Build Coastguard Worker 2.0f, -1.0f, 3.0f, -5.0f, -5.0f, -2.0f, 0.0f, -2.0f, 40*89c4ff92SAndroid Build Coastguard Worker 0.0f, -1.0f, -3.0f, 1.0f, -2.0f, 9.0f, 4.0f, 5.0f, 41*89c4ff92SAndroid Build Coastguard Worker 2.0f, 2.0f, 1.0f, 0.0f, -6.0f, -2.0f, 0.0f, 0.0f, 42*89c4ff92SAndroid Build Coastguard Worker 0.0f, -1.0f, 4.0f, -4.0f, 3.0f, -7.0f, -1.0f, 5.0f, 43*89c4ff92SAndroid Build Coastguard Worker -6.0f, -1.0f, -5.0f, 4.0f, 3.0f, 9.0f, -2.0f, 1.0f, 44*89c4ff92SAndroid Build Coastguard Worker 3.0f, 0.0f, 0.0f, -2.0f, 1.0f, 2.0f, 1.0f, 1.0f, 45*89c4ff92SAndroid Build Coastguard Worker 0.0f, 3.0f, 2.0f, -1.0f, 3.0f, -3.0f, 7.0f, 0.0f, 46*89c4ff92SAndroid Build Coastguard Worker 0.0f, 3.0f, 2.0f, 2.0f, -2.0f, 3.0f, -2.0f, 2.0f, 47*89c4ff92SAndroid Build Coastguard Worker -3.0f, 4.0f, -1.0f, -1.0f, -5.0f, -1.0f, -3.0f, -2.0f, 48*89c4ff92SAndroid Build Coastguard Worker 1.0f, -1.0f, 3.0f, 2.0f, 4.0f, 1.0f, 2.0f, -2.0f, 49*89c4ff92SAndroid Build Coastguard Worker 0.0f, 2.0f, 7.0f, 0.0f, 8.0f, -3.0f, 6.0f, -3.0f, 50*89c4ff92SAndroid Build Coastguard Worker 6.0f, 1.0f, 2.0f, -3.0f, -1.0f, -1.0f, -1.0f, 1.0f, 51*89c4ff92SAndroid Build Coastguard Worker -2.0f, 2.0f, 1.0f, 2.0f, 0.0f, -2.0f, 3.0f, -2.0f, 52*89c4ff92SAndroid Build Coastguard Worker 3.0f, -2.0f, 1.0f, 0.0f, -3.0f, -1.0f, -2.0f, -4.0f, 53*89c4ff92SAndroid Build Coastguard Worker -6.0f, -5.0f, -8.0f, -1.0f, -4.0f, 0.0f, -3.0f, -1.0f, 54*89c4ff92SAndroid Build Coastguard Worker -1.0f, -1.0f, 0.0f, -2.0f, -3.0f, -7.0f, -1.0f, 0.0f, 55*89c4ff92SAndroid Build Coastguard Worker 1.0f, 5.0f, 0.0f, 5.0f, 1.0f, 1.0f, -3.0f, 0.0f, 56*89c4ff92SAndroid Build Coastguard Worker -6.0f, 3.0f, -8.0f, 4.0f, -8.0f, 6.0f, -6.0f, 1.0f, 57*89c4ff92SAndroid Build Coastguard Worker -6.0f, -2.0f, -5.0f, -6.0f, 0.0f, -5.0f, 4.0f, -1.0f, 58*89c4ff92SAndroid Build Coastguard Worker 4.0f, -2.0f, 1.0f, 2.0f, 1.0f, 0.0f, -2.0f, 0.0f, 59*89c4ff92SAndroid Build Coastguard Worker 0.0f, 2.0f, -2.0f, 2.0f, -5.0f, 2.0f, 0.0f, -2.0f, 60*89c4ff92SAndroid Build Coastguard Worker 1.0f, -2.0f, 0.0f, 5.0f, 1.0f, 0.0f, 1.0f, 5.0f, 61*89c4ff92SAndroid Build Coastguard Worker 0.0f, 8.0f, 3.0f, 2.0f, 2.0f, 0.0f, 5.0f, -2.0f, 62*89c4ff92SAndroid Build Coastguard Worker 3.0f, 1.0f, 0.0f, 1.0f, 0.0f, -2.0f, -1.0f, -3.0f, 63*89c4ff92SAndroid Build Coastguard Worker 1.0f, -1.0f, 3.0f, 0.0f, 3.0f, 0.0f, -2.0f, -1.0f, 64*89c4ff92SAndroid Build Coastguard Worker -4.0f, -4.0f, -4.0f, -1.0f, -4.0f, -4.0f, -3.0f, -6.0f, 65*89c4ff92SAndroid Build Coastguard Worker -3.0f, -7.0f, -3.0f, -1.0f, -2.0f, 0.0f, -5.0f, -4.0f, 66*89c4ff92SAndroid Build Coastguard Worker -7.0f, -3.0f, -2.0f, -2.0f, 1.0f, 2.0f, 2.0f, 8.0f, 67*89c4ff92SAndroid Build Coastguard Worker 5.0f, 4.0f, 2.0f, 4.0f, 3.0f, 5.0f, 0.0f, 3.0f, 68*89c4ff92SAndroid Build Coastguard Worker 3.0f, 6.0f, 4.0f, 2.0f, 2.0f, -2.0f, 4.0f, -2.0f, 69*89c4ff92SAndroid Build Coastguard Worker 3.0f, 3.0f, 2.0f, 1.0f, 1.0f, 4.0f, -5.0f, 2.0f, 70*89c4ff92SAndroid Build Coastguard Worker -3.0f, 0.0f, -1.0f, 1.0f, -2.0f, 2.0f, 5.0f, 1.0f, 71*89c4ff92SAndroid Build Coastguard Worker 4.0f, 2.0f, 3.0f, 1.0f, -1.0f, 1.0f, 0.0f, 6.0f, 72*89c4ff92SAndroid Build Coastguard Worker 0.0f, -2.0f, -1.0f, 1.0f, -1.0f, 2.0f, -5.0f, -1.0f, 73*89c4ff92SAndroid Build Coastguard Worker -5.0f, -1.0f, -6.0f, -3.0f, -3.0f, 2.0f, 4.0f, 0.0f, 74*89c4ff92SAndroid Build Coastguard Worker -1.0f, -5.0f, 3.0f, -4.0f, -1.0f, -3.0f, -4.0f, 1.0f, 75*89c4ff92SAndroid Build Coastguard Worker -4.0f, 1.0f, -1.0f, -1.0f, 0.0f, -5.0f, -4.0f, -2.0f, 76*89c4ff92SAndroid Build Coastguard Worker -1.0f, -1.0f, -3.0f, -7.0f, -3.0f, -3.0f, 4.0f, 4.0f 77*89c4ff92SAndroid Build Coastguard Worker }; 78*89c4ff92SAndroid Build Coastguard Worker 79*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("Test MFCC") 80*89c4ff92SAndroid Build Coastguard Worker { 81*89c4ff92SAndroid Build Coastguard Worker int sampFreq = 16000; 82*89c4ff92SAndroid Build Coastguard Worker int frameLenMs = 32; 83*89c4ff92SAndroid Build Coastguard Worker int frameLenSamples = sampFreq * frameLenMs * 0.001; 84*89c4ff92SAndroid Build Coastguard Worker int numMfccFeats = 13; 85*89c4ff92SAndroid Build Coastguard Worker 86*89c4ff92SAndroid Build Coastguard Worker std::vector<float> fullAudioData; 87*89c4ff92SAndroid Build Coastguard Worker 88*89c4ff92SAndroid Build Coastguard Worker for (auto f : testWav) 89*89c4ff92SAndroid Build Coastguard Worker { 90*89c4ff92SAndroid Build Coastguard Worker fullAudioData.emplace_back( f / (1<<15)); 91*89c4ff92SAndroid Build Coastguard Worker } 92*89c4ff92SAndroid Build Coastguard Worker 93*89c4ff92SAndroid Build Coastguard Worker MfccParams mfccParams(sampFreq, 128, 0, 8000, numMfccFeats, 94*89c4ff92SAndroid Build Coastguard Worker frameLenSamples, false, 1); 95*89c4ff92SAndroid Build Coastguard Worker 96*89c4ff92SAndroid Build Coastguard Worker Wav2LetterMFCC mfccInst = Wav2LetterMFCC(mfccParams); 97*89c4ff92SAndroid Build Coastguard Worker mfccInst.Init(); 98*89c4ff92SAndroid Build Coastguard Worker auto mfccOutput = mfccInst.MfccCompute(fullAudioData); 99*89c4ff92SAndroid Build Coastguard Worker 100*89c4ff92SAndroid Build Coastguard Worker std::vector<float> expected = { -834.96564f, 21.02699f, 18.62856f, 7.3412f, 18.90791f, -5.36034f, 6.52351f, 101*89c4ff92SAndroid Build Coastguard Worker -11.27064f, 8.37522f, 12.0672f, 8.30833f, -13.50008f, -18.1761f}; 102*89c4ff92SAndroid Build Coastguard Worker 103*89c4ff92SAndroid Build Coastguard Worker REQUIRE_THAT(mfccOutput, Catch::Approx(expected).epsilon(1.e-5) ); 104*89c4ff92SAndroid Build Coastguard Worker }