summaryrefslogtreecommitdiff
path: root/source/use_case
diff options
context:
space:
mode:
Diffstat (limited to 'source/use_case')
-rw-r--r--source/use_case/ad/include/AdMelSpectrogram.hpp4
-rw-r--r--source/use_case/ad/include/AdModel.hpp4
-rw-r--r--source/use_case/ad/include/MelSpectrogram.hpp22
-rw-r--r--source/use_case/ad/src/AdMelSpectrogram.cc17
-rw-r--r--source/use_case/ad/src/MelSpectrogram.cc53
-rw-r--r--source/use_case/ad/src/UseCaseHandler.cc113
-rw-r--r--source/use_case/asr/include/AsrClassifier.hpp6
-rw-r--r--source/use_case/asr/include/Wav2LetterMfcc.hpp4
-rw-r--r--source/use_case/asr/include/Wav2LetterModel.hpp4
-rw-r--r--source/use_case/asr/include/Wav2LetterPostprocess.hpp18
-rw-r--r--source/use_case/asr/include/Wav2LetterPreprocess.hpp38
-rw-r--r--source/use_case/asr/src/AsrClassifier.cc39
-rw-r--r--source/use_case/asr/src/UseCaseHandler.cc20
-rw-r--r--source/use_case/asr/src/Wav2LetterMfcc.cc23
-rw-r--r--source/use_case/asr/src/Wav2LetterPostprocess.cc32
-rw-r--r--source/use_case/asr/src/Wav2LetterPreprocess.cc38
-rw-r--r--source/use_case/img_class/include/MobileNetModel.hpp4
-rw-r--r--source/use_case/img_class/src/UseCaseHandler.cc28
-rw-r--r--source/use_case/kws/include/DsCnnModel.hpp4
-rw-r--r--source/use_case/kws/src/UseCaseHandler.cc88
-rw-r--r--source/use_case/kws_asr/include/AsrClassifier.hpp6
-rw-r--r--source/use_case/kws_asr/include/DsCnnModel.hpp4
-rw-r--r--source/use_case/kws_asr/include/Wav2LetterMfcc.hpp5
-rw-r--r--source/use_case/kws_asr/include/Wav2LetterModel.hpp4
-rw-r--r--source/use_case/kws_asr/include/Wav2LetterPostprocess.hpp12
-rw-r--r--source/use_case/kws_asr/include/Wav2LetterPreprocess.hpp38
-rw-r--r--source/use_case/kws_asr/src/AsrClassifier.cc40
-rw-r--r--source/use_case/kws_asr/src/UseCaseHandler.cc120
-rw-r--r--source/use_case/kws_asr/src/Wav2LetterMfcc.cc23
-rw-r--r--source/use_case/kws_asr/src/Wav2LetterPostprocess.cc19
-rw-r--r--source/use_case/kws_asr/src/Wav2LetterPreprocess.cc38
31 files changed, 445 insertions, 423 deletions
diff --git a/source/use_case/ad/include/AdMelSpectrogram.hpp b/source/use_case/ad/include/AdMelSpectrogram.hpp
index cf8a1d4..30a77c1 100644
--- a/source/use_case/ad/include/AdMelSpectrogram.hpp
+++ b/source/use_case/ad/include/AdMelSpectrogram.hpp
@@ -60,8 +60,8 @@ namespace audio {
virtual bool ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies) override;
/**
diff --git a/source/use_case/ad/include/AdModel.hpp b/source/use_case/ad/include/AdModel.hpp
index 2d83455..bbdf91c 100644
--- a/source/use_case/ad/include/AdModel.hpp
+++ b/source/use_case/ad/include/AdModel.hpp
@@ -41,10 +41,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted */
- static constexpr int _ms_maxOpCnt = 6;
+ static constexpr int ms_maxOpCnt = 6;
/* A mutable op resolver instance */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/ad/include/MelSpectrogram.hpp b/source/use_case/ad/include/MelSpectrogram.hpp
index c1dd61e..22b5d29 100644
--- a/source/use_case/ad/include/MelSpectrogram.hpp
+++ b/source/use_case/ad/include/MelSpectrogram.hpp
@@ -49,7 +49,7 @@ namespace audio {
~MelSpecParams() = default;
/** @brief String representation of parameters */
- std::string Str();
+ std::string Str() const;
};
/**
@@ -76,7 +76,7 @@ namespace audio {
* @brief Constructor
* @param[in] params - Mel Spectrogram parameters
*/
- MelSpectrogram(const MelSpecParams& params);
+ explicit MelSpectrogram(const MelSpecParams& params);
MelSpectrogram() = delete;
~MelSpectrogram() = default;
@@ -148,7 +148,7 @@ namespace audio {
* bank weights and adding them up to be placed into
* bins, according to the filter bank's first and last
* indices (pre-computed for each filter bank element
- * by _CreateMelFilterBank function).
+ * by CreateMelFilterBank 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
@@ -162,8 +162,8 @@ namespace audio {
virtual bool ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies);
/**
@@ -195,33 +195,33 @@ namespace audio {
std::vector<float> _m_melEnergies;
std::vector<float> _m_windowFunc;
std::vector<std::vector<float>> _m_melFilterBank;
- std::vector<int32_t> _m_filterBankFilterFirst;
- std::vector<int32_t> _m_filterBankFilterLast;
+ std::vector<uint32_t> _m_filterBankFilterFirst;
+ std::vector<uint32_t> _m_filterBankFilterLast;
bool _m_filterBankInitialised;
arm::app::math::FftInstance _m_fftInstance;
/**
* @brief Initialises the filter banks.
**/
- void _InitMelFilterBank();
+ void InitMelFilterBank();
/**
* @brief Signals whether the instance of MelSpectrogram has had its
* required buffers initialised
* @return True if initialised, false otherwise
**/
- bool _IsMelFilterBankInited();
+ bool IsMelFilterBankInited() const;
/**
* @brief Create mel filter banks for Mel Spectrogram calculation.
* @return 2D vector of floats
**/
- std::vector<std::vector<float>> _CreateMelFilterBank();
+ std::vector<std::vector<float>> CreateMelFilterBank();
/**
* @brief Computes the magnitude from an interleaved complex array
**/
- void _ConvertToPowerSpectrum();
+ void ConvertToPowerSpectrum();
};
diff --git a/source/use_case/ad/src/AdMelSpectrogram.cc b/source/use_case/ad/src/AdMelSpectrogram.cc
index 183c05c..e070eb8 100644
--- a/source/use_case/ad/src/AdMelSpectrogram.cc
+++ b/source/use_case/ad/src/AdMelSpectrogram.cc
@@ -18,6 +18,8 @@
#include "PlatformMath.hpp"
+#include <cfloat>
+
namespace arm {
namespace app {
namespace audio {
@@ -25,8 +27,8 @@ namespace audio {
bool AdMelSpectrogram::ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies)
{
const size_t numBanks = melEnergies.size();
@@ -39,11 +41,12 @@ namespace audio {
for (size_t bin = 0; bin < numBanks; ++bin) {
auto filterBankIter = melFilterBank[bin].begin();
- float melEnergy = 1e-10; /* Avoid log of zero at later stages. */
- const int32_t firstIndex = filterBankFilterFirst[bin];
- const int32_t lastIndex = filterBankFilterLast[bin];
+ auto end = melFilterBank[bin].end();
+ float melEnergy = FLT_MIN; /* Avoid log of zero at later stages. */
+ const uint32_t firstIndex = filterBankFilterFirst[bin];
+ const uint32_t lastIndex = std::min<int32_t>(filterBankFilterLast[bin], fftVec.size() - 1);
- for (int32_t i = firstIndex; i <= lastIndex; ++i) {
+ for (uint32_t i = firstIndex; i <= lastIndex && filterBankIter != end; ++i) {
melEnergy += (*filterBankIter++ * fftVec[i]);
}
@@ -69,7 +72,7 @@ namespace audio {
/* Scale the log values. */
for (auto iterM = melEnergies.begin(), iterL = vecLogEnergies.begin();
- iterM != melEnergies.end(); ++iterM, ++iterL) {
+ iterM != melEnergies.end() && iterL != vecLogEnergies.end(); ++iterM, ++iterL) {
*iterM = *iterL * multiplier;
}
diff --git a/source/use_case/ad/src/MelSpectrogram.cc b/source/use_case/ad/src/MelSpectrogram.cc
index 86d57e6..372ebd8 100644
--- a/source/use_case/ad/src/MelSpectrogram.cc
+++ b/source/use_case/ad/src/MelSpectrogram.cc
@@ -42,7 +42,7 @@ namespace audio {
m_useHtkMethod(useHtkMethod)
{}
- std::string MelSpecParams::Str()
+ std::string MelSpecParams::Str() const
{
char strC[1024];
snprintf(strC, sizeof(strC) - 1, "\n \
@@ -71,7 +71,7 @@ namespace audio {
this->_m_params.m_numFbankBins, 0.0);
this->_m_windowFunc = std::vector<float>(this->_m_params.m_frameLen);
- const float multiplier = 2 * M_PI / this->_m_params.m_frameLen;
+ const auto multiplier = static_cast<float>(2 * M_PI / this->_m_params.m_frameLen);
/* Create window function. */
for (size_t i = 0; i < this->_m_params.m_frameLen; ++i) {
@@ -85,7 +85,7 @@ namespace audio {
void MelSpectrogram::Init()
{
- this->_InitMelFilterBank();
+ this->InitMelFilterBank();
}
float MelSpectrogram::MelScale(const float freq, const bool useHTKMethod)
@@ -121,8 +121,8 @@ namespace audio {
bool MelSpectrogram::ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies)
{
const size_t numBanks = melEnergies.size();
@@ -135,11 +135,12 @@ namespace audio {
for (size_t bin = 0; bin < numBanks; ++bin) {
auto filterBankIter = melFilterBank[bin].begin();
+ auto end = melFilterBank[bin].end();
float melEnergy = FLT_MIN; /* Avoid log of zero at later stages */
- int32_t firstIndex = filterBankFilterFirst[bin];
- int32_t lastIndex = filterBankFilterLast[bin];
+ const uint32_t firstIndex = filterBankFilterFirst[bin];
+ const uint32_t lastIndex = std::min<int32_t>(filterBankFilterLast[bin], fftVec.size() - 1);
- for (int i = firstIndex; i <= lastIndex; ++i) {
+ for (uint32_t i = firstIndex; i <= lastIndex && filterBankIter != end; ++i) {
float energyRep = math::MathUtils::SqrtF32(fftVec[i]);
melEnergy += (*filterBankIter++ * energyRep);
}
@@ -152,14 +153,14 @@ namespace audio {
void MelSpectrogram::ConvertToLogarithmicScale(std::vector<float>& melEnergies)
{
- for (size_t bin = 0; bin < melEnergies.size(); ++bin) {
- melEnergies[bin] = logf(melEnergies[bin]);
+ for (float& melEnergy : melEnergies) {
+ melEnergy = logf(melEnergy);
}
}
- void MelSpectrogram::_ConvertToPowerSpectrum()
+ void MelSpectrogram::ConvertToPowerSpectrum()
{
- const uint32_t halfDim = this->_m_params.m_frameLenPadded / 2;
+ const uint32_t halfDim = this->_m_buffer.size() / 2;
/* Handle this special case. */
float firstEnergy = this->_m_buffer[0] * this->_m_buffer[0];
@@ -188,22 +189,22 @@ namespace audio {
return 1.f;
}
- void MelSpectrogram::_InitMelFilterBank()
+ void MelSpectrogram::InitMelFilterBank()
{
- if (!this->_IsMelFilterBankInited()) {
- this->_m_melFilterBank = this->_CreateMelFilterBank();
+ if (!this->IsMelFilterBankInited()) {
+ this->_m_melFilterBank = this->CreateMelFilterBank();
this->_m_filterBankInitialised = true;
}
}
- bool MelSpectrogram::_IsMelFilterBankInited()
+ bool MelSpectrogram::IsMelFilterBankInited() const
{
return this->_m_filterBankInitialised;
}
std::vector<float> MelSpectrogram::ComputeMelSpec(const std::vector<int16_t>& audioData, float trainingMean)
{
- this->_InitMelFilterBank();
+ this->InitMelFilterBank();
/* TensorFlow way of normalizing .wav data to (-1, 1). */
constexpr float normaliser = 1.0/(1<<15);
@@ -223,7 +224,7 @@ namespace audio {
math::MathUtils::FftF32(this->_m_frame, this->_m_buffer, this->_m_fftInstance);
/* Convert to power spectrum. */
- this->_ConvertToPowerSpectrum();
+ this->ConvertToPowerSpectrum();
/* Apply mel filterbanks. */
if (!this->ApplyMelFilterBank(this->_m_buffer,
@@ -245,7 +246,7 @@ namespace audio {
return this->_m_melEnergies;
}
- std::vector<std::vector<float>> MelSpectrogram::_CreateMelFilterBank()
+ std::vector<std::vector<float>> MelSpectrogram::CreateMelFilterBank()
{
size_t numFftBins = this->_m_params.m_frameLenPadded / 2;
float fftBinWidth = static_cast<float>(this->_m_params.m_samplingFreq) / this->_m_params.m_frameLenPadded;
@@ -260,17 +261,18 @@ namespace audio {
std::vector<std::vector<float>> melFilterBank(
this->_m_params.m_numFbankBins);
this->_m_filterBankFilterFirst =
- std::vector<int32_t>(this->_m_params.m_numFbankBins);
+ std::vector<uint32_t>(this->_m_params.m_numFbankBins);
this->_m_filterBankFilterLast =
- std::vector<int32_t>(this->_m_params.m_numFbankBins);
+ std::vector<uint32_t>(this->_m_params.m_numFbankBins);
for (size_t bin = 0; bin < this->_m_params.m_numFbankBins; bin++) {
float leftMel = melLowFreq + bin * melFreqDelta;
float centerMel = melLowFreq + (bin + 1) * melFreqDelta;
float rightMel = melLowFreq + (bin + 2) * melFreqDelta;
- int32_t firstIndex = -1;
- int32_t lastIndex = -1;
+ uint32_t firstIndex = 0;
+ uint32_t lastIndex = 0;
+ bool firstIndexFound = false;
const float normaliser = this->GetMelFilterBankNormaliser(leftMel, rightMel, this->_m_params.m_useHtkMethod);
for (size_t i = 0; i < numFftBins; ++i) {
@@ -287,8 +289,9 @@ namespace audio {
}
thisBin[i] = weight * normaliser;
- if (firstIndex == -1) {
+ if (!firstIndexFound) {
firstIndex = i;
+ firstIndexFound = true;
}
lastIndex = i;
}
@@ -298,7 +301,7 @@ namespace audio {
this->_m_filterBankFilterLast[bin] = lastIndex;
/* Copy the part we care about. */
- for (int32_t i = firstIndex; i <= lastIndex; ++i) {
+ for (uint32_t i = firstIndex; i <= lastIndex; ++i) {
melFilterBank[bin].push_back(thisBin[i]);
}
}
diff --git a/source/use_case/ad/src/UseCaseHandler.cc b/source/use_case/ad/src/UseCaseHandler.cc
index 1c15595..8f86966 100644
--- a/source/use_case/ad/src/UseCaseHandler.cc
+++ b/source/use_case/ad/src/UseCaseHandler.cc
@@ -32,7 +32,7 @@ namespace app {
* @brief Helper function to increment current audio clip index
* @param[in/out] ctx pointer to the application context object
**/
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx);
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx);
/**
* @brief Helper function to set the audio clip index
@@ -40,7 +40,7 @@ namespace app {
* @param[in] idx value to be set
* @return true if index is set, false otherwise
**/
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
/**
* @brief Presents inference results using the data presentation
@@ -50,7 +50,7 @@ namespace app {
* @param[in] threhsold if larger than this value we have an anomaly
* @return true if successful, false otherwise
**/
- static bool _PresentInferenceResult(hal_platform& platform, float result, float threshold);
+ static bool PresentInferenceResult(hal_platform& platform, float result, float threshold);
/**
* @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -87,7 +87,7 @@ namespace app {
/* If the request has a valid size, set the audio index */
if (clipIndex < NUMBER_OF_FILES) {
- if (!_SetAppCtxClipIdx(ctx, clipIndex)) {
+ if (!SetAppCtxClipIdx(ctx, clipIndex)) {
return false;
}
}
@@ -216,20 +216,20 @@ namespace app {
dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
ctx.Set<float>("result", result);
- if (!_PresentInferenceResult(platform, result, scoreThreshold)) {
+ if (!PresentInferenceResult(platform, result, scoreThreshold)) {
return false;
}
profiler.PrintProfilingResult();
- _IncrementAppCtxClipIdx(ctx);
+ IncrementAppCtxClipIdx(ctx);
} while (runAll && ctx.Get<uint32_t>("clipIndex") != startClipIdx);
return true;
}
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx)
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx)
{
auto curAudioIdx = ctx.Get<uint32_t>("clipIndex");
@@ -241,7 +241,7 @@ namespace app {
ctx.Set<uint32_t>("clipIndex", curAudioIdx);
}
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, const uint32_t idx)
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx)
{
if (idx >= NUMBER_OF_FILES) {
printf_err("Invalid idx %u (expected less than %u)\n",
@@ -252,7 +252,7 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform, float result, float threshold)
+ static bool PresentInferenceResult(hal_platform& platform, float result, float threshold)
{
constexpr uint32_t dataPsnTxtStartX1 = 20;
constexpr uint32_t dataPsnTxtStartY1 = 30;
@@ -275,7 +275,7 @@ namespace app {
platform.data_psn->present_data_text(
resultStr.c_str(), resultStr.size(),
- dataPsnTxtStartX1, rowIdx1, 0);
+ dataPsnTxtStartX1, rowIdx1, false);
info("%s\n", resultStr.c_str());
@@ -297,8 +297,8 @@ namespace app {
*/
template<class T>
std::function<void (std::vector<int16_t>&, size_t, bool, size_t, size_t)>
- _FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
- std::function<std::vector<T> (std::vector<int16_t>& )> compute)
+ FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
+ std::function<std::vector<T> (std::vector<int16_t>& )> compute)
{
/* Feature cache to be captured by lambda function*/
static std::vector<std::vector<T>> featureCache = std::vector<std::vector<T>>(cacheSize);
@@ -335,24 +335,24 @@ namespace app {
}
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t, size_t)>
- _FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<int8_t> (std::vector<int16_t>&)> compute);
+ FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<int8_t> (std::vector<int16_t>&)> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t, size_t)>
- _FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<uint8_t> (std::vector<int16_t>&)> compute);
+ FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<uint8_t> (std::vector<int16_t>&)> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t, size_t)>
- _FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<int16_t> (std::vector<int16_t>&)> compute);
+ FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<int16_t> (std::vector<int16_t>&)> compute);
template std::function<void(std::vector<int16_t>&, size_t, bool, size_t, size_t)>
- _FeatureCalc<float>(TfLiteTensor *inputTensor,
- size_t cacheSize,
- std::function<std::vector<float>(std::vector<int16_t>&)> compute);
+ FeatureCalc<float>(TfLiteTensor *inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<float>(std::vector<int16_t>&)> compute);
static std::function<void (std::vector<int16_t>&, int, bool, size_t, size_t)>
@@ -370,38 +370,41 @@ namespace app {
switch (inputTensor->type) {
case kTfLiteInt8: {
- melSpecFeatureCalc = _FeatureCalc<int8_t>(inputTensor,
- cacheSize,
- [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
- return melSpec.MelSpecComputeQuant<int8_t>(audioDataWindow,
- quantScale,
- quantOffset,
- trainingMean);
- }
+ melSpecFeatureCalc = FeatureCalc<int8_t>(inputTensor,
+ cacheSize,
+ [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
+ return melSpec.MelSpecComputeQuant<int8_t>(
+ audioDataWindow,
+ quantScale,
+ quantOffset,
+ trainingMean);
+ }
);
break;
}
case kTfLiteUInt8: {
- melSpecFeatureCalc = _FeatureCalc<uint8_t>(inputTensor,
- cacheSize,
- [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
- return melSpec.MelSpecComputeQuant<uint8_t>(audioDataWindow,
- quantScale,
- quantOffset,
- trainingMean);
- }
+ melSpecFeatureCalc = FeatureCalc<uint8_t>(inputTensor,
+ cacheSize,
+ [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
+ return melSpec.MelSpecComputeQuant<uint8_t>(
+ audioDataWindow,
+ quantScale,
+ quantOffset,
+ trainingMean);
+ }
);
break;
}
case kTfLiteInt16: {
- melSpecFeatureCalc = _FeatureCalc<int16_t>(inputTensor,
- cacheSize,
- [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
- return melSpec.MelSpecComputeQuant<int16_t>(audioDataWindow,
- quantScale,
- quantOffset,
- trainingMean);
- }
+ melSpecFeatureCalc = FeatureCalc<int16_t>(inputTensor,
+ cacheSize,
+ [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
+ return melSpec.MelSpecComputeQuant<int16_t>(
+ audioDataWindow,
+ quantScale,
+ quantOffset,
+ trainingMean);
+ }
);
break;
}
@@ -411,12 +414,14 @@ namespace app {
} else {
- melSpecFeatureCalc = melSpecFeatureCalc = _FeatureCalc<float>(inputTensor,
- cacheSize,
- [=, &melSpec](std::vector<int16_t>& audioDataWindow) {
- return melSpec.ComputeMelSpec(audioDataWindow,
- trainingMean);
- });
+ melSpecFeatureCalc = melSpecFeatureCalc = FeatureCalc<float>(inputTensor,
+ cacheSize,
+ [=, &melSpec](
+ std::vector<int16_t>& audioDataWindow) {
+ return melSpec.ComputeMelSpec(
+ audioDataWindow,
+ trainingMean);
+ });
}
return melSpecFeatureCalc;
}
diff --git a/source/use_case/asr/include/AsrClassifier.hpp b/source/use_case/asr/include/AsrClassifier.hpp
index 1a63814..2c97a39 100644
--- a/source/use_case/asr/include/AsrClassifier.hpp
+++ b/source/use_case/asr/include/AsrClassifier.hpp
@@ -51,9 +51,9 @@ namespace app {
* @return true if successful, false otherwise.
**/
template<typename T>
- bool _GetTopResults(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
+ bool GetTopResults(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
};
} /* namespace app */
diff --git a/source/use_case/asr/include/Wav2LetterMfcc.hpp b/source/use_case/asr/include/Wav2LetterMfcc.hpp
index 3cb43b9..b5a21d3 100644
--- a/source/use_case/asr/include/Wav2LetterMfcc.hpp
+++ b/source/use_case/asr/include/Wav2LetterMfcc.hpp
@@ -60,8 +60,8 @@ namespace audio {
bool ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies) override;
/**
diff --git a/source/use_case/asr/include/Wav2LetterModel.hpp b/source/use_case/asr/include/Wav2LetterModel.hpp
index b801e10..4c62578 100644
--- a/source/use_case/asr/include/Wav2LetterModel.hpp
+++ b/source/use_case/asr/include/Wav2LetterModel.hpp
@@ -49,10 +49,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted. */
- static constexpr int _ms_maxOpCnt = 5;
+ static constexpr int ms_maxOpCnt = 5;
/* A mutable op resolver instance. */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/asr/include/Wav2LetterPostprocess.hpp b/source/use_case/asr/include/Wav2LetterPostprocess.hpp
index 69567a3..e16d35b 100644
--- a/source/use_case/asr/include/Wav2LetterPostprocess.hpp
+++ b/source/use_case/asr/include/Wav2LetterPostprocess.hpp
@@ -72,33 +72,33 @@ namespace asr {
* initialised.
* @return true if valid, false otherwise.
*/
- bool _IsInputValid(TfLiteTensor* tensor,
- uint32_t axisIdx) const;
+ bool IsInputValid(TfLiteTensor* tensor,
+ const uint32_t axisIdx) const;
/**
* @brief Gets the tensor data element size in bytes based
* on the tensor type.
* @return Size in bytes, 0 if not supported.
*/
- uint32_t _GetTensorElementSize(TfLiteTensor* tensor);
+ static uint32_t GetTensorElementSize(TfLiteTensor* tensor);
/**
* @brief Erases sections from the data assuming row-wise
* arrangement along the context axis.
* @return true if successful, false otherwise.
*/
- bool _EraseSectionsRowWise(uint8_t* ptrData,
- uint32_t strideSzBytes,
- bool lastIteration);
+ bool EraseSectionsRowWise(uint8_t* ptrData,
+ const uint32_t strideSzBytes,
+ const bool lastIteration);
/**
* @brief Erases sections from the data assuming col-wise
* arrangement along the context axis.
* @return true if successful, false otherwise.
*/
- bool _EraseSectionsColWise(uint8_t* ptrData,
- uint32_t strideSzBytes,
- bool lastIteration);
+ static bool EraseSectionsColWise(const uint8_t* ptrData,
+ const uint32_t strideSzBytes,
+ const bool lastIteration);
};
} /* namespace asr */
diff --git a/source/use_case/asr/include/Wav2LetterPreprocess.hpp b/source/use_case/asr/include/Wav2LetterPreprocess.hpp
index 8a4e0b7..10512b9 100644
--- a/source/use_case/asr/include/Wav2LetterPreprocess.hpp
+++ b/source/use_case/asr/include/Wav2LetterPreprocess.hpp
@@ -74,16 +74,16 @@ namespace asr {
* @param[out] delta2 Result of the second diff computation.
* @return true if successful, false otherwise.
*/
- static bool _ComputeDeltas(Array2d<float>& mfcc,
- Array2d<float>& delta1,
- Array2d<float>& delta2);
+ static bool ComputeDeltas(Array2d<float>& mfcc,
+ Array2d<float>& delta1,
+ Array2d<float>& delta2);
/**
* @brief Given a 2D vector of floats, computes the mean.
* @param[in] vec Vctor of vector of floats.
* @return Mean value.
*/
- static float _GetMean(Array2d<float>& vec);
+ static float GetMean(Array2d<float>& vec);
/**
* @brief Given a 2D vector of floats, computes the stddev.
@@ -91,20 +91,20 @@ namespace asr {
* @param[in] mean Mean value of the vector passed in.
* @return stddev value.
*/
- static float _GetStdDev(Array2d<float>& vec,
- float mean);
+ static float GetStdDev(Array2d<float>& vec,
+ const float mean);
/**
* @brief Given a 2D vector of floats, normalises it using
* the mean and the stddev.
* @param[in,out] vec Vector of vector of floats.
*/
- static void _NormaliseVec(Array2d<float>& vec);
+ static void NormaliseVec(Array2d<float>& vec);
/**
* @brief Normalises the MFCC and delta buffers.
*/
- void _Normalise();
+ void Normalise();
/**
* @brief Given the quantisation and data type limits, computes
@@ -116,7 +116,7 @@ namespace asr {
* @param[in] maxVal Numerical limit - maximum.
* @return Floating point quantised value.
*/
- static float _GetQuantElem(
+ static float GetQuantElem(
float elem,
float quantScale,
int quantOffset,
@@ -137,7 +137,7 @@ namespace asr {
* @param[in] quantOffset Quantisation offset.
*/
template <typename T>
- bool _Quantise(
+ bool Quantise(
T * outputBuf,
const uint32_t outputBufSz,
const float quantScale,
@@ -161,15 +161,15 @@ namespace asr {
/* Need to transpose while copying and concatenating the tensor. */
for (uint32_t j = 0; j < this->_m_numFeatVectors; ++j) {
for (uint32_t i = 0; i < this->_m_numMfccFeats; ++i) {
- *outputBufMfcc++ = static_cast<T>(Preprocess::_GetQuantElem(
- this->_m_mfccBuf(i, j), quantScale,
- quantOffset, minVal, maxVal));
- *outputBufD1++ = static_cast<T>(Preprocess::_GetQuantElem(
- this->_m_delta1Buf(i, j), quantScale,
- quantOffset, minVal, maxVal));
- *outputBufD2++ = static_cast<T>(Preprocess::_GetQuantElem(
- this->_m_delta2Buf(i, j), quantScale,
- quantOffset, minVal, maxVal));
+ *outputBufMfcc++ = static_cast<T>(Preprocess::GetQuantElem(
+ this->_m_mfccBuf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
+ *outputBufD1++ = static_cast<T>(Preprocess::GetQuantElem(
+ this->_m_delta1Buf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
+ *outputBufD2++ = static_cast<T>(Preprocess::GetQuantElem(
+ this->_m_delta2Buf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
}
outputBufMfcc += ptrIncr;
outputBufD1 += ptrIncr;
diff --git a/source/use_case/asr/src/AsrClassifier.cc b/source/use_case/asr/src/AsrClassifier.cc
index 7377d30..df26a7f 100644
--- a/source/use_case/asr/src/AsrClassifier.cc
+++ b/source/use_case/asr/src/AsrClassifier.cc
@@ -21,13 +21,18 @@
#include "Wav2LetterModel.hpp"
template<typename T>
-bool arm::app::AsrClassifier::_GetTopResults(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint)
+bool arm::app::AsrClassifier::GetTopResults(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint)
{
const uint32_t nElems = tensor->dims->data[arm::app::Wav2LetterModel::ms_outputRowsIdx];
const uint32_t nLetters = tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx];
+ if (nLetters != labels.size()) {
+ printf("Output size doesn't match the labels' size\n");
+ return false;
+ }
+
/* NOTE: tensor's size verification against labels should be
* checked by the calling/public function. */
if (nLetters < 1) {
@@ -58,12 +63,12 @@ bool arm::app::AsrClassifier::_GetTopResults(TfLiteTensor* tensor,
return true;
}
-template bool arm::app::AsrClassifier::_GetTopResults<uint8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
-template bool arm::app::AsrClassifier::_GetTopResults<int8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
+template bool arm::app::AsrClassifier::GetTopResults<uint8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
+template bool arm::app::AsrClassifier::GetTopResults<int8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
bool arm::app::AsrClassifier::GetClassificationResults(
TfLiteTensor* outputTensor,
@@ -104,16 +109,16 @@ bool arm::app::AsrClassifier::GetClassificationResults(
switch (outputTensor->type) {
case kTfLiteUInt8:
- resultState = this->_GetTopResults<uint8_t>(
- outputTensor, vecResults,
- labels, quantParams.scale,
- quantParams.offset);
+ resultState = this->GetTopResults<uint8_t>(
+ outputTensor, vecResults,
+ labels, quantParams.scale,
+ quantParams.offset);
break;
case kTfLiteInt8:
- resultState = this->_GetTopResults<int8_t>(
- outputTensor, vecResults,
- labels, quantParams.scale,
- quantParams.offset);
+ resultState = this->GetTopResults<int8_t>(
+ outputTensor, vecResults,
+ labels, quantParams.scale,
+ quantParams.offset);
break;
default:
printf_err("Tensor type %s not supported by classifier\n",
diff --git a/source/use_case/asr/src/UseCaseHandler.cc b/source/use_case/asr/src/UseCaseHandler.cc
index 5d3157a..efaefc2 100644
--- a/source/use_case/asr/src/UseCaseHandler.cc
+++ b/source/use_case/asr/src/UseCaseHandler.cc
@@ -35,7 +35,7 @@ namespace app {
* @brief Helper function to increment current audio clip index.
* @param[in,out] ctx Pointer to the application context object.
**/
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx);
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx);
/**
* @brief Helper function to set the audio clip index.
@@ -43,7 +43,7 @@ namespace app {
* @param[in] idx Value to be set.
* @return true if index is set, false otherwise.
**/
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
/**
* @brief Presents inference results using the data presentation
@@ -54,7 +54,7 @@ namespace app {
* otherwise, this can be passed in as 0.
* @return true if successful, false otherwise.
**/
- static bool _PresentInferenceResult(
+ static bool PresentInferenceResult(
hal_platform& platform,
const std::vector<arm::app::asr::AsrResult>& results);
@@ -71,7 +71,7 @@ namespace app {
/* If the request has a valid size, set the audio index. */
if (clipIndex < NUMBER_OF_FILES) {
- if (!_SetAppCtxClipIdx(ctx, clipIndex)) {
+ if (!SetAppCtxClipIdx(ctx, clipIndex)) {
return false;
}
}
@@ -207,20 +207,20 @@ namespace app {
ctx.Set<std::vector<arm::app::asr::AsrResult>>("results", results);
- if (!_PresentInferenceResult(platform, results)) {
+ if (!PresentInferenceResult(platform, results)) {
return false;
}
profiler.PrintProfilingResult();
- _IncrementAppCtxClipIdx(ctx);
+ IncrementAppCtxClipIdx(ctx);
} while (runAll && ctx.Get<uint32_t>("clipIndex") != startClipIdx);
return true;
}
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx)
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx)
{
auto curAudioIdx = ctx.Get<uint32_t>("clipIndex");
@@ -232,7 +232,7 @@ namespace app {
ctx.Set<uint32_t>("clipIndex", curAudioIdx);
}
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, const uint32_t idx)
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx)
{
if (idx >= NUMBER_OF_FILES) {
printf_err("Invalid idx %u (expected less than %u)\n",
@@ -244,8 +244,8 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform,
- const std::vector<arm::app::asr::AsrResult>& results)
+ static bool PresentInferenceResult(hal_platform& platform,
+ const std::vector<arm::app::asr::AsrResult>& results)
{
constexpr uint32_t dataPsnTxtStartX1 = 20;
constexpr uint32_t dataPsnTxtStartY1 = 60;
diff --git a/source/use_case/asr/src/Wav2LetterMfcc.cc b/source/use_case/asr/src/Wav2LetterMfcc.cc
index 92c91bc..0eb152a 100644
--- a/source/use_case/asr/src/Wav2LetterMfcc.cc
+++ b/source/use_case/asr/src/Wav2LetterMfcc.cc
@@ -27,8 +27,8 @@ namespace audio {
bool Wav2LetterMFCC::ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies)
{
const size_t numBanks = melEnergies.size();
@@ -41,11 +41,14 @@ namespace audio {
for (size_t bin = 0; bin < numBanks; ++bin) {
auto filterBankIter = melFilterBank[bin].begin();
- float melEnergy = 1e-10; /* Avoid log of zero at later stages, same value used in librosa. */
- const int32_t firstIndex = filterBankFilterFirst[bin];
- const int32_t lastIndex = filterBankFilterLast[bin];
-
- for (int32_t i = firstIndex; i <= lastIndex; ++i) {
+ auto end = melFilterBank[bin].end();
+ /* Avoid log of zero at later stages, same value used in librosa.
+ * The number was used during our default wav2letter model training. */
+ float melEnergy = 1e-10;
+ const uint32_t firstIndex = filterBankFilterFirst[bin];
+ const uint32_t lastIndex = std::min<uint32_t>(filterBankFilterLast[bin], fftVec.size() - 1);
+
+ for (uint32_t i = firstIndex; i <= lastIndex && filterBankIter != end; ++i) {
melEnergy += (*filterBankIter++ * fftVec[i]);
}
@@ -73,7 +76,7 @@ namespace audio {
/* Scale the log values and get the max. */
for (auto iterM = melEnergies.begin(), iterL = vecLogEnergies.begin();
- iterM != melEnergies.end(); ++iterM, ++iterL) {
+ iterM != melEnergies.end() && iterL != vecLogEnergies.end(); ++iterM, ++iterL) {
*iterM = *iterL * multiplier;
@@ -86,8 +89,8 @@ namespace audio {
/* Clamp the mel energies. */
constexpr float maxDb = 80.0;
const float clampLevelLowdB = maxMelEnergy - maxDb;
- for (auto iter = melEnergies.begin(); iter != melEnergies.end(); ++iter) {
- *iter = std::max(*iter, clampLevelLowdB);
+ for (float& melEnergy : melEnergies) {
+ melEnergy = std::max(melEnergy, clampLevelLowdB);
}
}
diff --git a/source/use_case/asr/src/Wav2LetterPostprocess.cc b/source/use_case/asr/src/Wav2LetterPostprocess.cc
index 60ee51e..9157a6f 100644
--- a/source/use_case/asr/src/Wav2LetterPostprocess.cc
+++ b/source/use_case/asr/src/Wav2LetterPostprocess.cc
@@ -39,13 +39,13 @@ namespace asr {
const bool lastIteration)
{
/* Basic checks. */
- if (!this->_IsInputValid(tensor, axisIdx)) {
+ if (!this->IsInputValid(tensor, axisIdx)) {
return false;
}
/* Irrespective of tensor type, we use unsigned "byte" */
uint8_t* ptrData = tflite::GetTensorData<uint8_t>(tensor);
- const uint32_t elemSz = this->_GetTensorElementSize(tensor);
+ const uint32_t elemSz = this->GetTensorElementSize(tensor);
/* Other sanity checks. */
if (0 == elemSz) {
@@ -59,13 +59,15 @@ namespace asr {
/* Which axis do we need to process? */
switch (axisIdx) {
case arm::app::Wav2LetterModel::ms_outputRowsIdx:
- return this->_EraseSectionsRowWise(ptrData,
- elemSz * tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx],
- lastIteration);
+ return this->EraseSectionsRowWise(ptrData,
+ elemSz *
+ tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx],
+ lastIteration);
case arm::app::Wav2LetterModel::ms_outputColsIdx:
- return this->_EraseSectionsColWise(ptrData,
- elemSz * tensor->dims->data[arm::app::Wav2LetterModel::ms_outputRowsIdx],
- lastIteration);
+ return this->EraseSectionsColWise(ptrData,
+ elemSz *
+ tensor->dims->data[arm::app::Wav2LetterModel::ms_outputRowsIdx],
+ lastIteration);
default:
printf_err("Unsupported axis index: %u\n", axisIdx);
}
@@ -73,8 +75,8 @@ namespace asr {
return false;
}
- bool Postprocess::_IsInputValid(TfLiteTensor* tensor,
- const uint32_t axisIdx) const
+ bool Postprocess::IsInputValid(TfLiteTensor* tensor,
+ const uint32_t axisIdx) const
{
if (nullptr == tensor) {
return false;
@@ -96,17 +98,15 @@ namespace asr {
return true;
}
- uint32_t Postprocess::_GetTensorElementSize(TfLiteTensor* tensor)
+ uint32_t Postprocess::GetTensorElementSize(TfLiteTensor* tensor)
{
switch(tensor->type) {
case kTfLiteUInt8:
- return 1;
case kTfLiteInt8:
return 1;
case kTfLiteInt16:
return 2;
case kTfLiteInt32:
- return 4;
case kTfLiteFloat32:
return 4;
default:
@@ -117,7 +117,7 @@ namespace asr {
return 0;
}
- bool Postprocess::_EraseSectionsRowWise(
+ bool Postprocess::EraseSectionsRowWise(
uint8_t* ptrData,
const uint32_t strideSzBytes,
const bool lastIteration)
@@ -154,8 +154,8 @@ namespace asr {
return true;
}
- bool Postprocess::_EraseSectionsColWise(
- uint8_t* ptrData,
+ bool Postprocess::EraseSectionsColWise(
+ const uint8_t* ptrData,
const uint32_t strideSzBytes,
const bool lastIteration)
{
diff --git a/source/use_case/asr/src/Wav2LetterPreprocess.cc b/source/use_case/asr/src/Wav2LetterPreprocess.cc
index e46cca3..d65ea75 100644
--- a/source/use_case/asr/src/Wav2LetterPreprocess.cc
+++ b/source/use_case/asr/src/Wav2LetterPreprocess.cc
@@ -88,12 +88,12 @@ namespace asr {
}
/* Compute first and second order deltas from MFCCs. */
- this->_ComputeDeltas(this->_m_mfccBuf,
- this->_m_delta1Buf,
- this->_m_delta2Buf);
+ Preprocess::ComputeDeltas(this->_m_mfccBuf,
+ this->_m_delta1Buf,
+ this->_m_delta2Buf);
/* Normalise. */
- this->_Normalise();
+ this->Normalise();
/* Quantise. */
QuantParams quantParams = GetTensorQuantParams(tensor);
@@ -105,11 +105,11 @@ namespace asr {
switch(tensor->type) {
case kTfLiteUInt8:
- return this->_Quantise<uint8_t>(
+ return this->Quantise<uint8_t>(
tflite::GetTensorData<uint8_t>(tensor), tensor->bytes,
quantParams.scale, quantParams.offset);
case kTfLiteInt8:
- return this->_Quantise<int8_t>(
+ return this->Quantise<int8_t>(
tflite::GetTensorData<int8_t>(tensor), tensor->bytes,
quantParams.scale, quantParams.offset);
default:
@@ -120,9 +120,9 @@ namespace asr {
return false;
}
- bool Preprocess::_ComputeDeltas(Array2d<float>& mfcc,
- Array2d<float>& delta1,
- Array2d<float>& delta2)
+ bool Preprocess::ComputeDeltas(Array2d<float>& mfcc,
+ Array2d<float>& delta1,
+ Array2d<float>& delta2)
{
const std::vector <float> delta1Coeffs =
{6.66666667e-02, 5.00000000e-02, 3.33333333e-02,
@@ -175,20 +175,20 @@ namespace asr {
return true;
}
- float Preprocess::_GetMean(Array2d<float>& vec)
+ float Preprocess::GetMean(Array2d<float>& vec)
{
return math::MathUtils::MeanF32(vec.begin(), vec.totalSize());
}
- float Preprocess::_GetStdDev(Array2d<float>& vec, const float mean)
+ float Preprocess::GetStdDev(Array2d<float>& vec, const float mean)
{
return math::MathUtils::StdDevF32(vec.begin(), vec.totalSize(), mean);
}
- void Preprocess::_NormaliseVec(Array2d<float>& vec)
+ void Preprocess::NormaliseVec(Array2d<float>& vec)
{
- auto mean = Preprocess::_GetMean(vec);
- auto stddev = Preprocess::_GetStdDev(vec, mean);
+ auto mean = Preprocess::GetMean(vec);
+ auto stddev = Preprocess::GetStdDev(vec, mean);
debug("Mean: %f, Stddev: %f\n", mean, stddev);
if (stddev == 0) {
@@ -204,14 +204,14 @@ namespace asr {
}
}
- void Preprocess::_Normalise()
+ void Preprocess::Normalise()
{
- Preprocess::_NormaliseVec(this->_m_mfccBuf);
- Preprocess::_NormaliseVec(this->_m_delta1Buf);
- Preprocess::_NormaliseVec(this->_m_delta2Buf);
+ Preprocess::NormaliseVec(this->_m_mfccBuf);
+ Preprocess::NormaliseVec(this->_m_delta1Buf);
+ Preprocess::NormaliseVec(this->_m_delta2Buf);
}
- float Preprocess::_GetQuantElem(
+ float Preprocess::GetQuantElem(
const float elem,
const float quantScale,
const int quantOffset,
diff --git a/source/use_case/img_class/include/MobileNetModel.hpp b/source/use_case/img_class/include/MobileNetModel.hpp
index f0521ce..2540564 100644
--- a/source/use_case/img_class/include/MobileNetModel.hpp
+++ b/source/use_case/img_class/include/MobileNetModel.hpp
@@ -43,10 +43,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted. */
- static constexpr int _ms_maxOpCnt = 7;
+ static constexpr int ms_maxOpCnt = 7;
/* A mutable op resolver instance. */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/img_class/src/UseCaseHandler.cc b/source/use_case/img_class/src/UseCaseHandler.cc
index f7e83f5..ffeb860 100644
--- a/source/use_case/img_class/src/UseCaseHandler.cc
+++ b/source/use_case/img_class/src/UseCaseHandler.cc
@@ -35,13 +35,13 @@ namespace app {
* @param[out] inputTensor Pointer to the input tensor to be populated.
* @return true if tensor is loaded, false otherwise.
**/
- static bool _LoadImageIntoTensor(uint32_t imIdx, TfLiteTensor* inputTensor);
+ static bool LoadImageIntoTensor(uint32_t imIdx, TfLiteTensor* inputTensor);
/**
* @brief Helper function to increment current image index.
* @param[in,out] ctx Pointer to the application context object.
**/
- static void _IncrementAppCtxImageIdx(ApplicationContext& ctx);
+ static void IncrementAppCtxImageIdx(ApplicationContext& ctx);
/**
* @brief Helper function to set the image index.
@@ -49,7 +49,7 @@ namespace app {
* @param[in] idx Value to be set.
* @return true if index is set, false otherwise.
**/
- static bool _SetAppCtxImageIdx(ApplicationContext& ctx, uint32_t idx);
+ static bool SetAppCtxImageIdx(ApplicationContext& ctx, uint32_t idx);
/**
* @brief Presents inference results using the data presentation
@@ -60,8 +60,8 @@ namespace app {
* otherwise, this can be passed in as 0.
* @return true if successful, false otherwise.
**/
- static bool _PresentInferenceResult(hal_platform& platform,
- const std::vector<ClassificationResult>& results);
+ static bool PresentInferenceResult(hal_platform& platform,
+ const std::vector<ClassificationResult>& results);
/**
* @brief Helper function to convert a UINT8 image to INT8 format.
@@ -89,7 +89,7 @@ namespace app {
/* If the request has a valid size, set the image index. */
if (imgIndex < NUMBER_OF_FILES) {
- if (!_SetAppCtxImageIdx(ctx, imgIndex)) {
+ if (!SetAppCtxImageIdx(ctx, imgIndex)) {
return false;
}
}
@@ -124,7 +124,7 @@ namespace app {
std::string str_inf{"Running inference... "};
/* Copy over the data. */
- _LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
+ LoadImageIntoTensor(ctx.Get<uint32_t>("imgIndex"), inputTensor);
/* Display this image on the LCD. */
platform.data_psn->present_data_image(
@@ -164,20 +164,20 @@ namespace app {
arm::app::DumpTensor(outputTensor);
#endif /* VERIFY_TEST_OUTPUT */
- if (!_PresentInferenceResult(platform, results)) {
+ if (!PresentInferenceResult(platform, results)) {
return false;
}
profiler.PrintProfilingResult();
- _IncrementAppCtxImageIdx(ctx);
+ IncrementAppCtxImageIdx(ctx);
} while (runAll && ctx.Get<uint32_t>("imgIndex") != curImIdx);
return true;
}
- static bool _LoadImageIntoTensor(const uint32_t imIdx, TfLiteTensor* inputTensor)
+ static bool LoadImageIntoTensor(uint32_t imIdx, TfLiteTensor* inputTensor)
{
const size_t copySz = inputTensor->bytes < IMAGE_DATA_SIZE ?
inputTensor->bytes : IMAGE_DATA_SIZE;
@@ -193,7 +193,7 @@ namespace app {
return true;
}
- static void _IncrementAppCtxImageIdx(ApplicationContext& ctx)
+ static void IncrementAppCtxImageIdx(ApplicationContext& ctx)
{
auto curImIdx = ctx.Get<uint32_t>("imgIndex");
@@ -205,7 +205,7 @@ namespace app {
ctx.Set<uint32_t>("imgIndex", curImIdx);
}
- static bool _SetAppCtxImageIdx(ApplicationContext& ctx, const uint32_t idx)
+ static bool SetAppCtxImageIdx(ApplicationContext& ctx, uint32_t idx)
{
if (idx >= NUMBER_OF_FILES) {
printf_err("Invalid idx %u (expected less than %u)\n",
@@ -216,8 +216,8 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform,
- const std::vector<ClassificationResult>& results)
+ static bool PresentInferenceResult(hal_platform& platform,
+ const std::vector<ClassificationResult>& results)
{
constexpr uint32_t dataPsnTxtStartX1 = 150;
constexpr uint32_t dataPsnTxtStartY1 = 30;
diff --git a/source/use_case/kws/include/DsCnnModel.hpp b/source/use_case/kws/include/DsCnnModel.hpp
index a4e7110..e9ac18c 100644
--- a/source/use_case/kws/include/DsCnnModel.hpp
+++ b/source/use_case/kws/include/DsCnnModel.hpp
@@ -47,10 +47,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted. */
- static constexpr int _ms_maxOpCnt = 8;
+ static constexpr int ms_maxOpCnt = 8;
/* A mutable op resolver instance. */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/kws/src/UseCaseHandler.cc b/source/use_case/kws/src/UseCaseHandler.cc
index d2cba55..4011df6 100644
--- a/source/use_case/kws/src/UseCaseHandler.cc
+++ b/source/use_case/kws/src/UseCaseHandler.cc
@@ -37,7 +37,7 @@ namespace app {
* @brief Helper function to increment current audio clip index.
* @param[in,out] ctx Pointer to the application context object.
**/
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx);
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx);
/**
* @brief Helper function to set the audio clip index.
@@ -45,7 +45,7 @@ namespace app {
* @param[in] idx Value to be set.
* @return true if index is set, false otherwise.
**/
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
/**
* @brief Presents inference results using the data presentation
@@ -56,8 +56,8 @@ namespace app {
* otherwise, this can be passed in as 0.
* @return true if successful, false otherwise.
**/
- static bool _PresentInferenceResult(hal_platform& platform,
- const std::vector<arm::app::kws::KwsResult>& results);
+ static bool PresentInferenceResult(hal_platform& platform,
+ const std::vector<arm::app::kws::KwsResult>& results);
/**
* @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -96,7 +96,7 @@ namespace app {
/* If the request has a valid size, set the audio index. */
if (clipIndex < NUMBER_OF_FILES) {
- if (!_SetAppCtxClipIdx(ctx, clipIndex)) {
+ if (!SetAppCtxClipIdx(ctx, clipIndex)) {
return false;
}
}
@@ -240,20 +240,20 @@ namespace app {
ctx.Set<std::vector<arm::app::kws::KwsResult>>("results", results);
- if (!_PresentInferenceResult(platform, results)) {
+ if (!PresentInferenceResult(platform, results)) {
return false;
}
profiler.PrintProfilingResult();
- _IncrementAppCtxClipIdx(ctx);
+ IncrementAppCtxClipIdx(ctx);
} while (runAll && ctx.Get<uint32_t>("clipIndex") != startClipIdx);
return true;
}
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx)
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx)
{
auto curAudioIdx = ctx.Get<uint32_t>("clipIndex");
@@ -265,7 +265,7 @@ namespace app {
ctx.Set<uint32_t>("clipIndex", curAudioIdx);
}
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, const uint32_t idx)
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx)
{
if (idx >= NUMBER_OF_FILES) {
printf_err("Invalid idx %u (expected less than %u)\n",
@@ -276,8 +276,8 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform,
- const std::vector<arm::app::kws::KwsResult>& results)
+ static bool PresentInferenceResult(hal_platform& platform,
+ const std::vector<arm::app::kws::KwsResult>& results)
{
constexpr uint32_t dataPsnTxtStartX1 = 20;
constexpr uint32_t dataPsnTxtStartY1 = 30;
@@ -345,8 +345,8 @@ namespace app {
*/
template<class T>
std::function<void (std::vector<int16_t>&, size_t, bool, size_t)>
- _FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
- std::function<std::vector<T> (std::vector<int16_t>& )> compute)
+ FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
+ std::function<std::vector<T> (std::vector<int16_t>& )> compute)
{
/* Feature cache to be captured by lambda function. */
static std::vector<std::vector<T>> featureCache = std::vector<std::vector<T>>(cacheSize);
@@ -378,24 +378,24 @@ namespace app {
}
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
+ FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
size_t cacheSize,
std::function<std::vector<int8_t> (std::vector<int16_t>& )> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<uint8_t> (std::vector<int16_t>& )> compute);
+ FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<uint8_t> (std::vector<int16_t>& )> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<int16_t> (std::vector<int16_t>& )> compute);
+ FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<int16_t> (std::vector<int16_t>& )> compute);
template std::function<void(std::vector<int16_t>&, size_t, bool, size_t)>
- _FeatureCalc<float>(TfLiteTensor *inputTensor,
- size_t cacheSize,
- std::function<std::vector<float>(std::vector<int16_t>&)> compute);
+ FeatureCalc<float>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<float>(std::vector<int16_t>&)> compute);
static std::function<void (std::vector<int16_t>&, int, bool, size_t)>
@@ -413,19 +413,19 @@ namespace app {
switch (inputTensor->type) {
case kTfLiteInt8: {
- mfccFeatureCalc = _FeatureCalc<int8_t>(inputTensor,
- cacheSize,
- [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccComputeQuant<int8_t>(audioDataWindow,
- quantScale,
- quantOffset);
- }
+ mfccFeatureCalc = FeatureCalc<int8_t>(inputTensor,
+ cacheSize,
+ [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccComputeQuant<int8_t>(audioDataWindow,
+ quantScale,
+ quantOffset);
+ }
);
break;
}
case kTfLiteUInt8: {
- mfccFeatureCalc = _FeatureCalc<uint8_t>(inputTensor,
- cacheSize,
+ mfccFeatureCalc = FeatureCalc<uint8_t>(inputTensor,
+ cacheSize,
[=, &mfcc](std::vector<int16_t>& audioDataWindow) {
return mfcc.MfccComputeQuant<uint8_t>(audioDataWindow,
quantScale,
@@ -435,13 +435,13 @@ namespace app {
break;
}
case kTfLiteInt16: {
- mfccFeatureCalc = _FeatureCalc<int16_t>(inputTensor,
- cacheSize,
- [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccComputeQuant<int16_t>(audioDataWindow,
- quantScale,
- quantOffset);
- }
+ mfccFeatureCalc = FeatureCalc<int16_t>(inputTensor,
+ cacheSize,
+ [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccComputeQuant<int16_t>(audioDataWindow,
+ quantScale,
+ quantOffset);
+ }
);
break;
}
@@ -451,11 +451,11 @@ namespace app {
} else {
- mfccFeatureCalc = mfccFeatureCalc = _FeatureCalc<float>(inputTensor,
- cacheSize,
- [&mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccCompute(audioDataWindow);
- });
+ mfccFeatureCalc = mfccFeatureCalc = FeatureCalc<float>(inputTensor,
+ cacheSize,
+ [&mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccCompute(audioDataWindow);
+ });
}
return mfccFeatureCalc;
}
diff --git a/source/use_case/kws_asr/include/AsrClassifier.hpp b/source/use_case/kws_asr/include/AsrClassifier.hpp
index de18aa8..7dbb6e9 100644
--- a/source/use_case/kws_asr/include/AsrClassifier.hpp
+++ b/source/use_case/kws_asr/include/AsrClassifier.hpp
@@ -53,9 +53,9 @@ namespace app {
* @return true if successful, false otherwise.
**/
template<typename T>
- bool _GetTopResults(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
+ bool GetTopResults(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
};
} /* namespace app */
diff --git a/source/use_case/kws_asr/include/DsCnnModel.hpp b/source/use_case/kws_asr/include/DsCnnModel.hpp
index 150a48c..f9d4357 100644
--- a/source/use_case/kws_asr/include/DsCnnModel.hpp
+++ b/source/use_case/kws_asr/include/DsCnnModel.hpp
@@ -55,10 +55,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted. */
- static constexpr int _ms_maxOpCnt = 10;
+ static constexpr int ms_maxOpCnt = 10;
/* A mutable op resolver instance. */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/kws_asr/include/Wav2LetterMfcc.hpp b/source/use_case/kws_asr/include/Wav2LetterMfcc.hpp
index 0852cbf..75d75da 100644
--- a/source/use_case/kws_asr/include/Wav2LetterMfcc.hpp
+++ b/source/use_case/kws_asr/include/Wav2LetterMfcc.hpp
@@ -60,8 +60,8 @@ namespace audio {
bool ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies) override;
/**
@@ -103,6 +103,7 @@ namespace audio {
const float& leftMel,
const float& rightMel,
bool useHTKMethod) override;
+
};
} /* namespace audio */
diff --git a/source/use_case/kws_asr/include/Wav2LetterModel.hpp b/source/use_case/kws_asr/include/Wav2LetterModel.hpp
index fb701ea..9a86bd9 100644
--- a/source/use_case/kws_asr/include/Wav2LetterModel.hpp
+++ b/source/use_case/kws_asr/include/Wav2LetterModel.hpp
@@ -55,10 +55,10 @@ namespace app {
private:
/* Maximum number of individual operations that can be enlisted. */
- static constexpr int _ms_maxOpCnt = 5;
+ static constexpr int ms_maxOpCnt = 5;
/* A mutable op resolver instance. */
- tflite::MicroMutableOpResolver<_ms_maxOpCnt> _m_opResolver;
+ tflite::MicroMutableOpResolver<ms_maxOpCnt> _m_opResolver;
};
} /* namespace app */
diff --git a/source/use_case/kws_asr/include/Wav2LetterPostprocess.hpp b/source/use_case/kws_asr/include/Wav2LetterPostprocess.hpp
index 3a9d401..fe60923 100644
--- a/source/use_case/kws_asr/include/Wav2LetterPostprocess.hpp
+++ b/source/use_case/kws_asr/include/Wav2LetterPostprocess.hpp
@@ -72,24 +72,24 @@ namespace asr {
* initialised.
* @return true if valid, false otherwise.
*/
- bool _IsInputValid(TfLiteTensor* tensor,
- uint32_t axisIdx) const;
+ bool IsInputValid(TfLiteTensor* tensor,
+ const uint32_t axisIdx) const;
/**
* @brief Gets the tensor data element size in bytes based
* on the tensor type.
* @return Size in bytes, 0 if not supported.
*/
- uint32_t _GetTensorElementSize(TfLiteTensor* tensor);
+ uint32_t GetTensorElementSize(TfLiteTensor* tensor);
/**
* @brief Erases sections from the data assuming row-wise
* arrangement along the context axis.
* @return true if successful, false otherwise.
*/
- bool _EraseSectionsRowWise(uint8_t* ptrData,
- uint32_t strideSzBytes,
- bool lastIteration);
+ bool EraseSectionsRowWise(uint8_t* ptrData,
+ const uint32_t strideSzBytes,
+ const bool lastIteration);
};
diff --git a/source/use_case/kws_asr/include/Wav2LetterPreprocess.hpp b/source/use_case/kws_asr/include/Wav2LetterPreprocess.hpp
index 3ffabb4..cf40fa8 100644
--- a/source/use_case/kws_asr/include/Wav2LetterPreprocess.hpp
+++ b/source/use_case/kws_asr/include/Wav2LetterPreprocess.hpp
@@ -75,16 +75,16 @@ namespace asr {
*
* @return true if successful, false otherwise.
*/
- static bool _ComputeDeltas(Array2d<float>& mfcc,
- Array2d<float>& delta1,
- Array2d<float>& delta2);
+ static bool ComputeDeltas(Array2d<float>& mfcc,
+ Array2d<float>& delta1,
+ Array2d<float>& delta2);
/**
* @brief Given a 2D vector of floats, computes the mean.
* @param[in] vec Vector of vector of floats.
* @return Mean value.
*/
- static float _GetMean(Array2d<float>& vec);
+ static float GetMean(Array2d<float>& vec);
/**
* @brief Given a 2D vector of floats, computes the stddev.
@@ -92,20 +92,20 @@ namespace asr {
* @param[in] mean Mean value of the vector passed in.
* @return stddev value.
*/
- static float _GetStdDev(Array2d<float>& vec,
- float mean);
+ static float GetStdDev(Array2d<float>& vec,
+ const float mean);
/**
* @brief Given a 2D vector of floats, normalises it using
* the mean and the stddev
* @param[in,out] vec Vector of vector of floats.
*/
- static void _NormaliseVec(Array2d<float>& vec);
+ static void NormaliseVec(Array2d<float>& vec);
/**
* @brief Normalises the MFCC and delta buffers.
*/
- void _Normalise();
+ void Normalise();
/**
* @brief Given the quantisation and data type limits, computes
@@ -117,7 +117,7 @@ namespace asr {
* @param[in] maxVal Numerical limit - maximum.
* @return Floating point quantised value.
*/
- static float _GetQuantElem(
+ static float GetQuantElem(
float elem,
float quantScale,
int quantOffset,
@@ -138,7 +138,7 @@ namespace asr {
* @param[in] quantOffset Quantisation offset.
*/
template <typename T>
- bool _Quantise(
+ bool Quantise(
T * outputBuf,
const uint32_t outputBufSz,
const float quantScale,
@@ -163,15 +163,15 @@ namespace asr {
* the tensor. */
for (uint32_t j = 0; j < this->_m_numFeatVectors; ++j) {
for (uint32_t i = 0; i < this->_m_numMfccFeats; ++i) {
- *outputBufMfcc++ = static_cast<T>(this->_GetQuantElem(
- this->_m_mfccBuf(i, j), quantScale,
- quantOffset, minVal, maxVal));
- *outputBufD1++ = static_cast<T>(this->_GetQuantElem(
- this->_m_delta1Buf(i, j), quantScale,
- quantOffset, minVal, maxVal));
- *outputBufD2++ = static_cast<T>(this->_GetQuantElem(
- this->_m_delta2Buf(i, j), quantScale,
- quantOffset, minVal, maxVal));
+ *outputBufMfcc++ = static_cast<T>(this->GetQuantElem(
+ this->_m_mfccBuf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
+ *outputBufD1++ = static_cast<T>(this->GetQuantElem(
+ this->_m_delta1Buf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
+ *outputBufD2++ = static_cast<T>(this->GetQuantElem(
+ this->_m_delta2Buf(i, j), quantScale,
+ quantOffset, minVal, maxVal));
}
outputBufMfcc += ptrIncr;
outputBufD1 += ptrIncr;
diff --git a/source/use_case/kws_asr/src/AsrClassifier.cc b/source/use_case/kws_asr/src/AsrClassifier.cc
index bc86e09..f1fa6f1 100644
--- a/source/use_case/kws_asr/src/AsrClassifier.cc
+++ b/source/use_case/kws_asr/src/AsrClassifier.cc
@@ -21,13 +21,17 @@
#include "Wav2LetterModel.hpp"
template<typename T>
-bool arm::app::AsrClassifier::_GetTopResults(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint)
+bool arm::app::AsrClassifier::GetTopResults(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint)
{
const uint32_t nElems = tensor->dims->data[arm::app::Wav2LetterModel::ms_outputRowsIdx];
const uint32_t nLetters = tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx];
+ if (nLetters != labels.size()) {
+ printf("Output size doesn't match the labels' size\n");
+ return false;
+ }
/* NOTE: tensor's size verification against labels should be
* checked by the calling/public function. */
@@ -42,7 +46,7 @@ bool arm::app::AsrClassifier::_GetTopResults(TfLiteTensor* tensor,
/* Get the top 1 results. */
for (uint32_t i = 0, row = 0; i < nElems; ++i, row+=nLetters) {
- std::pair<T, uint32_t> top_1 = std::make_pair(tensorData[row + 0], 0);
+ std::pair<T, uint32_t> top_1 = std::make_pair(tensorData[row], 0);
for (uint32_t j = 1; j < nLetters; ++j) {
if (top_1.first < tensorData[row + j]) {
@@ -59,12 +63,12 @@ bool arm::app::AsrClassifier::_GetTopResults(TfLiteTensor* tensor,
return true;
}
-template bool arm::app::AsrClassifier::_GetTopResults<uint8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
-template bool arm::app::AsrClassifier::_GetTopResults<int8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- const std::vector <std::string>& labels, double scale, double zeroPoint);
+template bool arm::app::AsrClassifier::GetTopResults<uint8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
+template bool arm::app::AsrClassifier::GetTopResults<int8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ const std::vector <std::string>& labels, double scale, double zeroPoint);
bool arm::app::AsrClassifier::GetClassificationResults(
TfLiteTensor* outputTensor,
@@ -105,16 +109,16 @@ bool arm::app::AsrClassifier::GetClassificationResults(
switch (outputTensor->type) {
case kTfLiteUInt8:
- resultState = this->_GetTopResults<uint8_t>(
- outputTensor, vecResults,
- labels, quantParams.scale,
- quantParams.offset);
+ resultState = this->GetTopResults<uint8_t>(
+ outputTensor, vecResults,
+ labels, quantParams.scale,
+ quantParams.offset);
break;
case kTfLiteInt8:
- resultState = this->_GetTopResults<int8_t>(
- outputTensor, vecResults,
- labels, quantParams.scale,
- quantParams.offset);
+ resultState = this->GetTopResults<int8_t>(
+ outputTensor, vecResults,
+ labels, quantParams.scale,
+ quantParams.offset);
break;
default:
printf_err("Tensor type %s not supported by classifier\n",
diff --git a/source/use_case/kws_asr/src/UseCaseHandler.cc b/source/use_case/kws_asr/src/UseCaseHandler.cc
index a428210..1edc7c4 100644
--- a/source/use_case/kws_asr/src/UseCaseHandler.cc
+++ b/source/use_case/kws_asr/src/UseCaseHandler.cc
@@ -52,13 +52,7 @@ namespace app {
* @brief Helper function to increment current audio clip index
* @param[in,out] ctx pointer to the application context object
**/
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx);
-
- /**
- * @brief Helper function to increment current audio clip index
- * @param[in,out] ctx pointer to the application context object
- **/
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx);
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx);
/**
* @brief Helper function to set the audio clip index
@@ -66,7 +60,7 @@ namespace app {
* @param[in] idx value to be set
* @return true if index is set, false otherwise
**/
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx);
/**
* @brief Presents kws inference results using the data presentation
@@ -77,7 +71,7 @@ namespace app {
* Otherwise, this can be passed in as 0.
* @return true if successful, false otherwise
**/
- static bool _PresentInferenceResult(hal_platform& platform, std::vector<arm::app::kws::KwsResult>& results);
+ static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::kws::KwsResult>& results);
/**
* @brief Presents asr inference results using the data presentation
@@ -88,7 +82,7 @@ namespace app {
* Otherwise, this can be passed in as 0.
* @return true if successful, false otherwise
**/
- static bool _PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results);
+ static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results);
/**
* @brief Returns a function to perform feature calculation and populates input tensor data with
@@ -212,7 +206,7 @@ namespace app {
std::string str_inf{"Running KWS inference... "};
platform.data_psn->present_data_text(
str_inf.c_str(), str_inf.size(),
- dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
+ dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
info("Running KWS inference on audio clip %u => %s\n",
currentIndex, get_filename(currentIndex));
@@ -279,9 +273,9 @@ namespace app {
str_inf = std::string(str_inf.size(), ' ');
platform.data_psn->present_data_text(
str_inf.c_str(), str_inf.size(),
- dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
+ dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
- if (!_PresentInferenceResult(platform, kwsResults)) {
+ if (!PresentInferenceResult(platform, kwsResults)) {
return output;
}
@@ -375,7 +369,7 @@ namespace app {
std::string str_inf{"Running ASR inference... "};
platform.data_psn->present_data_text(
str_inf.c_str(), str_inf.size(),
- dataPsnTxtInfStartX, dataPsnTxtInfStartY, 0);
+ dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
size_t asrInferenceWindowLen = asrAudioParamsWinLen;
@@ -425,7 +419,7 @@ namespace app {
str_inf.c_str(), str_inf.size(),
dataPsnTxtInfStartX, dataPsnTxtInfStartY, false);
}
- if (!_PresentInferenceResult(platform, asrResults)) {
+ if (!PresentInferenceResult(platform, asrResults)) {
return false;
}
@@ -442,7 +436,7 @@ namespace app {
/* If the request has a valid size, set the audio index. */
if (clipIndex < NUMBER_OF_FILES) {
- if (!_SetAppCtxClipIdx(ctx, clipIndex)) {
+ if (!SetAppCtxClipIdx(ctx, clipIndex)) {
return false;
}
}
@@ -463,14 +457,14 @@ namespace app {
}
}
- _IncrementAppCtxClipIdx(ctx);
+ IncrementAppCtxClipIdx(ctx);
} while (runAll && ctx.Get<uint32_t>("clipIndex") != startClipIdx);
return true;
}
- static void _IncrementAppCtxClipIdx(ApplicationContext& ctx)
+ static void IncrementAppCtxClipIdx(ApplicationContext& ctx)
{
auto curAudioIdx = ctx.Get<uint32_t>("clipIndex");
@@ -482,7 +476,7 @@ namespace app {
ctx.Set<uint32_t>("clipIndex", curAudioIdx);
}
- static bool _SetAppCtxClipIdx(ApplicationContext& ctx, const uint32_t idx)
+ static bool SetAppCtxClipIdx(ApplicationContext& ctx, uint32_t idx)
{
if (idx >= NUMBER_OF_FILES) {
printf_err("Invalid idx %u (expected less than %u)\n",
@@ -493,8 +487,8 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform,
- std::vector<arm::app::kws::KwsResult>& results)
+ static bool PresentInferenceResult(hal_platform& platform,
+ std::vector<arm::app::kws::KwsResult>& results)
{
constexpr uint32_t dataPsnTxtStartX1 = 20;
constexpr uint32_t dataPsnTxtStartY1 = 30;
@@ -510,7 +504,7 @@ namespace app {
std::string topKeyword{"<none>"};
float score = 0.f;
- if (results[i].m_resultVec.size()) {
+ if (!results[i].m_resultVec.empty()) {
topKeyword = results[i].m_resultVec[0].m_label;
score = results[i].m_resultVec[0].m_normalisedVal;
}
@@ -538,7 +532,7 @@ namespace app {
return true;
}
- static bool _PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results)
+ static bool PresentInferenceResult(hal_platform& platform, std::vector<arm::app::asr::AsrResult>& results)
{
constexpr uint32_t dataPsnTxtStartX1 = 20;
constexpr uint32_t dataPsnTxtStartY1 = 80;
@@ -587,8 +581,8 @@ namespace app {
**/
template<class T>
std::function<void (std::vector<int16_t>&, size_t, bool, size_t)>
- _FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
- std::function<std::vector<T> (std::vector<int16_t>& )> compute)
+ FeatureCalc(TfLiteTensor* inputTensor, size_t cacheSize,
+ std::function<std::vector<T> (std::vector<int16_t>& )> compute)
{
/* Feature cache to be captured by lambda function. */
static std::vector<std::vector<T>> featureCache = std::vector<std::vector<T>>(cacheSize);
@@ -621,24 +615,24 @@ namespace app {
}
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<int8_t> (std::vector<int16_t>& )> compute);
+ FeatureCalc<int8_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<int8_t> (std::vector<int16_t>& )> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<uint8_t> (std::vector<int16_t>& )> compute);
+ FeatureCalc<uint8_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<uint8_t> (std::vector<int16_t>& )> compute);
template std::function<void (std::vector<int16_t>&, size_t , bool, size_t)>
- _FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<int16_t> (std::vector<int16_t>& )> compute);
+ FeatureCalc<int16_t>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<int16_t> (std::vector<int16_t>& )> compute);
template std::function<void(std::vector<int16_t>&, size_t, bool, size_t)>
- _FeatureCalc<float>(TfLiteTensor* inputTensor,
- size_t cacheSize,
- std::function<std::vector<float>(std::vector<int16_t>&)> compute);
+ FeatureCalc<float>(TfLiteTensor* inputTensor,
+ size_t cacheSize,
+ std::function<std::vector<float>(std::vector<int16_t>&)> compute);
static std::function<void (std::vector<int16_t>&, int, bool, size_t)>
@@ -656,35 +650,35 @@ namespace app {
switch (inputTensor->type) {
case kTfLiteInt8: {
- mfccFeatureCalc = _FeatureCalc<int8_t>(inputTensor,
- cacheSize,
- [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccComputeQuant<int8_t>(audioDataWindow,
- quantScale,
- quantOffset);
- }
+ mfccFeatureCalc = FeatureCalc<int8_t>(inputTensor,
+ cacheSize,
+ [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccComputeQuant<int8_t>(audioDataWindow,
+ quantScale,
+ quantOffset);
+ }
);
break;
}
case kTfLiteUInt8: {
- mfccFeatureCalc = _FeatureCalc<uint8_t>(inputTensor,
- cacheSize,
- [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccComputeQuant<uint8_t>(audioDataWindow,
- quantScale,
- quantOffset);
- }
+ mfccFeatureCalc = FeatureCalc<uint8_t>(inputTensor,
+ cacheSize,
+ [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccComputeQuant<uint8_t>(audioDataWindow,
+ quantScale,
+ quantOffset);
+ }
);
break;
}
case kTfLiteInt16: {
- mfccFeatureCalc = _FeatureCalc<int16_t>(inputTensor,
- cacheSize,
- [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccComputeQuant<int16_t>(audioDataWindow,
- quantScale,
- quantOffset);
- }
+ mfccFeatureCalc = FeatureCalc<int16_t>(inputTensor,
+ cacheSize,
+ [=, &mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccComputeQuant<int16_t>(audioDataWindow,
+ quantScale,
+ quantOffset);
+ }
);
break;
}
@@ -694,11 +688,11 @@ namespace app {
} else {
- mfccFeatureCalc = mfccFeatureCalc = _FeatureCalc<float>(inputTensor,
- cacheSize,
- [&mfcc](std::vector<int16_t>& audioDataWindow) {
- return mfcc.MfccCompute(audioDataWindow);
- });
+ mfccFeatureCalc = mfccFeatureCalc = FeatureCalc<float>(inputTensor,
+ cacheSize,
+ [&mfcc](std::vector<int16_t>& audioDataWindow) {
+ return mfcc.MfccCompute(audioDataWindow);
+ });
}
return mfccFeatureCalc;
}
diff --git a/source/use_case/kws_asr/src/Wav2LetterMfcc.cc b/source/use_case/kws_asr/src/Wav2LetterMfcc.cc
index 80e4a26..ae9e57a 100644
--- a/source/use_case/kws_asr/src/Wav2LetterMfcc.cc
+++ b/source/use_case/kws_asr/src/Wav2LetterMfcc.cc
@@ -27,8 +27,8 @@ namespace audio {
bool Wav2LetterMFCC::ApplyMelFilterBank(
std::vector<float>& fftVec,
std::vector<std::vector<float>>& melFilterBank,
- std::vector<int32_t>& filterBankFilterFirst,
- std::vector<int32_t>& filterBankFilterLast,
+ std::vector<uint32_t>& filterBankFilterFirst,
+ std::vector<uint32_t>& filterBankFilterLast,
std::vector<float>& melEnergies)
{
const size_t numBanks = melEnergies.size();
@@ -41,11 +41,14 @@ namespace audio {
for (size_t bin = 0; bin < numBanks; ++bin) {
auto filterBankIter = melFilterBank[bin].begin();
- float melEnergy = 1e-10; /* Avoid log of zero at later stages, same value used in librosa. */
- const int32_t firstIndex = filterBankFilterFirst[bin];
- const int32_t lastIndex = filterBankFilterLast[bin];
-
- for (int32_t i = firstIndex; i <= lastIndex; ++i) {
+ auto end = melFilterBank[bin].end();
+ /* Avoid log of zero at later stages, same value used in librosa.
+ * The number was used during our default wav2letter model training. */
+ float melEnergy = 1e-10;
+ const uint32_t firstIndex = filterBankFilterFirst[bin];
+ const uint32_t lastIndex = std::min<uint32_t>(filterBankFilterLast[bin], fftVec.size() - 1);
+
+ for (uint32_t i = firstIndex; i <= lastIndex && filterBankIter != end; ++i) {
melEnergy += (*filterBankIter++ * fftVec[i]);
}
@@ -73,7 +76,7 @@ namespace audio {
/* Scale the log values and get the max. */
for (auto iterM = melEnergies.begin(), iterL = vecLogEnergies.begin();
- iterM != melEnergies.end(); ++iterM, ++iterL) {
+ iterM != melEnergies.end() && iterL != vecLogEnergies.end(); ++iterM, ++iterL) {
*iterM = *iterL * multiplier;
@@ -86,8 +89,8 @@ namespace audio {
/* Clamp the mel energies. */
constexpr float maxDb = 80.0;
const float clampLevelLowdB = maxMelEnergy - maxDb;
- for (auto iter = melEnergies.begin(); iter != melEnergies.end(); ++iter) {
- *iter = std::max(*iter, clampLevelLowdB);
+ for (float & melEnergie : melEnergies) {
+ melEnergie = std::max(melEnergie, clampLevelLowdB);
}
}
diff --git a/source/use_case/kws_asr/src/Wav2LetterPostprocess.cc b/source/use_case/kws_asr/src/Wav2LetterPostprocess.cc
index b173968..ee3aba0 100644
--- a/source/use_case/kws_asr/src/Wav2LetterPostprocess.cc
+++ b/source/use_case/kws_asr/src/Wav2LetterPostprocess.cc
@@ -38,13 +38,13 @@ namespace asr {
const bool lastIteration)
{
/* Basic checks. */
- if (!this->_IsInputValid(tensor, axisIdx)) {
+ if (!this->IsInputValid(tensor, axisIdx)) {
return false;
}
/* Irrespective of tensor type, we use unsigned "byte" */
uint8_t* ptrData = tflite::GetTensorData<uint8_t>(tensor);
- const uint32_t elemSz = this->_GetTensorElementSize(tensor);
+ const uint32_t elemSz = this->GetTensorElementSize(tensor);
/* Other sanity checks. */
if (0 == elemSz) {
@@ -58,9 +58,10 @@ namespace asr {
/* Which axis do we need to process? */
switch (axisIdx) {
case arm::app::Wav2LetterModel::ms_outputRowsIdx:
- return this->_EraseSectionsRowWise(ptrData,
- elemSz * tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx],
- lastIteration);
+ return this->EraseSectionsRowWise(ptrData,
+ elemSz *
+ tensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx],
+ lastIteration);
default:
printf_err("Unsupported axis index: %u\n", axisIdx);
}
@@ -68,8 +69,8 @@ namespace asr {
return false;
}
- bool Postprocess::_IsInputValid(TfLiteTensor* tensor,
- const uint32_t axisIdx) const
+ bool Postprocess::IsInputValid(TfLiteTensor* tensor,
+ const uint32_t axisIdx) const
{
if (nullptr == tensor) {
return false;
@@ -91,7 +92,7 @@ namespace asr {
return true;
}
- uint32_t Postprocess::_GetTensorElementSize(TfLiteTensor* tensor)
+ uint32_t Postprocess::GetTensorElementSize(TfLiteTensor* tensor)
{
switch(tensor->type) {
case kTfLiteUInt8:
@@ -112,7 +113,7 @@ namespace asr {
return 0;
}
- bool Postprocess::_EraseSectionsRowWise(
+ bool Postprocess::EraseSectionsRowWise(
uint8_t* ptrData,
const uint32_t strideSzBytes,
const bool lastIteration)
diff --git a/source/use_case/kws_asr/src/Wav2LetterPreprocess.cc b/source/use_case/kws_asr/src/Wav2LetterPreprocess.cc
index 613ddb0..8251396 100644
--- a/source/use_case/kws_asr/src/Wav2LetterPreprocess.cc
+++ b/source/use_case/kws_asr/src/Wav2LetterPreprocess.cc
@@ -88,12 +88,12 @@ namespace asr {
}
/* Compute first and second order deltas from MFCCs. */
- this->_ComputeDeltas(this->_m_mfccBuf,
- this->_m_delta1Buf,
- this->_m_delta2Buf);
+ this->ComputeDeltas(this->_m_mfccBuf,
+ this->_m_delta1Buf,
+ this->_m_delta2Buf);
/* Normalise. */
- this->_Normalise();
+ this->Normalise();
/* Quantise. */
QuantParams quantParams = GetTensorQuantParams(tensor);
@@ -105,11 +105,11 @@ namespace asr {
switch(tensor->type) {
case kTfLiteUInt8:
- return this->_Quantise<uint8_t>(
+ return this->Quantise<uint8_t>(
tflite::GetTensorData<uint8_t>(tensor), tensor->bytes,
quantParams.scale, quantParams.offset);
case kTfLiteInt8:
- return this->_Quantise<int8_t>(
+ return this->Quantise<int8_t>(
tflite::GetTensorData<int8_t>(tensor), tensor->bytes,
quantParams.scale, quantParams.offset);
default:
@@ -120,9 +120,9 @@ namespace asr {
return false;
}
- bool Preprocess::_ComputeDeltas(Array2d<float>& mfcc,
- Array2d<float>& delta1,
- Array2d<float>& delta2)
+ bool Preprocess::ComputeDeltas(Array2d<float>& mfcc,
+ Array2d<float>& delta1,
+ Array2d<float>& delta2)
{
const std::vector <float> delta1Coeffs =
{6.66666667e-02, 5.00000000e-02, 3.33333333e-02,
@@ -175,20 +175,20 @@ namespace asr {
return true;
}
- float Preprocess::_GetMean(Array2d<float>& vec)
+ float Preprocess::GetMean(Array2d<float>& vec)
{
return math::MathUtils::MeanF32(vec.begin(), vec.totalSize());
}
- float Preprocess::_GetStdDev(Array2d<float>& vec, const float mean)
+ float Preprocess::GetStdDev(Array2d<float>& vec, const float mean)
{
return math::MathUtils::StdDevF32(vec.begin(), vec.totalSize(), mean);
}
- void Preprocess::_NormaliseVec(Array2d<float>& vec)
+ void Preprocess::NormaliseVec(Array2d<float>& vec)
{
- auto mean = Preprocess::_GetMean(vec);
- auto stddev = Preprocess::_GetStdDev(vec, mean);
+ auto mean = Preprocess::GetMean(vec);
+ auto stddev = Preprocess::GetStdDev(vec, mean);
debug("Mean: %f, Stddev: %f\n", mean, stddev);
if (stddev == 0) {
@@ -204,14 +204,14 @@ namespace asr {
}
}
- void Preprocess::_Normalise()
+ void Preprocess::Normalise()
{
- Preprocess::_NormaliseVec(this->_m_mfccBuf);
- Preprocess::_NormaliseVec(this->_m_delta1Buf);
- Preprocess::_NormaliseVec(this->_m_delta2Buf);
+ Preprocess::NormaliseVec(this->_m_mfccBuf);
+ Preprocess::NormaliseVec(this->_m_delta1Buf);
+ Preprocess::NormaliseVec(this->_m_delta2Buf);
}
- float Preprocess::_GetQuantElem(
+ float Preprocess::GetQuantElem(
const float elem,
const float quantScale,
const int quantOffset,