MLECO-2079 Adding the C++ KWS example

Signed-off-by: Eanna O Cathain <eanna.ocathain@arm.com>
Change-Id: I81899bbfaada32f478c2e2fc6441eabb94d8d0fc
diff --git a/samples/KeywordSpotting/src/Decoder.cpp b/samples/KeywordSpotting/src/Decoder.cpp
new file mode 100644
index 0000000..107e25c
--- /dev/null
+++ b/samples/KeywordSpotting/src/Decoder.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "Decoder.hpp"
+
+std::pair<int, float> kws::Decoder::decodeOutput(std::vector<int8_t>& modelOutput) 
+{
+
+    std::vector<float> dequantisedOutput;
+    //Normalise vector values into new vector
+    for (auto& value : modelOutput) 
+    {
+        float normalisedModelOutput = this->quantisationScale * (static_cast<float >(value) -
+                                                                 static_cast<float >(this->quantisationOffset));
+        dequantisedOutput.push_back(normalisedModelOutput);
+    }
+
+    //Get largest value in modelOutput
+    const std::vector<float>::iterator& maxElementIterator = std::max_element(dequantisedOutput.begin(),
+                                                                              dequantisedOutput.end());
+    //Find the labelMapIndex of the largest value which corresponds to a key in a label map
+    int labelMapIndex = static_cast<int>(std::distance(dequantisedOutput.begin(), maxElementIterator));
+
+    //Round to two DP
+    float maxModelOutputProbability = std::roundf((*maxElementIterator) * 100) / 100;
+
+    return std::make_pair(labelMapIndex, maxModelOutputProbability);
+
+}
+
+
+
+