| /* |
| * 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 */ |