/*
 * Copyright (c) 2021 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef ADMELSPECTROGRAM_HPP
#define ADMELSPECTROGRAM_HPP

#include "MelSpectrogram.hpp"

namespace arm {
namespace app {
namespace audio {

    /* Class to provide anomaly detection specific Mel Spectrogram calculation requirements */
    class AdMelSpectrogram : public MelSpectrogram {

    public:
        static constexpr uint32_t  ms_defaultSamplingFreq = 16000;
        static constexpr uint32_t  ms_defaultNumFbankBins =    64;
        static constexpr uint32_t  ms_defaultMelLoFreq    =     0;
        static constexpr uint32_t  ms_defaultMelHiFreq    =  8000;
        static constexpr bool      ms_defaultUseHtkMethod = false;

        explicit AdMelSpectrogram(const size_t frameLen)
                :  MelSpectrogram(MelSpecParams(
                ms_defaultSamplingFreq, ms_defaultNumFbankBins,
                ms_defaultMelLoFreq, ms_defaultMelHiFreq,
                frameLen, ms_defaultUseHtkMethod))
        {}

        AdMelSpectrogram()  = delete;
        ~AdMelSpectrogram() = default;

    protected:

        /**
         * @brief       Overrides base class implementation of this function.
         * @param[in]   fftVec                  Vector populated with FFT magnitudes
         * @param[in]   melFilterBank           2D Vector with filter bank weights
         * @param[in]   filterBankFilterFirst   Vector containing the first indices of filter bank
         *                                      to be used for each bin.
         * @param[in]   filterBankFilterLast    Vector containing the last indices of filter bank
         *                                      to be used for each bin.
         * @param[out]  melEnergies             Pre-allocated vector of MEL energies to be
         *                                      populated.
         * @return      true if successful, false otherwise
         */
        virtual bool ApplyMelFilterBank(
                std::vector<float>&                 fftVec,
                std::vector<std::vector<float>>&    melFilterBank,
                std::vector<uint32_t>&               filterBankFilterFirst,
                std::vector<uint32_t>&               filterBankFilterLast,
                std::vector<float>&                 melEnergies) override;

        /**
         * @brief       Override for the base class implementation convert mel
         *              energies to logarithmic scale. The difference from
         *              default behaviour is that the power is converted to dB
         *              and subsequently clamped.
         * @param[in,out]   melEnergies - 1D vector of Mel energies
         **/
        virtual void ConvertToLogarithmicScale(std::vector<float>& melEnergies) override;

        /**
         * @brief       Given the low and high Mel values, get the normaliser
         *              for weights to be applied when populating the filter
         *              bank. Override for the base class implementation.
         * @param[in]   leftMel - low Mel frequency value
         * @param[in]   rightMel - high Mel frequency value
         * @param[in]   useHTKMethod - bool to signal if HTK method is to be
         *              used for calculation
         * @return      Return float value to be applied 
         *              when populating the filter bank.
         */
        virtual float GetMelFilterBankNormaliser(
                const float&   leftMel,
                const float&   rightMel,
                const bool     useHTKMethod) override;
    };

} /* namespace audio */
} /* namespace app */
} /* namespace arm */

#endif /* ADMELSPECTROGRAM_HPP */
