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