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 #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include "MFCC.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker /* Class to provide Wav2Letter specific MFCC calculation requirements. */ 10*89c4ff92SAndroid Build Coastguard Worker class Wav2LetterMFCC : public MFCC 11*89c4ff92SAndroid Build Coastguard Worker { 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Worker public: Wav2LetterMFCC(const MfccParams & params)14*89c4ff92SAndroid Build Coastguard Worker explicit Wav2LetterMFCC(const MfccParams& params) 15*89c4ff92SAndroid Build Coastguard Worker : MFCC(params) 16*89c4ff92SAndroid Build Coastguard Worker {} 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker Wav2LetterMFCC() = delete; 19*89c4ff92SAndroid Build Coastguard Worker ~Wav2LetterMFCC() = default; 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Worker protected: 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker /** 24*89c4ff92SAndroid Build Coastguard Worker * @brief Overrides base class implementation of this function. 25*89c4ff92SAndroid Build Coastguard Worker * @param[in] fftVec Vector populated with FFT magnitudes 26*89c4ff92SAndroid Build Coastguard Worker * @param[in] melFilterBank 2D Vector with filter bank weights 27*89c4ff92SAndroid Build Coastguard Worker * @param[in] filterBankFilterFirst Vector containing the first indices of filter bank 28*89c4ff92SAndroid Build Coastguard Worker * to be used for each bin. 29*89c4ff92SAndroid Build Coastguard Worker * @param[in] filterBankFilterLast Vector containing the last indices of filter bank 30*89c4ff92SAndroid Build Coastguard Worker * to be used for each bin. 31*89c4ff92SAndroid Build Coastguard Worker * @param[out] melEnergies Pre-allocated vector of MEL energies to be 32*89c4ff92SAndroid Build Coastguard Worker * populated. 33*89c4ff92SAndroid Build Coastguard Worker * @return true if successful, false otherwise 34*89c4ff92SAndroid Build Coastguard Worker */ 35*89c4ff92SAndroid Build Coastguard Worker bool ApplyMelFilterBank( 36*89c4ff92SAndroid Build Coastguard Worker std::vector<float>& fftVec, 37*89c4ff92SAndroid Build Coastguard Worker std::vector<std::vector<float>>& melFilterBank, 38*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t>& filterBankFilterFirst, 39*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t>& filterBankFilterLast, 40*89c4ff92SAndroid Build Coastguard Worker std::vector<float>& melEnergies) override; 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker /** 43*89c4ff92SAndroid Build Coastguard Worker * @brief Override for the base class implementation convert mel 44*89c4ff92SAndroid Build Coastguard Worker * energies to logarithmic scale. The difference from 45*89c4ff92SAndroid Build Coastguard Worker * default behaviour is that the power is converted to dB 46*89c4ff92SAndroid Build Coastguard Worker * and subsequently clamped. 47*89c4ff92SAndroid Build Coastguard Worker * @param[in,out] melEnergies 1D vector of Mel energies 48*89c4ff92SAndroid Build Coastguard Worker **/ 49*89c4ff92SAndroid Build Coastguard Worker void ConvertToLogarithmicScale(std::vector<float>& melEnergies) override; 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker /** 52*89c4ff92SAndroid Build Coastguard Worker * @brief Create a matrix used to calculate Discrete Cosine 53*89c4ff92SAndroid Build Coastguard Worker * Transform. Override for the base class' default 54*89c4ff92SAndroid Build Coastguard Worker * implementation as the first and last elements 55*89c4ff92SAndroid Build Coastguard Worker * use a different normaliser. 56*89c4ff92SAndroid Build Coastguard Worker * @param[in] inputLength input length of the buffer on which 57*89c4ff92SAndroid Build Coastguard Worker * DCT will be performed 58*89c4ff92SAndroid Build Coastguard Worker * @param[in] coefficientCount Total coefficients per input length. 59*89c4ff92SAndroid Build Coastguard Worker * @return 1D vector with inputLength x coefficientCount elements 60*89c4ff92SAndroid Build Coastguard Worker * populated with DCT coefficients. 61*89c4ff92SAndroid Build Coastguard Worker */ 62*89c4ff92SAndroid Build Coastguard Worker std::vector<float> CreateDCTMatrix(int32_t inputLength, 63*89c4ff92SAndroid Build Coastguard Worker int32_t coefficientCount) override; 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker /** 66*89c4ff92SAndroid Build Coastguard Worker * @brief Given the low and high Mel values, get the normaliser 67*89c4ff92SAndroid Build Coastguard Worker * for weights to be applied when populating the filter 68*89c4ff92SAndroid Build Coastguard Worker * bank. Override for the base class implementation. 69*89c4ff92SAndroid Build Coastguard Worker * @param[in] leftMel Low Mel frequency value. 70*89c4ff92SAndroid Build Coastguard Worker * @param[in] rightMel High Mel frequency value. 71*89c4ff92SAndroid Build Coastguard Worker * @param[in] useHTKMethod bool to signal if HTK method is to be 72*89c4ff92SAndroid Build Coastguard Worker * used for calculation. 73*89c4ff92SAndroid Build Coastguard Worker * @return Value to use for normalising. 74*89c4ff92SAndroid Build Coastguard Worker */ 75*89c4ff92SAndroid Build Coastguard Worker float GetMelFilterBankNormaliser(const float& leftMel, 76*89c4ff92SAndroid Build Coastguard Worker const float& rightMel, 77*89c4ff92SAndroid Build Coastguard Worker bool useHTKMethod) override; 78*89c4ff92SAndroid Build Coastguard Worker };