Opensource ML embedded evaluation kit

Change-Id: I12e807f19f5cacad7cef82572b6dd48252fd61fd
diff --git a/tests/common/AppContextTest.cc b/tests/common/AppContextTest.cc
new file mode 100644
index 0000000..42b142d
--- /dev/null
+++ b/tests/common/AppContextTest.cc
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+#include "AppContext.hpp"
+
+#include <catch.hpp>
+
+TEST_CASE("Common: Application context")
+{
+    SECTION("Add primitive type Parameter")
+    {
+        arm::app::ApplicationContext context;
+        context.Set<uint32_t>("imgIndex", 0);
+        auto data = context.Get<uint32_t>("imgIndex");
+
+        REQUIRE(0 == data);
+
+    }
+
+    SECTION("Add object parameter")
+    {
+        arm::app::ApplicationContext context;
+        std::vector <std::string> vect{"a"};
+        context.Set<std::vector <std::string>>("vect", vect);
+        auto data = context.Get<std::vector <std::string>>("vect");
+
+        REQUIRE(vect == data);
+    }
+
+    SECTION("Add reference object parameter")
+    {
+        arm::app::ApplicationContext context;
+        std::vector <std::string> vect{"a"};
+        context.Set<std::vector <std::string>&>("vect", vect);
+        auto data = context.Get<std::vector <std::string>&>("vect");
+
+        REQUIRE(vect == data);
+    }
+
+    SECTION("Add object pointer parameter")
+    {
+        arm::app::ApplicationContext context;
+        std::vector <std::string>* vect = new std::vector <std::string>{"a"};
+        context.Set<std::vector <std::string>*>("vect", vect);
+        auto data = context.Get<std::vector <std::string>*>("vect");
+
+        REQUIRE(vect == data);
+        delete(vect);
+    }
+}
\ No newline at end of file
diff --git a/tests/common/ClassifierTests.cc b/tests/common/ClassifierTests.cc
new file mode 100644
index 0000000..f08a09a
--- /dev/null
+++ b/tests/common/ClassifierTests.cc
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+#include "Classifier.hpp"
+
+#include <catch.hpp>
+
+TEST_CASE("Common classifier")
+{
+    SECTION("Test invalid classifier")
+    {
+        TfLiteTensor* outputTens = nullptr;
+        std::vector <arm::app::ClassificationResult> resultVec;
+        arm::app::Classifier classifier;
+        REQUIRE(!classifier.GetClassificationResults(outputTens, resultVec, {}, 5));
+    }
+
+    SECTION("Test valid classifier UINT8")
+    {
+        const int dimArray[] = {1, 1001};
+        std::vector <std::string> labels(1001);
+        std::vector <uint8_t> outputVec(1001);
+        TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+        TfLiteTensor tfTensor = tflite::testing::CreateQuantizedTensor(
+                outputVec.data(), dims, 1, 0, "test");
+        TfLiteTensor* outputTensor = &tfTensor;
+        std::vector <arm::app::ClassificationResult> resultVec;
+        arm::app::Classifier classifier;
+        REQUIRE(classifier.GetClassificationResults(outputTensor, resultVec, labels, 5));
+        REQUIRE(5 == resultVec.size());
+    }
+
+    SECTION("Get classification results")
+    {
+        const int dimArray[] = {1, 1001};
+        std::vector <std::string> labels(1001);
+        std::vector<uint8_t> outputVec(1001, static_cast<uint8_t>(5));
+        TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+        TfLiteTensor tfTensor = tflite::testing::CreateQuantizedTensor(
+                outputVec.data(), dims, 1, 0, "test");
+        TfLiteTensor* outputTensor = &tfTensor;
+
+        std::vector <arm::app::ClassificationResult> resultVec;
+
+        /* Set the top five results. */
+        std::vector<std::pair<uint32_t, uint8_t>> selectedResults {
+                {0, 8}, {20, 7}, {10, 7}, {15, 9}, {1000, 10}};
+
+        for (size_t i = 0; i < selectedResults.size(); ++i) {
+            outputVec[selectedResults[i].first] = selectedResults[i].second;
+        }
+
+        arm::app::Classifier classifier;
+        REQUIRE(classifier.GetClassificationResults(outputTensor, resultVec, labels, 5));
+        REQUIRE(5 == resultVec.size());
+
+        REQUIRE(resultVec[0].m_labelIdx == 1000);
+        REQUIRE(resultVec[1].m_labelIdx == 15);
+        REQUIRE(resultVec[2].m_labelIdx == 0);
+        REQUIRE(resultVec[3].m_labelIdx == 20);
+        REQUIRE(resultVec[4].m_labelIdx == 10);
+    }
+}
diff --git a/tests/common/ProfilerTests.cc b/tests/common/ProfilerTests.cc
new file mode 100644
index 0000000..caf492b
--- /dev/null
+++ b/tests/common/ProfilerTests.cc
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+#include "Profiler.hpp"
+
+#include "AppContext.hpp"
+#include "TensorFlowLiteMicro.hpp"
+
+#include <catch.hpp>
+#include <iostream>
+
+
+TEST_CASE("Common: Test Profiler")
+{
+    hal_platform    platform;
+    data_acq_module data_acq {};
+    data_psn_module data_psn {};
+    platform_timer  timer {};
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* An invalid profiler shouldn't be of much use. */
+    arm::app::Profiler profilerInvalid {nullptr, "test_invalid"};
+    REQUIRE(false == profilerInvalid.StartProfiling());
+    REQUIRE(false == profilerInvalid.StopProfiling());
+
+    arm::app::Profiler profilerValid{&platform, "test_valid"};
+    REQUIRE(true == profilerValid.StartProfiling());
+    REQUIRE(true == profilerValid.StopProfiling());
+
+    std::string strProfile = profilerValid.GetResultsAndReset();
+    REQUIRE(std::string::npos != strProfile.find("test_valid"));
+
+#if defined(CPU_PROFILE_ENABLED)
+    /* We should have milliseconds elapsed. */
+    REQUIRE(std::string::npos != strProfile.find("ms"));
+#endif /* defined(CPU_PROFILE_ENABLED) */
+
+    /* Abuse should fail: */
+    REQUIRE(false == profilerValid.StopProfiling());  /* We need to start it first. */
+    REQUIRE(true == profilerValid.StartProfiling());  /* Should be able to start it fine. */
+    REQUIRE(false == profilerValid.StartProfiling()); /* Can't restart it without resetting. */
+    profilerValid.Reset();                            /* Reset. */
+    REQUIRE(true == profilerValid.StartProfiling());  /* Can start it again now. */
+    REQUIRE(true == profilerValid.StopProfiling());   /* Can start it again now. */
+}
diff --git a/tests/common/SlidingWindowTests.cc b/tests/common/SlidingWindowTests.cc
new file mode 100644
index 0000000..bfdb5b7
--- /dev/null
+++ b/tests/common/SlidingWindowTests.cc
@@ -0,0 +1,266 @@
+/*
+ * 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.
+ */
+#include "AudioUtils.hpp"
+#include "catch.hpp"
+
+TEST_CASE("Common: Slide long data")
+{
+    std::vector<int> test{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+
+    SECTION("Fit the data")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+
+        for (int i = 0 ; i < 10; ++i) {
+            REQUIRE(slider.HasNext());
+            REQUIRE(*slider.Next() == i + 1);
+        }
+
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+
+    SECTION("Fit the data stride> window")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 3);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 1);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 4);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 7);
+
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+
+    SECTION("Fit the data stride < window")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 1);
+
+        for (int i = 0 ; i < 6; i++) {
+            REQUIRE(slider.HasNext());
+            REQUIRE(*slider.Next() == i + 1);
+        }
+
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+}
+
+
+TEST_CASE("Common: Slide data size 1")
+{
+    std::vector<int> test{1};
+
+    SECTION("Fit the data")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 1);
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+
+    SECTION("Does not Fit the data because of big window")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 1);
+
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+
+    SECTION("Does not Fit the data because of big stride")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 1);
+        REQUIRE(!slider.HasNext());
+        REQUIRE(nullptr == slider.Next());
+    }
+
+}
+
+
+TEST_CASE("Common: Slide reset")
+{
+    SECTION("current range")
+    {
+        std::vector<int> test{1};
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+        int *saved = slider.Next();
+        slider.Reset();
+
+        REQUIRE(slider.Next() == saved);
+    }
+
+    SECTION("new range")
+    {
+        std::vector<int> test{1};
+        std::vector<int> test2{100};
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+        slider.Next();
+        slider.Reset(test2.data());
+
+        REQUIRE(*slider.Next() == 100);
+    }
+}
+
+
+TEST_CASE("Common: Slide fast forward")
+{
+    std::vector<int> test{1, 2, 3, 4, 5};
+
+    auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+    SECTION("at the beginning") {
+        slider.FastForward(3);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 4);
+    }
+
+    SECTION("in the middle")
+    {
+        slider.Next();
+        slider.FastForward(3);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 4);
+    }
+
+    SECTION("at the end")
+    {
+        while(slider.HasNext()) {
+            slider.Next();
+        }
+        slider.FastForward(3);
+
+        REQUIRE(slider.HasNext());
+        REQUIRE(*slider.Next() == 4);
+    }
+
+    SECTION("out of the range")
+    {
+        slider.FastForward(100);
+
+        REQUIRE(!slider.HasNext());
+        REQUIRE(slider.Next() == nullptr);
+    }
+}
+
+
+TEST_CASE("Common: Slide Index")
+{
+    std::vector<int> test{1, 2, 3, 4, 5};
+    auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+    REQUIRE(slider.Index() == 0);
+    for (int i = 0; i < 5; i++) {
+        slider.Next();
+        REQUIRE(slider.Index() == i);
+    }
+}
+
+
+TEST_CASE("Common: Total strides") 
+{
+    std::vector<int> test{1, 2, 3, 4, 5};
+
+    SECTION("Element by element")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
+        REQUIRE(slider.TotalStrides() == 4 );
+    }
+
+    SECTION("Step through element")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2);
+        REQUIRE(slider.TotalStrides() == 2 );
+    }
+
+    SECTION("Window = data")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 2);
+        REQUIRE(slider.TotalStrides() == 0 );
+    }
+
+    SECTION("Window > data")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 6, 2);
+        REQUIRE(slider.TotalStrides() == 0 );
+    }
+
+    SECTION("Window < data, not enough for the next stride")
+    {
+        auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 4, 2);
+        REQUIRE(slider.TotalStrides() == 0 );
+    }
+}
+
+
+TEST_CASE("Common: Next window data index")
+{
+    std::vector<int> test{1, 2, 3, 4, 5};
+
+    /* Check we get the correct index returned */
+    SECTION("Stride 1")
+    {
+        auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 1);
+        REQUIRE(slider.NextWindowStartIndex() == 0);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 1);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 2);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 3);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 4);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 5);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 5);
+    }
+
+    SECTION("Stride 2")
+    {
+        auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 2);
+        REQUIRE(slider.NextWindowStartIndex() == 0);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 2);
+        REQUIRE(slider.NextWindowStartIndex() == 2);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 4);
+    }
+
+    SECTION("Stride 3")
+    {
+        auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 3);
+        REQUIRE(slider.NextWindowStartIndex() == 0);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 3);
+        REQUIRE(slider.NextWindowStartIndex() == 3);
+        slider.Next();
+        REQUIRE(slider.NextWindowStartIndex() == 6);
+        REQUIRE(!slider.HasNext());
+        REQUIRE(slider.Next() == nullptr);
+        REQUIRE(slider.NextWindowStartIndex() == 6);
+    }
+}
diff --git a/tests/resources/golden_fv/AdGoldenInput.hpp b/tests/resources/golden_fv/AdGoldenInput.hpp
new file mode 100644
index 0000000..41d1a89
--- /dev/null
+++ b/tests/resources/golden_fv/AdGoldenInput.hpp
@@ -0,0 +1,132 @@
+/*
+ * 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 AD_GOLDEN_OUTPUTS_HPP
+#define AD_GOLDEN_OUTPUTS_HPP
+
+#include "Model.hpp"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#ifndef AD_FEATURE_VEC_DATA_SIZE
+#define AD_IN_FEATURE_VEC_DATA_SIZE       (1024)
+#define AD_OUT_FEATURE_VEC_DATA_SIZE       (8)
+#endif /* AD_FEATURE_VEC_DATA_SIZE */
+
+/* Golden input. */
+uint8_t ad_golden_input[AD_IN_FEATURE_VEC_DATA_SIZE] = {
+  0x7a, 0x7c, 0x7f, 0x7c, 0x7b, 0x61, 0x7f, 0x75, 0x7f, 0x6b, 0x6d, 0x71,
+  0x7f, 0x6e, 0x7a, 0x76, 0x7f, 0x7f, 0x65, 0x7f, 0x7f, 0x6f, 0x5d, 0x67,
+  0x7f, 0x5b, 0x7a, 0x43, 0x65, 0x69, 0x4e, 0x63, 0x5f, 0x56, 0x4e, 0x64,
+  0x36, 0x4a, 0x3c, 0x56, 0x3a, 0x61, 0x71, 0x74, 0x72, 0x6f, 0x71, 0x71,
+  0x66, 0x7b, 0x68, 0x62, 0x44, 0x5f, 0x2f, 0x3d, 0x56, 0x5b, 0x5b, 0x4d,
+  0x5f, 0x59, 0x58, 0x6e, 0x4f, 0x3d, 0x48, 0x5f, 0x46, 0x38, 0x48, 0x4f,
+  0x46, 0x74, 0x6d, 0x61, 0x60, 0x63, 0x6a, 0x68, 0x62, 0x69, 0x63, 0x5c,
+  0x6e, 0x4d, 0x4c, 0x3c, 0x5a, 0x55, 0x4a, 0x5d, 0x59, 0x66, 0x67, 0x6c,
+  0x55, 0x40, 0x49, 0x47, 0x56, 0x61, 0x48, 0x4d, 0x64, 0x61, 0x77, 0x7e,
+  0x37, 0x63, 0x52, 0x3e, 0x57, 0x4d, 0x54, 0x4f, 0x3b, 0x4c, 0x54, 0x50,
+  0x55, 0x4c, 0x57, 0x58, 0x45, 0x7b, 0x74, 0x58, 0x39, 0x34, 0x3c, 0x38,
+  0x3e, 0x1e, 0x22, 0x46, 0x2c, 0x7a, 0x6e, 0x74, 0x72, 0x70, 0x61, 0x7d,
+  0x69, 0x79, 0x66, 0x3c, 0x33, 0x20, 0x3a, 0x20, 0x34, 0x29, 0x3c, 0x4e,
+  0x47, 0x5b, 0x78, 0x47, 0x36, 0x30, 0x18, 0x45, 0x24, 0x25, 0x2c, 0x75,
+  0x71, 0x70, 0x7f, 0x73, 0x6c, 0x6c, 0x77, 0x6a, 0x6d, 0x6b, 0x6d, 0x5b,
+  0x36, 0x43, 0x34, 0x2b, 0x2e, 0x3b, 0x32, 0x67, 0x2a, 0x5b, 0x7f, 0x66,
+  0x32, 0x24, 0x28, 0x29, 0x2d, 0x31, 0x2b, 0x1d, 0x0d, 0x40, 0x3a, 0x49,
+  0x3b, 0x42, 0x37, 0x43, 0x40, 0x44, 0x4f, 0x40, 0x25, 0x1b, 0x33, 0x32,
+  0x15, 0x3b, 0x22, 0x33, 0x45, 0x4e, 0x45, 0x3a, 0x2a, 0x10, 0x19, 0x3a,
+  0x27, 0x25, 0x18, 0x0d, 0x0d, 0x3a, 0x36, 0x2d, 0x21, 0x34, 0x25, 0x38,
+  0x26, 0x33, 0x2f, 0x33, 0x2a, 0x21, 0x36, 0x1e, 0x2b, 0x28, 0x29, 0x31,
+  0x25, 0x2e, 0x4d, 0x32, 0x42, 0x1b, 0x37, 0x1a, 0x34, 0x36, 0x23, 0x25,
+  0x2b, 0x3f, 0x46, 0x41, 0x4c, 0x35, 0x39, 0x2d, 0x37, 0x4d, 0x42, 0x46,
+  0x27, 0x36, 0x20, 0x34, 0x10, 0x32, 0x19, 0x21, 0x33, 0x3b, 0x39, 0x46,
+  0x10, 0xf3, 0x26, 0x13, 0x24, 0x1f, 0x28, 0x18, 0x29, 0x20, 0x20, 0x14,
+  0x1f, 0x17, 0x27, 0x34, 0x38, 0x3e, 0x26, 0x37, 0x20, 0x33, 0x16, 0x26,
+  0x0e, 0x1c, 0x31, 0x1d, 0x23, 0x2e, 0x44, 0x38, 0x25, 0x2f, 0x27, 0x39,
+  0x3b, 0x2b, 0x36, 0x3c, 0x35, 0x3f, 0x2d, 0x3f, 0x42, 0x32, 0x43, 0x4e,
+  0x55, 0x3d, 0x17, 0x2e, 0x39, 0x20, 0x31, 0x41, 0x38, 0x2b, 0x31, 0x38,
+  0x46, 0x3f, 0x1e, 0x2d, 0x0a, 0x07, 0x18, 0xfc, 0x1a, 0x14, 0xec, 0x25,
+  0x1e, 0x30, 0x3c, 0x37, 0x2a, 0x47, 0x3c, 0x3b, 0x3b, 0x37, 0x2b, 0x22,
+  0x18, 0x1b, 0x31, 0x1e, 0x0e, 0x22, 0x13, 0x11, 0x10, 0x10, 0x14, 0x22,
+  0x0c, 0x0e, 0x18, 0x03, 0x0e, 0x03, 0x03, 0x08, 0x26, 0x0c, 0x1a, 0x0a,
+  0x06, 0x2d, 0x1e, 0x1e, 0x14, 0x1a, 0x26, 0x1d, 0x06, 0x06, 0x1c, 0x0e,
+  0x16, 0x06, 0x09, 0x13, 0x1c, 0x21, 0x25, 0x0d, 0x1c, 0x00, 0xfa, 0xfd,
+  0x13, 0xfa, 0x18, 0xff, 0x0d, 0x08, 0x23, 0x2e, 0x26, 0x1d, 0x14, 0x10,
+  0x14, 0x28, 0x14, 0x1b, 0x05, 0x0a, 0xff, 0xfa, 0x1a, 0x18, 0x11, 0x13,
+  0x16, 0x0f, 0x07, 0x12, 0x05, 0x00, 0x13, 0xf3, 0x05, 0x01, 0x01, 0x01,
+  0x1a, 0x16, 0x2b, 0x26, 0x1e, 0x21, 0x15, 0x13, 0x12, 0x28, 0x19, 0x1c,
+  0xff, 0xf8, 0xf0, 0x02, 0x01, 0x05, 0x04, 0x19, 0x11, 0x14, 0x1b, 0x15,
+  0xea, 0x19, 0x12, 0x02, 0x0f, 0x11, 0xee, 0xfe, 0x1c, 0x2f, 0x19, 0x38,
+  0x2a, 0x30, 0x26, 0x1e, 0x28, 0x29, 0x24, 0x12, 0x01, 0x12, 0xff, 0x0c,
+  0x09, 0x0b, 0x26, 0x24, 0x21, 0x24, 0x11, 0x21, 0x13, 0x17, 0xf8, 0x0c,
+  0xfd, 0x03, 0xf9, 0xfc, 0x03, 0x20, 0x14, 0x34, 0x1e, 0x30, 0x2e, 0x25,
+  0x23, 0x29, 0x16, 0x01, 0xf4, 0x05, 0x15, 0x05, 0xf9, 0x02, 0xea, 0x32,
+  0x38, 0x28, 0x28, 0x18, 0xf6, 0xfa, 0xfb, 0xff, 0xf9, 0xee, 0xff, 0x01,
+  0xfc, 0x41, 0x40, 0x2b, 0x2f, 0x1f, 0x1c, 0x20, 0x21, 0x28, 0x2b, 0x17,
+  0xfd, 0xf9, 0x07, 0xf5, 0x01, 0xf8, 0xfe, 0xfe, 0x11, 0x14, 0x27, 0x0e,
+  0xf5, 0xfd, 0xe7, 0x05, 0xef, 0xee, 0xe9, 0xf6, 0xff, 0x10, 0x0c, 0x16,
+  0x15, 0x16, 0x0d, 0x1c, 0x15, 0x1c, 0x09, 0xf6, 0x00, 0xfe, 0xf4, 0xf8,
+  0xe1, 0x0a, 0xfa, 0x05, 0x0b, 0x1b, 0x19, 0x05, 0xf0, 0xec, 0xec, 0x02,
+  0xf0, 0xec, 0xf4, 0xec, 0xe7, 0x30, 0x47, 0x2d, 0x31, 0x2a, 0x24, 0x31,
+  0x1f, 0x31, 0x2c, 0x07, 0xe4, 0xfa, 0xef, 0xee, 0xfe, 0xf5, 0xf1, 0x1a,
+  0x18, 0x33, 0x1c, 0x10, 0xf5, 0xce, 0xeb, 0xe3, 0xf1, 0xec, 0xe7, 0xed,
+  0xde, 0x19, 0x2e, 0x11, 0x1f, 0x17, 0x19, 0x23, 0x17, 0x1d, 0x1b, 0x01,
+  0xef, 0xed, 0xeb, 0xf8, 0xe9, 0xf0, 0xf3, 0x1c, 0x19, 0x2a, 0x0d, 0x19,
+  0xe3, 0xe1, 0xee, 0xe0, 0xe7, 0xee, 0xe7, 0xee, 0xea, 0x30, 0x2e, 0x2f,
+  0x32, 0x11, 0x29, 0x38, 0x0f, 0x1a, 0x29, 0x24, 0xe6, 0xfa, 0xfc, 0xf0,
+  0xed, 0xec, 0xe1, 0x2e, 0x13, 0x29, 0x22, 0x16, 0xd4, 0xee, 0xeb, 0xee,
+  0xd3, 0xe4, 0xe4, 0xe5, 0xee, 0x23, 0x08, 0x10, 0x15, 0x17, 0x1b, 0x2b,
+  0x1b, 0x1d, 0x17, 0x03, 0xf8, 0xdd, 0xe3, 0xe8, 0xe5, 0xd8, 0xdb, 0x09,
+  0xf5, 0x10, 0x16, 0x14, 0xd9, 0xde, 0xd0, 0xd7, 0xd7, 0xda, 0xe0, 0xe1,
+  0xe4, 0x0f, 0x17, 0x04, 0x10, 0x0c, 0x14, 0x1d, 0x1d, 0x17, 0x15, 0xfa,
+  0xd9, 0xd6, 0xe1, 0xdf, 0xd7, 0xdf, 0xd5, 0x18, 0xf5, 0x14, 0x08, 0x0b,
+  0xd0, 0xd6, 0xd4, 0xd7, 0xc6, 0xda, 0xc5, 0xda, 0xdc, 0x14, 0x26, 0x15,
+  0x19, 0x0d, 0x0b, 0x0f, 0x07, 0x09, 0x1b, 0x03, 0xdc, 0xda, 0xd6, 0xd8,
+  0xc0, 0xc5, 0xdc, 0x08, 0xfb, 0x10, 0x0d, 0x13, 0xd8, 0xde, 0xcb, 0xd6,
+  0xd0, 0xc7, 0xcd, 0xdc, 0xc3, 0x0c, 0x0f, 0x08, 0x13, 0x13, 0x25, 0x25,
+  0x13, 0x1f, 0x11, 0xee, 0xd0, 0xd0, 0xd2, 0xcd, 0xbf, 0xca, 0xd2, 0x0a,
+  0xeb, 0x04, 0x03, 0x10, 0xd0, 0xcd, 0xb1, 0xc7, 0xca, 0xbf, 0xe1, 0xdd,
+  0xce, 0x2b, 0x19, 0x20, 0x20, 0x14, 0x24, 0x34, 0x27, 0x2c, 0x25, 0xf8,
+  0xd5, 0xc7, 0xcb, 0xba, 0xc0, 0xcf, 0xc4, 0x14, 0x06, 0x1f, 0x28, 0x10,
+  0xc9, 0xc9, 0xc3, 0xbf, 0xc4, 0xcd, 0xd2, 0xcc, 0xd4, 0x15, 0x27, 0x1e,
+  0x19, 0x05, 0x18, 0x1d, 0x24, 0x1a, 0x1f, 0xf9, 0xcc, 0xd3, 0xc3, 0xcd,
+  0xcc, 0xc1, 0xd5, 0x10, 0xe7, 0x1d, 0x12, 0x04, 0xb4, 0xb9, 0xb0, 0xb9,
+  0xb1, 0xb1, 0xbb, 0xd2, 0xb0, 0xff, 0x22, 0x06, 0xff, 0xf7, 0xfb, 0x07,
+  0xf8, 0xfa, 0x03, 0xef, 0xc2, 0xc7, 0xb9, 0xbb, 0xb4, 0xb2, 0xb5, 0xf2,
+  0xcc, 0x05, 0xf1, 0xea, 0xb0, 0xb1, 0xa7, 0xab, 0xa9, 0xa6, 0xb2, 0xbf,
+  0xb4, 0x04, 0x0f, 0x02, 0x0e, 0x0a, 0x05, 0x07, 0xff, 0x04, 0x0a, 0xe2,
+  0xac, 0xad, 0xa9, 0xa0, 0xa8, 0xa3, 0x9a, 0xef, 0xd3, 0xf5, 0x03, 0xfd,
+  0x9c, 0x99, 0x99, 0x9c, 0x96, 0x99, 0xaf, 0xa8, 0xaa, 0xfd, 0x09, 0x0e,
+  0xf5, 0xed, 0xe7, 0xf4, 0xec, 0xf4, 0xf1, 0xd5, 0xa5, 0x9a, 0x9e, 0x98,
+  0xa7, 0x99, 0xa2, 0xd9, 0xc2, 0xf1, 0xee, 0xec, 0x8a, 0x86, 0x8c, 0x8d,
+  0x84, 0x88, 0xa0, 0xad, 0xa2, 0xe5, 0x02, 0xff, 0xf5, 0xe4, 0xee, 0xf1,
+  0xf2, 0xec, 0xf0, 0xc9, 0x9e, 0x97, 0x98, 0x89, 0x8f, 0x88, 0x93, 0xd9,
+  0xd1, 0xf8, 0xeb, 0xde
+};
+
+/* Golden output */
+uint8_t ad_golden_out[AD_OUT_FEATURE_VEC_DATA_SIZE] = {
+        0x3a, 0x7f, 0x36, 0x76, 0x80, 0x80, 0x80, 0x80
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AD_GOLDEN_OUTPUTS_HPP */
diff --git a/tests/resources/golden_fv/AsrGoldenFeatures.hpp b/tests/resources/golden_fv/AsrGoldenFeatures.hpp
new file mode 100644
index 0000000..a230a52
--- /dev/null
+++ b/tests/resources/golden_fv/AsrGoldenFeatures.hpp
@@ -0,0 +1,931 @@
+/*
+ * 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 ASR_F_GOLDEN_HPP
+#define ASR_F_GOLDEN_HPP
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <stdint.h>
+
+size_t golden_asr_mfcc_len = 13U * 296U;
+size_t golden_diff1_len = golden_asr_mfcc_len;
+size_t golden_diff2_len = golden_asr_mfcc_len;
+
+static const float golden_asr_mfcc[] = {
+/* 13 features, 296 time samples */
+-739.77203,    4.43339,    4.14916,    3.94062,    3.75471,    3.36722,    2.75536,    2.15424,    1.70661,    1.26036,    0.63381,   -0.07275,   -0.61404,
+-741.22699,    2.43739,    2.19547,    1.81668,    1.33471,    0.79128,    0.23156,   -0.30073,   -0.76779,   -1.14135,   -1.40496,   -1.55474,   -1.59852,
+-740.28369,    3.77706,    3.55944,    3.23880,    2.85630,    2.43850,    1.98858,    1.49232,    0.93505,    0.31964,   -0.32507,   -0.95050,   -1.50613,
+-737.92542,    7.08773,    6.79751,    6.36016,    5.82753,    5.24427,    4.63403,    3.99524,    3.30806,    2.54938,    1.70949,    0.80348,   -0.12769,
+-737.88190,    7.17392,    6.94397,    6.56755,    6.05465,    5.41886,    4.67691,    3.84815,    2.95400,    2.01727,    1.06150,    0.11023,   -0.81362,
+-740.40613,    3.61488,    3.41837,    3.10070,    2.67607,    2.16330,    1.58483,    0.96553,    0.33144,   -0.29155,   -0.87899,   -1.40899,   -1.86323,
+-738.04297,    6.88258,    6.47138,    5.82175,    4.98088,    4.00386,    2.94619,    1.85797,    0.78088,   -0.25189,   -1.21348,   -2.08038,   -2.83026,
+-739.10394,    5.01142,    4.08197,    3.61993,    3.46862,    2.79344,    1.53009,    0.59595,    0.51155,    0.61026,    0.09230,   -0.73804,   -0.99980,
+-738.93628,    5.04577,    3.92978,    3.86487,    4.45355,    4.15855,    2.83126,    1.97671,    2.32735,    2.63497,    1.63883,    0.06747,   -0.52301,
+-742.09735,    1.27576,    1.23579,    1.17278,    1.08758,    0.97981,    0.85158,    0.70800,    0.55358,    0.39015,    0.21937,    0.04588,   -0.12424,
+-740.26038,    3.81065,    3.58432,    3.22149,    2.74267,    2.17462,    1.54851,    0.89788,    0.25634,   -0.34453,   -0.87725,   -1.32006,   -1.65818,
+-738.87238,    5.63912,    5.15087,    4.61127,    4.02923,    3.28429,    2.43234,    1.70882,    1.20934,    0.76495,    0.22197,   -0.31741,   -0.67138,
+-738.80823,    5.85002,    5.58049,    5.14473,    4.56218,    3.85858,    3.06471,    2.21470,    1.34432,    0.48918,   -0.31712,   -1.04458,   -1.66828,
+-737.43085,    7.76511,    7.40725,    6.84653,    6.11416,    5.24155,    4.27151,    3.25613,    2.23841,    1.24139,    0.27895,   -0.63012,   -1.46581,
+-737.83099,    7.12094,    6.58481,    5.70745,    4.61185,    3.33776,    2.02636,    0.73143,   -0.42896,   -1.41877,   -2.17289,   -2.68819,   -2.96023,
+-738.05359,    6.74544,    6.00377,    4.91264,    3.64911,    2.39284,    1.28308,    0.39052,   -0.28846,   -0.81449,   -1.27167,   -1.72931,   -2.21198,
+-733.09210,   11.21165,    6.83860,    6.50434,    8.39739,    6.62222,    1.12450,   -2.07976,   -0.50446,    1.11805,   -1.27790,   -4.70090,   -4.26429,
+-729.61566,   10.02992,   -1.95083,    1.63069,   11.62741,    8.21267,   -4.95377,   -8.36486,    0.19372,    4.14391,   -3.06428,   -8.99785,   -4.47088,
+-723.47961,   10.17970,   -9.74782,   -1.55895,   11.08994,    8.48012,   -0.16512,   -6.58712,   -3.57666,    7.86839,    7.80519,   -4.68555,   -5.37104,
+-703.88519,   18.29580,  -21.44657,   -6.79528,   12.08492,    8.75593,    2.90998,   -1.51398,   -1.36442,    6.59666,    1.81764,   -9.89391,   -4.18426,
+-678.76422,   19.09791,  -33.17283,    1.54777,   14.24737,    8.83076,    2.65867,   -3.69481,   -3.60083,   -0.10980,    0.55969,   -1.57821,   -3.58482,
+-597.23285,   37.85891,  -60.26614,   -0.12251,   14.22423,   -0.90098,    0.90394,    0.41278,   -4.10125,    6.44201,    6.07266,   11.16191,   -6.44330,
+-487.76270,   29.97835,  -62.39044,   -5.40837,   11.29997,    6.95592,   -5.83144,    0.48654,  -11.59783,   10.14861,    7.22627,   12.45544,  -14.93312,
+-468.18643,   32.67844,  -46.44635,   -7.10132,    3.99336,   12.08127,   -4.66342,    4.15338,  -17.32649,   -4.82752,  -10.19122,   -2.54350,  -13.77276,
+-469.04898,   37.73291,  -47.50086,    5.52127,    3.27568,    6.41865,  -13.02156,   -3.75707,   -4.57083,    0.00712,  -10.25383,  -10.10860,   -8.79650,
+-468.63696,   42.29890,  -48.59408,    5.51896,   12.85027,    3.59784,  -19.76094,   -5.88601,   -5.34028,    3.93530,   -8.92158,  -14.67978,  -14.06335,
+-484.16913,   47.05151,  -50.70958,   -3.16510,    6.97707,   11.57512,   -4.71207,   10.11598,    7.59590,   11.88781,   -5.98053,   -3.78069,   -1.87512,
+-513.99847,   38.55527,  -58.36864,   -3.13968,    5.45301,   10.91985,   -3.15140,   -0.44534,    0.41920,   15.86110,    3.14245,   -0.24400,  -10.29185,
+-525.34448,   53.88523,  -61.43047,   -6.67531,   16.82977,   18.57971,    1.81502,    6.59831,    3.63511,   16.62849,   -6.21790,   -0.93611,  -10.05373,
+-543.47412,   67.34111,  -53.03713,  -11.67502,   16.99445,   17.41154,   10.10119,    9.28551,   -2.13365,   15.32820,   -4.74680,    3.89862,    1.69543,
+-543.86810,   95.82130,  -44.91877,  -27.12481,    7.24652,    9.93297,    2.24394,    8.90679,    3.20333,    9.80860,  -13.70252,   -9.32810,   -1.20880,
+-540.39093,  118.15536,  -39.92270,  -31.31052,    8.73977,   20.39213,    2.70147,   -6.48235,  -11.14444,    2.80034,   -5.70351,   -9.33047,   -3.82105,
+-559.33344,  113.90231,  -45.61569,  -36.66971,   11.51530,   18.66145,    5.43105,   -5.79920,  -15.95238,   11.71870,    3.30188,  -17.29617,   -0.12055,
+-611.22729,   92.45084,  -33.29684,  -45.60332,   -0.57918,   19.67272,   18.25746,    2.54525,   -1.95916,   10.47044,    0.64767,  -23.26884,  -10.61353,
+-673.00159,   63.06639,    4.17435,  -13.07201,   15.45242,   36.55398,   28.04820,    6.53190,   -2.03077,   -4.86843,  -10.15063,   -7.98050,   11.46151,
+-685.77118,   60.38826,   23.26720,    5.49815,   14.32310,   24.30405,   22.31143,   14.91874,   12.03119,    8.62008,    2.74104,    0.13998,    4.97190,
+-614.80969,  123.72738,   24.36467,  -23.45894,   -9.78909,   12.62901,   13.46521,    0.35274,   -5.22431,    3.50167,    1.96512,  -11.65986,  -19.05206,
+-570.55817,  138.50626,   23.04182,  -24.43203,   -6.62432,    8.97017,   -1.10296,   -6.29671,  -15.93489,    5.53342,   -1.25716,  -13.43966,  -28.57895,
+-445.96667,  164.02409,    5.72825,  -52.08717,  -16.37173,   10.28557,   10.33937,   -2.31468,  -20.52966,   15.33060,   -3.55347,  -16.33257,  -28.28063,
+-363.43756,  175.12576,   -3.31680,  -66.65984,  -19.85510,    7.41258,   11.93293,   -0.79320,  -16.91802,   20.56325,   -0.02419,  -12.53419,  -39.70355,
+-348.60983,  154.19067,    7.74570,  -50.03997,  -22.13355,    9.42086,    9.85655,    9.36244,   -5.75583,   21.20298,   -6.69417,   -8.00366,  -43.66351,
+-299.13873,  152.12788,  -11.62845,  -42.77829,  -31.78709,   -0.61493,   -5.46732,    9.17835,   -5.86130,    9.14817,   -5.92584,   -9.86393,  -49.09785,
+-279.24234,  134.64542,  -43.43766,  -36.45545,  -21.69882,  -16.28008,   -5.64642,   13.52591,   -1.48913,   11.07259,  -13.52461,  -16.82686,  -39.25970,
+-260.71298,  136.22865,  -44.57975,  -29.85570,   -0.64486,  -38.38213,  -18.33903,    5.89145,   -3.89952,   12.23704,   -3.22323,  -23.71099,  -20.92175,
+-244.48389,  133.28445,  -43.79402,  -22.31293,    4.11721,  -55.92643,  -25.76093,   17.25046,   -9.47253,    0.42447,   -5.67624,  -16.34599,   -8.27315,
+-258.41626,  114.99637,  -39.90332,    1.50976,    8.22684,  -57.25970,  -31.64858,    1.77440,  -21.77207,   -4.49708,   -6.35045,   -1.23350,   -9.94049,
+-293.08508,   99.34319,  -16.11116,   17.69371,   15.47070,  -62.74282,  -27.08352,    4.12698,  -20.45372,  -10.08534,  -17.34487,   -5.33286,  -20.24701,
+-322.00287,   94.11205,   -0.92652,   37.83418,   21.11624,  -52.57660,  -18.44728,    4.90179,  -30.57641,  -17.70811,  -27.24849,  -12.71308,  -22.68225,
+-360.38376,   87.69393,   15.29972,   68.40858,   17.43580,  -39.63292,   -1.59294,    1.32824,  -37.38486,  -21.12629,  -25.94076,  -13.80269,  -27.75978,
+-401.70505,   90.96419,   29.30173,   78.28263,    3.20327,  -36.78372,    6.16998,   -7.54714,  -28.99337,  -21.18590,  -14.36380,    4.06708,  -33.08428,
+-533.28723,  137.39876,   49.16436,   72.20885,    7.80102,  -24.72589,   -3.93477,  -15.49783,  -23.35331,  -18.65767,  -14.67795,   -4.94262,  -18.59274,
+-559.62939,   99.69369,   62.95110,   83.08356,    7.80114,   13.37880,  -17.57888,   -7.87949,  -14.74117,  -25.68275,  -16.59367,  -13.87330,   -6.59394,
+-555.69965,   67.18806,   52.50816,   79.44274,    2.79971,   21.60576,  -20.30817,  -11.56905,  -17.36839,  -27.29060,  -18.14963,  -12.88813,  -10.80527,
+-659.99139,   90.88692,   74.82683,   53.60613,   17.83161,    7.39822,   -9.09811,  -16.35573,  -20.83104,  -22.41822,  -18.70988,  -18.33362,  -14.70294,
+-679.79871,   83.09547,   68.24111,   49.89501,   30.46873,   14.45928,    3.91992,   -3.76449,   -8.50756,   -9.65265,  -10.31525,  -11.33202,  -11.55049,
+-694.87091,   62.41616,   49.22509,   35.81430,   26.22110,   19.58934,   13.44967,    6.70528,   -0.06228,   -5.94130,  -10.83276,  -15.16693,  -18.84751,
+-704.53339,   49.78053,   40.19272,   32.00471,   26.16905,   21.18073,   16.54406,   11.00089,    3.29591,   -4.95220,  -11.12703,  -14.73515,  -16.49860,
+-704.69830,   50.06087,   41.28493,   33.35400,   26.99703,   20.23875,   13.06462,    6.38402,   -0.09129,   -5.92407,   -9.17170,   -9.74002,  -10.29155,
+-711.46802,   42.55208,   37.13642,   29.97435,   22.53142,   15.76887,   10.13004,    5.37198,    0.79322,   -3.90029,   -8.15694,  -11.21932,  -12.86519,
+-723.13409,   27.21255,   24.66596,   20.84755,   16.27658,   11.48368,    6.89734,    2.77970,   -0.77472,   -3.78793,   -6.32338,   -8.42078,  -10.06509,
+-443.93698,   -1.74865,   -9.79181,    7.66294,  -18.64954,   -5.27232,    4.84549,   -8.48673,   -2.54492,    2.67439,   -6.86648,    9.85871,   -8.21330,
+-298.20532,  -12.81320,   17.29125,    6.56532,  -15.89673,   -1.43100,    8.31953,  -10.98549,    9.37294,    0.49440,   -3.70998,    7.79895,   -6.09313,
+-305.63287,  -56.60079,   37.23157,   15.93787,  -16.12873,    4.72155,    3.36984,   -4.53316,   12.89923,   -6.25745,   -5.42213,    9.98214,   -5.26571,
+-316.28519,  -90.52562,   34.93086,   42.75752,    6.76751,    3.31615,   -5.30959,    6.70043,   21.56020,  -10.07466,   -6.29718,   21.09662,    2.53661,
+-329.53720,  -94.12029,    6.18531,   40.50994,    4.35451,  -12.12563,  -13.27101,    7.24133,   15.15652,  -10.72804,   -3.78922,   17.08343,    4.88286,
+-356.77383,  -52.07880,  -15.00291,   42.41784,   -2.45872,  -20.72002,  -19.36626,    7.91365,    4.72626,   -4.90424,    3.93229,   13.72323,    3.81743,
+-388.43564,  -18.23531,  -27.64051,   39.90910,    6.87263,   -9.67537,  -18.85973,    6.46791,   10.94759,   -4.51365,    8.38604,   13.82587,   -0.89720,
+-387.53278,   42.73358,    6.46609,   43.05339,   20.04885,  -11.90844,  -10.72181,   17.58882,    1.21852,  -11.54529,   -6.57513,    3.74334,  -10.30171,
+-361.15170,   93.01609,   18.34750,   34.17667,   21.55042,  -20.90072,  -19.98984,    8.97430,   -5.22827,   -7.51887,  -19.58678,  -12.16964,  -14.88791,
+-343.59412,  101.69102,   16.34492,   12.79201,   13.97989,  -26.50590,  -36.06129,    2.05754,    0.81474,   -9.14219,  -33.64646,  -17.92052,  -23.68695,
+-335.24365,  113.71022,   19.48219,    0.26569,   10.15661,  -21.69938,  -33.86705,  -11.23172,   -0.19690,   -1.78176,  -14.47228,   -4.76587,  -17.37306,
+-299.25641,   99.93545,   -9.58726,   -9.46401,    9.96207,  -10.53954,  -35.09438,  -15.00333,   10.62438,   -2.10113,   -6.79275,   -6.00083,  -22.96282,
+-300.10519,   78.59589,   -6.51480,  -16.16937,   -0.94357,  -15.15780,  -43.71510,  -21.76927,    1.60866,   -1.99735,   -8.69847,  -12.43583,  -22.55209,
+-316.80902,   93.42959,   -0.82785,  -12.93124,  -14.51613,   -7.83749,  -37.18201,  -28.08782,   -6.06824,    4.80437,   -6.88215,  -16.59713,  -22.29524,
+-315.29916,  115.42698,   -1.13148,  -10.75052,  -13.06001,   -7.73907,  -24.59613,  -41.00932,  -12.86884,    5.27404,   -5.81072,   -9.62144,  -26.91442,
+-314.75229,  124.12968,   -2.79560,  -17.03026,  -28.89275,   -8.95922,   -6.59420,  -40.73174,   -9.84872,    5.15444,   -4.32795,    1.96284,  -24.17693,
+-315.53088,  125.58240,    1.15098,  -21.96985,  -34.33059,   -3.54398,   -6.85529,  -44.57242,  -21.80232,    7.20194,   -8.49010,    4.75513,  -28.38153,
+-316.27704,  122.26854,    9.06494,  -27.00614,  -40.43912,    0.67930,   -6.98057,  -49.63099,  -22.58922,   -2.52189,  -11.50818,    9.91990,  -27.45758,
+-327.35529,  117.16550,   21.98269,  -17.33347,  -38.99503,    6.68010,   -1.65017,  -50.80903,  -26.47403,   -4.14860,  -13.12196,    7.10704,  -30.10763,
+-321.23111,  106.84170,   34.31313,   -3.68023,  -30.01686,    5.29732,   -6.57700,  -42.91172,  -27.53443,    4.61466,  -15.36086,    3.52533,  -30.84628,
+-324.52029,  105.49486,   25.03466,   -2.60415,  -28.69174,   -0.12828,  -14.06143,  -39.43727,  -33.95476,    5.75513,  -19.13151,   -2.93614,  -36.38286,
+-317.18118,  106.27744,   28.27160,    3.54661,   -1.14089,  -12.54203,   -3.93085,  -28.66591,  -23.39810,    4.34814,  -23.34138,  -20.87079,  -33.98920,
+-327.57474,   93.39848,   30.33432,   12.20178,   10.78983,  -17.81099,   -5.48535,  -11.80645,  -23.51105,   -2.96250,  -22.57767,  -28.34293,  -28.73708,
+-350.31647,   85.08986,   36.08148,   28.87788,   15.04847,  -26.97350,  -11.33844,    2.60015,  -23.01023,  -16.96572,  -23.07828,  -27.98988,  -21.04955,
+-376.05798,   72.38734,   42.25750,   45.36614,   23.51564,  -37.08350,   -7.10778,    5.91058,  -30.25048,  -26.47700,  -17.96576,  -24.60368,  -30.84109,
+-404.26224,   65.94995,   51.06128,   50.59633,    6.64929,  -35.64878,    6.40939,    9.16480,  -41.30687,  -34.50303,  -11.83757,  -20.59805,  -30.04825,
+-443.86591,   52.20867,   70.20848,   71.01749,   11.28605,  -30.21029,    5.79169,    0.37297,  -39.64886,  -34.88003,   -4.04763,  -22.88266,  -22.50964,
+-487.70062,   47.62605,   94.98031,   83.99281,   14.70511,  -14.94850,   11.23262,   -5.88986,  -38.03238,  -40.28688,  -16.84157,  -20.98334,  -20.05816,
+-509.07642,   45.77028,  109.92744,   81.87650,   13.95934,   -3.93742,    4.11268,   -9.91554,  -32.80961,  -30.89524,   -9.98727,  -14.64280,  -30.88258,
+-522.71735,   37.61763,  103.68540,   78.68625,   16.01972,    4.56800,   11.92203,  -22.13283,  -29.86579,  -30.24809,  -12.04046,  -10.16577,  -26.49791,
+-508.07632,   30.67447,   94.83904,   71.36203,   24.34888,    7.39304,   20.89282,  -12.73135,  -29.18987,  -23.50452,  -10.04839,  -18.02681,  -21.11977,
+-481.59796,   31.90848,   78.80377,   63.13389,   25.43876,    3.49658,   18.26456,   -5.80285,  -22.66960,  -22.49039,  -17.23462,  -30.48423,  -30.81418,
+-456.96207,   45.49911,   62.68452,   71.53724,   20.47784,  -28.85520,    8.76649,    4.74806,  -28.93201,  -33.62452,  -22.59154,  -30.95151,  -38.00834,
+-438.81244,   64.58253,   53.13954,   72.63129,   29.09319,  -37.28661,    3.45708,   15.12676,  -35.47618,  -49.79375,  -16.69294,  -19.46603,  -34.32941,
+-423.95709,   80.28170,   27.77286,   54.04255,   39.76050,  -35.75346,   -3.38681,   12.29888,  -34.48137,  -55.19286,  -26.09116,  -20.89586,  -38.82964,
+-403.37570,  104.78390,   24.31571,   33.62110,   43.22993,  -32.68417,   -9.63470,   14.40468,  -29.44122,  -32.80064,  -27.87226,  -12.14832,  -21.32968,
+-410.64990,  113.51939,   21.66384,   25.88121,   47.00960,  -13.49685,   -1.19114,    2.34893,  -34.86524,  -13.70483,  -30.08947,  -20.01185,  -20.18216,
+-427.86404,  115.69196,   16.82162,    8.77996,   38.88261,    4.62155,   10.18594,  -17.62808,  -42.41760,  -11.70966,  -29.65791,  -37.22931,  -38.67917,
+-434.29660,  124.90443,   30.81101,   -1.94971,   34.90073,    6.41934,   21.23090,  -18.56267,  -52.61283,  -14.50310,  -15.40610,  -29.62020,  -44.02092,
+-454.99860,  127.80815,   49.49559,   -4.71944,   25.74934,    7.45291,   30.37157,  -19.19380,  -64.06045,  -27.05679,  -21.07340,  -19.17959,  -28.23726,
+-461.24274,  134.59407,   68.29501,  -15.07210,   12.94805,   -5.15533,   36.96617,   -8.80068,  -58.84946,  -30.21778,  -30.54121,  -18.83973,  -18.17796,
+-479.60336,  144.00020,   72.91606,   -9.99038,    1.21133,   -7.48206,   32.60101,    1.88745,  -43.98568,  -33.80843,  -34.62660,  -27.18499,  -11.38533,
+-505.77020,  149.12779,   79.25552,   -6.04475,   -6.48688,   -8.97785,   32.86127,    1.98450,  -35.43898,  -35.60764,  -33.81352,  -25.21284,  -15.70421,
+-513.59387,  154.25208,   83.21911,   -4.70393,   -4.05527,  -10.33386,   28.84863,    3.08010,  -28.15909,  -32.38344,  -26.96810,  -31.97985,  -30.05245,
+-530.85712,  154.80107,   93.09445,    2.43585,  -10.55350,  -12.89960,   16.57527,   11.23611,  -14.67146,  -28.25472,  -30.90336,  -29.62308,  -33.68346,
+-545.02936,  157.65283,   85.82580,    4.90056,    1.98147,   -2.92201,   10.70440,    6.61972,  -24.46090,  -30.23070,  -33.71283,  -23.79030,  -31.37379,
+-549.22186,  155.82300,   71.25284,    2.24713,   14.28724,   -5.89741,   11.94555,    8.34093,  -16.32330,  -24.46994,  -35.22298,  -26.59025,  -29.61477,
+-555.90649,  153.10989,   36.65089,    3.84110,   16.78571,    6.35293,   10.35865,   -2.39851,  -21.93614,  -28.16301,  -27.44939,  -19.97972,  -20.11437,
+-557.76038,  144.97772,   20.05028,   -3.40184,   25.23508,   22.33108,   24.19692,   12.85208,  -13.60905,  -24.50617,  -32.56139,  -24.60412,  -19.16363,
+-565.04395,  141.75775,   23.26726,    1.44345,   24.35340,   23.82019,   24.81945,    8.61719,  -14.13487,  -16.99150,  -26.64034,  -16.34756,  -16.28925,
+-582.35852,  121.70802,   11.77862,    1.21382,   33.49820,   31.02796,   19.44608,   -4.32764,  -22.20745,  -13.69146,  -14.79044,   -1.90694,   -9.58287,
+-611.60425,  108.65694,   15.34908,    4.63596,   34.72903,   35.42127,   20.02589,   -6.36097,  -25.55186,  -17.19771,   -2.10331,   -5.88407,  -30.63498,
+-633.38940,   90.24216,   13.99240,   10.41656,   33.89569,   11.58191,  -12.36133,  -23.82138,  -21.01793,   -6.91555,  -11.57736,  -33.45514,  -32.55983,
+-638.89941,   90.62136,   31.36757,   37.06882,   41.14146,    0.38717,  -15.60635,   -5.89425,   -6.65146,  -10.05258,  -17.95158,  -25.66393,  -20.19134,
+-645.22919,   84.56592,   46.39761,   50.55693,   33.34886,  -18.71098,  -18.46934,   -6.45251,  -23.79868,  -33.81595,  -24.85833,  -19.18478,  -21.62932,
+-663.24762,   70.47253,   47.16746,   42.61106,   24.64014,  -20.18022,  -14.29461,   -8.25118,  -33.31351,  -29.12968,  -15.16687,  -13.82747,  -26.03916,
+-665.23572,   68.91484,   48.07513,   45.93549,   24.35101,  -22.22397,  -14.34225,   -7.24802,  -31.21640,  -26.50978,  -10.99041,  -13.64789,  -25.31266,
+-653.87531,   71.60163,   43.54386,   43.93507,   16.09889,  -32.49047,  -11.13548,   -4.03882,  -32.00384,  -24.84754,   -6.49042,  -19.24341,  -32.97263,
+-628.96997,   80.97196,   43.75434,   42.96486,    5.35637,  -46.30515,  -11.74355,   -5.22698,  -34.61658,  -31.77387,   -6.11563,  -21.50899,  -28.13975,
+-560.27863,   98.65417,   57.04360,   53.12490,   13.60819,  -37.92327,   -2.64569,  -10.87142,  -33.09066,  -27.77287,  -13.27444,  -24.04862,  -38.21613,
+-474.16153,  133.19215,   42.96102,   52.72581,   29.01019,  -33.03656,   -3.30715,   -8.54953,  -37.34371,  -24.96823,   -7.55104,  -21.57481,  -42.22615,
+-420.70679,  127.66073,   44.20655,   51.52517,   21.18233,  -36.80200,    1.18547,   -8.64668,  -31.38762,  -30.50883,   -6.14316,  -16.59294,  -44.98491,
+-392.38339,  118.34142,   35.92733,   60.44886,   14.10930,  -42.87946,   -6.38012,   -8.52512,  -43.05403,  -23.24982,  -14.38810,  -17.42284,  -28.54035,
+-396.14377,   91.24722,   33.84401,   68.58575,   13.68457,  -47.81595,  -10.30057,  -14.74097,  -43.99838,  -23.68055,   -6.89345,  -22.21245,  -22.73807,
+-375.81790,   84.50850,   37.38282,   64.55530,    9.26053,  -38.50275,   -6.90849,   -2.34685,  -39.99230,  -36.20174,  -11.40772,  -19.35306,  -40.25445,
+-371.31277,   86.60709,   26.88540,   60.70909,   13.63760,  -43.42980,  -12.22658,    0.11664,  -36.24310,  -31.65624,   -7.84330,   -6.56514,  -38.04145,
+-395.22690,  113.64909,   34.76160,   69.25298,    8.00502,  -51.12570,  -14.85159,   11.17280,  -27.47415,  -31.16954,  -15.57132,    2.17963,  -37.04792,
+-487.96347,  136.72539,   48.62033,   72.58236,    4.90202,  -34.16551,   -5.12197,   16.65520,    2.30252,  -26.79140,  -12.89626,   -9.70030,  -28.38115,
+-491.70081,  126.93477,   11.16320,   82.84847,   26.42068,    7.49833,   -2.51091,  -18.77224,  -12.22970,  -37.88863,  -36.79497,    3.01517,  -17.09411,
+-362.33643,   91.61451,    0.37455,   63.82765,   10.41564,   -0.94651,   -7.24294,   -5.33058,   -7.09231,  -31.30616,  -27.50639,   15.18285,  -14.38406,
+-360.52228,   96.28909,   25.21511,   62.68855,    4.91354,  -27.48291,  -18.13877,    1.86747,  -10.94692,  -27.01387,  -17.22662,   -2.00933,  -22.37263,
+-378.26196,  118.54053,    5.21113,   56.28373,    9.19872,  -38.01694,  -14.65021,    6.69412,  -28.87903,  -25.22076,  -15.05834,   -5.24249,  -24.69993,
+-370.16278,  114.58689,   -0.28570,   44.82927,   13.10141,  -42.67530,  -17.02056,   -0.04590,  -34.04948,  -21.32712,  -20.10828,   -6.89947,  -22.48342,
+-337.19305,  118.63881,   -3.91941,   22.77721,   19.59201,  -45.92442,  -31.26322,    2.50052,  -38.53117,  -19.03586,  -24.08696,   -8.85186,  -17.54709,
+-310.57822,  113.03319,   -9.06078,   25.27596,   11.55997,  -40.19213,  -39.65878,   -1.88564,  -33.22710,  -26.07192,  -22.41040,   -9.94286,  -18.82849,
+-311.33539,  103.68066,   -1.11024,   25.31038,    1.24793,  -40.32587,  -44.05034,  -10.81609,  -25.39709,  -27.82468,  -24.11249,  -15.82641,  -10.58237,
+-306.09283,  107.53571,   -5.71102,   15.36855,   -0.06519,  -32.78188,  -39.53238,  -17.80904,  -23.24977,  -21.61374,  -22.77439,  -18.94307,   -4.31926,
+-315.72760,  116.47948,  -11.70051,   10.31159,    6.36807,  -23.05539,  -34.21939,  -21.04945,  -18.21829,  -12.44790,  -29.04151,  -16.46194,   -3.99485,
+-335.40533,  122.68563,   -2.73751,   14.60683,    7.67535,  -21.95919,  -25.67969,  -26.21349,  -14.40325,   -9.32450,  -27.60385,  -19.34495,   -2.29705,
+-344.91006,   84.22801,   30.53672,   24.76007,   -7.96196,  -12.27603,  -28.83938,  -31.28870,   -7.10280,  -10.32913,  -26.31890,  -28.76020,  -10.16101,
+-321.74847,   22.61870,   67.62318,   22.66578,  -16.89212,    1.31448,  -41.29454,  -20.61598,   -4.62421,  -11.44328,  -19.23549,  -23.71359,  -19.15634,
+-320.57489,  -10.41486,   99.94828,   33.88570,   -1.77472,   28.93340,  -27.08552,  -21.86935,    2.15045,   -5.06805,  -18.29232,  -16.90594,  -15.15376,
+-325.89075,  -29.47031,  110.55493,   38.55762,    4.04195,   34.33043,  -26.90088,  -28.04365,   -4.17569,   -8.46432,  -19.69166,  -15.66487,   -7.47089,
+-336.47360,  -56.66702,   86.97776,   19.25002,   -2.79542,   22.82478,  -15.66427,   -0.37997,   10.49368,  -13.39484,  -25.38358,  -28.94642,  -16.30313,
+-323.85843,  -59.53122,   89.57014,   27.79789,   -0.33431,   17.84040,  -15.93314,    3.56822,   14.33489,  -12.46129,  -23.75436,  -14.04394,   -7.38174,
+-324.96545,  -75.17782,   83.45936,   19.04148,    1.78696,   22.14714,  -13.65047,    2.92450,   19.27539,   -2.63968,  -20.18465,  -11.90597,   -7.07332,
+-344.67255,  -79.84637,   80.44215,   23.84577,    0.79056,   25.22506,  -11.30942,   -1.17479,   24.93149,   -9.26643,  -17.22021,  -11.04599,  -16.54391,
+-375.36279,  -70.17471,   71.28268,   31.66566,   -7.46310,   13.73584,   -8.19228,   -9.15990,   12.89818,  -15.77331,  -23.41481,  -21.19809,  -21.89870,
+-412.11044,  -54.72255,   76.23882,   54.27297,    6.91382,   30.43379,   -0.04433,   -9.83065,    9.14938,   -3.71777,   -9.83891,  -10.77449,  -26.20202,
+-426.38629,    8.12202,   50.87331,   45.91777,   54.90336,   48.59229,  -14.05536,  -15.14324,   -3.37800,  -22.35563,  -19.86466,  -21.13762,  -22.59322,
+-483.17102,   95.93178,   29.22441,   35.87289,   58.79867,   21.23550,  -26.27444,  -23.48962,   -8.57341,  -29.70831,  -11.57309,  -18.66440,  -26.72654,
+-539.40594,  139.17160,   40.84406,   23.59950,   31.91476,    2.91482,  -27.79764,  -16.67805,  -36.13083,  -23.88976,   -6.00165,  -11.89510,  -23.69569,
+-550.31390,  146.30614,   46.67932,   37.03757,   44.81111,  -11.20804,  -17.97526,  -12.71701,  -36.34298,  -16.29894,   -2.04527,  -12.37814,  -25.78544,
+-550.08276,  142.76784,   43.96206,   30.36060,   46.46640,  -14.24652,  -13.37420,  -10.16631,  -33.66499,  -15.89499,   -3.76226,  -12.20420,  -20.20636,
+-547.64502,  144.29440,   43.40225,   36.58519,   45.52866,  -15.76632,  -11.51921,   -6.43776,  -38.47662,  -22.12944,   -9.12653,  -17.88100,  -19.03604,
+-530.69507,  150.77492,   39.30650,   34.92780,   48.19412,  -12.40477,  -13.61568,   -5.13870,  -44.81704,  -15.71391,   -6.85942,  -16.08999,  -23.19726,
+-531.73352,  148.31209,   40.27899,   35.28296,   51.28910,   -6.96135,  -11.41517,   -3.96197,  -44.39988,  -16.34683,  -13.13658,  -22.45674,  -23.91177,
+-528.42450,  148.31938,   43.70385,   33.69122,   47.01711,  -12.27729,  -16.49473,   -4.52656,  -41.69998,   -9.85081,  -11.73811,  -20.82237,  -22.63989,
+-524.53143,  152.69884,   41.16589,   21.22641,   41.17306,  -20.25027,  -21.31323,  -11.35616,  -40.42639,  -20.23978,  -14.69206,  -24.46453,  -22.25762,
+-533.03210,  141.29987,   46.16906,   21.69607,   45.43491,  -20.68425,  -27.40121,  -15.02421,  -35.13165,  -17.41097,   -7.54792,  -13.94088,  -19.49087,
+-504.09952,  108.60211,   45.97687,   37.09571,   17.71260,    5.86324,  -19.76870,  -17.16998,  -17.81991,  -28.20092,  -15.53811,   -4.63092,  -19.00638,
+-467.63785,  132.16171,   32.52523,   24.28167,    7.25442,   -0.63801,  -21.26180,  -24.28684,  -17.23636,  -23.55528,  -10.52019,   -9.29675,  -22.95332,
+-340.47134,  150.94380,   -5.40431,  -12.30841,  -14.63590,    3.29749,  -28.80212,  -23.54673,  -14.12508,  -13.87720,  -13.41590,  -17.71863,  -26.09510,
+-311.39139,  142.51981,  -31.06075,  -35.87051,  -10.02770,  -12.16096,  -18.78892,  -32.56214,  -13.80549,   -4.23693,   -2.31403,  -11.90334,  -32.74061,
+-309.15152,  124.61391,  -50.81188,  -38.51775,  -11.46098,  -20.72153,   -1.91621,  -40.46830,  -10.70336,    8.67581,   -1.28233,   -2.77227,  -38.88427,
+-310.65503,  124.23444,  -52.91621,  -40.31299,  -19.68514,  -23.62526,   11.31189,  -37.97126,  -13.66395,    6.95346,  -12.45460,   -3.08454,  -33.13107,
+-298.31958,  140.30038,  -60.75840,  -43.61348,  -29.72572,  -25.76282,    7.95005,  -35.32393,  -20.30392,    7.45490,  -14.43555,    5.52338,  -33.68083,
+-310.68411,  143.88361,  -43.75583,  -32.23655,  -43.31153,  -16.77195,    5.56395,  -30.31214,   -8.32603,   14.51808,   -9.60608,   11.15491,  -39.21754,
+-306.63290,  132.73161,  -40.05501,  -36.98214,  -53.05022,  -14.40135,    1.52464,  -39.32082,   -6.91366,   13.03398,   -8.60260,   11.39476,  -38.40683,
+-293.21274,  114.66545,  -52.86196,  -43.43966,  -49.01334,   -8.87678,    4.17357,  -36.09983,   -4.14086,   10.07351,   -3.47874,   12.86056,  -42.30226,
+-260.88785,  118.68002,  -46.41621,  -40.20872,  -33.20874,    1.55962,   20.05049,  -30.44283,   -3.89125,    6.33120,   -0.51390,   13.73246,  -42.64820,
+-248.72377,  125.34203,  -53.03514,  -45.62149,  -33.05993,   -4.37795,   12.62489,  -26.28844,   -4.05405,    0.75630,    2.51615,    6.27459,  -47.92072,
+-249.81819,  130.63123,  -62.14239,  -48.99425,  -34.38806,  -14.66482,    1.07221,  -27.83782,   -4.74374,   -0.83245,   -0.56152,   -0.98220,  -48.11487,
+-254.00978,  139.72881,  -59.63356,  -36.40792,  -26.36911,  -17.42650,  -19.30721,  -22.03000,   -0.97694,    7.48954,    3.50996,   -3.00547,  -50.41830,
+-259.76166,  154.54689,  -53.19246,  -16.99224,  -17.35365,  -11.15831,  -24.09927,  -17.77573,   -1.32666,    1.86994,   -4.33618,  -14.71345,  -36.14102,
+-309.31085,  176.01402,  -48.16504,    1.92940,   -9.54937,   -7.85120,  -30.84069,  -27.12883,   -6.02949,   -7.01642,   14.15697,  -17.98174,  -17.55932,
+-440.07883,  184.48796,  -10.16064,   18.17631,   16.42781,    0.29587,  -16.35007,  -20.31314,   -5.56250,   -0.70789,   13.50835,  -11.07479,  -10.24114,
+-512.24915,  192.43919,   20.11260,    9.00326,   24.41474,   -9.59827,  -25.85304,  -11.96010,   -2.19711,    6.27681,    9.08973,  -10.23279,  -17.25590,
+-545.09546,  175.38416,   27.32856,    9.03898,   28.14956,   -3.71783,  -21.98946,   -5.63140,   -3.17746,   -8.66310,    0.45472,   -1.61766,  -15.34482,
+-616.07855,  134.16933,   52.32460,   13.84887,   17.44582,   14.40052,   -4.27584,  -11.32673,    0.50363,   10.12419,    2.44672,  -13.78299,  -21.20637,
+-659.68634,   99.49026,   60.61839,   28.53442,   10.91960,   -0.92757,   -9.31487,   -8.36906,   -0.55846,    2.12741,   -4.53421,  -10.89314,   -8.77946,
+-659.05249,   96.39398,   51.13544,   18.32431,    7.06392,    6.12628,    6.43870,    3.02480,   -6.60868,  -16.90468,  -19.56609,  -15.09356,  -10.13031,
+-663.96637,   88.90488,   44.31673,   15.60063,    9.49454,   12.31807,   15.58250,   12.86089,   -1.57275,  -18.46472,  -21.38613,  -11.58452,   -3.48439,
+-705.61469,   48.35851,   37.74590,   26.64371,   18.58700,   13.84768,   10.08821,    4.86532,   -1.35519,   -6.30758,   -9.04604,  -10.25949,  -11.49900,
+-712.27972,   37.26599,   25.93010,   20.55217,   21.43903,   20.69118,   14.25117,    5.64500,   -0.06065,   -2.23915,   -3.81368,   -6.35554,   -9.13893,
+-722.03278,   26.32119,   20.04255,   16.95817,   17.41955,   16.11649,    9.82035,    1.73084,   -3.03804,   -3.87100,   -4.45093,   -7.37119,  -11.27701,
+-726.48999,   22.07387,   19.45728,   17.36243,   15.53367,   12.31727,    7.63438,    3.50081,    1.23575,   -0.28905,   -2.63978,   -5.22975,   -6.21708,
+-731.08289,   15.97149,   14.62836,   13.32377,   12.42178,   10.31140,    7.56272,    4.76615,    3.10965,    1.21597,   -1.16498,   -3.99053,   -5.54179,
+-639.79535,   51.71355,   -2.33925,   35.18297,   36.18015,   -6.28807,  -26.16285,   -0.99254,    5.17867,   -0.96490,   10.68179,    1.95577,  -11.31189,
+-342.22736,   74.86382,  -12.04188,   24.78247,   23.38870,   -5.64898,  -20.37819,   15.64958,   14.62847,  -11.82782,   -6.57900,   -3.53603,  -18.39786,
+-316.12149,   82.72071,  -19.31676,    7.00616,   11.48070,   -2.32272,   -9.79769,    9.02850,    8.73732,  -12.53925,  -13.31921,    3.73772,  -14.35109,
+-373.67056,   90.69460,  -30.11087,  -15.01380,  -11.97342,   -7.14060,   11.48161,    9.99608,    5.34673,    2.11251,   -9.52344,   11.62454,  -14.17081,
+-402.84872,   92.72632,   -4.53706,  -17.97655,  -24.18877,  -15.23140,   20.55283,    4.26547,   -1.90602,   16.05496,   -8.39785,   17.63147,   -7.58050,
+-408.00958,  104.34008,   22.46475,   -2.44329,  -14.62350,  -17.33055,   15.03711,  -14.86941,  -20.18334,   24.46267,  -28.20920,    3.93071,  -20.25869,
+-405.76697,  147.20627,   56.66483,    4.83606,  -36.89982,  -27.85701,    6.59308,  -20.22911,  -28.79591,   17.14229,  -37.56203,    8.35426,  -20.11530,
+-405.19531,  186.35690,   56.11123,    0.79771,  -63.96230,  -45.93291,    7.61355,   -7.51543,  -15.41443,   26.49616,  -35.26764,  -12.33839,  -28.09844,
+-415.56647,  186.05031,   44.84282,    8.57117,  -75.28368,  -39.46779,    8.06600,   -5.73941,  -16.75528,   23.65435,  -33.09233,   -8.24646,  -20.35406,
+-410.48975,  169.63432,   47.38409,   11.42275,  -82.42666,  -35.03646,    4.36853,  -12.49395,  -26.03498,   14.63939,  -41.48138,    3.48123,  -21.27683,
+-389.01846,  181.50140,   31.39800,   -0.73777,  -86.05359,  -40.73767,    1.15004,  -10.21134,  -17.95034,   12.57470,  -51.81875,    5.42645,  -29.16546,
+-381.36578,  190.97713,   16.56431,  -18.99318,  -74.91054,  -40.46955,    9.64043,    1.46569,   -9.14612,    3.86484,  -37.25309,    0.22394,  -36.43250,
+-372.44888,  197.29846,    6.56907,  -36.48407,  -43.23312,  -28.98909,   10.33254,    6.20580,  -12.04798,  -30.40288,  -25.32218,    7.00081,  -30.52537,
+-349.32806,  191.64467,  -14.09583,  -48.44706,  -17.40703,  -16.26879,   12.72570,  -10.09641,  -22.76518,  -50.48253,   -6.45452,    9.54748,  -21.54997,
+-329.09549,  185.53635,  -23.96144,  -48.33319,   12.20624,   -9.46398,   -1.35701,  -26.31596,  -37.73962,  -40.88706,   14.07668,   12.47700,  -22.13748,
+-332.91913,  172.24333,  -31.32884,  -38.86584,   27.30210,  -13.64118,  -27.55054,  -36.44904,  -34.19913,  -35.77820,   10.24152,    2.61219,  -29.05568,
+-337.38162,  159.34306,  -21.24244,  -19.63639,   37.31166,  -10.48006,  -53.06920,  -30.64360,  -13.26747,  -36.61865,   -3.26523,   -5.97771,  -30.19121,
+-345.73712,  148.88217,  -10.56683,    3.55900,   36.27192,  -20.22350,  -64.35509,  -16.89741,   -1.25741,  -43.80673,  -11.09250,   -4.66476,  -29.39306,
+-347.59207,  124.05372,    0.06424,   26.65538,   27.07813,  -24.55914,  -52.08172,   -9.33817,    0.87643,  -52.62959,  -13.25934,   -4.64068,  -38.93477,
+-354.77094,  107.03270,   18.57542,   39.82758,   21.07135,  -20.15565,  -32.71638,    3.82454,    3.26863,  -49.43832,  -18.47179,   -1.33855,  -46.21080,
+-356.82126,  101.29904,   31.65295,   48.51870,   25.42647,  -24.41973,  -17.62938,   -3.69525,   -6.80475,  -37.40614,  -16.25546,    3.79310,  -46.79686,
+-365.47476,   96.48830,   37.55275,   52.13327,   27.34974,  -23.96722,  -19.71255,   -2.85377,  -15.44656,  -31.10847,  -11.01326,    2.28878,  -38.16014,
+-359.25830,  100.04993,   35.95026,   43.66024,   34.67427,  -23.88166,  -25.05778,    6.28581,  -13.95853,  -29.20864,  -14.47804,   -4.28369,  -38.17802,
+-355.16251,   85.51714,   36.95945,   47.05676,   35.13097,   -0.48355,  -26.01568,    8.33860,   -0.76428,  -32.37434,  -24.03978,  -12.23794,  -24.79102,
+-345.82358,   53.52118,   50.42019,   43.07238,   20.82985,    2.91177,  -32.40328,    1.76590,   -0.75600,  -17.39132,  -24.83293,  -24.84604,  -18.59051,
+-324.37042,    6.48494,   81.98193,   59.58132,   13.82420,   18.43753,  -21.45969,    7.82956,    4.68797,  -16.76673,  -28.63046,  -22.80368,  -24.61898,
+-338.64651,  -20.17721,  102.06671,   56.37870,   10.54378,   17.93890,  -12.79192,    3.72052,   19.59299,  -18.45952,   -5.52712,  -10.50150,  -14.15830,
+-337.57449,  -38.65701,   94.49697,   55.52618,   16.52288,   26.58708,   -6.60422,    5.20680,   32.34816,  -10.49484,  -13.71105,  -17.84119,  -20.07737,
+-337.04196,  -30.74304,   83.06897,   40.65010,   20.80648,   36.09961,   -4.79771,    2.75117,   20.44530,    4.15405,   -9.48995,  -14.69443,  -17.01763,
+-336.17767,  -17.02739,   78.98351,   36.36460,   16.83785,   35.33120,   -8.01113,   -1.16322,   14.32056,   -6.75638,  -18.05978,  -11.20271,  -19.45627,
+-328.07965,    9.37859,   76.33435,   36.29006,   12.61380,   35.82531,  -24.38402,  -17.90148,   19.43253,   -9.25912,  -23.28895,  -17.65702,  -21.09180,
+-343.16101,   44.98497,   70.59290,   36.67994,   10.65938,   33.58757,  -31.46309,  -21.07189,    4.88002,  -12.56131,  -15.16683,  -23.74206,  -22.84709,
+-363.25851,   89.59911,   49.30536,   34.12471,    2.75580,   27.73447,  -31.61609,  -24.36949,    3.89285,  -13.43786,  -23.47494,  -20.88989,  -31.23467,
+-379.68423,  119.24084,   18.05355,   26.64109,   15.60474,   30.37321,  -26.09801,  -25.50461,    9.00627,  -30.22595,  -19.81620,  -21.95905,  -38.36639,
+-384.54666,  126.66396,   17.38682,   14.13732,   27.81340,   14.06393,  -21.93423,  -27.65716,    9.35011,  -42.40445,  -17.44700,   -9.82522,  -30.37819,
+-411.82861,  155.06801,    7.81988,   25.71399,   10.58142,   13.98584,  -20.39351,  -35.70902,   12.12937,  -33.90580,  -11.49447,  -10.75090,  -42.80706,
+-471.00290,  176.11607,   19.88964,   31.80215,   18.70531,   17.40353,  -24.72796,  -23.13475,    6.21466,  -30.76181,   -7.90854,  -19.20424,  -46.07262,
+-542.09521,  178.40500,   50.89020,   33.66317,   49.60354,   18.17146,  -17.65844,  -21.48166,  -25.04848,  -32.41996,  -11.10730,  -10.62945,  -27.44338,
+-550.66718,  182.16162,   54.56665,   27.04737,   54.47807,   31.37173,   -6.15687,  -21.02319,  -22.85120,  -24.10654,  -19.48920,  -21.63028,  -22.44670,
+-552.81726,  182.10162,   61.26754,   35.03073,   55.85181,   30.13055,   -5.99490,  -20.07623,  -22.07219,  -15.74288,  -13.91844,  -20.16744,  -18.97942,
+-544.18488,  182.36761,   52.82781,   36.16469,   61.39413,   25.15055,   -9.71565,  -14.11956,  -18.60657,  -17.49442,  -10.51644,  -15.87521,  -21.88856,
+-545.78558,  179.03738,   48.88223,   33.75148,   62.84162,   29.09242,   -6.05286,  -11.99398,  -17.85251,  -15.68026,   -6.50234,  -12.05964,  -23.38323,
+-556.52777,  174.80112,   53.80671,   37.43137,   57.72126,   27.46006,   -3.14888,   -9.04027,  -15.06365,  -11.37029,   -2.66824,  -11.51523,  -24.39712,
+-549.42841,  171.00031,   42.87871,   42.80640,   66.08316,   25.29501,    0.87917,   -1.86104,  -17.41379,  -17.45526,    0.62682,   -9.37598,  -19.51379,
+-550.77026,  167.68494,   41.31839,   47.43911,   71.51474,   23.08547,   -3.54858,   -2.01599,  -12.36597,  -15.21634,    0.98496,   -9.53740,  -16.19566,
+-562.23907,  162.02208,   49.44933,   45.88921,   66.58150,   24.05586,   -8.63106,   -3.62967,   -6.04240,   -3.92589,   -1.60562,   -7.13539,  -11.40836,
+-567.48071,  162.70137,   47.84641,   42.31034,   64.06474,   30.14901,   -2.78371,   -6.70905,  -10.95013,   -6.79315,    1.08683,   -7.31497,  -17.66081,
+-592.04895,  154.20142,   67.06769,   50.96314,   57.81846,   34.39915,    9.02027,   -1.97011,   -9.80261,  -11.53745,  -13.48275,  -23.37712,  -21.63716,
+-613.96185,  142.23486,   78.04945,   54.53412,   50.37206,   35.27765,   16.71364,   -0.16995,  -10.51157,   -7.81608,   -7.27338,  -18.19815,  -22.58065,
+-623.37231,  130.30595,   76.90309,   64.94444,   58.26167,   31.72890,   12.44767,    0.89875,   -7.31113,   -8.87330,  -11.26855,  -16.62859,  -12.09391,
+-526.01825,  145.78355,    8.95888,   52.16813,   28.99513,   -5.08013,   13.08779,   14.38430,   -0.01122,  -10.31202,   -7.53272,   -7.29460,   -3.43278,
+-539.64673,  138.42181,   12.10800,   48.64116,   26.21812,  -13.02563,   10.41339,   16.91183,    3.32470,   -6.08288,   -2.11641,   -6.44468,   -5.93290,
+-589.82617,  122.51987,   21.44257,   41.49991,   42.71370,    3.13264,   10.15284,   24.20997,   14.37974,    9.17556,   -4.46364,  -21.85761,  -16.65999,
+-615.26050,  104.61245,   14.61877,   24.35236,   35.20853,    5.54551,    6.43138,   22.46386,   18.52065,    9.82759,   -5.80420,  -27.75697,  -25.72497,
+-655.27783,   74.97298,   18.20997,   29.73637,   36.75604,    5.38053,   -3.63343,   13.44123,   18.08150,    6.55374,  -10.95804,  -22.64592,  -16.10758,
+-683.23322,   59.71490,   28.18122,   30.36807,   34.32085,   18.50830,    7.70230,   11.60670,   14.50619,    7.28390,   -7.20995,  -17.80128,  -17.05165,
+-709.21967,   34.49238,   17.61381,   18.90655,   19.67831,    7.15575,   -1.46977,    1.13926,    2.01570,   -3.91360,  -10.35604,  -12.89073,  -11.23378,
+-722.60254,   27.00973,   23.59079,   21.18510,   18.54302,   13.69143,    8.24810,    4.72475,    2.12363,   -1.78975,   -6.01705,   -8.09017,   -8.43185,
+-728.82135,   19.60254,   18.29690,   16.35365,   14.01246,   11.45263,    8.74696,    5.88674,    2.85985,   -0.26681,   -3.31179,   -6.01459,   -8.12518,
+-734.40045,   11.88858,   11.12416,   10.03389,    8.64481,    6.90780,    4.89620,    2.83119,    0.88499,   -0.93537,   -2.64846,   -4.13302,   -5.20602,
+-731.09973,   16.23312,   15.63525,   14.62359,   13.13073,   11.01530,    9.38444,    7.01467,    4.70279,    2.58447,    0.73818,   -1.51889,   -2.83358,
+-735.99713,    9.36690,    9.22009,    8.00824,    7.25840,    5.54003,    4.38853,    2.40805,    1.12161,   -0.83802,   -1.98246,   -3.65658,   -4.42722,
+-738.08246,    6.74858,    6.11811,    5.14963,    3.94640,    2.62023,    1.27304,   -0.01320,   -1.17665,   -2.16874,   -2.94603,   -3.46665,   -3.69432,
+-734.35925,   12.00047,   11.33683,   10.30780,    8.95957,    7.32947,    5.49645,    3.58400,    1.70265,   -0.08561,   -1.73316,   -3.16493,   -4.30174,
+-734.30115,   11.98556,   11.23580,   10.41712,    9.47419,    8.09429,    6.28417,    4.45523,    2.87658,    1.35736,   -0.34371,   -2.03668,   -3.31543,
+-738.17822,    6.62347,    6.20253,    5.86356,    5.53534,    4.91368,    3.97001,    3.02845,    2.28791,    1.54555,    0.55870,   -0.53031,   -1.38146,
+-739.94824,    4.22052,    3.90312,    3.39999,    2.74741,    1.99142,    1.18364,    0.37680,   -0.37978,   -1.04404,   -1.58425,   -1.98085,   -2.22703,
+-739.30322,    5.06824,    4.56438,    3.77272,    2.76009,    1.60996,    0.41392,   -0.73753,   -1.76363,   -2.60055,   -3.20636,   -3.56323,   -3.67687,
+-739.16473,    5.30410,    4.91553,    4.30079,    3.50576,    2.58837,    1.61301,    0.64460,   -0.25719,   -1.04301,   -1.67751,   -2.14146,   -2.43210,
+-736.69739,    8.79853,    8.42094,    7.81059,    6.99461,    6.00839,    4.89334,    3.69428,    2.45682,    1.22480,    0.03817,   -1.06882,   -2.06871,
+-734.32904,   12.03986,   11.37942,   10.41253,    9.27072,    8.04052,    6.73659,    5.32101,    3.75596,    2.05790,    0.32033,   -1.30946,   -2.68754,
+-736.46539,    9.08386,    8.58840,    7.80864,    6.79541,    5.60690,    4.31370,    2.99494,    1.72147,    0.54269,   -0.51056,   -1.41694,   -2.16573,
+-738.00793,    6.90498,    6.52955,    6.14000,    5.71911,    5.11078,    4.31552,    3.53233,    2.87486,    2.21075,    1.38225,    0.46470,   -0.34030,
+-738.29486,    6.57672,    6.30999,    5.88031,    5.30815,    4.61892,    3.84067,    3.00211,    2.13129,    1.25494,    0.39838,   -0.41441,   -1.16096,
+-735.73694,   10.02796,    9.55337,    8.62896,    7.59865,    6.26828,    4.98420,    3.55015,    2.27467,    0.94200,   -0.18489,   -1.32611,   -2.24739,
+-738.12238,    6.82689,    6.57912,    6.18188,    5.65690,    5.03126,    4.33449,    3.59570,    2.84085,    2.09071,    1.35968,    0.65559,   -0.01955,
+-741.35187,    2.32154,    2.25504,    2.14647,    1.99904,    1.81698,    1.60526,    1.36934,    1.11486,    0.84744,    0.57248,    0.29505,    0.01979,
+-740.19116,    3.91596,    3.71056,    3.37813,    2.93304,    2.39441,    1.78518,    1.13102,    0.45907,   -0.20331,   -0.82985,   -1.39657,   -1.88286,
+-740.28094,    3.82164,    3.71215,    3.53285,    3.28839,    2.98509,    2.63071,    2.23421,    1.80547,    1.35500,    0.89357,    0.43194,   -0.01951,
+-738.56226,    6.22831,    6.04752,    5.75127,    5.34703,    4.84492,    4.25744,    3.59908,    2.88593,    2.13516,    1.36458,    0.59208,   -0.16482,
+-737.59711,    7.48435,    7.10050,    6.68635,    6.21458,    5.52307,    4.61379,    3.69611,    2.90172,    2.11949,    1.20903,    0.25253,   -0.55514,
+-738.57526,    5.76306,    5.26624,    4.74333,    4.66980,    3.88802,    2.90043,    1.82335,    1.50358,    1.10149,    0.47930,   -0.44566,   -0.81899,
+-724.99268,   -0.10466,  -15.73566,   14.00270,   17.04775,  -10.95862,   -4.33519,   15.78423,    2.44723,   -9.77599,    3.77438,    7.40308,   -4.98057,
+-590.63898,  -39.88918,  -61.68854,   29.76473,   38.49112,  -12.07083,  -15.84209,   22.42212,   -4.31226,    9.27367,   -4.15463,   10.12855,  -12.81028,
+-520.53040,  -62.00702,  -56.77345,   34.64658,   41.82232,  -11.03334,  -17.87015,   16.52698,   -0.77704,    5.50097,  -10.93985,   13.53583,  -21.96571,
+-499.40854,  -82.09811,  -42.77442,   46.67083,   30.14816,  -10.77432,   -8.14084,   19.69935,   -3.97295,    7.10202,   -9.52753,   17.72063,  -19.13954,
+-478.88480, -102.54325,  -33.41099,   51.24611,   22.43158,  -15.02392,  -12.73046,   18.12399,   -5.56858,   20.43665,   -5.20860,    1.63608,  -22.93487,
+-460.00089, -117.45983,  -38.14782,   44.41587,   10.85175,  -18.42480,  -20.85704,   13.42610,   -5.06648,   14.77578,   -5.41554,    5.98919,  -12.92177,
+-436.08902, -106.75754,  -37.54352,   47.05707,    6.49411,  -21.96540,  -20.56840,   11.17224,   -4.91976,    8.21666,   -9.43517,    0.02851,  -24.14723,
+-431.53085, -104.52063,  -31.69811,   55.99023,   14.07409,   -9.67273,   -6.03402,   21.91988,  -14.17605,    6.90253,  -10.94309,    6.77816,  -18.33216,
+-424.59906,  -86.83882,  -22.08900,   53.29281,   19.05461,   -7.95386,   -2.32602,   19.13455,  -19.69125,    8.10068,   -6.92678,   10.93707,  -16.15567,
+-428.36624,  -67.50560,  -24.48224,   50.47601,   18.74273,  -20.39020,  -20.49356,   16.66978,  -11.89109,    1.08991,   -8.05492,    5.10515,   -8.56974,
+-443.08276,   -8.88845,  -10.48011,   66.38592,   49.91155,    0.86849,   -0.34684,   22.84564,   -2.74701,    0.58778,  -17.34853,    5.22805,  -11.46131,
+-435.82764,   95.80535,   13.62339,   80.46363,   55.52112,   -7.25954,   -1.67090,   10.80670,  -10.50134,   -8.81252,  -25.66192,   -3.25990,  -20.18513,
+-381.94879,  131.20715,  -16.48029,   87.01087,   53.16800,  -45.39627,   11.92146,    9.28672,  -14.34239,  -15.28063,  -32.94108,    3.39632,  -20.16990,
+-374.69403,  118.91750,  -17.20040,   82.15328,   56.67689,  -41.36109,   23.95814,   13.94576,  -15.61728,  -15.42536,  -38.30678,   13.34375,  -29.81994,
+-369.38788,  124.81142,  -24.51602,   89.74030,   48.55617,  -41.11355,   18.53158,    8.42735,  -15.37730,  -14.26523,  -28.02233,    9.68363,  -36.25220,
+-386.45721,  118.97467,  -22.82434,   96.50023,   47.94357,  -37.79622,   16.12708,    1.16924,  -14.44053,  -24.05315,  -24.62144,   17.51671,  -29.46925,
+-421.42725,  115.36848,  -14.01150,   98.95058,   45.11883,  -34.03223,   18.23173,    2.81380,   -6.00298,  -30.70661,  -15.66134,    8.52229,  -39.76482,
+-468.87555,  111.35516,   16.96186,  108.35189,   44.64090,  -28.17288,    8.54648,    1.14605,   -1.83844,  -36.53164,   -6.91851,   17.54620,  -42.04927,
+-544.56995,  101.10758,   43.59412,   97.50617,   41.32880,  -20.49871,    6.59254,   11.98400,   13.62090,  -35.46710,   -5.78840,   22.58328,  -32.60872,
+-616.66064,  102.26636,   52.12772,   74.47034,   45.83502,    0.88920,   13.82385,   27.56186,    4.32556,  -31.13667,   -0.50148,    8.55910,  -24.87976,
+-655.08875,   92.81599,   66.07819,   64.82114,   50.34473,   17.12009,    7.09327,    7.61381,    1.25385,  -12.30105,   -2.86482,   -1.24810,  -11.74414,
+-667.78241,   79.23113,   64.03854,   57.02592,   57.56951,   27.23013,    9.59921,    5.18198,    7.68584,   -4.19990,   -8.00458,   -7.87641,   -6.57486,
+-642.40674,   94.75227,   25.83233,    5.45235,   27.99678,   28.74962,   15.73191,    4.30192,    4.12479,    2.92348,    2.88622,   -2.28952,   -9.06624,
+-451.78699,   99.16212,  -27.62571,  -31.75214,   31.80745,  -16.08509,   11.18785,  -14.27908,  -21.10685,    7.97357,   -0.75501,   -2.21972,   -6.87012,
+-401.80478,  109.05980,  -40.16762,  -28.47931,   26.69852,  -14.71886,   13.88773,  -17.41035,  -25.91043,    4.41777,   -1.47560,   -4.54047,   -9.88411,
+-368.46060,  117.97938,  -37.87859,  -40.05217,   16.11098,  -17.78066,   33.12175,   -9.39918,  -22.65516,   -2.05613,    5.48190,    3.70603,  -14.99805
+};
+
+static const float golden_diff1_features[] = {
+-123.11830,    0.99917,    0.95805,    0.89408,    0.81248,    0.71794,    0.61364,    0.50104,    0.38071,    0.25359,    0.12199,   -0.01007,   -0.13747,
+-110.86054,    0.82501,    0.79184,    0.73540,    0.66041,    0.57449,    0.48119,    0.37892,    0.26721,    0.15073,    0.03548,   -0.07627,   -0.18402,
+ -86.10514,    0.80844,    0.77220,    0.70644,    0.61741,    0.51769,    0.41308,    0.30020,    0.17814,    0.05537,   -0.05868,   -0.16374,   -0.26398,
+ -49.11975,    0.55242,    0.48541,    0.43367,    0.39057,    0.31347,    0.20146,    0.10639,    0.05811,    0.02169,   -0.04557,   -0.12705,   -0.17475,
+   0.19521,    0.21516,    0.12044,    0.11689,    0.17158,    0.15369,    0.05109,   -0.00531,    0.05060,    0.11282,    0.06911,   -0.02435,   -0.03706,
+  -0.03262,   -0.08807,   -0.14386,   -0.11539,   -0.03314,   -0.00671,   -0.04884,   -0.05501,    0.02827,    0.11541,    0.11466,    0.06971,    0.08476,
+  -0.22049,   -0.33602,   -0.36584,   -0.34196,   -0.28473,   -0.26232,   -0.28089,   -0.27253,   -0.20086,   -0.11662,   -0.07589,   -0.05276,    0.01411,
+  -0.25332,   -0.37332,   -0.39287,   -0.38077,   -0.34722,   -0.32975,   -0.32956,   -0.30655,   -0.24162,   -0.16621,   -0.11195,   -0.06195,    0.01795,
+  -0.10887,   -0.15171,   -0.14795,   -0.14679,   -0.14613,   -0.13917,   -0.12300,   -0.10187,   -0.08020,   -0.05580,   -0.02353,    0.01600,    0.05628,
+   0.14574,    0.22539,    0.25125,    0.23819,    0.19844,    0.18125,    0.19373,    0.18966,    0.14405,    0.09475,    0.08440,    0.09461,    0.07662,
+   0.15581,    0.25311,    0.29410,    0.25368,    0.16032,    0.10641,    0.10988,    0.08252,   -0.01615,   -0.11151,   -0.11978,   -0.07825,   -0.07926,
+   0.30504,    0.46966,    0.49986,    0.39949,    0.21782,    0.10238,    0.08256,    0.03093,   -0.11686,   -0.25540,   -0.27020,   -0.22181,   -0.24756,
+   0.69681,    0.83032,    0.56994,    0.48308,    0.48805,    0.30629,   -0.04563,   -0.26607,   -0.23658,   -0.18923,   -0.31124,   -0.45747,   -0.41045,
+   1.23411,    1.01172,   -0.00456,    0.21409,    0.97355,    0.66618,   -0.46384,   -0.82240,   -0.14151,    0.23893,   -0.31966,   -0.84641,   -0.49297,
+   1.76171,    0.80587,   -1.22535,   -0.45464,    1.02315,    0.71143,   -0.59803,   -1.19359,   -0.41006,    0.70317,    0.35665,   -0.79858,   -0.53647,
+   3.43839,    1.20394,   -2.84728,   -1.25620,    1.11030,    0.74963,   -0.45219,   -1.08916,   -0.48705,    0.89677,    0.41597,   -1.13295,   -0.54123,
+   6.29922,    1.56643,   -4.70324,   -1.21880,    1.29313,    0.77561,   -0.27214,   -1.02235,   -0.60671,    0.62004,    0.43811,   -0.68649,   -0.38170,
+  13.59902,    2.97291,   -7.69089,   -1.19724,    1.34852,    0.10822,   -0.16015,   -0.54947,   -0.66831,    0.77170,    0.77724,    0.56974,   -0.44725,
+  25.95202,    3.48014,   -9.57049,   -1.29846,    1.17726,    0.15919,   -0.36061,    0.04513,   -1.06441,    1.13393,    1.13645,    1.74329,   -0.98233,
+  35.41563,    3.74347,   -9.29239,   -1.40323,    0.30726,    0.36464,   -0.50191,    0.71997,   -1.83411,    0.12763,    0.01438,    1.52732,   -1.34014,
+  40.30910,    3.88652,   -8.24915,   -0.51924,   -0.68049,   -0.03190,   -1.15086,    0.78199,   -1.46009,   -0.44920,   -0.90312,    0.88450,   -1.12363,
+  41.16010,    4.18969,   -6.31749,    0.48709,   -0.62803,   -0.33113,   -2.02391,    0.56536,   -1.08399,   -0.61680,   -1.58262,   -0.17104,   -1.31953,
+  36.85773,    4.19310,   -4.33543,    0.52477,   -0.77216,    0.08440,   -2.05214,    0.95521,    0.29329,   -0.04903,   -2.08752,   -0.69174,   -0.55677,
+  26.98730,    3.02555,   -2.70108,    0.37827,   -0.98518,    0.42249,   -1.58129,    0.48110,    0.75456,    0.96493,   -1.02983,   -0.70425,   -0.47341,
+  14.50198,    3.08342,   -1.43540,   -0.41395,   -0.26288,    1.25355,   -0.47332,    0.79696,    1.54798,    1.79086,   -1.01742,   -1.27096,   -0.19327,
+  -0.07425,    3.51203,    0.07904,   -0.84623,    0.57152,    1.84925,    1.18436,    0.97503,    1.68712,    1.80404,   -0.87783,   -0.97168,    1.01794,
+ -10.13729,    6.59868,    0.20801,   -2.22731,    0.70834,    0.99239,    2.04797,    1.25381,    2.11591,    1.73793,   -0.78743,   -0.58378,    1.70931,
+ -11.73542,    9.55152,    0.23723,   -3.87789,    0.81732,    1.30697,    2.35846,    0.37123,    0.84172,    1.45737,    0.26195,    0.25325,    1.43181,
+ -12.08789,   10.97621,    0.84113,   -5.59512,    0.54512,    1.70936,    2.80604,   -0.04408,   -1.23794,    0.64584,    0.67573,   -0.32758,    1.31251,
+ -14.45271,   10.03827,    2.16457,   -6.36324,   -0.71855,    1.59761,    3.24396,   -0.39643,   -1.34466,   -0.12180,    0.68246,   -1.69113,    0.68083,
+ -18.53185,    6.60991,    5.65825,   -4.11071,   -0.05131,    2.15530,    3.25167,   -0.76546,   -1.56379,   -1.75907,   -0.10137,   -2.19705,    1.11219,
+ -21.35056,    3.05293,    9.36903,   -1.03400,    0.00783,    2.01184,    3.33418,    0.55118,    0.17739,   -1.68767,    0.23982,   -1.36500,    1.70118,
+ -18.56425,    2.78826,   11.28176,   -0.03004,   -1.78994,    0.82329,    2.50660,   -0.06341,    0.09623,   -1.57193,    1.14418,   -1.09023,   -0.12693,
+ -12.09316,    3.36681,   11.47227,    0.95308,   -2.17463,    0.00065,    0.84474,   -0.54763,   -0.33692,   -1.05079,    1.07330,   -0.80153,   -2.42432,
+   1.92679,    5.35752,    9.80011,   -0.02818,   -2.80453,   -0.67148,    0.68485,   -0.32753,   -1.23095,    0.20005,    0.88925,   -0.09440,   -3.41398,
+  19.79073,    8.85031,    7.22205,   -2.59490,   -3.92287,   -2.03960,   -0.02755,    0.15578,   -1.13285,    1.33972,    0.17429,    0.10092,   -4.90758,
+  35.92577,   11.48686,    5.10447,   -3.74352,   -4.61698,   -2.36022,   -1.00173,    0.19538,   -1.15090,    1.75878,   -0.54673,    0.65150,   -6.24128,
+  50.58400,   13.03088,    0.42639,   -4.54247,   -5.20881,   -3.31127,   -2.88928,    0.01554,   -1.66646,    1.81067,   -0.44956,    0.39215,   -6.96486,
+  57.90758,   10.98468,   -5.91219,   -5.56255,   -5.41425,   -4.90112,   -3.53827,    0.57130,   -0.89262,    1.92968,   -0.92637,   -0.95299,   -7.09069,
+  55.78551,    5.89209,   -9.03530,   -3.58417,   -2.52814,   -5.95845,   -3.81914,    0.76729,   -0.29327,    0.83804,   -1.38007,   -1.59041,   -3.67697,
+  46.80977,   -0.83933,   -9.70238,    0.72430,    0.84962,   -7.95729,   -4.29974,    2.43014,    1.13752,   -0.20215,   -1.03846,   -0.79795,    0.57891,
+  35.46388,   -4.72663,   -8.90094,    4.67138,    2.66211,   -9.68076,   -5.10884,    1.80854,    0.66877,   -1.86039,   -0.66617,    0.29346,    2.94240,
+  19.55447,   -8.28039,   -5.55247,    9.20015,    4.92099,  -10.90987,   -6.07571,    0.76598,   -0.32883,   -3.58855,   -1.15677,    0.78949,    3.67301,
+   7.47528,   -9.40369,   -1.98193,   12.06493,    6.37570,  -10.15639,   -5.08030,   -0.06683,   -2.30887,   -4.74815,   -2.23084,    0.41731,    4.12727,
+  -2.35128,   -8.86452,    2.02752,   14.25492,    6.66997,   -7.73172,   -2.34869,   -1.13136,   -4.27439,   -5.14893,   -2.52870,    0.22870,    3.19781,
+ -13.74784,   -8.39473,    7.58204,   16.23704,    5.20402,   -4.16565,    0.95284,   -1.97663,   -4.40917,   -4.80555,   -2.17866,    1.63009,    1.38432,
+ -28.90904,   -3.94742,   12.48695,   16.28066,    2.81784,    0.13804,    2.36518,   -3.08546,   -3.78945,   -4.59171,   -1.65770,    2.07464,   -0.09225,
+ -40.26587,   -3.22518,   14.64699,   15.65972,    0.61256,    6.07845,    2.82745,   -2.91284,   -1.93971,   -4.22240,   -1.75182,    1.26154,   -0.45747,
+ -45.14349,   -3.95551,   14.24252,   13.35371,   -0.66332,   10.23118,    2.24892,   -3.26564,   -0.24511,   -3.25066,   -1.04008,   -0.10879,   -0.11971,
+ -50.70501,   -2.20058,   13.77331,    8.13219,   -0.59765,   10.97492,    1.83205,   -2.69995,    0.97870,   -2.27968,   -0.32133,   -1.40878,    0.84365,
+ -51.82294,   -1.78247,   11.21226,    3.38317,    0.42440,   11.02288,    1.51470,   -2.02442,    2.18843,   -0.48708,    1.11811,   -0.94949,    1.98539,
+ -49.81170,   -3.51574,    7.56374,   -1.76232,    1.39623,    9.76060,    1.62028,   -0.36254,    3.84997,    1.17318,    1.67293,   -0.91917,    1.80862,
+ -44.15802,   -5.91185,    3.48952,   -5.78543,    2.65587,    8.07939,    1.97629,    1.60731,    4.55197,    2.19508,    1.27429,   -1.31118,    1.56218,
+ -35.33823,   -8.08526,    0.15498,   -7.07355,    3.57980,    6.18474,    2.92167,    2.86992,    3.89624,    2.65474,    0.84629,   -1.42729,    1.20335,
+ -24.67462,   -9.85952,   -2.72238,   -7.17991,    2.86062,    3.23167,    4.07403,    3.24118,    3.37722,    2.99099,    1.17120,   -0.22057,   -0.06190,
+ -20.59121,   -7.97999,   -4.90647,   -7.59573,    1.78547,    0.12186,    4.10282,    2.56175,    2.72723,    3.25732,    1.48873,    0.67668,   -0.26983,
+   3.07428,   -9.33687,   -7.83053,   -7.12828,   -1.75935,   -1.53312,    2.67727,    1.46145,    2.30059,    3.12121,    1.47116,    2.10630,    0.50347,
+  34.85448,  -12.44948,   -8.60693,   -5.78039,   -5.09658,   -1.93558,    0.88214,   -0.10276,    2.24627,    2.23317,    1.37225,    3.08518,    1.09415,
+  53.15696,  -15.17300,   -5.60713,   -4.74609,   -6.88502,   -2.72789,   -0.78592,   -1.64544,    1.69279,    0.83795,    0.87184,    3.41102,    1.33665,
+  63.19269,  -18.34933,   -2.68293,   -1.60527,   -5.52794,   -2.98085,   -2.15557,   -1.58699,    2.18150,   -0.01729,    0.79118,    4.58937,    2.20473,
+  65.03039,  -20.59490,   -2.70460,    0.33127,   -4.29067,   -3.65004,   -3.10802,   -0.79441,    2.44594,   -0.59979,    0.76763,    4.64011,    2.38635,
+  58.15821,  -18.48174,   -4.17419,    1.99928,   -3.14752,   -4.23100,   -3.76360,    0.39203,    2.04124,   -0.63182,    1.11693,    3.96532,    2.29718,
+  43.36550,  -12.39132,   -5.47534,    3.43893,   -0.83615,   -3.45579,   -4.07687,    1.14879,    1.74518,   -0.71960,    1.67511,    3.23933,    2.07236,
+  22.79780,   -1.72378,   -3.69967,    4.69732,    2.31691,   -2.70338,   -3.56008,    2.56122,    0.69024,   -1.13102,    1.02780,    1.32513,    0.84953,
+  -2.38226,   11.01462,   -1.65994,    4.38537,    5.09022,   -2.44627,   -3.58302,    2.97971,   -0.93223,   -1.13723,   -0.36051,   -1.66610,   -0.48844,
+  -9.15842,   20.82118,   -2.51988,    1.32690,    4.36041,   -3.41942,   -4.40026,    1.89496,   -2.22513,   -0.65096,   -2.51034,   -3.45496,   -2.17831,
+  -4.90597,   28.78299,   -1.34937,   -2.74360,    3.06130,   -3.39814,   -4.09993,   -0.45970,   -2.64830,    0.34129,   -2.67252,   -4.07549,   -3.01268,
+   1.74398,   30.06878,   -0.49164,   -6.57672,    1.29566,   -1.78235,   -3.59079,   -2.52400,   -1.89671,    0.78753,   -2.28603,   -4.38701,   -3.96275,
+   7.34338,   24.49593,    1.15951,   -8.19852,    0.27615,   -0.33721,   -3.73858,   -3.92873,   -0.98650,    0.85332,   -2.07667,   -3.93494,   -3.94029,
+  10.45519,   16.79375,    1.48509,   -8.80962,   -1.72076,    0.61703,   -3.47419,   -5.23513,   -0.78920,    1.18348,   -1.49720,   -3.53585,   -3.28705,
+  11.18580,   10.93569,    0.14163,   -8.22567,   -3.87385,    0.79017,   -2.48016,   -6.75811,   -1.56071,    1.77140,   -0.15130,   -2.39039,   -2.57756,
+   8.62314,    5.68633,   -2.59710,   -7.38330,   -6.12817,    1.58600,   -0.15663,   -7.56769,   -1.31918,    2.21425,    1.82699,   -0.07501,   -1.56627,
+   4.85575,    3.24181,   -2.64459,   -5.65921,   -7.05089,    2.54483,    2.62323,   -6.91991,   -2.33872,    2.04650,    2.49293,    1.78403,   -1.23099,
+   2.03701,    3.38577,   -1.08578,   -3.92688,   -7.34940,    2.89644,    4.55796,   -6.29122,   -3.56426,    1.25358,    1.90528,    2.64444,   -0.91498,
+  -0.80505,    3.42489,    1.32204,   -2.31205,   -7.14935,    2.82134,    5.29194,   -5.34071,   -4.25586,    0.13365,   -0.09624,    2.46993,   -1.29939,
+  -2.81361,    3.51945,    4.71937,   -0.32877,   -5.78644,    2.50150,    5.30680,   -4.09004,   -4.64764,    0.12808,   -0.99124,    2.73573,   -1.09987,
+  -2.27606,    2.49080,    4.82849,    0.98120,   -3.68185,    2.29999,    4.26559,   -2.39404,   -4.11005,    0.06532,   -1.48285,    2.32967,   -1.51072,
+  -0.89890,   -0.35663,    4.83242,    2.02812,   -0.00512,    0.71252,    2.83080,   -0.13655,   -2.87700,   -0.21353,   -2.20828,    0.14064,   -1.50410,
+  -1.32203,   -3.28788,    4.86801,    3.59329,    3.33925,   -0.65978,    1.17374,    2.83331,   -1.87445,   -0.51870,   -2.48739,   -2.75273,   -0.93531,
+  -2.95602,   -4.93940,    4.74206,    6.03304,    6.66710,   -2.46849,   -0.35298,    5.41546,   -1.11451,   -1.58884,   -2.44900,   -4.84549,   -0.13159,
+  -5.67693,   -6.20691,    4.26896,    8.38822,    8.77156,   -4.73230,   -0.31846,    7.51461,   -0.41656,   -2.93236,   -1.65841,   -5.44101,    0.14973,
+  -9.32123,   -6.92015,    3.96077,    9.64051,    8.42496,   -5.98046,    0.60400,    8.73328,   -1.11180,   -4.11314,   -0.57883,   -5.09402,    0.24460,
+ -14.18911,   -7.83175,    4.75672,   10.62509,    7.19545,   -5.97903,    1.25377,    8.04866,   -1.43700,   -5.43428,    0.82436,   -4.04638,    0.94682,
+ -20.77600,   -8.30645,    7.26155,   11.64701,    5.45212,   -3.94525,    2.49760,    6.01494,   -1.69385,   -6.71214,    1.11581,   -2.55983,    1.50917,
+ -25.60518,   -8.60620,   10.57376,   11.97685,    3.51226,   -0.93216,    2.64148,    3.62231,   -1.49824,   -6.03131,    1.73962,   -0.48087,    1.12084,
+ -28.48710,   -8.54384,   11.43639,   10.75773,    1.08724,    2.34973,    2.50412,    0.15479,   -1.55349,   -4.62047,    1.82277,    1.66091,    0.56405,
+ -26.47807,   -7.74785,   10.66816,    8.20806,    0.76822,    4.70722,    3.37597,   -2.07676,   -0.75210,   -2.27726,    1.56973,    1.90455,    0.40052,
+ -20.38836,   -6.68279,    7.89335,    4.70084,    1.09125,    6.03361,    3.52933,   -2.70703,    0.57110,   -0.01144,    0.67969,    0.64763,   -0.18611,
+ -11.98435,   -4.37924,    3.71503,    2.29466,    1.19429,    4.08454,    2.16590,   -1.53341,    1.50450,    0.67063,   -0.69825,   -0.57534,   -0.57711,
+  -2.73807,   -1.20215,   -1.02834,    0.62445,    2.48680,    0.76224,    0.46599,    0.57219,    1.49698,   -0.24021,   -1.26501,   -0.70107,   -1.25617,
+   6.19413,    2.61517,   -6.91054,   -2.30359,    2.99197,   -2.33490,   -0.73984,    2.60685,    0.72150,   -1.79121,   -1.96885,   -0.67395,   -2.11103,
+  13.52636,    6.68200,  -11.03947,   -4.94872,    3.56298,   -4.77247,   -2.25040,    3.99700,    0.30644,   -1.53599,   -1.90471,   -0.24907,   -1.02465,
+  16.04592,   10.07306,  -12.51600,   -6.40530,    4.13849,   -4.61784,   -2.48754,    3.82767,   -0.50564,   -0.49293,   -2.65747,   -0.36906,    0.32286,
+  14.35237,   12.35609,  -11.84781,   -8.20980,    3.57165,   -2.36192,   -2.35247,    1.85376,   -1.43877,    1.02273,   -2.58947,   -1.12470,   -0.46274,
+   9.73970,   13.40854,   -9.21540,   -9.77718,    2.49565,    0.57999,   -0.93151,   -1.07202,   -2.64612,    2.08634,   -1.41460,   -0.62353,   -1.10912,
+   3.49330,   12.62119,   -4.85997,  -10.79564,    1.18898,    3.79537,    1.69124,   -3.31593,   -4.18121,    2.61258,   -0.39545,    0.24283,    0.03696,
+  -1.84747,   10.77017,    0.16821,  -11.92192,   -0.90363,    5.84449,    4.37664,   -4.18188,   -4.24437,    3.07181,   -0.42259,    0.11295,    1.16443,
+  -6.69855,    8.96735,    4.33632,  -10.70571,   -3.98391,    5.18672,    5.66782,   -3.40608,   -3.23547,    2.49260,   -0.94673,   -0.80631,    1.93462,
+ -11.40426,    7.45498,    7.96113,   -7.77649,   -6.53836,    3.37039,    6.13666,   -1.71124,   -1.95125,    0.44907,   -0.72452,   -0.69973,    2.27975,
+ -14.27764,    6.18340,    9.30103,   -4.99569,   -7.44876,    1.11961,    5.27760,    0.04002,   -0.09942,   -2.06586,   -0.54380,   -1.06767,    0.98289,
+ -15.09284,    5.75743,   10.08707,   -2.46157,   -7.77299,   -1.47011,    2.54240,    2.66415,    2.96622,   -2.81969,   -0.75924,   -0.36479,    0.75600,
+ -15.33435,    5.41592,    9.02124,    0.11162,   -6.05019,   -2.12545,   -0.31740,    4.02868,    4.68107,   -2.18970,   -1.29622,    0.36290,    0.98462,
+ -15.05021,    4.39790,    5.51100,    1.43249,   -3.43379,   -1.64553,   -2.34462,    3.77202,    6.13566,   -0.73397,   -1.83753,   -0.46790,   -0.02438,
+ -13.72513,    3.29787,   -0.04745,    2.07437,   -0.57272,   -0.02380,   -3.58655,    2.28870,    5.93155,    0.45545,   -0.58019,   -0.40121,   -0.99625,
+ -12.22198,    1.42758,   -5.25288,    1.90606,    2.39094,    2.75039,   -2.96300,    1.50009,    4.81733,    1.07018,    0.06479,    0.06655,   -0.98787,
+ -10.01205,   -0.37804,   -8.18648,    1.17609,    4.23761,    4.32519,   -1.64548,    0.76116,    3.26145,    1.87996,    0.50699,    1.20348,   -0.10082,
+  -8.75645,   -2.85586,  -10.75044,    0.57903,    5.52579,    5.70370,   -0.84751,   -0.24039,    1.66081,    2.39009,    1.33372,    2.56615,    1.76790,
+  -9.91855,   -5.40492,  -11.52912,    0.35217,    5.71640,    6.60860,    0.23005,   -1.26582,    0.18645,    2.18125,    2.74341,    3.40672,    1.84320,
+ -11.42108,   -8.08009,  -11.00284,    0.44441,    5.36715,    5.07123,   -0.97200,   -3.22489,   -0.54376,    2.61974,    3.56344,    1.52315,    0.84333,
+ -12.73294,   -9.61740,   -7.34149,    2.65644,    4.32692,    2.20847,   -2.72633,   -2.86079,    0.68873,    2.76868,    3.37408,    0.37999,    0.40724,
+ -13.84710,  -10.25110,   -2.25508,    5.39586,    2.95018,   -1.31748,   -4.62441,   -2.63310,   -0.17137,    0.86537,    2.27429,    0.08884,   -0.15712,
+ -14.84188,  -10.75873,    2.32538,    6.62349,    1.49554,   -4.92618,   -5.65451,   -2.16402,   -0.99870,   -0.18570,    1.54716,   -0.15523,   -1.03129,
+ -14.62582,  -10.17378,    4.48427,    7.53285,    0.05729,   -7.41222,   -6.38270,   -2.24648,   -1.87079,   -1.29221,    1.41200,   -0.04917,   -1.12492,
+ -11.98472,   -8.68415,    4.76730,    7.00370,   -1.35307,   -8.77491,   -5.33223,   -0.76328,   -1.94678,   -2.01072,    0.87653,   -0.80704,   -1.56335,
+  -6.68833,   -5.61523,    4.94088,    6.02469,   -3.40081,  -10.02078,   -3.68155,    0.56931,   -1.93419,   -2.55908,    0.42494,   -1.11725,   -1.20990,
+   2.81004,   -2.02520,    4.70157,    5.01186,   -3.81974,   -8.93846,   -1.26274,    0.67761,   -2.15123,   -2.31932,    0.14151,   -0.30736,   -0.77184,
+  15.24441,    3.16399,    3.06654,    3.39242,   -2.77780,   -6.01506,    1.52849,    0.88032,   -2.74911,   -1.95009,    1.27164,    0.70505,   -1.87823,
+  27.13629,    6.04094,    0.94129,    1.37315,   -2.23185,   -4.18834,    2.30917,   -0.34200,   -2.37557,   -0.96387,    1.79692,    0.01351,   -3.13576,
+  36.91251,    7.70456,   -0.79154,    1.48468,   -1.34173,   -2.89329,    2.08928,   -0.31521,   -1.40975,    0.63808,    1.15078,   -0.36513,   -2.05920,
+  41.80196,    6.59528,   -1.48675,    2.87300,   -0.67878,   -2.79773,    1.21568,   -0.70548,   -1.32912,    0.45099,    0.36933,   -0.66049,   -0.57649,
+  42.39352,    3.75095,   -1.67266,    3.02999,   -0.70875,   -1.71865,    0.77996,   -0.28122,   -1.43765,   -0.34925,   -0.20487,   -0.26833,   -0.61056,
+  38.32924,    0.68278,   -2.31969,    2.84187,   -0.21468,   -0.83297,   -0.13737,    0.29246,   -1.01017,   -0.51026,   -0.25605,    1.08342,   -0.19962,
+  28.71867,   -0.65356,   -2.46608,    2.81041,   -0.60524,   -0.96247,   -0.99773,    1.74791,    0.02007,   -0.41452,   -0.49988,    2.43381,   -0.14864,
+  10.69030,   -0.37141,   -1.52464,    2.49809,   -1.96297,   -0.80192,   -1.19818,    3.21631,    2.74220,   -0.49875,   -0.38280,    2.44637,    0.95079,
+  -4.21305,   -0.19767,   -2.05400,    3.22323,   -1.19091,    2.63238,   -0.57677,    1.48780,    4.00736,   -1.07241,   -2.34252,    2.89817,    1.96701,
+  -4.45865,    0.02820,   -3.71148,    2.15166,   -0.41589,    5.15389,   -0.32820,    0.98058,    4.91290,   -0.80492,   -2.81405,    3.91624,    2.47771,
+  -1.99250,    0.79772,   -2.89936,    0.71907,   -0.35009,    5.05768,   -0.36603,    0.89149,    5.55362,   -0.60737,   -2.15034,    3.59069,    1.76190,
+   0.64822,    2.79693,   -3.79425,   -0.58293,   -0.31688,    3.59744,   -0.47969,    0.95906,    3.68599,    0.25640,   -1.84443,    2.73738,    1.88444,
+   3.28015,    2.27138,   -4.71726,   -1.90106,    0.02296,    1.33422,   -0.94024,   -0.19434,    1.15872,    1.37669,   -1.23947,    1.17146,    2.57427,
+   9.37088,    1.06541,   -5.01879,   -4.62926,    0.43655,   -0.45519,   -1.95563,   -0.39005,   -1.49931,    1.56708,   -1.05569,   -0.54155,    2.12925,
+  16.96761,   -0.90822,   -5.84950,   -6.81510,    0.50724,   -2.14934,   -3.56798,   -0.75367,   -3.51565,    1.38109,   -0.25178,   -1.43665,    1.40476,
+  21.50877,   -1.69229,   -4.89472,   -7.69609,   -0.54430,   -4.54768,   -5.23466,   -0.75794,   -4.32952,    1.02574,    0.03743,   -1.93897,    0.99259,
+  17.27320,   -0.13019,   -2.49389,   -8.23005,   -1.82934,   -5.20975,   -5.30269,   -0.40506,   -2.55345,    1.39355,    0.78113,   -3.33895,    1.27909,
+   9.05269,    1.69877,   -2.70827,   -7.29207,   -0.80949,   -1.77445,   -4.22542,   -2.64609,   -1.22710,    1.36135,   -0.71990,   -3.35986,    2.12678,
+   7.36781,    1.17238,   -2.84311,   -6.44386,   -0.70203,    1.53942,   -2.44470,   -4.07329,    0.88151,    1.66190,   -1.48027,   -2.23438,    3.09518,
+   4.75160,   -2.04617,    1.36224,   -4.19334,   -2.04990,    3.63767,   -1.47533,   -4.89096,    3.27745,    1.88681,   -1.29670,   -2.59379,    2.67214,
+   1.94100,   -7.31669,    6.28434,   -1.98404,   -3.42142,    5.51068,   -0.86725,   -4.04228,    4.28021,    1.90879,   -0.30868,   -2.44035,    1.25195,
+  -1.05833,  -13.52023,   11.86317,    0.57902,   -3.02504,    8.18123,    0.93464,   -3.38367,    4.89950,    2.45062,    0.39102,   -1.66330,    0.19091,
+  -2.49104,  -18.57310,   16.17573,    1.79826,   -1.45206,    9.74734,    1.72970,   -2.56075,    4.12025,    2.68600,    0.63560,   -0.79943,   -0.06874,
+  -2.59974,  -23.43774,   16.58014,    1.67555,   -0.74508,    9.68651,    2.50153,    0.24997,    4.18836,    1.83014,    0.56718,   -0.79837,   -1.19192,
+  -1.49893,  -26.44437,   16.21926,    2.22600,   -0.49411,    8.23197,    2.48956,    2.55461,    4.43638,    0.67917,    0.51508,    0.02263,   -1.07525,
+   0.17367,  -27.45265,   13.55627,    1.32274,   -0.18477,    6.72377,    2.53765,    3.99385,    4.53051,    0.44450,    0.80651,    0.69672,   -0.46945,
+   0.04410,  -24.98162,    8.70683,    0.25714,    0.56338,    5.31583,    2.75320,    4.54420,    4.71225,    0.21563,    0.73014,    1.51762,   -0.42208,
+  -3.28887,  -18.07655,    2.45797,   -0.15476,    0.96318,    2.42861,    3.50636,    3.80064,    3.69052,   -0.23977,    0.16358,    1.33120,   -0.38106,
+  -9.19778,  -10.13179,   -1.92130,    1.50227,    1.27064,    0.86660,    4.24795,    2.30520,    2.57223,    0.13229,    0.53934,    1.08597,   -0.95556,
+ -13.00829,   -0.81566,   -5.66277,    1.93589,    3.78529,    0.93587,    2.53763,    0.98734,    0.55445,   -0.94121,    0.56234,    0.27065,   -1.77174,
+ -18.76268,   11.84327,   -7.87458,    2.24731,    6.62282,    0.69497,    0.74281,   -1.08260,   -1.26590,   -1.79175,    1.22720,    0.14458,   -2.47265,
+ -25.99911,   24.02445,   -7.24912,    2.09671,    7.14326,   -0.18926,   -1.15170,   -3.18595,   -5.27186,   -2.12673,    2.03488,    0.60253,   -2.13838,
+ -31.28606,   31.60418,   -7.03757,    1.48232,    7.48913,   -2.45022,   -1.44005,   -2.90936,   -7.53694,   -2.10945,    2.40383,   -0.14134,   -2.40903,
+ -31.94234,   35.32645,   -6.11949,    0.83866,    7.35700,   -4.76190,   -1.40555,   -1.92809,   -8.52276,   -1.93904,    2.40511,    0.09211,   -1.40625,
+ -28.75794,   34.47496,   -4.98783,   -0.16244,    6.55911,   -6.28123,   -1.09982,   -0.52298,   -8.61766,   -1.30856,    2.01304,    0.09461,   -0.08601,
+ -22.37448,   30.00859,   -3.71303,   -1.16607,    5.12686,   -6.68807,   -0.77428,    0.78317,   -7.70137,   -0.47778,    1.83486,    0.38777,    0.36698,
+ -15.51739,   22.34031,   -2.45110,   -1.67907,    2.42308,   -7.06228,   -0.00384,    1.56840,   -6.59758,   -0.12398,    0.54929,   -0.50547,    0.43699,
+  -8.89583,   12.31876,   -0.03110,   -0.47453,   -0.34662,   -6.05444,    1.16067,    2.17346,   -4.67122,    1.67708,    0.31698,   -0.40014,    0.26673,
+  -1.26582,    4.44218,    0.64815,   -0.45421,   -0.17520,   -3.35307,    1.11054,    1.79210,   -2.85642,    1.33460,   -0.91608,   -1.23376,    0.36333,
+   2.70118,    0.71353,    0.01867,   -0.82814,    0.83380,   -1.81299,   -0.24275,    0.40755,   -0.50411,    0.53273,   -1.06812,   -1.10424,    0.29433,
+   4.74178,   -2.34778,    0.06226,   -0.96192,   -2.02295,    0.66886,   -1.19536,   -0.69350,    1.14850,   -0.70856,   -1.35563,    0.13132,    0.38962,
+   7.71573,   -2.73441,   -0.39019,   -1.05507,   -4.26551,    1.49125,   -1.56280,   -1.93073,    2.51715,   -0.93571,   -0.81998,    0.89451,   -0.03053,
+  17.80878,   -1.92802,   -3.36182,   -3.93137,   -7.20354,    2.14663,   -1.99473,   -2.71323,    3.99794,   -0.36306,   -0.47921,    1.05937,   -0.24241,
+  26.55011,   -1.69229,   -7.26775,   -7.14862,   -8.89414,    1.35240,   -1.34739,   -3.56304,    4.77341,    0.29911,    0.31556,    1.23076,   -0.70165,
+  32.91570,   -2.08066,  -11.59069,   -9.47287,   -9.53222,    0.20750,    0.37125,   -4.39626,    4.81612,    2.05855,    1.25449,    2.06052,   -1.68883,
+  35.40212,   -2.26355,  -14.47091,  -10.66311,   -9.46641,   -0.53875,    2.96014,   -4.37613,    4.12767,    3.24393,    0.83255,    2.11693,   -2.09055,
+  35.30202,   -0.97347,  -16.03527,  -10.94610,   -9.24308,   -1.59276,    4.52284,   -3.65974,    2.70928,    4.61573,    0.38373,    2.56052,   -2.26927,
+  30.86695,    1.05409,  -14.93660,  -10.22094,   -9.13342,   -2.48704,    5.11750,   -2.66507,    1.83895,    5.30424,    0.05566,    2.63695,   -2.60124,
+  22.42946,    1.53519,  -11.75891,   -8.88198,   -7.90977,   -3.31742,    4.48760,   -2.26071,    0.96900,    5.55024,    0.30507,    3.01267,   -2.36594,
+  13.52437,   -1.77012,   -8.01396,   -5.71224,   -7.08577,   -1.67191,    4.18823,   -1.41550,    1.25624,    4.19230,    0.24781,    3.83969,   -2.03469,
+   6.29797,   -2.94556,   -3.31295,   -2.05268,   -4.96755,    0.37324,    4.42386,   -0.47072,    1.38078,    2.33410,    0.60536,    4.04449,   -1.66715,
+   7.03388,   -1.88699,   -0.89831,   -0.72831,   -3.98922,    2.31390,    2.84756,    0.91529,    1.53131,    0.41264,    0.75684,    2.66646,   -1.58468,
+   8.59103,   -0.75111,   -0.43501,   -1.03709,   -2.40834,    2.40848,    0.64505,    1.49241,    1.49464,   -1.05527,    1.36277,    0.88936,   -1.70518,
+   9.02918,   -0.30275,   -0.93235,   -0.50864,   -0.00630,    1.64730,   -1.84104,    1.71915,    1.81658,   -0.94907,    2.29689,   -0.44372,   -2.23498,
+   8.03955,    0.84996,   -1.02862,    1.12941,    2.55989,    1.00710,   -3.25440,    2.13028,    1.70638,   -1.34126,    1.69704,   -2.57947,   -1.14129,
+   3.92637,    4.26742,   -1.43864,    3.36519,    4.77079,    0.20147,   -4.80717,    1.80189,    0.52371,   -2.19936,    2.02969,   -4.02197,    1.19553,
+  -9.75186,    7.95319,    1.89195,    6.87313,    7.24508,    0.38969,   -4.94622,    2.20894,    0.13242,   -1.80711,    2.24500,   -4.14295,    3.29014,
+ -25.74727,   10.56297,    6.98925,    8.53384,    8.44463,   -0.16862,   -5.69018,    2.25549,    0.03712,   -0.81912,    1.86413,   -3.81732,    4.50172,
+ -39.38715,    9.53511,   10.49757,    8.89239,    8.93848,    0.04543,   -5.49953,    2.53636,    0.02893,   -0.96121,    1.03970,   -2.43473,    5.16357,
+ -50.86744,    5.08216,   14.87293,    8.96620,    8.74975,    2.25109,   -2.36884,    2.40114,    0.27089,    0.14961,    0.52958,   -1.54921,    4.95654,
+ -58.32141,   -1.38571,   17.60396,    8.66702,    7.29410,    2.72607,    0.21255,    2.49070,    0.35523,    0.19951,   -0.24277,   -0.63393,    4.78122,
+ -58.97495,   -7.18837,   17.04962,    6.17018,    4.73773,    2.75655,    3.24712,    2.91209,   -0.07952,   -1.17464,   -2.15621,   -0.31728,    3.84731,
+ -53.48480,  -12.16156,   14.36180,    3.41863,    2.32079,    2.62316,    5.10355,    3.95882,    0.16645,   -1.69142,   -3.53495,    0.29989,    2.53144,
+ -44.41793,  -17.75593,   10.04019,    2.15446,    0.66357,    2.61836,    5.61286,    4.24551,    0.40771,   -1.43346,   -4.32993,    0.17271,    1.08880,
+ -32.49360,  -20.53106,    3.83417,    1.33373,   -0.75217,    2.92861,    5.26812,    3.42742,    0.34384,   -1.50851,   -3.15650,   -0.04079,    0.94127,
+ -25.40067,  -21.01723,   -0.83224,    1.31692,   -0.78758,    3.13710,    5.08402,    2.37012,    0.02091,   -1.24625,   -1.78009,    0.05981,    1.12072,
+ -19.91983,  -18.48783,   -3.51829,    0.58294,   -0.29967,    2.00412,    3.52609,    1.75950,    0.22128,   -0.11042,   -0.35183,    0.31160,    1.07019,
+ -13.91170,  -14.94708,   -5.91401,   -0.55662,    0.44003,    0.86219,    1.72723,    1.50295,    0.40767,   -0.00982,    0.65065,    1.28056,    1.03996,
+  -4.63321,   -9.80123,   -7.14623,    0.09051,    2.13378,   -0.11032,   -1.33640,    0.21459,    0.93396,    1.34634,    2.63592,    1.67171,   -0.02679,
+  21.24445,   -4.62768,   -7.42309,    0.91250,    2.11867,   -1.97277,   -4.06952,    0.10994,    1.92382,    1.49673,    2.75147,    1.67524,   -0.69527,
+  43.62434,    1.22208,   -7.76417,   -0.23891,    0.78057,   -2.94695,   -4.60009,    0.11306,    1.76363,    0.24628,    1.19909,    1.69104,   -1.04623,
+  56.04261,    7.20722,   -8.21888,   -2.89665,   -1.99220,   -3.58552,   -2.67945,    0.90029,    1.54129,   -0.23016,   -0.35601,    2.21120,   -0.76100,
+  58.20672,    9.91913,   -6.27579,   -4.32141,   -4.46382,   -4.31170,   -0.54358,    0.68694,    0.73825,    0.89305,   -1.00545,    2.85541,   -0.52620,
+  54.42525,   11.74144,   -2.81250,   -4.47458,   -5.34716,   -4.12288,    1.39709,   -0.72710,   -1.16623,    2.54309,   -2.55042,    2.44672,   -1.00524,
+  44.90937,   14.39153,    2.49791,   -4.05870,   -7.44950,   -4.38335,    2.39249,   -2.48273,   -3.55761,    3.12409,   -4.36542,    2.07686,   -1.46756,
+  29.78906,   17.28297,    7.11228,   -3.67632,  -10.60783,   -5.43260,    3.32754,   -2.87728,   -4.27145,    4.27696,   -5.32469,    0.24385,   -1.89313,
+   8.23970,   16.90738,    9.96211,   -2.83619,  -13.45532,   -5.24715,    4.28713,   -2.86439,   -4.64102,    4.91937,   -5.47223,   -1.09461,   -1.38145,
+ -10.62254,   15.58126,   11.06381,    0.09486,  -13.33739,   -5.31992,    2.18137,   -3.60659,   -5.12573,    4.40507,   -4.65969,   -1.08478,   -1.16525,
+  -7.07778,   15.01011,    9.46250,    1.74451,  -12.55043,   -5.24038,   -0.16576,   -2.61809,   -3.76376,    2.58781,   -5.10532,   -1.42833,   -1.89937,
+  -0.06750,   13.94813,    5.54204,    1.12110,  -10.18889,   -4.28095,   -1.42396,   -0.97186,   -1.76278,   -0.27610,   -4.38760,   -1.66195,   -2.60128,
+   3.82889,   12.16779,   -0.54229,   -2.07004,   -6.23017,   -2.32188,   -1.18671,    1.19706,    0.06024,   -4.47695,   -2.15927,   -0.72798,   -2.52633,
+   6.81479,    8.40311,   -6.48447,   -5.94777,   -1.04667,    0.17513,   -0.01482,    1.86478,    0.85430,   -8.31264,    1.68402,    0.95341,   -1.03125,
+   9.82745,    3.55038,  -10.67489,   -8.01563,    6.79512,    2.96815,   -0.11098,    0.09600,   -0.52539,   -9.69904,    5.21271,    1.82310,   -0.39903,
+  11.45684,    0.03036,  -11.73270,   -8.08089,   13.33979,    4.47437,   -2.38381,   -2.60420,   -2.09416,  -10.26572,    7.00157,    2.26133,   -0.18476,
+  11.62225,   -1.50441,  -10.69765,   -6.47235,   17.22651,    4.44808,   -5.70378,   -3.58756,   -1.06231,   -9.22693,    7.28444,    0.49821,   -0.56244,
+   9.23613,   -3.31189,   -8.60070,   -2.32909,   18.41258,    3.72011,   -8.72706,   -3.12103,    0.62269,   -7.85225,    6.69340,   -0.94240,   -0.20668,
+   5.98558,   -7.52313,   -4.65974,    3.67510,   16.53122,    2.75163,  -10.03322,   -2.52747,    1.41834,   -6.69265,    4.89216,   -1.46378,   -0.41327,
+   2.99743,  -11.12050,   -0.02822,    9.29017,   12.12208,    1.42700,   -9.37573,   -0.91877,    2.59866,   -4.37121,    1.41160,   -1.46756,   -1.46802,
+  -0.06049,  -13.06933,    4.45271,   13.28728,    7.14645,   -0.50260,   -6.44046,    0.92776,    3.48747,   -0.93990,   -1.26318,   -1.45002,   -2.88334,
+  -3.36130,  -13.31747,    8.24255,   14.94259,    3.26655,   -1.71282,   -3.13191,    3.31142,    3.51931,    0.74346,   -2.94420,   -1.02752,   -3.05788,
+  -4.43719,  -12.11914,    9.68708,   13.55916,    0.85073,   -1.94101,    0.52049,    5.09686,    2.81389,    0.89194,   -3.52238,   -0.75242,   -2.35841,
+  -3.38847,  -10.87211,    9.54265,   10.87654,    0.06512,    0.08463,    3.56519,    5.39448,    1.59345,    1.27442,   -2.89335,   -0.53296,   -0.53830,
+  -1.60134,  -11.19891,    8.66631,    7.12740,   -0.79799,    1.83884,    4.41223,    3.83193,    0.05234,    2.93964,   -2.00153,   -1.56419,    1.16289,
+   1.45920,  -13.75778,    9.37214,    4.71567,   -1.18614,    4.61565,    3.94317,    2.52049,    0.06108,    4.27000,   -1.90385,   -2.71746,    2.19313,
+   2.65486,  -16.41823,   10.58618,    2.70309,   -1.48818,    6.06531,    2.58464,    1.43941,    1.76507,    4.55765,   -0.49548,   -2.66073,    3.89439,
+   3.64922,  -19.56205,   10.30426,    1.67804,   -1.72896,    7.09416,    1.80202,    0.74372,    4.14972,    4.21858,    0.09398,   -2.99403,    4.15199,
+   3.91389,  -20.88485,    9.22920,    0.27776,   -2.00880,    8.27171,    1.99566,    0.73880,    5.41566,    4.41979,    0.53800,   -2.62236,    3.69295,
+   3.76984,  -19.47481,    7.89668,   -0.69767,   -2.18589,    8.10510,    2.76700,   -0.13585,    5.14756,    4.00312,    0.44569,   -1.36767,    2.53594,
+   3.10047,  -14.73316,    6.09035,   -1.17428,   -2.34116,    7.01329,    2.11292,   -2.09845,    4.14803,    3.43358,    0.47169,   -0.41870,    1.53394,
+   1.32047,   -5.86912,    3.12136,   -2.06694,   -1.77074,    4.78289,    0.61932,   -3.25998,    1.72100,    2.43805,    0.95504,   -0.09067,    0.12897,
+  -1.72635,    5.67588,   -1.76008,   -2.73056,   -1.28893,    3.15430,   -0.85754,   -4.01433,    0.01372,    0.84282,    0.09917,    0.08895,   -0.97511,
+  -4.95503,   16.46264,   -7.80901,   -4.00959,   -0.60269,    1.51427,   -2.40550,   -4.84695,   -1.42961,   -0.93863,   -0.58828,   -0.70918,   -1.93054,
+  -6.15577,   22.72925,  -10.73279,   -4.47260,    0.40074,   -0.37692,   -2.86899,   -4.86325,   -2.55904,   -3.26603,   -1.51787,   -0.57631,   -2.52619,
+  -9.36204,   26.66463,  -11.54406,   -3.67332,   -0.25116,   -2.24198,   -2.49954,   -5.16732,   -2.33882,   -4.74062,   -0.31173,    0.30372,   -2.98273,
+ -15.20423,   27.54249,  -10.61071,   -2.02813,    0.13618,   -3.09263,   -1.77672,   -3.85209,   -1.32558,   -5.08445,    0.55094,    0.01271,   -3.67274,
+ -23.51772,   25.65288,   -7.31953,   -1.10315,    2.90398,   -2.94630,   -0.13000,   -2.15893,   -2.95290,   -3.98030,    1.45540,    0.57831,   -2.43257,
+ -28.91310,   21.67089,   -3.58740,   -0.85989,    5.18609,   -1.68520,    2.23006,   -0.35752,   -4.18589,   -2.62156,    1.11387,    0.63374,   -0.88875,
+ -30.20216,   16.56558,    0.77764,    0.06467,    6.58043,   -0.39967,    3.20560,    0.44316,   -4.32143,   -0.62463,    0.73178,    0.42263,    0.79977,
+ -28.42687,   11.56648,    4.35270,    1.11830,    7.46077,    0.46229,    3.03668,    1.41300,   -4.74689,    1.08841,    1.09717,    0.03241,    2.11287,
+ -25.08270,    7.77350,    6.18683,    1.80671,    6.93339,    1.23991,    2.73674,    2.13388,   -4.81290,    2.93157,    0.96031,    0.00314,    2.61138,
+ -20.78136,    4.67761,    5.75201,    2.12302,    6.13397,    2.10596,    2.66419,    2.75081,   -3.90445,    3.70042,    1.10107,   -0.22610,    2.31713,
+ -13.46454,    1.02092,    3.93720,    1.57585,    6.20745,    1.51712,    2.82467,    3.39257,   -2.72285,    2.73447,    1.37315,    0.52436,    2.78130,
+  -5.76264,   -1.22873,    0.79626,    1.82444,    4.56921,    0.58728,    2.43814,    2.92308,   -0.52706,    2.21018,    1.86391,    1.17943,    2.24987,
+  -1.44083,   -2.31218,   -1.35512,    2.11496,    2.26353,   -0.14471,    1.07082,    2.83232,    2.00566,    2.38910,    2.27280,    1.26996,    1.32193,
+  -1.87221,   -2.92470,   -1.52263,    2.08718,    1.56698,   -0.51738,    0.41417,    2.34894,    1.81023,    1.79143,    2.48958,    1.86194,    0.95187,
+  -4.23272,   -3.52911,   -0.05163,    1.94083,    0.61919,    0.29370,    1.25501,    1.97348,    1.63943,    1.14314,    0.83332,    0.41114,    0.57006,
+  -7.54358,   -4.47028,    2.50155,    2.29922,   -0.76621,    1.00946,    2.36928,    1.47940,    1.26880,    1.23042,   -0.04485,   -0.54338,    0.40080,
+  -9.74334,   -5.52010,    3.99529,    3.12108,   -1.07245,    0.98784,    2.51061,    1.22118,    1.20767,    0.96915,   -1.01663,   -1.06841,    0.74825,
+  -4.26644,   -4.94790,    0.22937,    2.41042,   -3.15696,   -1.26886,    2.63047,    1.78882,    1.50777,    0.61947,   -1.39230,   -0.64064,    1.38530,
+  -0.92275,   -4.66528,   -2.25085,    1.46434,   -5.28919,   -3.62174,    2.49501,    2.33147,    1.96532,    0.82141,   -1.07020,   -0.19027,    1.43869,
+  -0.61408,   -5.15320,   -4.32445,    0.30326,   -5.09984,   -4.40307,    2.45182,    3.52640,    2.65756,    1.44538,   -0.63919,   -0.67366,    0.87614,
+  -1.43957,   -6.30323,   -6.62573,   -1.59314,   -4.56871,   -4.83830,    1.63700,    4.15749,    3.51661,    1.85555,   -0.18287,   -1.35576,   -0.06179,
+  -4.81377,   -8.84991,   -7.56502,   -2.87500,   -3.74041,   -4.91132,   -0.43869,    3.64460,    4.35858,    2.57094,   -0.17287,   -1.19331,    0.19920,
+  -8.93782,  -10.90637,   -7.45249,   -4.14376,   -2.78710,   -3.29015,   -1.35468,    2.46828,    4.15115,    2.92140,    0.46725,   -0.46433,   -0.04547,
+ -14.91245,  -13.63623,   -6.11492,   -5.25653,   -2.83475,   -1.87762,   -2.07324,    0.68378,    2.78237,    1.89539,   -0.17822,   -0.57172,   -0.24379,
+ -21.65250,  -15.86699,   -2.63951,   -5.38553,   -2.94295,    0.49789,   -1.32799,   -0.76350,    1.16474,    1.19402,   -0.06909,   -0.10227,   -0.50733,
+ -27.78066,  -17.66521,    1.29509,   -4.41328,   -2.16524,    2.78819,   -0.76389,   -2.12583,   -0.34769,    0.40564,   -0.13348,    0.46788,   -0.11234,
+ -24.41044,  -16.84285,    0.06626,   -4.11720,   -3.44676,    2.04601,   -0.34149,   -2.65121,   -1.55297,   -0.69065,    0.02506,    1.76441,    1.13287,
+ -18.48285,  -14.11274,   -0.63549,   -3.10682,   -4.32147,    0.71575,    0.29379,   -2.49450,   -2.24068,   -1.35613,    0.77933,    3.25334,    2.35745,
+ -13.87248,  -11.12907,   -1.04583,   -2.56560,   -3.99491,   -0.03370,    0.59145,   -1.87177,   -2.26884,   -1.12270,    1.10905,    3.23326,    2.53021,
+  -9.08447,   -7.92635,   -2.02791,   -3.08573,   -3.92366,   -0.81684,    0.46735,   -1.19261,   -1.88418,   -0.75675,    1.22146,    2.43087,    1.79254,
+  -5.33600,   -5.21240,   -2.22113,   -2.49326,   -2.86820,   -1.25103,   -0.12794,   -0.65089,   -1.01587,   -0.32481,    0.93760,    1.66968,    1.44865,
+  -2.59525,   -2.72141,   -1.47559,   -1.51706,   -1.51809,   -0.57274,    0.12176,   -0.03969,   -0.09426,    0.37483,    0.90498,    1.06274,    0.89507,
+  -1.42737,   -1.89428,   -1.66380,   -1.46703,   -1.23667,   -0.87896,   -0.52353,   -0.27670,   -0.05895,    0.25267,    0.55589,    0.70269,    0.72631,
+  -1.01009,   -1.38642,   -1.31704,   -1.17398,   -1.00001,   -0.79800,   -0.63541,   -0.42318,   -0.19702,    0.04387,    0.24362,    0.43999,    0.57047,
+  -0.77895,   -1.05948,   -1.03922,   -0.96229,   -0.87679,   -0.73403,   -0.63929,   -0.47465,   -0.32427,   -0.15422,   -0.02524,    0.14293,    0.24011,
+  -0.82881,   -1.11742,   -1.10684,   -1.03235,   -0.96362,   -0.81952,   -0.74525,   -0.57821,   -0.43861,   -0.26528,   -0.13865,    0.05660,    0.16186,
+  -0.35972,   -0.47061,   -0.46137,   -0.39041,   -0.35838,   -0.26273,   -0.20377,   -0.09339,   -0.03483,    0.06995,    0.12835,    0.22643,    0.25931,
+  -0.04755,   -0.05598,   -0.03302,   -0.01273,    0.01151,    0.05671,    0.11911,    0.17134,    0.19456,    0.19818,    0.19911,    0.19458,    0.16996,
+  -0.07938,   -0.10116,   -0.08523,   -0.08693,   -0.09317,   -0.07109,   -0.01829,    0.03068,    0.05290,    0.06624,    0.09580,    0.13227,    0.14747,
+   0.06926,    0.10713,    0.11903,    0.11316,    0.10068,    0.11070,    0.14570,    0.17547,    0.17976,    0.17390,    0.17916,    0.18638,    0.17058,
+   0.26443,    0.37722,    0.38035,    0.37451,    0.36403,    0.36042,    0.36336,    0.35838,    0.33535,    0.29982,    0.26079,    0.21541,    0.15515,
+   0.37360,    0.52071,    0.52056,    0.51525,    0.52128,    0.51296,    0.50513,    0.48314,    0.46386,    0.42227,    0.36637,    0.28216,    0.19255,
+   0.13555,    0.19380,    0.21501,    0.24147,    0.28236,    0.31694,    0.35449,    0.38128,    0.40802,    0.41555,    0.40874,    0.37341,    0.32244,
+  -0.29448,   -0.40627,   -0.36830,   -0.31665,   -0.24786,   -0.17582,   -0.09476,   -0.01552,    0.06813,    0.14400,    0.21438,    0.26481,    0.29733,
+  -0.60144,   -0.83460,   -0.78682,   -0.72154,   -0.64098,   -0.55201,   -0.45194,   -0.34815,   -0.23793,   -0.12528,   -0.00904,    0.09761,    0.18751,
+  -0.69167,   -0.95489,   -0.89304,   -0.80826,   -0.71013,   -0.60057,   -0.48226,   -0.36119,   -0.23999,   -0.11567,    0.01128,    0.12929,    0.22304,
+  -0.41023,   -0.56167,   -0.51855,   -0.45896,   -0.39059,   -0.30542,   -0.21282,   -0.12335,   -0.05091,    0.01319,    0.07226,    0.12658,    0.16316,
+  -0.17193,   -0.23419,   -0.21758,   -0.18663,   -0.15410,   -0.11460,   -0.08021,   -0.04418,   -0.01581,    0.01346,    0.03622,    0.06058,    0.07869,
+  -0.10852,   -0.17638,   -0.18566,   -0.16418,   -0.10060,   -0.07273,   -0.06668,   -0.05676,    0.00252,    0.05859,    0.08061,    0.07701,    0.10191,
+   0.84595,   -0.51807,   -1.55112,    0.47720,    0.76134,   -1.04124,   -0.55151,    0.84568,    0.04465,   -0.68262,    0.27772,    0.55861,   -0.21271,
+  10.74878,   -3.11310,   -5.34238,    2.26307,    3.04804,   -1.68683,   -1.57190,    2.02328,   -0.35717,    0.00393,   -0.15863,    1.01564,   -1.07620,
+  22.70843,   -6.61746,   -7.86647,    3.81820,    4.88015,   -2.06069,   -2.43454,    2.49714,   -0.36634,    0.39582,   -0.85246,    1.67405,   -2.18834,
+  32.18055,  -10.68944,   -8.76175,    5.36425,    5.02639,   -2.41739,   -2.50591,    2.78143,   -0.67211,    0.73401,   -1.31273,    2.36673,   -2.74303,
+  39.08526,  -14.58456,   -8.16102,    6.57589,    4.26688,   -2.79942,   -2.70583,    2.63534,   -1.05410,    1.76937,   -1.43361,    1.55572,   -3.38997,
+  42.88630,  -17.70767,   -7.25725,    6.54728,    2.44002,   -3.06865,   -3.13514,    1.98477,   -1.18996,    2.21320,   -1.35169,    1.13674,   -2.86322,
+  43.75336,  -17.89537,   -5.42091,    6.19822,    0.36815,   -3.06211,   -3.01817,    1.11116,   -1.11147,    2.06109,   -1.39334,    0.24111,   -2.88191,
+  39.96351,  -15.94618,   -2.38062,    5.83421,   -1.14522,   -1.73270,   -1.48879,    0.83592,   -1.51866,    1.71870,   -1.36848,   -0.22345,   -2.14575,
+  31.45315,  -11.09490,    1.79407,    4.30672,   -2.58627,   -0.17169,    0.32247,   -0.08480,   -2.12540,    1.29164,   -0.93414,   -0.57769,   -0.99019,
+  18.59060,   -3.90034,    4.51498,    2.55389,   -3.25637,   -0.47962,    0.40670,   -0.29496,   -1.78026,   -0.62591,   -0.17699,   -0.85637,    0.57991,
+  10.99932,    5.01000,    4.48573,    2.56734,   -0.08985,    0.69420,    1.14445,    0.44501,   -1.14982,   -1.17057,   -0.50301,   -0.86144,    1.36458,
+   7.27482,   18.54009,    5.61949,    3.31578,    3.53790,    1.19695,    1.36667,   -0.11593,   -0.76783,   -2.51154,   -1.72880,   -1.06676,    0.78223,
+   7.49068,   30.12584,    4.73965,    4.73910,    5.80762,   -0.88405,    3.03583,   -0.41851,   -0.74616,   -3.91174,   -3.07679,   -0.19967,    0.40673,
+   7.94285,   35.63343,    4.15385,    5.54752,    7.28455,   -2.47315,    4.79059,   -0.36822,   -0.76962,   -3.83732,   -4.03237,    0.22894,   -0.91120,
+   8.58590,   36.59988,    2.41544,    5.77743,    6.68436,   -3.89020,    4.89490,   -1.00768,   -0.56777,   -3.55960,   -3.76792,    0.58118,   -1.70878,
+   8.57344,   34.03123,    0.61296,    5.92270,    5.05179,   -5.00299,    4.20648,   -2.23552,   -0.11940,   -3.99699,   -3.23494,    0.89732,   -2.60078,
+   5.78229,   27.64637,   -0.36020,    6.15170,    3.17174,   -4.57662,    4.25798,   -2.29137,    0.27880,   -4.44962,   -1.97717,    0.88484,   -3.60586,
+   0.23718,   18.80261,    1.23752,    6.06667,    1.15746,   -3.21039,    3.56837,   -2.37208,    0.35882,   -4.56392,    0.27678,    1.79146,   -4.22465,
+  -9.93021,    7.58356,    3.76043,    4.10620,   -1.53005,   -2.03193,    1.05332,   -1.63585,    1.82193,   -4.44761,    2.51193,    2.43774,   -3.15035,
+ -24.19330,   -1.48371,    6.88449,    1.15200,   -1.69619,    2.34576,    0.24782,    0.73166,    3.00216,   -3.47517,    4.28729,    1.86801,   -1.40110,
+ -37.52070,   -4.30909,   11.90375,   -1.40707,   -1.02627,    7.12782,   -1.35290,    0.68745,    3.21353,   -1.50163,    4.93153,   -0.11838,    0.72051,
+ -43.55009,   -5.04015,   13.40414,   -3.67952,    0.01548,    8.99950,   -1.79994,    0.40766,    3.33770,    0.53111,    4.24657,   -2.02550,    3.04733,
+ -42.51932,   -4.89435,   10.95545,   -9.29525,   -0.69523,   10.09831,   -0.79636,    0.52587,    2.75109,    2.84201,    3.42491,   -2.54333,    4.17730,
+ -23.87650,   -3.56064,    3.61606,  -15.48069,   -1.35062,    7.06025,   -0.41084,   -0.89379,    0.17333,    5.28044,    2.53100,   -3.10096,    4.57176,
+  -1.95067,   -1.62599,   -4.36667,  -18.85973,   -2.11852,    3.97257,    0.07670,   -2.74860,   -2.55112,    6.29552,    1.41799,   -2.96217,    4.84084,
+  19.53974,    0.76802,  -11.17333,  -20.72311,   -3.47356,    0.60982,    2.05922,   -3.62263,   -4.16425,    5.85003,    1.12973,   -2.65552,    3.58460,
+  60.75739,   -5.08121,  -12.47585,  -16.81619,   -5.45903,   -1.35013,    0.77835,   -3.80548,   -3.64245,    4.57869,    0.85220,   -1.76367,    2.72508,
+  87.85258,   -9.92849,  -11.27633,  -12.00721,   -6.97649,   -3.14012,   -0.52290,   -3.06606,   -1.86302,    2.78719,    0.55353,   -0.15964,    1.95145,
+  99.86404,  -12.99408,   -8.63910,   -7.49278,   -7.42962,   -3.48943,   -1.11168,   -0.82875,   -0.63118,    0.76545,    0.59896,    0.65211,    1.27843,
+  98.39548,  -15.14276,   -3.97054,   -2.54129,   -6.74303,   -2.47134,   -2.03093,    0.20558,    0.41677,   -0.20560,    0.43909,    0.78924,    1.28537
+};
+
+static const float golden_diff2_features[] = {
+  16.21731,    0.19516,    0.20180,    0.20088,    0.19413,    0.19077,    0.19143,    0.18572,    0.16733,    0.14279,    0.12012,    0.09567,    0.06024,
+  43.27348,   -0.20258,   -0.18401,   -0.16553,   -0.14803,   -0.12548,   -0.09792,   -0.07352,   -0.05640,   -0.03998,   -0.01733,    0.00732,    0.02418,
+  56.11353,   -0.24310,   -0.23309,   -0.22323,   -0.21464,   -0.20435,   -0.19125,   -0.17725,   -0.16231,   -0.14209,   -0.11335,   -0.07929,   -0.04632,
+  44.80687,   -0.33941,   -0.36965,   -0.35402,   -0.30704,   -0.28633,   -0.29821,   -0.28407,   -0.21006,   -0.11928,   -0.06474,   -0.02990,    0.03805,
+  -0.10879,   -0.20161,   -0.26546,   -0.23390,   -0.14047,   -0.10829,   -0.15147,   -0.15231,   -0.05091,    0.05645,    0.06798,    0.03493,    0.07529,
+  -0.37346,   -0.52451,   -0.50858,   -0.47412,   -0.42533,   -0.37226,   -0.31718,   -0.25402,   -0.18147,   -0.10781,   -0.03950,    0.02753,    0.09911,
+  -0.19116,   -0.24038,   -0.18975,   -0.17430,   -0.17958,   -0.14767,   -0.07469,   -0.02263,   -0.02556,   -0.03835,   -0.00892,    0.04125,    0.05542,
+   0.11563,    0.19720,    0.24364,    0.22611,    0.16819,    0.15623,    0.20157,    0.22173,    0.17058,    0.11040,    0.11162,    0.14075,    0.11520,
+   0.18031,    0.29460,    0.34897,    0.32642,    0.25085,    0.21896,    0.24202,    0.22669,    0.12594,    0.01853,   -0.01105,   -0.00135,   -0.04710,
+   0.20499,    0.31708,    0.34884,    0.31497,    0.23562,    0.18721,    0.17936,    0.14123,    0.03911,   -0.06382,   -0.10252,   -0.10855,   -0.15534,
+   0.31046,    0.43420,    0.41051,    0.34902,    0.26344,    0.17682,    0.09930,    0.01492,   -0.07655,   -0.15488,   -0.20076,   -0.22568,   -0.24929,
+   0.12999,    0.14073,    0.06069,    0.01583,    0.00081,   -0.04401,   -0.11966,   -0.15633,   -0.11731,   -0.06064,   -0.05386,   -0.07838,   -0.06843,
+   0.26017,    0.17106,   -0.11744,   -0.07830,    0.15252,    0.12827,   -0.16917,   -0.29638,   -0.06758,    0.15656,    0.05404,   -0.15683,   -0.09470,
+   0.31485,   -0.11509,   -0.84687,   -0.54336,    0.20418,    0.10039,   -0.64470,   -0.76768,   -0.10500,    0.26783,   -0.10735,   -0.43370,   -0.08453,
+   0.75957,   -0.05233,   -1.31864,   -0.68615,    0.29225,    0.21304,   -0.31901,   -0.61384,   -0.24770,    0.54825,    0.53502,   -0.20244,   -0.13772,
+   1.88292,    0.41875,   -1.89908,   -0.88685,    0.26989,    0.21361,    0.20804,    0.06673,   -0.03850,    0.52586,    0.46733,   -0.19222,    0.06346,
+   3.29321,    0.50465,   -2.27539,   -0.18780,    0.21818,    0.09957,    0.50984,    0.42155,   -0.02883,   -0.14084,    0.16381,    0.40750,    0.17080,
+   7.79825,    1.50741,   -3.14751,    0.29748,    0.02551,   -0.65686,    0.49119,    0.87794,   -0.00355,   -0.16768,    0.24352,    1.50982,    0.08034,
+  14.00504,    0.91646,   -2.46539,    0.20880,   -0.50957,   -0.61261,   -0.18063,    0.83464,   -0.52641,   -0.13895,    0.09943,    1.74159,   -0.52868,
+  13.44142,    0.31483,    0.29234,    0.15242,   -1.14150,   -0.05969,   -0.42379,    0.83283,   -0.86010,   -0.92560,   -1.04317,    0.47985,   -0.55997,
+   7.22871,    0.02501,    2.49428,    0.95413,   -1.02842,    0.15923,   -1.01835,   -0.11145,    0.05258,   -0.72917,   -1.47458,   -1.18530,   -0.17015,
+  -1.61599,   -0.43003,    3.37022,    0.88134,   -0.13308,    0.03882,   -1.58968,   -0.96594,    0.62509,   -0.06993,   -1.16790,   -2.32724,   -0.06668,
+ -10.76176,   -0.49072,    3.29918,    0.07189,    0.00983,    0.42607,    0.01932,    0.04170,    1.57404,    0.85996,    0.00954,   -1.53939,    0.88909,
+ -17.49955,   -0.84642,    1.83108,   -0.41681,    0.20646,    0.43982,    1.17639,    0.01386,    1.51175,    1.19512,    0.82039,   -0.61095,    0.86442,
+ -18.20613,   -0.14520,   -0.01912,   -0.39252,    1.10353,    0.63736,    1.88209,    0.21828,    1.04752,    0.99000,    0.92230,    0.93419,    0.61598,
+ -12.11390,    1.46204,   -1.21052,   -1.04637,    1.22112,    0.17140,    2.24943,    0.65173,   -0.08588,    0.92601,    1.20127,    2.28213,    0.75185,
+  -3.51505,    2.54119,    0.00642,   -2.18675,    0.11835,    0.00227,    1.10610,    0.51876,   -0.93515,   -0.16250,    0.13794,    1.11413,    0.14248,
+   0.45022,    3.88328,    1.77821,   -2.05071,   -0.69773,    0.26972,    0.12809,   -0.71774,   -2.04822,   -2.04363,   -0.77679,   -0.64332,   -0.11925,
+   1.84052,    2.91784,    1.42999,   -0.91996,   -0.57730,   -0.33576,   -1.01007,   -1.70689,   -1.77488,   -1.43049,    0.02612,   -1.89165,   -0.00646,
+  -0.12880,   -0.53214,    1.48872,   -0.68723,   -0.84349,   -0.47665,   -0.65907,   -0.98961,   -0.54255,   -0.72874,    0.44080,   -2.24455,   -0.94040,
+  -4.97158,   -5.22039,    3.00956,    1.78392,   -0.31825,    0.91453,    0.94948,    0.53822,    0.87715,   -0.75816,    0.10799,   -0.14966,    0.57097,
+  -6.88770,   -7.83044,    3.55969,    4.53842,    0.33471,    0.39304,    0.72327,    1.03753,    1.80131,    0.30180,    0.80916,    1.57761,    0.06766,
+  -0.06472,   -2.73202,    2.67699,    3.19374,   -0.29062,   -0.56358,   -0.11369,    0.91659,    1.20609,    0.50170,    0.16801,    1.54581,   -1.30414,
+   7.96513,    2.19639,    1.12540,    1.29673,   -0.77663,   -1.71659,   -1.67205,    0.03821,   -0.39451,    0.56292,   -0.26644,    1.20030,   -1.91406,
+  20.36825,    7.16812,   -2.07462,   -2.56250,   -1.72555,   -2.07219,   -2.24737,   -0.62517,   -1.37638,    0.89459,   -0.92776,   -0.20225,   -2.23473,
+  27.52857,    8.49879,   -5.10473,   -4.96347,   -1.45094,   -1.23414,   -1.66458,   -1.39808,   -2.19753,    1.22582,   -0.15785,   -0.48237,   -2.32545,
+  22.42527,    3.69515,   -5.78014,   -4.11555,   -0.79674,   -0.46982,   -0.64408,   -0.16306,   -0.84121,    1.61191,   -0.09852,   -0.66065,   -1.43130,
+  11.24784,   -2.54764,   -4.99240,   -1.41613,   -0.71763,    0.07090,   -0.07168,    1.05152,    1.13015,   -0.00134,   -0.50929,   -0.42378,   -0.52650,
+  -2.27832,   -8.25114,   -3.73306,    3.31291,    1.59268,    0.15774,    0.36296,    1.77359,    2.16789,   -1.40649,   -1.20025,    0.35247,    2.46950,
+ -10.87834,   -8.49211,   -2.13050,    5.42344,    3.29342,   -2.09924,   -0.78673,    1.19661,    2.46813,   -1.00383,    0.29814,   -0.01854,    3.86095,
+ -12.64384,   -4.14936,   -0.63627,    4.12979,    3.06376,   -3.62388,   -1.78564,    0.15274,    0.27741,   -1.96116,    0.51165,   -0.51537,    3.92123,
+ -13.84193,   -2.73674,    1.04745,    4.18937,    3.25537,   -2.80288,   -2.02591,   -1.37560,   -1.85905,   -1.85010,    0.45583,    0.58390,    3.33817,
+ -11.25400,   -1.05981,    3.28878,    2.43213,    2.21390,   -0.98947,    0.08231,   -1.47618,   -2.38273,   -1.07941,   -0.22681,    0.86386,    1.48212,
+ -11.05228,   -0.22290,    5.64809,    1.93243,    1.05831,    1.77555,    1.93646,   -1.12377,   -2.22490,   -0.69184,   -0.95848,    0.70705,   -1.07224,
+ -12.78424,   -0.67527,    7.24214,    3.37218,   -0.79577,    4.67174,    3.65980,   -0.47327,   -1.43202,   -0.44532,   -1.34798,    0.34553,   -2.89207,
+ -11.10884,    0.57496,    5.36448,    2.60238,   -3.22833,    5.30668,    3.88445,   -0.72640,   -0.06072,   -0.23699,   -0.17798,    0.66642,   -3.76137,
+ -14.76188,    4.10834,    2.80884,   -0.11126,   -2.92619,    4.78836,    2.72440,   -0.89062,    1.61909,    1.01685,    0.55895,   -0.35090,   -1.62364,
+ -12.08655,    3.87674,    1.44833,   -2.20587,   -1.70860,    4.93422,   -0.33181,   -0.40690,    2.70387,    1.26864,    1.62162,   -1.39498,    1.41874,
+  -4.35015,    0.69686,   -1.40145,   -4.04673,   -1.39059,    3.77357,   -2.48010,    0.48856,    2.38896,    0.75792,    1.41704,   -0.90706,    2.51950,
+  -2.98126,   -0.57544,   -2.04650,   -5.84479,    0.28809,    0.99410,   -2.62742,   -0.09681,    1.11973,    0.93487,    0.81901,   -0.48789,    1.68075,
+   0.48137,   -1.78558,   -2.41798,   -6.14209,    2.28130,   -1.36703,   -0.85182,    1.26430,    1.03422,    1.56647,    0.16530,   -0.44342,    0.43913,
+   5.29263,   -2.91849,   -4.07649,   -5.20471,    2.50273,   -2.33617,    1.43612,    2.41752,    0.44709,    1.65795,   -0.35830,   -0.56680,   -0.91788,
+   8.78468,   -3.08363,   -4.82285,   -2.76874,    1.36147,   -2.90089,    3.06442,    2.46061,    0.10628,    1.45005,   -0.11077,    0.12710,   -1.69580,
+   9.94646,   -0.88849,   -3.99298,   -0.79378,   -0.24021,   -3.27466,    2.42517,    1.15397,    0.04365,    0.87672,    0.51490,    1.54578,   -1.26088,
+   6.50878,    1.91146,   -2.31437,    0.57698,   -1.07603,   -2.39338,    0.04244,   -0.10844,   -0.21124,    0.17367,    0.26625,    0.86430,    0.04497,
+   7.70786,   -0.67801,   -1.46316,    1.88686,   -2.15238,   -0.56492,   -2.20550,   -0.78685,   -0.63474,   -0.97331,   -0.04675,    0.38546,    0.91254,
+  24.54930,   -2.71407,   -2.79878,    1.09356,   -4.45266,   -1.62989,   -2.90559,   -2.40690,   -1.53768,   -1.00329,   -0.35777,    1.35590,    0.68131,
+  32.06574,   -1.15240,    0.55634,   -0.18682,   -3.40026,   -2.27297,   -1.81379,   -2.88574,   -0.99391,   -0.68378,   -0.21541,    1.12434,    0.46684,
+  28.45597,   -3.15990,    2.83928,    0.65308,   -1.67239,   -0.68778,   -0.77180,   -1.18102,    0.39176,   -0.48112,    0.06073,    1.04493,    0.33685,
+  14.59797,   -5.13138,    3.18517,    2.50967,    1.11177,    0.57163,   -0.42486,    0.98442,    1.48556,   -0.83740,   -0.23931,    0.73557,    0.17675,
+  -3.72845,   -3.51124,    1.55782,    3.41259,    3.04399,    0.40921,   -0.68759,    1.95865,    1.00030,   -1.01141,   -0.23681,   -0.06809,    0.44259,
+ -21.61495,    2.89444,   -0.54097,    3.40615,    3.46339,   -0.14803,   -1.11945,    1.84813,   -0.62411,   -0.52742,    0.33278,   -0.95693,    0.37680,
+ -33.78760,    9.00981,   -2.74898,    1.85490,    3.27310,    0.25686,   -0.82873,    1.25507,   -1.14359,    0.12123,    0.76512,   -1.72360,   -0.51226,
+ -31.51916,   14.52491,   -1.82974,   -0.18268,    2.48123,    0.26023,    0.34134,    0.86735,   -2.05563,    0.18035,   -0.15100,   -2.20650,   -1.42871,
+  -8.13280,   16.60238,   -0.28863,   -2.56735,    0.05195,   -0.53726,    0.79647,   -0.75513,   -2.34694,    0.74106,   -1.55933,   -2.39823,   -1.98695,
+   5.05126,   13.15464,    3.60279,   -4.34883,   -0.80506,   -0.09033,    0.36513,   -1.74143,   -0.82592,    0.41468,   -2.75943,   -2.80814,   -2.28767,
+   7.32411,    4.78275,    5.29998,   -4.34229,   -1.44093,    0.81103,    0.02437,   -2.32194,    0.24427,    0.33826,   -1.67193,   -0.96206,   -1.24182,
+   9.10812,   -4.59359,    1.96367,   -2.91030,   -0.87951,    1.50810,   -0.30948,   -2.06597,    1.81809,    0.25831,    0.14130,    0.95121,   -0.05634,
+   6.96846,  -11.21001,   -1.88491,   -2.25561,   -2.15953,    0.73442,   -0.77903,   -2.01683,    1.21401,    0.31835,    1.63315,    1.29029,    0.85059,
+   1.13596,  -11.05882,   -3.52247,   -0.25600,   -3.23051,    0.99667,   -0.03908,   -1.50529,    0.06820,    0.86959,    2.75778,    1.28492,    1.31335,
+  -3.70472,   -7.35983,   -2.95527,    1.77781,   -1.96865,    1.57230,    1.82800,   -1.06835,   -0.53964,    0.59958,    2.55650,    1.57267,    0.93750,
+  -5.04297,   -1.50997,    0.15249,    2.92941,   -1.16833,    0.70852,    3.91727,    0.42658,   -1.21815,   -0.11621,    0.80285,    1.50611,    0.53641,
+  -4.06056,    2.18459,    1.73452,    2.38119,   -0.74181,   -0.17670,    3.29103,    0.68917,   -1.78614,   -0.15311,   -1.04603,    0.92786,    0.06090,
+  -2.86080,    2.13510,    2.38423,    0.81881,   -0.49837,   -0.42827,    1.61950,    0.76231,   -0.98939,   -1.00621,   -2.06018,    1.11499,   -0.19129,
+  -1.93483,    0.82137,    2.78030,    0.64130,    0.56392,    0.21727,    0.76120,    0.71704,   -0.30525,   -1.11435,   -0.98799,    1.28927,    0.11555,
+   0.68825,   -2.47889,    1.71057,    1.32855,    2.12561,    0.48081,   -1.00540,    1.64850,    0.79676,   -0.66252,   -0.64123,   -0.02105,   -0.11619,
+   0.48389,   -4.33922,    0.98819,    1.66829,    2.46791,   -0.48849,   -2.91387,    2.05927,    0.34919,   -0.05767,   -0.74559,   -1.72925,   -0.26099,
+   0.24245,   -2.77404,    0.23601,    2.20284,    3.88731,   -1.43572,   -2.23418,    2.44810,    0.90633,    0.54946,   -0.57527,   -3.42200,   -0.07661,
+   0.17565,   -1.35679,   -0.84536,    2.18870,    4.77929,   -2.31978,   -1.05009,    2.80705,    1.24735,    0.16229,   -0.10471,   -3.42125,    0.31608,
+  -1.18938,   -0.77795,   -1.36764,    1.86921,    3.31434,   -2.76629,   -0.22201,    3.36896,    1.53384,   -0.94211,    0.32354,   -2.05125,    1.23954,
+  -3.13374,   -0.91509,   -0.97772,    1.65283,    1.83681,   -2.39579,   -0.00488,    2.36957,    0.36397,   -1.91926,    0.74306,   -0.34365,    0.65549,
+  -4.97267,   -0.96364,    0.13713,    0.91143,   -1.31509,   -1.00163,    1.03233,    0.69180,   -0.72927,   -2.78508,    1.32490,    1.56583,    0.35754,
+  -6.85945,   -1.28193,    2.03452,    1.50264,   -2.92260,    0.98349,    1.41435,   -1.51727,   -1.21326,   -1.86687,    1.87517,    2.28697,    0.32175,
+  -7.11939,   -1.01505,    3.67222,    1.59803,   -3.20086,    2.97749,    1.06817,   -3.10749,   -0.99417,   -0.26336,    0.79722,    2.42876,    0.23495,
+  -5.31246,    0.28673,    3.27009,   -0.19856,   -2.88602,    4.07824,   -0.00856,   -4.00545,   -0.20722,    1.62717,    0.14996,    2.04044,   -0.79287,
+  -1.39747,    1.09174,    1.50430,   -2.01806,   -0.80691,    3.93254,    0.23631,   -3.97883,    1.33579,    2.66006,   -0.62404,    0.95474,   -0.59348,
+   3.48982,    0.89344,   -1.34445,   -3.53587,    0.67709,    2.90906,    0.09460,   -1.85039,    1.73261,    2.93600,   -0.79489,   -0.18817,    0.14495,
+   8.41412,    1.19195,   -4.37971,   -4.15560,    1.22093,    0.56913,   -0.53951,    0.53321,    1.87599,    2.13698,   -1.20868,   -1.36792,   -0.11842,
+  11.79348,    2.07406,   -6.59916,   -3.18767,    0.80053,   -3.53592,   -1.01774,    2.37130,    0.55460,    0.43783,   -1.15931,   -1.65250,   -1.28935,
+  12.09620,    3.57289,   -6.70376,   -1.96437,   -0.15075,   -5.44186,   -1.12845,    3.54374,   -1.06725,   -1.74863,   -0.28421,   -0.71038,   -0.87711,
+   9.04450,    4.26321,   -5.62701,   -1.01178,    0.58143,   -4.83820,   -1.86991,    2.57650,   -1.34064,   -2.74849,   -0.25834,   -0.20044,   -0.32551,
+   4.86684,    5.19290,   -2.60689,   -1.42399,    0.79326,   -2.28328,   -2.04050,    1.21844,   -0.85736,   -1.27215,   -0.81190,    1.08856,    0.99834,
+   0.01623,    4.37000,    0.22282,   -2.03165,    0.58962,    1.50096,   -1.27020,   -1.11682,   -0.50553,    1.81982,   -0.18143,    1.41350,    1.26103,
+  -4.79588,    1.68520,    1.65410,   -2.66616,   -0.25647,    4.96139,    1.14134,   -3.99812,   -0.57983,    3.27449,    0.15974,    0.03994,    0.64050,
+  -6.52693,   -0.79567,    3.55107,   -2.63971,   -0.98564,    5.81594,    3.22678,   -3.99359,   -0.95776,    3.42637,    1.42837,   -0.96330,   -0.26422,
+  -7.08716,   -2.52728,    5.10914,   -1.21147,   -2.29996,    4.11644,    3.75145,   -2.84352,   -1.31686,    1.28807,    1.17904,   -0.91478,   -0.46273,
+  -5.96604,   -2.75027,    6.02725,    0.86845,   -3.49258,   -0.38843,    3.00652,   -0.18185,   -1.16662,   -1.59567,    0.34567,   -0.04521,    0.16324,
+  -4.59670,   -1.91198,    5.15809,    2.62574,   -3.25644,   -2.83582,    1.15669,    2.52683,    0.44425,   -3.77954,   -0.16283,    0.55103,    1.26083,
+  -3.34087,   -0.99035,    2.62799,    3.01482,   -2.23738,   -3.71878,   -0.89664,    3.38273,    2.46827,   -3.69741,   -0.99399,    0.64024,    1.23144,
+  -1.09569,    0.10035,    0.70302,    2.90472,   -0.58142,   -3.26729,   -2.55281,    3.23568,    3.81462,   -1.09265,   -0.57576,    0.36919,    0.72021,
+  -0.69000,   -0.22143,   -0.89592,    3.11012,    0.69255,   -1.41779,   -3.33030,    1.90778,    3.97646,    1.20440,   -0.33052,   -0.58568,   -1.02687,
+  -0.46983,   -0.75360,   -2.78557,    2.20918,    2.17967,    0.89865,   -3.16726,   -0.33005,    1.89780,    1.72530,    0.15660,   -0.91208,   -2.67401,
+   0.86113,   -1.10262,   -3.73482,    1.04196,    3.74525,    1.45714,   -1.97777,   -1.12089,   -0.05726,    1.75960,    0.89571,    0.04996,   -2.26333,
+   1.54331,   -1.65894,   -5.35786,    0.17701,    3.73783,    2.10178,   -0.60824,   -2.08271,   -2.10277,    0.68544,    0.79497,    1.22325,    0.20415,
+   2.75545,   -2.01349,   -5.84217,   -1.25973,    2.98491,    2.32762,    1.40892,   -0.78433,   -1.92256,    0.31187,    0.00115,    0.88398,    1.76278,
+   2.43094,   -1.80217,   -4.50456,   -1.03065,    1.38983,    2.07960,    2.15277,   -0.15730,   -1.19875,    0.30760,    0.11612,    0.60493,    2.35047,
+   0.84679,   -2.47226,   -2.41982,   -0.74440,    0.38131,    1.50645,    1.98511,   -0.89829,   -1.23095,    0.38567,    1.11637,    1.32482,    1.85701,
+  -1.04035,   -2.75775,    0.72750,   -0.18247,   -0.43029,    0.55353,    1.11439,   -1.03401,   -1.09463,    0.19856,    2.27336,    0.67122,   -0.84261,
+  -3.09812,   -3.04583,    3.51253,    0.81631,   -1.46276,   -2.09959,   -2.16450,   -1.61351,   -0.33714,    0.53306,    1.14867,   -1.37724,   -2.10640,
+  -3.04177,   -1.70739,    5.31536,    2.60671,   -0.76392,   -3.78547,   -3.50987,   -0.72561,    0.30075,    0.00962,   -0.43289,   -1.77595,   -1.42549,
+  -1.36122,   -0.29429,    5.64058,    3.42238,   -0.88336,   -5.49962,   -3.17181,    0.28307,    0.15652,   -1.71665,   -1.86693,   -1.55986,   -0.67926,
+  -0.05605,    0.50171,    3.52788,    2.23423,   -1.71910,   -4.30363,   -1.43891,    0.71553,   -0.85863,   -2.38490,   -1.61935,   -0.42899,    0.09333,
+   1.95913,    1.36761,    1.86388,    0.36330,   -1.66910,   -1.97065,    1.11231,    2.01403,   -0.54413,   -1.66595,   -1.34725,    0.19886,    0.48335,
+   4.00524,    2.36195,    0.29345,   -1.20186,   -1.95526,   -0.41043,    2.61748,    1.72425,   -0.64939,   -0.40865,    0.01834,    0.99658,    0.33514,
+   5.74574,    2.67030,   -1.71518,   -2.68293,   -1.74787,    0.84111,    2.96371,    0.60119,   -0.91063,    0.09193,    1.28830,    1.29943,    0.38961,
+   9.16844,    3.65109,   -1.55293,   -2.48842,   -0.65675,    2.25802,    2.97735,   -0.45119,   -0.26118,    0.77344,    1.19886,   -0.06256,   -1.31736,
+  14.03404,    5.33166,   -2.18882,   -1.59919,    1.41859,    2.15699,    0.85363,   -1.24766,    0.62711,    1.76408,    0.17662,   -1.57600,   -1.28843,
+  15.93616,    4.98503,   -1.13437,    0.10328,    2.26967,    1.94326,    0.53132,   -0.14357,    1.72593,    0.85668,   -0.54843,   -0.39603,   -0.41069,
+  12.32546,    2.02964,   -0.79794,    1.01409,    1.32153,    0.95630,   -0.38356,   -0.11529,    0.04899,   -0.15901,   -1.38836,    0.45448,    0.89047,
+   3.22332,   -2.96326,   -0.99718,    0.87723,    0.40621,    0.65367,   -0.96395,   -0.43524,   -0.63281,    0.29420,   -0.42521,    0.59194,    1.82136,
+  -4.69443,   -5.77902,   -0.61340,    0.47730,   -0.38476,    0.82694,   -1.10198,    0.46039,   -0.13309,   -0.35774,   -0.16382,    0.47541,    1.05309,
+ -10.69698,   -5.97465,   -0.89254,   -0.53134,   -0.95255,   -0.01493,   -1.16917,    1.09365,    0.38539,   -0.46845,    0.28823,    0.77107,    0.26669,
+ -14.42573,   -2.34556,    0.21167,   -0.54150,   -1.33387,   -0.92884,   -1.04867,    1.61572,    1.16332,   -0.65551,   -0.20347,    1.25553,    0.04953,
+ -17.57152,    2.88091,    2.18779,   -0.04547,   -0.37261,    0.80963,    0.38018,    1.57617,    3.28357,    0.13170,   -0.44664,    0.37655,   -0.28389,
+ -14.15765,    5.55117,   -0.39026,    0.29892,    1.96548,    4.02907,    1.08338,   -0.94065,    2.46001,   -0.13199,   -1.42123,    0.63745,    0.40805,
+  -1.09724,    2.01740,   -1.83111,   -0.83400,    0.98159,    3.77382,    1.09521,   -1.62366,    1.60375,    0.05070,   -1.13992,    1.16497,    1.08691,
+   6.62698,   -1.02055,   -0.89974,   -0.98594,   -0.12853,    0.60213,   -0.30740,   -1.44273,   -0.70436,    0.90354,   -0.16535,   -0.49715,    1.39288,
+   8.37336,   -2.40382,   -0.95125,   -1.39960,   -0.29384,   -2.34899,   -0.69393,   -0.84604,   -3.07693,    0.86963,    1.33303,   -1.90806,    0.30474,
+   9.09226,   -2.35774,   -0.59003,   -2.48865,   -0.22981,   -3.82534,   -0.72252,    0.12832,   -4.10311,    0.43712,    1.39041,   -2.10518,   -1.41038,
+   7.50743,   -0.70278,   -0.37272,   -3.56151,    0.48566,   -4.81038,   -1.70290,    0.77569,   -3.84390,    0.77642,    1.18686,   -1.44140,   -1.27691,
+   2.50409,    1.52394,    0.74946,   -2.17047,   -0.06193,   -3.51532,   -1.92592,    1.04794,   -1.62890,    0.11128,    0.43504,   -0.96312,   -0.99034,
+  -5.22338,    1.67406,    1.82973,   -0.32132,   -0.63252,    0.02896,   -1.02435,   -0.26692,    1.60749,   -0.53685,   -0.22094,   -1.20691,    0.36702,
+  -4.58686,   -0.14313,    0.00440,    0.93010,   -0.13779,    3.95035,    0.10185,   -2.79772,    2.07685,   -1.03115,   -1.39511,    0.04919,    1.56523,
+   0.39207,   -1.65948,    0.05167,    0.69743,   -0.84583,    4.02613,    1.06878,   -1.80613,    3.03130,    0.09818,   -0.74767,    0.97279,    1.37240,
+  -3.67383,   -0.08797,    1.94511,    1.78755,   -0.49418,    2.29842,    2.07127,   -0.99623,    2.53297,    0.82346,    0.10110,    0.16294,    0.38437,
+  -7.04397,   -0.79178,    2.98282,    2.64806,   -0.53676,    1.59799,    2.67209,   -0.37433,    1.24542,    0.88541,    0.39583,   -0.27205,   -0.80536,
+  -4.75853,   -5.44884,    5.40727,    2.14419,   -0.66403,    1.43901,    1.27792,    0.74164,    0.40086,    0.59947,    0.65964,    0.09008,   -1.85426,
+  -0.80910,   -8.15322,    7.01508,    1.74411,    0.55960,    2.30439,    0.38024,    1.74539,   -0.04146,    0.30871,    0.78478,    0.82254,   -1.78181,
+   1.55233,   -8.47263,    6.00203,    2.18416,    0.95761,    2.26771,   -0.28012,    1.41688,   -0.58115,   -0.77729,    0.76535,    1.19218,   -0.95701,
+   1.29372,   -6.79743,    1.55503,    0.30901,    0.57075,    0.15209,    0.14880,    2.44755,   -0.03292,   -1.43924,    0.03932,    0.16937,   -0.24720,
+   1.80636,   -1.49374,   -3.37284,   -0.99571,    0.91656,   -1.79310,    0.63861,    2.60025,    0.04679,   -1.08674,   -0.35133,    0.62593,    0.91322,
+   0.68870,    3.68574,   -7.25332,   -2.06033,    1.34142,   -2.86425,    0.92081,    1.84401,    0.23503,    0.11824,   -0.64202,    0.95494,    1.27660,
+  -1.90220,    7.11677,   -7.94954,   -1.50408,    0.71101,   -3.37488,    0.84299,    0.23825,    0.36986,    0.13650,   -0.21722,    0.56112,    0.53745,
+  -4.09752,    7.19482,   -5.89078,   -0.06701,   -1.19444,   -3.30172,   -0.08174,   -1.53648,   -0.54018,   -0.41243,   -0.20274,   -0.70925,   -0.84675,
+  -5.05081,    6.15473,   -2.14298,    1.96321,   -0.77681,   -0.88775,   -0.60982,   -2.05754,   -1.57310,    0.20186,    0.95024,   -0.09381,   -1.71482,
+  -5.45865,    9.16485,   -0.63835,    2.63683,    3.46940,    2.50331,   -0.89519,   -2.86652,   -2.68339,   -0.42777,    0.46653,   -0.39933,   -0.94980,
+  -7.15794,   14.07588,   -1.48734,    1.17906,    4.65874,    1.20143,   -2.10305,   -2.96969,   -3.33467,   -1.49633,    0.35106,   -0.71336,   -0.29812,
+  -8.20444,   14.70248,   -1.63056,   -1.80849,    1.70856,   -1.71557,   -2.02139,   -0.32258,   -3.55417,   -1.30519,    0.26541,   -0.67806,    0.09364,
+  -4.39986,   10.60242,    0.44664,   -1.66287,    0.12941,   -3.63376,   -1.21170,    0.98407,   -2.61885,    0.09384,    0.55667,    0.57674,    1.04438,
+   0.64806,    2.04062,    1.62402,   -2.34527,   -1.60279,   -3.60193,    0.11853,    1.67965,   -0.51766,    1.37388,    0.41398,    0.75521,    1.42050,
+   5.01791,   -6.15281,    2.48339,   -1.08979,   -3.23749,   -2.58196,    1.27918,    1.82403,    1.16025,    0.95175,   -0.34997,    0.16514,    0.96616,
+   8.83378,  -11.30906,    2.31181,    0.38729,   -3.68626,   -0.78698,    1.80967,    1.37946,    1.47948,    1.08950,   -0.95211,   -0.45951,    0.28065,
+  10.05825,  -12.78813,    2.02912,    1.80898,   -1.54103,    2.77833,    1.83379,    0.91330,    2.08963,    1.27430,   -0.99111,   -0.52263,   -0.20687,
+   9.49942,   -8.71228,    0.17933,    0.86607,    1.12210,    4.19081,   -0.04120,   -0.08533,    2.07753,    0.13819,   -1.49305,   -1.03974,   -0.17264,
+   4.96108,   -2.72504,   -0.90154,   -0.90986,    0.13664,    1.89568,   -1.55447,   -1.30247,    1.80273,   -0.85200,   -0.81179,   -0.69120,   -0.38906,
+   0.08487,   -0.80578,    0.30573,   -1.63767,   -1.27700,    0.27901,   -1.99012,   -1.42654,    0.81261,   -0.51483,    0.30977,    0.62867,   -0.01883,
+   0.24185,   -2.81577,    0.71859,    0.22825,   -2.04332,    0.98005,   -0.73467,   -1.35773,    2.14691,   -0.81958,    0.42843,    1.63667,    0.12070,
+   2.54637,   -2.06032,   -0.37911,   -0.09031,   -2.84493,    1.05361,    0.05539,   -1.33701,    2.37299,   -0.80721,    0.54231,    1.50378,    0.22601,
+  10.74993,    0.46409,   -3.19143,   -1.84183,   -3.66671,    1.15522,    0.10569,   -0.68615,    1.52641,   -0.12650,    0.21268,    0.26509,   -0.17750,
+  13.92211,    1.72096,   -5.49705,   -3.79817,   -2.20497,    0.10411,    0.77840,   -0.50270,    0.24503,    1.44755,    0.86626,   -0.10963,   -0.99623,
+   9.93487,    0.92591,   -5.95206,   -3.68119,   -0.19081,   -1.22371,    2.17165,   -0.46051,   -0.53758,    2.64064,    0.73742,   -0.23889,   -1.42306,
+   2.45853,    0.53382,   -3.86704,   -2.38111,    1.06630,   -2.53741,    2.84142,    0.01277,   -1.36106,    2.59209,   -0.01666,   -0.18922,   -0.74878,
+  -5.16603,    1.10071,   -1.02587,   -0.65498,    1.71131,   -2.87453,    2.04240,    0.47719,   -2.17233,    1.02821,   -0.72409,    0.26941,   -0.00607,
+ -12.43123,    0.30608,    3.68857,    2.96309,    1.55630,   -0.98385,    0.61345,    1.30019,   -1.16512,    0.17263,   -0.45493,    1.32836,    0.42314,
+ -13.59440,   -1.44457,    6.62413,    5.32542,   -0.33035,    1.82161,   -0.62439,    1.11572,    0.18399,   -1.42046,   -0.68679,    1.32077,    0.72066,
+  -9.34379,   -0.82807,    5.77036,    4.03872,   -0.26507,    2.48931,   -1.93166,    0.90906,    0.50134,   -1.90245,    0.14190,    0.16543,    0.41823,
+   0.83365,   -0.15804,    3.34869,    1.48043,    0.92773,    3.18556,   -1.71020,    1.11097,    0.62936,   -1.85763,    0.67584,   -0.91246,    0.15532,
+   3.58294,   -0.49183,    0.86556,   -0.32031,    2.82222,    1.47408,   -0.95646,    0.70039,    0.36673,   -1.66082,    1.52451,   -1.44978,   -0.46740,
+   2.82632,   -0.49331,   -1.30602,   -0.76875,    3.20566,   -0.58260,   -0.59764,    0.17135,   -0.02765,   -1.11568,    0.85042,   -1.88961,   -0.51674,
+   0.73548,    1.22593,   -1.53706,    0.01615,    2.85568,   -1.87749,   -1.63739,    0.51648,   -0.47562,   -0.43747,   -0.16051,   -2.08342,    0.01977,
+  -1.50833,    3.63719,   -0.79696,    1.79341,    2.06264,   -1.83228,   -2.71805,    0.76524,   -0.78004,    0.01473,   -1.01369,   -1.91239,    1.07460,
+  -7.12200,    4.73549,    1.25465,    3.98537,    0.95340,   -0.75236,   -2.93568,   -0.05724,   -0.41303,    0.14127,    0.00988,   -1.37547,    2.44927,
+ -16.05533,    3.48974,    3.98671,    4.36116,    1.44413,    0.49505,   -1.03298,   -0.75418,   -0.42939,    0.38396,    0.34566,   -0.11899,    3.21039,
+ -20.02677,    1.44514,    5.73581,    2.33987,    2.03818,    0.82477,    0.74071,   -0.12468,   -0.08709,    0.82213,    0.27651,    1.10990,    2.00585,
+ -16.45775,   -1.12825,    5.86567,    0.09403,    1.94631,    1.31943,    2.83514,    0.64633,   -0.02941,   -0.10645,   -0.51430,    2.29224,    0.57413,
+ -12.04607,   -5.48223,    4.53004,   -2.18355,   -0.55953,    1.53644,    3.79456,    0.37770,    0.23428,    0.53815,   -0.86937,    1.46214,   -1.51234,
+  -5.08613,   -9.16066,    1.71684,   -2.63321,   -3.00263,   -0.10397,    2.73513,    0.02325,    0.29299,    0.52085,   -1.59154,    0.82633,   -1.91742,
+   5.18221,   -8.78437,   -1.97695,   -2.58549,   -4.10144,   -0.43996,    1.85184,    0.59036,    0.02410,   -0.49077,   -2.30230,   -0.02483,   -1.99048,
+  13.50362,   -5.64577,   -5.21514,   -1.81849,   -3.74644,    0.03933,    1.61908,    0.93424,   -0.06135,   -1.62124,   -2.24047,   -0.76083,   -0.41216,
+  13.04554,   -3.18341,   -6.84896,   -0.21182,   -1.79743,    0.16220,    0.40382,   -0.30199,   -0.28752,   -1.11176,    0.41599,   -0.55934,    0.31086,
+   8.12199,   -0.27922,   -5.83939,    0.04151,    0.92007,    0.47225,    0.06853,   -0.45388,   -0.06354,    0.44807,    1.77689,    0.39586,    0.24896,
+   6.26660,    2.21433,   -4.39397,   -1.09668,    1.60584,   -0.52127,   -1.69893,   -0.80409,    0.01291,    1.24749,    2.14532,    0.70911,   -0.64410,
+   5.37495,    2.85567,   -2.75570,   -1.11314,    1.26053,   -0.62689,   -2.15417,   -1.07443,    0.21577,    1.20760,    1.96039,    0.99756,   -0.54196,
+   2.45326,    2.08029,   -0.18036,   -0.75242,   -0.15587,   -0.52899,   -1.64229,   -1.44529,    0.51506,    2.10977,    1.70373,    0.17180,   -0.51534,
+   7.62515,    4.58346,    0.17525,    1.27628,    0.46337,   -2.61314,   -3.68955,   -1.21973,    0.39711,    0.62896,    1.13624,    0.38422,   -0.05342,
+  28.63886,    8.07296,   -0.43933,    0.56066,   -0.11386,   -2.21033,   -2.54121,    0.73336,    0.59858,   -1.68698,   -1.13978,   -0.28280,   -0.60486,
+  33.05630,    8.21598,   -0.62197,   -0.68171,   -0.86102,   -1.02507,   -0.56918,    1.16628,    0.49057,   -1.98812,   -2.13810,    0.03607,   -0.29178,
+  19.35886,    5.08679,   -0.83876,   -2.11066,   -2.24766,   -0.16469,    1.91195,    0.52344,   -0.19797,   -0.21282,   -1.43950,    0.52516,   -0.51290,
+   1.05964,    2.25556,    1.14766,   -3.16166,   -3.43586,    0.39448,    4.07371,   -0.14690,   -1.13379,    1.46506,   -0.85294,    0.96596,    0.32788,
+ -16.47921,   -0.37634,    4.38852,   -1.72560,   -2.73570,    0.38875,    3.80922,   -1.90740,   -2.70927,    2.43815,   -1.57970,   -0.20923,   -0.03821,
+ -27.79869,   -0.09178,    7.68185,    0.54952,   -2.45296,   -0.10436,    2.05334,   -2.55811,   -3.09893,    2.04949,   -1.75198,   -0.61015,    0.16000,
+ -29.08426,    1.79115,    7.11112,    2.12899,   -2.30041,   -1.32327,   -0.17704,   -1.42358,   -1.49022,    1.48503,   -0.80154,   -2.12979,   -0.42513,
+ -16.58322,    3.19567,    3.07473,    4.25485,   -0.51870,   -1.47221,   -3.10022,   -0.09613,    0.26226,   -0.15524,    0.64078,   -2.16681,   -0.43177,
+   4.19846,    0.74735,   -0.81213,    3.26574,   -0.34897,    0.15579,   -2.97701,    1.42923,    1.36501,   -2.43711,    0.07199,   -1.18562,   -0.30232,
+   7.04351,   -1.93867,   -5.04837,    0.33955,    0.26167,    1.23221,   -1.89839,    1.61539,    2.00777,   -3.04884,   -0.04032,    0.56949,   -0.04057,
+   4.17853,   -3.84825,   -7.78771,   -3.02794,    1.64138,    1.63907,    0.40393,    2.35928,    2.61261,   -2.52924,    1.58602,    1.46927,   -0.19888,
+   2.81883,   -4.79352,   -6.55991,   -4.51712,    5.33195,    2.31995,    1.32159,    1.94338,    1.76991,   -3.49259,    2.76889,    2.00009,    0.38291,
+   3.30576,   -4.24379,   -4.64981,   -4.03144,    8.75425,    3.06653,    1.11204,   -0.49300,   -0.39239,   -4.27045,    3.12231,    1.21235,    0.55950,
+   3.65417,   -1.87101,   -1.98393,   -2.56431,    8.83752,    2.52297,   -0.25835,   -2.24798,   -2.04056,   -2.91090,    4.09639,    0.87054,    0.95408,
+   1.66876,   -1.09840,   -0.87220,   -0.07665,    6.55136,    0.85409,   -2.24251,   -2.67509,   -1.48777,    0.28572,    3.47642,   -1.21795,    0.40747,
+  -1.45178,   -2.86295,    1.16961,    3.82425,    3.41072,    0.44732,   -4.34542,   -2.26515,   -0.07209,    2.41577,    0.68121,   -1.74238,    0.51740,
+  -3.53259,   -4.20449,    3.89107,    6.81943,   -0.81615,   -1.06892,   -4.99324,   -0.61748,    1.44100,    3.22921,   -2.85996,   -1.25922,    0.03446,
+  -4.01745,   -3.92943,    4.96052,    7.61386,   -4.94968,   -2.68325,   -2.57150,    1.85646,    2.97579,    3.07190,   -4.93034,   -1.02494,   -1.25283,
+  -4.55216,   -3.11318,    5.67682,    6.07460,   -6.83842,   -2.52929,    2.05827,    4.41438,    3.24786,    2.01340,   -4.49917,   -0.46858,   -1.99564,
+  -3.57136,   -1.45291,    5.25936,    3.12338,   -5.65845,   -1.49985,    5.85940,    3.96404,    1.07936,    0.50942,   -2.73902,    0.97716,   -1.19766,
+  -1.63437,    0.09951,    2.99573,   -0.20278,   -3.60439,   -0.20191,    6.98759,    1.52803,   -1.94480,    0.52486,    0.13909,    1.53447,    0.45609,
+   0.54424,    2.07960,    0.34316,   -3.33270,   -0.69932,    0.56253,    4.73373,   -0.32955,   -3.64980,    1.72959,    1.96386,    1.03045,    1.12667,
+   1.33631,    2.37755,   -1.87441,   -4.59423,    0.92868,    2.06332,    1.00696,   -1.41669,   -2.16562,    1.62258,    1.16338,   -0.60858,    2.02551,
+   2.16312,    0.69768,   -1.89097,   -4.51454,    0.65384,    2.74707,   -2.52128,   -1.70274,    0.08868,    1.57268,    0.03372,   -2.16884,    2.68824,
+   3.34501,   -2.81341,    0.01824,   -2.27004,   -0.60666,    2.73602,   -3.03987,   -0.84670,    1.59907,    0.48251,   -0.64083,   -1.95746,    1.86315,
+   2.35604,   -5.69370,    1.99409,   -0.58733,   -1.79226,    1.87871,   -1.11883,   -0.60441,    2.69282,   -0.76227,    0.77583,   -0.36741,    0.81042,
+   0.76722,   -5.76291,    2.03095,    0.20537,   -1.45271,    1.17989,    1.10953,   -0.19568,    3.11318,   -0.53355,    0.89315,    0.69284,   -0.69185,
+  -0.64447,   -1.93302,    0.00437,   -0.48542,   -0.01937,    0.06378,    2.04712,   -0.86621,    0.87357,    0.74088,    1.42457,    1.72469,   -1.22077,
+  -1.85081,    3.54681,   -2.57017,   -1.37412,    0.87132,   -1.14356,    1.02429,   -0.88191,   -1.41294,    0.11289,    0.88510,    1.98091,   -1.28046,
+  -1.28988,    9.33262,   -4.66195,   -2.01650,    1.35927,   -1.85700,   -1.28144,   -1.31423,   -2.01477,   -0.89281,   -0.53515,    0.94998,   -1.38835,
+  -1.61862,   12.59195,   -5.25156,   -1.35804,    0.88209,   -1.47722,   -2.90052,   -1.59517,   -2.67036,   -1.73913,   -1.15066,   -0.53627,   -0.70888,
+  -2.16144,   13.02065,   -4.71302,   -0.60855,   -0.72887,   -2.12651,   -3.29260,   -1.59289,   -2.94301,   -1.37787,   -1.51249,   -1.28468,   -0.93711,
+  -2.48996,   10.08527,   -3.78712,    0.59486,   -0.44427,   -1.56782,   -1.47537,   -0.50152,   -1.54615,   -2.45176,   -0.88758,   -0.79308,   -1.51723,
+  -3.37114,    5.22081,   -2.15569,   -0.03493,    0.84560,   -2.38960,    0.53854,    0.20923,    0.41152,   -3.03330,    0.90126,    0.83144,   -0.27947,
+  -3.66135,    1.14919,   -1.63629,    0.48386,    0.79058,   -1.71151,    1.97203,    0.70343,    1.67358,   -1.25116,    1.09744,    0.91605,   -0.61355,
+  -5.64232,   -1.37539,    0.53593,    0.65117,    1.02433,   -0.42820,    2.06895,    1.76367,    0.83862,    0.82207,    1.50662,    0.67475,   -0.27118,
+  -8.30937,   -3.99281,    4.73570,    1.26622,    2.33311,    0.37241,    1.69835,    2.00754,   -1.43329,    1.18721,    0.58491,    0.79643,    1.20485,
+  -6.45230,   -5.18484,    6.87114,    1.22436,    2.44002,    1.83408,    1.04069,    1.26849,   -1.87028,    2.25718,   -0.53987,   -0.57861,    2.23996,
+  -2.87819,   -5.12779,    6.66136,    1.42515,    1.59922,    2.15331,    0.51503,    1.04683,   -2.14922,    2.96057,   -0.44765,   -1.20753,    2.45751,
+   2.55963,   -4.19373,    3.12443,    0.91964,    0.52124,    1.39843,   -0.03413,    0.92559,   -0.64958,    2.35276,   -0.75760,   -0.70371,    1.40571,
+   7.60430,   -3.98521,   -1.01852,   -0.25229,    0.11536,    0.85281,   -0.07025,    0.61516,    1.19230,    0.59239,   -0.08972,    0.04696,    0.24487,
+  10.16228,   -4.02588,   -2.57450,   -0.84913,   -1.32936,   -0.70299,   -0.18757,    0.13752,    2.50470,   -0.35897,    0.59181,    1.03806,   -0.46586,
+   9.22936,   -2.40744,   -4.14243,    0.19192,   -2.82431,   -1.14219,   -0.35091,   -0.02258,    2.76954,   -0.70597,    1.19266,    0.96075,   -1.51163,
+   4.69089,   -1.23410,   -3.08633,    0.74810,   -1.74740,   -1.17424,   -0.94292,    0.43392,    1.91493,   -1.01433,    1.01194,    0.40200,   -1.16780,
+  -0.40179,   -1.07478,   -0.30931,    0.43293,   -0.26438,   -0.77071,   -0.91637,   -0.11969,    0.27763,   -0.48280,   -0.05405,    0.49262,    0.44182,
+  -1.30888,   -0.39406,    0.54836,   -0.45560,   -0.50473,    0.52426,   -0.20709,   -0.85935,    0.01156,    0.10719,   -0.85375,   -0.44064,    0.40290,
+  -2.51316,   -0.30038,    2.24405,    0.04567,   -1.06727,    0.87352,    0.45662,   -0.89379,   -0.20271,    0.05209,   -1.62835,   -1.47750,   -0.11997,
+  -3.21890,   -0.63541,    2.74252,    0.08231,   -1.48443,    0.81144,    1.01067,   -0.51558,   -0.33487,   -0.18637,   -1.36021,   -1.25547,   -0.81002,
+  -3.33979,   -1.25056,    2.29572,    0.46226,   -1.03928,    0.60282,    1.02832,   -0.26747,   -0.32177,   -0.29693,   -1.01177,   -0.69273,   -0.40967,
+   3.83003,   -0.05123,   -2.80682,   -0.09836,   -2.32190,   -2.24635,    0.68250,    0.84364,    0.16497,   -0.45109,   -0.16244,    0.38569,    0.48638,
+   7.31336,    0.54444,   -5.62951,   -0.63746,   -1.75873,   -3.84618,   -0.14022,    1.48527,    0.40388,   -0.55469,    0.84476,    1.14843,    0.98476,
+   4.41448,    0.17238,   -4.92365,   -1.43925,    0.26561,   -2.63845,   -1.26464,    1.46021,    1.35545,    0.86784,    1.07002,    0.40436,    0.32996,
+  -0.36896,   -0.82490,   -2.96900,   -2.93555,    0.88918,   -0.55652,   -1.99362,    0.58595,    1.62409,    1.75007,    0.80250,   -0.38241,   -0.81236,
+  -5.98791,   -2.45780,   -0.14485,   -2.59323,    1.54421,    1.62512,   -2.02780,   -0.97582,    0.64449,    0.93279,    0.13137,   -0.73216,   -1.27276,
+ -10.65201,   -3.67712,    4.00352,   -0.89261,    1.51217,    3.81264,   -0.42121,   -1.77168,   -0.46698,    0.01170,   -0.70166,   -0.99424,   -1.27991,
+ -11.50435,   -4.47949,    5.00780,   -0.00562,    0.40033,    3.46732,    0.00612,   -2.73054,   -2.14512,   -1.20490,   -0.54356,    0.31733,   -0.26649,
+  -6.66438,   -2.96093,    3.70358,    1.25327,   -0.10438,    2.13594,    0.59832,   -2.27570,   -2.58900,   -1.88680,   -0.33843,    1.45507,    1.25116,
+   3.46550,    0.51885,   -0.84675,    0.86400,   -1.94527,   -0.89987,    1.09293,   -0.71812,   -2.02673,   -1.76489,    0.42939,    2.23159,    1.83621,
+   5.75795,    2.37091,   -1.18967,    0.53958,   -1.52071,   -1.74541,    0.81437,    0.14279,   -1.20862,   -0.84202,    0.89451,    1.63559,    1.28508,
+   5.89360,    3.85243,   -0.66250,    0.40889,    0.37277,   -0.73996,    0.74387,    1.29072,    0.38874,    0.70585,    0.82826,    0.10710,    0.19355,
+   5.84407,    3.89011,   -1.06566,   -0.28079,    0.54319,   -0.79726,   -0.10010,    1.10425,    0.99781,    0.80465,    0.30735,   -0.84430,   -0.65162,
+   4.15440,    2.84123,   -0.60409,    0.25845,    0.92166,   -0.71915,   -0.95923,    0.35210,    0.91047,    0.49826,   -0.35318,   -0.94804,   -0.42840,
+   2.92589,    2.50807,    0.45630,    0.74996,    1.16122,    0.25525,   -0.30100,    0.21691,    0.62228,    0.34482,   -0.39568,   -0.85899,   -0.66905,
+   1.59452,    1.46675,    0.42945,    0.58506,    0.71894,    0.06417,   -0.42137,   -0.13321,    0.04791,   -0.18779,   -0.51909,   -0.55866,   -0.39290,
+   0.65455,    0.85218,    0.66460,    0.61843,    0.56772,    0.43565,    0.20614,    0.15363,    0.13117,    0.04038,   -0.14326,   -0.17633,   -0.17159,
+   0.10242,    0.15728,    0.12141,    0.10756,    0.07157,    0.07602,    0.04603,    0.04986,    0.01415,   -0.01059,   -0.07097,   -0.09258,   -0.13962,
+  -0.10807,   -0.14815,   -0.14954,   -0.14938,   -0.17144,   -0.17927,   -0.17881,   -0.17386,   -0.18305,   -0.16965,   -0.14692,   -0.10745,   -0.07029,
+   0.10584,    0.12991,    0.14904,    0.13138,    0.10066,    0.05203,    0.07636,    0.04703,    0.01529,   -0.01553,    0.00099,   -0.01276,    0.01326,
+   0.08425,    0.10493,    0.13542,    0.09583,    0.08445,    0.04019,    0.05727,    0.02121,    0.00529,   -0.05714,   -0.05560,   -0.08407,   -0.08461,
+   0.38736,    0.54152,    0.51499,    0.46106,    0.39383,    0.33696,    0.29355,    0.24304,    0.17114,    0.08912,    0.01619,   -0.04488,   -0.10124,
+   0.57681,    0.80494,    0.77494,    0.73010,    0.67231,    0.60115,    0.51754,    0.42478,    0.32564,    0.22085,    0.11215,    0.00524,   -0.09257,
+   0.26486,    0.36144,    0.34555,    0.35903,    0.38883,    0.39362,    0.36565,    0.33999,    0.33649,    0.32611,    0.27476,    0.19535,    0.12650,
+  -0.21093,   -0.29556,   -0.27549,   -0.22377,   -0.15293,   -0.09083,   -0.04424,    0.00619,    0.07127,    0.13267,    0.16759,    0.17926,    0.18613,
+  -0.24814,   -0.35065,   -0.33638,   -0.33100,   -0.31921,   -0.31383,   -0.29480,   -0.27651,   -0.24126,   -0.20092,   -0.14114,   -0.08350,   -0.02431,
+  -0.28843,   -0.40336,   -0.39127,   -0.38497,   -0.38041,   -0.37398,   -0.35692,   -0.33460,   -0.30211,   -0.25593,   -0.18824,   -0.11065,   -0.03383,
+  -0.40388,   -0.55839,   -0.53149,   -0.49648,   -0.45975,   -0.41103,   -0.35497,   -0.29469,   -0.23840,   -0.17541,   -0.10385,   -0.02526,    0.04476,
+  -0.14369,   -0.19512,   -0.18577,   -0.17187,   -0.16303,   -0.14426,   -0.12706,   -0.11088,   -0.11023,   -0.11001,   -0.11046,   -0.10197,   -0.09659,
+   0.04986,    0.07119,    0.06103,    0.05379,    0.04249,    0.04304,    0.04101,    0.03907,    0.01958,   -0.00486,   -0.03727,   -0.06044,   -0.07913,
+   0.11266,    0.15889,    0.14937,    0.14394,    0.13163,    0.11935,    0.09718,    0.07876,    0.05759,    0.04176,    0.02059,    0.00451,   -0.01118,
+   0.24149,    0.33048,    0.30735,    0.29830,    0.29356,    0.27574,    0.23733,    0.20474,    0.18577,    0.16789,    0.12721,    0.07614,    0.03404,
+   0.30163,    0.39157,    0.35508,    0.31405,    0.30194,    0.24286,    0.17205,    0.09610,    0.07223,    0.04378,    0.00352,   -0.05629,   -0.07777,
+   1.16603,    0.08366,   -0.87697,    0.89533,    1.06093,   -0.67183,   -0.29497,    0.89540,    0.08121,   -0.66815,    0.15620,    0.37290,   -0.36530,
+   9.21120,   -2.82343,   -4.35932,    1.65763,    2.25143,   -1.19674,   -1.27081,    1.41156,   -0.36733,    0.31764,   -0.23390,    0.75131,   -0.77766,
+  15.01506,   -4.99195,   -4.69809,    1.75278,    2.29372,   -1.12755,   -1.63234,    0.76995,   -0.39868,    0.45715,   -0.90487,    0.81855,   -1.40586,
+  14.57721,   -5.55807,   -2.11822,    2.03013,    0.87119,   -0.47299,   -0.55130,    0.30038,   -0.43459,    0.55848,   -0.93575,    0.75292,   -1.14337,
+   9.43524,   -4.92830,    1.26108,    1.52253,   -1.06139,    0.05145,    0.22248,   -0.33880,   -0.28392,    1.37014,   -0.24485,   -0.51274,   -0.57657,
+   1.76494,   -2.84747,    3.64396,   -0.05073,   -3.01963,    0.48404,    0.46461,   -1.16985,   -0.00458,    0.98046,    0.29409,   -1.08060,    0.74265,
+  -5.80262,    1.24152,    4.80939,   -1.44025,   -4.01440,    0.55141,    0.71258,   -1.72037,    0.21627,   -0.15831,    0.42853,   -1.66622,    0.90462,
+ -11.92034,    4.72914,    4.48976,   -1.85948,   -3.03117,    1.10386,    1.54666,   -0.90115,   -0.23760,   -1.21684,    0.45243,   -1.10811,    1.32431,
+ -12.56092,    7.24714,    2.34986,   -1.60707,   -0.33190,    0.82056,    1.54856,    0.30501,   -0.65289,   -1.78371,    0.70834,    0.18954,    1.21825,
+  -6.37655,    7.25386,   -0.86549,   -1.12217,    2.09120,    0.25773,   -0.13453,    0.52964,   -0.37262,   -1.10231,    0.11707,    0.54931,    1.06735,
+  -5.12965,    9.50558,    0.06137,    0.05321,    4.38371,    1.29442,    0.60271,    0.50784,    0.90449,   -1.15440,   -0.76032,    0.79430,    0.42655,
+  -4.91588,   13.99363,    2.21924,    1.72793,    4.22636,    0.88434,    1.02688,   -0.11563,    0.80970,   -0.95908,   -1.16542,    0.09138,   -0.25571,
+  -0.49899,   13.50086,    0.45976,    2.08231,    2.57830,   -2.23514,    1.04862,   -0.80894,    0.50177,   -0.39439,   -1.32026,   -0.65541,   -0.80816,
+   2.50879,    7.05446,   -1.60173,    0.75048,    0.44241,   -3.20741,    1.17587,   -0.86417,    0.22232,   -0.48021,   -1.41610,    0.34684,   -1.20772,
+   3.91430,   -0.11253,   -2.98095,    0.26236,   -1.73557,   -2.69258,    0.81257,   -0.76090,   -0.14933,   -0.11267,   -0.33433,    0.35107,   -2.20689,
+   1.52597,   -8.08723,   -2.88646,   -0.01534,   -2.71940,   -0.59833,    0.44367,   -0.36338,   -0.70591,    0.03754,    1.07923,    1.28916,   -0.98862,
+  -3.19241,  -13.07944,   -1.45363,   -1.00014,   -3.23551,    1.02494,   -0.75324,   -0.25386,   -0.06039,    0.07222,    2.70142,    0.74582,   -0.42609,
+  -9.37112,  -14.01679,    1.58559,   -0.99353,   -2.70695,    2.30827,   -2.86112,    0.00562,    1.23688,   -0.28028,    3.36462,    0.27533,    0.38289,
+ -15.65554,   -9.69857,    5.53239,   -0.88511,   -0.60628,    4.34134,   -2.31666,    1.16146,    2.59606,    0.06560,    2.47435,    0.14085,    1.17497,
+ -17.38906,   -2.45135,    6.80561,   -2.23381,    0.29775,    4.22087,   -1.59670,    1.92207,    1.32889,    0.40569,    1.28392,   -1.24831,    1.78650,
+ -12.32829,   -0.45323,    4.02706,   -3.48876,    0.91028,    2.64065,   -0.40734,    1.09273,   -0.07504,    2.04266,   -0.33405,   -1.75580,    2.78248,
+  -5.48976,   -1.31076,    1.13817,   -4.10307,    1.68517,    2.64528,    0.61998,    0.31068,   -0.72026,    3.38016,   -1.75093,   -1.89652,    2.49156,
+   4.86518,    0.46760,   -4.62680,   -5.68874,   -0.53312,    1.27476,    0.91930,   -0.88800,   -1.38324,    3.65460,   -1.17333,   -1.46998,    1.47362,
+  23.59956,    1.54103,  -10.57325,   -6.55460,   -1.18614,   -3.24342,    0.75381,   -2.71058,   -3.01869,    2.41544,   -1.13300,   -0.30150,    0.60880,
+  32.33330,    2.70337,  -11.78239,   -3.99596,   -1.67392,   -5.54388,    0.69011,   -2.90009,   -3.08534,    0.37034,   -0.66760,    0.15104,   -1.36276,
+  30.06627,    3.26370,   -7.79426,   -0.60895,   -2.00669,   -5.92217,    1.14711,   -1.47520,   -1.91072,   -1.88113,    0.17036,    1.92276,   -2.50109,
+  39.37696,   -4.69698,   -0.04885,    4.63564,   -2.39147,   -3.19453,   -0.69839,    1.31964,    1.29003,   -2.78135,   -0.00281,    2.12537,   -1.31877,
+  28.62589,   -7.60295,    5.43086,    7.42344,   -1.12472,    0.32970,   -1.36870,    2.95929,    2.25571,   -2.58043,   -0.04934,    0.91945,   -0.31753,
+   8.88008,   -7.52631,    8.67690,    8.57319,    0.51966,    2.83565,   -1.92872,    2.09044,    2.85297,   -1.26876,   -0.45494,   -0.01347,    0.57816,
+ -11.64625,   -4.59992,    7.86869,    6.87035,    1.68262,    3.67577,   -1.31846,    1.67403,    2.82795,   -0.42186,   -0.61134,   -0.46697,    0.59609
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ASR_F_GOLDEN_HPP
\ No newline at end of file
diff --git a/tests/use_case/ad/AdTests.cc b/tests/use_case/ad/AdTests.cc
new file mode 100644
index 0000000..09f82da
--- /dev/null
+++ b/tests/use_case/ad/AdTests.cc
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/tests/use_case/ad/InferenceTestAD.cc b/tests/use_case/ad/InferenceTestAD.cc
new file mode 100644
index 0000000..b87699d
--- /dev/null
+++ b/tests/use_case/ad/InferenceTestAD.cc
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ */
+
+#include <catch.hpp>
+#include <random>
+
+#include "AdModel.hpp"
+#include "AdGoldenInput.hpp"
+#include "hal.h"
+#include "TensorFlowLiteMicro.hpp"
+
+#ifndef AD_FEATURE_VEC_DATA_SIZE
+#define AD_IN_FEATURE_VEC_DATA_SIZE (1024)
+#endif /* AD_FEATURE_VEC_DATA_SIZE */
+
+bool RunInference(arm::app::Model& model, const int8_t vec[])
+{
+    TfLiteTensor *inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    const size_t copySz = inputTensor->bytes < AD_IN_FEATURE_VEC_DATA_SIZE ? inputTensor->bytes : AD_IN_FEATURE_VEC_DATA_SIZE;
+
+    memcpy(inputTensor->data.data, vec, copySz);
+
+    return model.RunInference();
+}
+
+bool RunInferenceRandom(arm::app::Model& model)
+{
+    TfLiteTensor *inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    std::random_device rndDevice;
+    std::mt19937 mersenneGen{rndDevice()};
+    std::uniform_int_distribution<short> dist{-128, 127};
+
+    auto gen = [&dist, &mersenneGen]() {
+        return dist(mersenneGen);
+    };
+
+    std::vector<int8_t> randomInput(inputTensor->bytes);
+    std::generate(std::begin(randomInput), std::end(randomInput), gen);
+
+    REQUIRE(RunInference(model, randomInput.data()));
+    return true;
+}
+
+template <typename T>
+void TestInference(const T *input_goldenFV, const T *output_goldenFV, arm::app::Model& model)
+{
+    REQUIRE(RunInference(model, (int8_t*)input_goldenFV));
+
+    TfLiteTensor *outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == AD_OUT_FEATURE_VEC_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++)
+    {
+        REQUIRE((int)tensorData[i] == (int)((T)output_goldenFV[i]));
+    }
+}
+
+TEST_CASE("Running random inference with TensorFlow Lite Micro and AdModel Int8", "[AD][.]")
+{
+    arm::app::AdModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    REQUIRE(RunInferenceRandom(model));
+}
+
+TEST_CASE("Running golden vector inference with TensorFlow Lite Micro and AdModel Int8", "[AD][.]")
+{
+    arm::app::AdModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    TestInference(ad_golden_input, ad_golden_out, model);
+}
\ No newline at end of file
diff --git a/tests/use_case/ad/MelSpecTests.cc b/tests/use_case/ad/MelSpecTests.cc
new file mode 100644
index 0000000..affc67a
--- /dev/null
+++ b/tests/use_case/ad/MelSpecTests.cc
@@ -0,0 +1,226 @@
+/*
+ * 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.
+ */
+
+#include "AdMelSpectrogram.hpp"
+#include <limits>
+#include <algorithm>
+#include <catch.hpp>
+
+/* First 1024 samples from test wav. */
+const std::vector<int16_t> testWav1 = std::vector<int16_t>{
+    490,495,445,403,390,259,126,146,
+    175,134,232,243,166,145,123,33,
+    -61,-4,8,-115,-281,-292,-210,-133,
+    -98,-142,-229,-356,-415,-438,-443,-396,
+    -377,-297,-85,122,172,16,-197,-351,
+    -484,-408,-378,-405,-399,-335,-180,-141,
+    -124,-108,-46,37,141,234,264,218,
+    147,164,132,111,125,73,2,36,
+    107,113,93,6,-40,-153,-273,-282,
+    -291,-298,-389,-446,-394,-324,-333,-385,
+    -485,-548,-690,-718,-660,-704,-690,-601,
+    -549,-641,-637,-513,-469,-366,-227,-269,
+    -348,-408,-486,-570,-638,-666,-730,-746,
+    -710,-634,-543,-461,-281,-156,-130,-126,
+    -144,-118,-23,103,132,37,-69,-86,
+    -234,-360,-366,-330,-248,-268,-282,-169,
+    -190,-152,-151,-145,-133,-205,-263,-397,
+    -558,-656,-668,-718,-779,-828,-856,-817,
+    -761,-759,-722,-772,-873,-983,-962,-897,
+    -843,-788,-750,-677,-555,-447,-373,-218,
+    -182,-230,-204,-174,-144,-127,-231,-199,
+    -127,-194,-250,-183,-189,-254,-249,-337,
+    -417,-459,-513,-505,-481,-402,-344,-284,
+    -281,-441,-450,-423,-327,-119,102,197,
+    208,173,102,103,165,131,15,75,
+    283,365,322,391,303,287,372,406,
+    493,577,640,681,577,498,524,511,
+    476,425,380,315,337,339,408,603,
+    749,745,672,654,588,520,523,544,
+    557,632,636,565,491,413,368,252,
+    136,33,1,-26,-152,-258,-98,18,
+    1,-18,-99,-117,-109,-228,-295,-349,
+    -334,-337,-441,-373,-279,-202,-204,-219,
+    -119,149,410,489,564,623,683,642,
+    707,872,932,862,833,862,894,784,
+    637,559,507,394,306,420,510,484,
+    519,526,599,789,959,1052,1063,1030,
+    860,697,603,530,475,463,468,461,
+    609,641,534,482,435,329,239,216,
+    185,82,88,106,60,26,-43,-127,
+    -220,-262,-317,-259,-172,-175,-271,-217,
+    -196,-164,8,144,150,134,60,13,
+    57,-58,-115,-171,-282,-310,-298,-106,
+    42,-101,-172,-181,-249,-326,-262,-132,
+    -56,-82,-71,-88,-196,-325,-426,-413,
+    -411,-317,-191,-172,-195,-292,-328,-191,
+    -88,-60,21,-63,-175,-135,-64,-83,
+    -163,-279,-440,-536,-403,-308,-236,-132,
+    -95,-69,-73,-21,13,133,185,251,
+    238,88,-66,-134,-175,-231,-219,-151,
+    -213,-328,-340,-374,-459,-601,-556,-395,
+    -248,-205,-174,-227,-402,-493,-464,-483,
+    -588,-564,-463,-493,-505,-416,-378,-313,
+    -215,-192,-192,-59,18,-40,-66,-60,
+    -143,-263,-213,-224,-265,-249,-237,-227,
+    -418,-504,-573,-699,-679,-577,-500,-570,
+    -538,-416,-444,-415,-294,-300,-427,-423,
+    -299,-279,-279,-187,-137,-123,60,230,
+    227,277,356,413,440,418,477,594,
+    697,729,586,561,653,570,590,628,
+    497,357,366,470,591,576,458,439,
+    417,431,447,349,304,241,294,406,
+    484,516,587,598,566,465,380,347,
+    316,391,429,409,216,69,57,76,
+    150,101,93,113,90,41,-28,-15,
+    -2,47,208,261,333,362,239,301,
+    422,431,426,434,482,510,480,407,
+    244,53,-108,-234,-275,-302,-304,-207,
+    -117,-181,-214,-248,-203,-52,5,-14,
+    24,-9,-154,-186,-82,-23,-62,-165,
+    -174,-190,-368,-414,-316,-301,-180,41,
+    116,214,319,408,416,157,-100,-40,
+    118,248,310,301,302,387,458,414,
+    301,261,233,111,33,39,65,56,
+    9,-92,-87,-98,-172,-196,-186,-18,
+    -14,-57,-111,-178,-278,-304,-358,-359,
+    -362,-464,-528,-400,-355,-284,-189,-240,
+    -253,-216,-319,-490,-621,-684,-758,-860,
+    -883,-877,-847,-787,-766,-852,-727,-481,
+    -339,-282,-266,-405,-414,-286,-225,-204,
+    -330,-488,-412,-292,-254,-290,-372,-436,
+    -545,-564,-413,-360,-344,-389,-430,-340,
+    -248,-271,-343,-383,-414,-409,-272,-223,
+    -215,-123,-10,-4,-6,-27,-11,78,
+    169,226,139,-19,16,100,54,-75,
+    -117,-103,-77,-277,-598,-644,-602,-509,
+    -396,-232,-227,-208,-153,-146,-205,-223,
+    -108,-55,-26,-8,-42,-178,-298,-320,
+    -254,-146,-135,-262,-370,-331,-337,-394,
+    -265,-53,136,309,354,312,345,303,
+    275,338,287,269,346,329,319,327,
+    199,118,251,296,243,111,90,150,
+    104,163,274,278,242,135,93,138,
+    5,-154,-206,-270,-334,-356,-251,-96,
+    -78,-123,-80,-93,-160,-217,-214,-154,
+    -42,128,228,243,307,465,492,425,
+    381,382,425,530,518,484,560,654,
+    659,663,723,717,672,652,542,507,
+    471,468,579,573,459,313,262,310,
+    284,235,331,361,275,207,104,35,
+    35,89,136,192,218,161,89,64,
+    116,175,159,95,96,242,350,248,
+    170,64,-35,-136,-202,-271,-307,-290,
+    -257,-219,-206,-185,-216,-213,-184,-135,
+    -165,-141,-25,-31,-28,-98,-247,-162,
+    10,35,-16,-113,-139,-127,-58,-100,
+    -166,-320,-406,-462,-604,-594,-650,-538,
+    -427,-365,-196,-117,-120,-102,-66,-122,
+    -211,-235,-202,-135,-40,-10,-38,-150,
+    -286,-223,-50,93,149,86,184,128,
+    113,163,13,-53,-135,-100,-72,-75,
+    -73,-118,-150,-197,-224,-131,-59,-109,
+    -92,-129,-189,-220,-166,-173,-114,-8,
+    26,-27,-38,50,109,143,161,209,
+    266,289,384,397,312,203,5,-64,
+    -14,6,56,67,19,-43,-112,-46,
+    -74,-101,-83,-115,-142,-207,-274,-292,
+    -299,-236,-181,-188,-48,60,6,-76,
+    -8,115,188,260,236,143,44,-30,
+    -17,31,37,-16,-28,87,210,276,
+    372,365,302,270,137,-8,-142,-246,
+    -279,-259,-203,-241,-278,-254,-245,-177,
+    -77,-8,-47,-159,-295,-412,-414,-414,
+    -566,-533,-255,-82,-10,222,358,336,
+    355,360,303,237,267,224,244,434,
+    422,372,404,464,559,538,446,294,
+    217,60,-82,-150,-144,-162,-250,-263,
+    -222,-148,-81,-134,-134,-106,-27,-71,
+};
+
+/* Golden log mel spec output for test wav. */
+const std::vector<float> testWavMelSpec {
+        -8.601085, -10.563560, -13.791912, -12.356619, -16.892878,
+        -16.913876, -15.695299, -21.848980, -21.193371, -18.772688,
+        -21.795116, -20.008236, -22.413673, -25.162649, -24.091856,
+        -24.936411, -19.341146, -23.534576, -29.052885, -26.562546,
+        -25.046455, -29.586889, -30.115177, -32.281334, -29.806450,
+        -30.398304, -26.682615, -27.397421, -31.224312, -31.033779,
+        -36.314369, -29.530331, -28.428139, -30.097546, -34.101303,
+        -32.660480, -34.229076, -34.668293, -35.140759, -34.104649,
+        -34.141472, -36.514408, -37.655891, -33.590931, -40.532566,
+        -39.105091, -39.600319, -40.239834, -41.356224, -41.103714,
+        -39.861557, -41.827553, -41.275696, -42.203575, -42.689217,
+        -46.495552, -46.704731, -45.560322, -47.423828, -50.672031,
+        -51.387669, -53.410839, -54.899536, -55.807552,
+};
+
+
+arm::app::audio::AdMelSpectrogram GetMelSpecInstance() {
+    int frameLenSamples = 1024;
+    return arm::app::audio::AdMelSpectrogram(frameLenSamples);
+}
+
+template <class T>
+void TestQuntisedMelSpec() {
+    float quantScale = 0.1410219967365265;
+    int quantOffset = 11;
+    std::vector<T> melSpecOutput = GetMelSpecInstance().MelSpecComputeQuant<T>(testWav1, quantScale, quantOffset);
+
+    long min_val = std::numeric_limits<T>::min();
+    long max_val = std::numeric_limits<T>::max();
+
+    for (size_t i = 0; i < testWavMelSpec.size(); i++){
+        long TestWavMelSpec = (std::lround((testWavMelSpec[i] / quantScale) + quantOffset));
+        T quantizedTestWavMelSpec = static_cast<T>(std::max(min_val, std::min(TestWavMelSpec, max_val)));
+
+        REQUIRE(quantizedTestWavMelSpec  == Approx(melSpecOutput[i]).margin(1));
+    }
+}
+
+template void TestQuntisedMelSpec<int8_t>();
+template void TestQuntisedMelSpec<uint8_t>();
+template void TestQuntisedMelSpec<int16_t>();
+
+TEST_CASE("Mel Spec calculation") {
+
+    hal_platform    platform;
+    data_acq_module dataAcq;
+    data_psn_module dataPsn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform */
+    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_platform_init(&platform);
+
+    SECTION("FP32") {
+        auto melSpecOutput = GetMelSpecInstance().ComputeMelSpec(testWav1);
+        REQUIRE_THAT( melSpecOutput, Catch::Approx( testWavMelSpec ).margin(0.1) );
+    }
+
+    SECTION("int8_t") {
+        TestQuntisedMelSpec<int8_t>();
+    }
+
+    SECTION("uint8_t") {
+        TestQuntisedMelSpec<uint8_t>();
+    }
+
+    SECTION("int16_t") {
+        TestQuntisedMelSpec<int16_t>();
+    }
+}
diff --git a/tests/use_case/ad/PostProcessTests.cc b/tests/use_case/ad/PostProcessTests.cc
new file mode 100644
index 0000000..62fa9e7
--- /dev/null
+++ b/tests/use_case/ad/PostProcessTests.cc
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+
+#include "AdPostProcessing.hpp"
+#include <catch.hpp>
+
+TEST_CASE("Softmax_vector") {
+
+    std::vector<float> testVec = {1, 2, 3, 4, 1, 2, 3};
+    arm::app::Softmax(testVec);
+    CHECK((testVec[0] - 0.024) == Approx(0.0).margin(0.001));
+    CHECK((testVec[1] - 0.064) == Approx(0.0).margin(0.001));
+    CHECK((testVec[2] - 0.175) == Approx(0.0).margin(0.001));
+    CHECK((testVec[3] - 0.475) == Approx(0.0).margin(0.001));
+    CHECK((testVec[4] - 0.024) == Approx(0.0).margin(0.001));
+    CHECK((testVec[5] - 0.064) == Approx(0.0).margin(0.001));
+    CHECK((testVec[6] - 0.175) == Approx(0.0).margin(0.001));
+}
+
+TEST_CASE("Output machine index") {
+
+    auto index = arm::app::OutputIndexFromFileName("test_id_00.wav");
+    CHECK(index == 0);
+
+    auto index1 = arm::app::OutputIndexFromFileName("test_id_02.wav");
+    CHECK(index1 == 1);
+
+    auto index2 = arm::app::OutputIndexFromFileName("test_id_4.wav");
+    CHECK(index2 == 2);
+
+    auto index3 = arm::app::OutputIndexFromFileName("test_id_6.wav");
+    CHECK(index3 == 3);
+
+    auto index4 = arm::app::OutputIndexFromFileName("test_id_id_00.wav");
+    CHECK(index4 == -1);
+
+    auto index5 = arm::app::OutputIndexFromFileName("test_id_7.wav");
+    CHECK(index5 == -1);
+}
\ No newline at end of file
diff --git a/tests/use_case/asr/AsrClassifierTests.cc b/tests/use_case/asr/AsrClassifierTests.cc
new file mode 100644
index 0000000..7c71912
--- /dev/null
+++ b/tests/use_case/asr/AsrClassifierTests.cc
@@ -0,0 +1,98 @@
+/*
+ * 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.
+ */
+#include "AsrClassifier.hpp"
+#include "Wav2LetterModel.hpp"
+
+#include <catch.hpp>
+
+TEST_CASE("Test invalid classifier")
+{
+    TfLiteTensor* outputTens = nullptr;
+    std::vector <arm::app::ClassificationResult> resultVec;
+    arm::app::AsrClassifier classifier;
+
+    REQUIRE(!classifier.GetClassificationResults(outputTens, resultVec, {}, 1));
+}
+
+
+TEST_CASE("Test valid classifier UINT8") {
+    const int dimArray[] = {4, 1, 1, 246, 29};
+    std::vector <std::string> labels(29);
+    std::vector <uint8_t> outputVec(7134);
+    TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+    TfLiteTensor tfTensor = tflite::testing::CreateQuantizedTensor(
+                                outputVec.data(), dims, 1, 0, "test");
+    TfLiteTensor* outputTensor = &tfTensor;
+    std::vector <arm::app::ClassificationResult> resultVec;
+    arm::app::AsrClassifier classifier;
+
+    REQUIRE(classifier.GetClassificationResults(outputTensor, resultVec, labels, 1));
+    REQUIRE(246 == resultVec.size());
+}
+
+
+TEST_CASE("Get classification results") {
+    const int dimArray[] = {4, 1, 1, 10, 15};
+    std::vector <std::string> labels(15);
+    std::vector<uint8_t> outputVec(150, static_cast<uint8_t>(1));
+    TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+    TfLiteTensor tfTensor = tflite::testing::CreateQuantizedTensor(
+                                outputVec.data(), dims, 1, 0, "test");
+    TfLiteTensor* outputTensor = &tfTensor;
+
+    std::vector <arm::app::ClassificationResult> resultVec(10);
+
+    /* set the top five results: */
+    std::vector<std::pair<uint32_t, std::pair<uint32_t, uint8_t>>> selectedResults {
+        {0, {3, 23}},
+        {0, {9, 15}},
+        {1, {5, 24}},
+        {1, {7, 4}},
+        {2, {9, 5}},
+        {3, {8, 6}},
+        {4, {13, 10}},
+        {4, {6, 18}},
+        {5, {3, 15}},
+        {5, {4, 115}},
+        {6, {6, 25}},
+        {7, {1, 7}},
+        {8, {11, 9}},
+        {9, {1, 10}}
+    };
+
+    const uint32_t nCols = outputTensor->dims->data[arm::app::Wav2LetterModel::ms_outputColsIdx];
+    for (size_t i = 0; i < selectedResults.size(); ++i) {
+        uint32_t rIndex = selectedResults[i].first;
+        uint32_t cIndex = selectedResults[i].second.first;
+        uint8_t   value = selectedResults[i].second.second;
+        outputVec[rIndex * nCols + cIndex] = value;
+    }
+
+    arm::app::AsrClassifier classifier;
+
+    REQUIRE(classifier.GetClassificationResults(outputTensor, resultVec, labels, 1));
+    REQUIRE(resultVec[0].m_labelIdx == 3);
+    REQUIRE(resultVec[1].m_labelIdx == 5);
+    REQUIRE(resultVec[2].m_labelIdx == 9);
+    REQUIRE(resultVec[3].m_labelIdx == 8);
+    REQUIRE(resultVec[4].m_labelIdx == 6);
+    REQUIRE(resultVec[5].m_labelIdx == 4);
+    REQUIRE(resultVec[6].m_labelIdx == 6);
+    REQUIRE(resultVec[7].m_labelIdx == 1);
+    REQUIRE(resultVec[8].m_labelIdx == 11);
+    REQUIRE(resultVec[9].m_labelIdx == 1);
+}
diff --git a/tests/use_case/asr/AsrFeaturesTests.cc b/tests/use_case/asr/AsrFeaturesTests.cc
new file mode 100644
index 0000000..9401f40
--- /dev/null
+++ b/tests/use_case/asr/AsrFeaturesTests.cc
@@ -0,0 +1,188 @@
+/*
+ * 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.
+ */
+#include "DataStructures.hpp"
+#include "AsrGoldenFeatures.hpp"
+#include "hal.h"
+#include "TensorFlowLiteMicro.hpp"
+#include "Wav2LetterPreprocess.hpp"
+
+#include <catch.hpp>
+#include <random>
+
+class TestPreprocess : public arm::app::audio::asr::Preprocess {
+public:
+    TestPreprocess()
+    : arm::app::audio::asr::Preprocess(0,0,0,0)
+    {}
+
+    bool ComputeDeltas(arm::app::Array2d<float>& mfcc,
+                       arm::app::Array2d<float>& delta1,
+                       arm::app::Array2d<float>& delta2)
+    {
+        return this->_ComputeDeltas(mfcc, delta1, delta2);
+    }
+
+    float GetMean(arm::app::Array2d<float>& vec)
+    {
+        return this->_GetMean(vec);
+    }
+
+    float GetStdDev(arm::app::Array2d<float>& vec, const float mean)
+    {
+       return this->_GetStdDev(vec, mean);
+    }
+
+    void NormaliseVec(arm::app::Array2d<float>& vec)
+    {
+        return this->_NormaliseVec(vec);
+    }
+};
+
+template<class T>
+void CheckOutputs(const std::vector<T> goldenOutput, std::vector<T> output)
+{
+    const size_t goldenSize = goldenOutput.size();
+    const size_t realSize = output.size();
+
+    REQUIRE(realSize == goldenSize);
+    REQUIRE_THAT(output, Catch::Approx( goldenOutput ).margin(0.0001));
+}
+template void CheckOutputs<float>(const std::vector<float> goldenOutput, std::vector<float> output);
+
+void populateBuffer(const float* input, size_t size, size_t numMfccFeats, std::vector<std::vector<float>>& buf)
+{
+    size_t time = 0;
+    for (size_t i = 0; i < size; ++i) {
+        if (i > 0 && i % numMfccFeats == 0) {
+            ++time;
+        }
+        float featureValue = *(input + i);
+        buf[i % numMfccFeats][time] = featureValue;
+    }
+}
+
+void populateArray2dWithVectorOfVector(std::vector<std::vector<float>> vec, arm::app::Array2d<float>& buf)
+{
+    for (size_t i = 0; i < vec.size(); ++i) {
+        for (size_t j = 0; j < vec[i].size(); ++j) {
+            buf(i, j) = vec[i][j];
+        }
+    }
+}
+
+TEST_CASE("Floating point asr features calculation", "[ASR]")
+{
+    TestPreprocess tp;
+
+    SECTION("First and second diff")
+    {
+        constexpr uint32_t numMfccFeats = 13;
+        constexpr uint32_t numFeatVectors = 296;
+
+        arm::app::Array2d<float> mfccBuf(numMfccFeats, numFeatVectors);
+        arm::app::Array2d<float> delta1Buf(numMfccFeats, numFeatVectors);
+        arm::app::Array2d<float> delta2Buf(numMfccFeats, numFeatVectors);
+
+        std::vector<std::vector<float>> goldenMfccBuf(numMfccFeats, std::vector<float>(numFeatVectors));
+        std::vector<std::vector<float>> goldenDelta1Buf(numMfccFeats, std::vector<float>(numFeatVectors));
+        std::vector<std::vector<float>> goldenDelta2Buf(numMfccFeats, std::vector<float>(numFeatVectors));
+
+        populateBuffer(golden_asr_mfcc, golden_asr_mfcc_len, numMfccFeats, goldenMfccBuf);
+        populateBuffer(golden_diff1_features, golden_diff1_len, numMfccFeats, goldenDelta1Buf);
+        populateBuffer(golden_diff2_features, golden_diff2_len, numMfccFeats, goldenDelta2Buf);
+
+        populateArray2dWithVectorOfVector(goldenMfccBuf, mfccBuf);
+        std::fill(delta1Buf.begin(), delta1Buf.end(), 0.f);
+        std::fill(delta2Buf.begin(), delta2Buf.end(), 0.f);
+
+        tp.ComputeDeltas(mfccBuf, delta1Buf, delta2Buf);
+
+        /* First 4 and last 4 values are different because we pad AFTER diff calculated. */
+        for (size_t i = 0; i < numMfccFeats; ++i) {
+            const float* start_goldenDelta1Buf = goldenDelta1Buf[i].data() + 4;
+            const float* start_delta1 = delta1Buf.begin() + i * delta1Buf.size(1) + 4;
+            std::vector<float> goldenDataDelta1(start_goldenDelta1Buf, start_goldenDelta1Buf + numFeatVectors - 8);
+            std::vector<float> tensorDataDelta1(start_delta1, start_delta1 + numFeatVectors - 8);
+
+            CheckOutputs<float>(goldenDataDelta1,tensorDataDelta1);
+
+            const float* start_goldenDelta2Buf = goldenDelta2Buf[i].data() + 4;
+            const float* start_delta2 = delta2Buf.begin() + i * delta2Buf.size(1) + 4;
+            std::vector<float> goldenDataDelta2(start_goldenDelta2Buf, start_goldenDelta2Buf + numFeatVectors - 8);
+            std::vector<float> tensorDataDelta2(start_delta2, start_delta2 + numFeatVectors - 8);
+
+            CheckOutputs<float>(goldenDataDelta2,tensorDataDelta2);
+        }
+
+    }
+
+    SECTION("Mean")
+    {
+        std::vector<std::vector<float>> mean1vec{{1, 2},
+                                                {-1, -2}};
+        arm::app::Array2d<float> mean1(2,2); /* {{1, 2},{-1, -2}} */
+        populateArray2dWithVectorOfVector(mean1vec, mean1);
+        REQUIRE(0 == Approx(tp.GetMean(mean1)));
+
+        arm::app::Array2d<float> mean2(2, 2);
+        std::fill(mean2.begin(), mean2.end(), 0.f);
+        REQUIRE(0 == Approx(tp.GetMean(mean2)));
+
+        arm::app::Array2d<float> mean3(3,3);
+        std::fill(mean3.begin(), mean3.end(), 1.f);
+        REQUIRE(1 == Approx(tp.GetMean(mean3)));
+    }
+
+    SECTION("Std")
+    {
+        arm::app::Array2d<float> std1(2, 2);
+        std::fill(std1.begin(), std1.end(), 0.f); /* {{0, 0}, {0, 0}} */
+        REQUIRE(0 == Approx(tp.GetStdDev(std1, 0)));
+
+        std::vector<std::vector<float>> std2vec{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}};
+        arm::app::Array2d<float> std2(2,5);
+        populateArray2dWithVectorOfVector(std2vec, std2);
+        const float mean = tp.GetMean(std2);
+        REQUIRE(2.872281323 == Approx(tp.GetStdDev(std2, mean)));
+
+        arm::app::Array2d<float> std3(2,2);
+        std::fill(std3.begin(), std3.end(), 1.f); /* std3{{1, 1}, {1, 1}}; */
+        REQUIRE(0 == Approx(tp.GetStdDev(std3, 1)));
+    }
+
+    SECTION("Norm") {
+        auto checker = [&](arm::app::Array2d<float>& d, std::vector<float>& g) {
+            tp.NormaliseVec(d);
+            std::vector<float> d_vec(d.begin(), d.end());
+            REQUIRE_THAT(g, Catch::Approx(d_vec));
+        };
+
+        std::vector<std::vector<float>> norm0vec{{1, 1}, {1, 1}};
+        std::vector<float> goldenNorm0 {0, 0, 0, 0};
+        arm::app::Array2d<float> norm0(2, 2);
+        populateArray2dWithVectorOfVector(norm0vec, norm0);
+        checker(norm0, goldenNorm0);
+
+        std::vector<std::vector<float>> norm1vec{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}};
+        std::vector<float> goldenNorm1 {
+            -1.218543592, -0.87038828, -0.522232968, -0.174077656, 0.174077656,
+             0.522232968,  0.87038828,  1.218543592,  1.566698904, -1.566698904};
+        arm::app::Array2d<float> norm1(2, 5);
+        populateArray2dWithVectorOfVector(norm1vec, norm1);
+        checker(norm1, goldenNorm1);
+    }
+}
diff --git a/tests/use_case/asr/AsrTests.cc b/tests/use_case/asr/AsrTests.cc
new file mode 100644
index 0000000..09f82da
--- /dev/null
+++ b/tests/use_case/asr/AsrTests.cc
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/tests/use_case/asr/InferenceTestWav2Letter.cc b/tests/use_case/asr/InferenceTestWav2Letter.cc
new file mode 100644
index 0000000..1fa4092
--- /dev/null
+++ b/tests/use_case/asr/InferenceTestWav2Letter.cc
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ */
+#include "hal.h"
+#include "TensorFlowLiteMicro.hpp"
+#include "Wav2LetterModel.hpp"
+#include "TestData_asr.hpp"
+
+#include <catch.hpp>
+#include <random>
+
+bool RunInference(arm::app::Model& model, const int8_t vec[], const size_t copySz)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    memcpy(inputTensor->data.data, vec, copySz);
+
+    return model.RunInference();
+}
+
+bool RunInferenceRandom(arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    std::random_device rndDevice;
+    std::mt19937 mersenneGen{rndDevice()};
+    std::uniform_int_distribution<short> dist {-128, 127};
+
+    auto gen = [&dist, &mersenneGen](){
+                   return dist(mersenneGen);
+               };
+
+    std::vector<int8_t> randomAudio(inputTensor->bytes);
+    std::generate(std::begin(randomAudio), std::end(randomAudio), gen);
+
+    REQUIRE(RunInference(model, randomAudio.data(), inputTensor->bytes));
+    return true;
+}
+
+/* Skip this test, Wav2LetterModel if not Vela optimized but only from ML-zoo will fail. */
+TEST_CASE("Running random inference with TensorFlow Lite Micro and Wav2LetterModel Int8", "[Wav2Letter][.]")
+{
+    arm::app::Wav2LetterModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    REQUIRE(RunInferenceRandom(model));
+}
+
+template<typename T>
+void TestInference(const T* input_goldenFV, const T* output_goldenFV, arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    REQUIRE(RunInference(model, input_goldenFV, inputTensor->bytes));
+
+    TfLiteTensor* outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == OFM_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++) {
+        REQUIRE((int)tensorData[i] == (int)((T)output_goldenFV[i]));
+    }
+}
+
+TEST_CASE("Running inference with Tflu and Wav2LetterModel Int8", "[Wav2Letter][.]")
+{
+    for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+        auto input_goldenFV = get_ifm_data_array(i);;
+        auto output_goldenFV = get_ofm_data_array(i);
+
+        DYNAMIC_SECTION("Executing inference with re-init")
+        {
+            arm::app::Wav2LetterModel model{};
+
+            REQUIRE_FALSE(model.IsInited());
+            REQUIRE(model.Init());
+            REQUIRE(model.IsInited());
+
+            TestInference<int8_t>(input_goldenFV, output_goldenFV, model);
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/use_case/asr/MfccTests.cc b/tests/use_case/asr/MfccTests.cc
new file mode 100644
index 0000000..c70e53e
--- /dev/null
+++ b/tests/use_case/asr/MfccTests.cc
@@ -0,0 +1,170 @@
+/*
+ * 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.
+ */
+#include "Wav2LetterMfcc.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+/* First 512 samples from itellyou.wav. */
+const std::vector<int16_t> testWav1 = std::vector<int16_t> {
+    -3,0,1,-1,2,3,-2,2,
+    1,-2,0,3,-1,8,3,2,
+    -1,-1,2,7,3,5,6,6,
+    6,12,5,6,3,3,5,4,
+    4,6,7,7,7,3,7,2,
+    8,4,4,2,-4,-1,-1,-4,
+    2,1,-1,-4,0,-7,-6,-2,
+    -5,1,-5,-1,-7,-3,-3,-7,
+    0,-3,3,-5,0,1,-2,-2,
+    -3,-3,-7,-3,-2,-6,-5,-8,
+    -2,-8,4,-9,-4,-9,-5,-5,
+    -3,-9,-3,-9,-1,-7,-4,1,
+    -3,2,-8,-4,-4,-5,1,-3,
+    -1,0,-1,-2,-3,-2,-4,-1,
+    1,-1,3,0,3,2,0,0,
+    0,-3,1,1,0,8,3,4,
+    1,5,6,4,7,3,3,0,
+    3,6,7,6,4,5,9,9,
+    5,5,8,1,6,9,6,6,
+    7,1,8,1,5,0,5,5,
+    0,3,2,7,2,-3,3,0,
+    3,0,0,0,2,0,-1,-1,
+    -2,-3,-8,0,1,0,-3,-3,
+    -3,-2,-3,-3,-4,-6,-2,-8,
+    -9,-4,-1,-5,-3,-3,-4,-3,
+    -6,3,0,-1,-2,-9,-4,-2,
+    2,-1,3,-5,-5,-2,0,-2,
+    0,-1,-3,1,-2,9,4,5,
+    2,2,1,0,-6,-2,0,0,
+    0,-1,4,-4,3,-7,-1,5,
+    -6,-1,-5,4,3,9,-2,1,
+    3,0,0,-2,1,2,1,1,
+    0,3,2,-1,3,-3,7,0,
+    0,3,2,2,-2,3,-2,2,
+    -3,4,-1,-1,-5,-1,-3,-2,
+    1,-1,3,2,4,1,2,-2,
+    0,2,7,0,8,-3,6,-3,
+    6,1,2,-3,-1,-1,-1,1,
+    -2,2,1,2,0,-2,3,-2,
+    3,-2,1,0,-3,-1,-2,-4,
+    -6,-5,-8,-1,-4,0,-3,-1,
+    -1,-1,0,-2,-3,-7,-1,0,
+    1,5,0,5,1,1,-3,0,
+    -6,3,-8,4,-8,6,-6,1,
+    -6,-2,-5,-6,0,-5,4,-1,
+    4,-2,1,2,1,0,-2,0,
+    0,2,-2,2,-5,2,0,-2,
+    1,-2,0,5,1,0,1,5,
+    0,8,3,2,2,0,5,-2,
+    3,1,0,1,0,-2,-1,-3,
+    1,-1,3,0,3,0,-2,-1,
+    -4,-4,-4,-1,-4,-4,-3,-6,
+    -3,-7,-3,-1,-2,0,-5,-4,
+    -7,-3,-2,-2,1,2,2,8,
+    5,4,2,4,3,5,0,3,
+    3,6,4,2,2,-2,4,-2,
+    3,3,2,1,1,4,-5,2,
+    -3,0,-1,1,-2,2,5,1,
+    4,2,3,1,-1,1,0,6,
+    0,-2,-1,1,-1,2,-5,-1,
+    -5,-1,-6,-3,-3,2,4,0,
+    -1,-5,3,-4,-1,-3,-4,1,
+    -4,1,-1,-1,0,-5,-4,-2,
+    -1,-1,-3,-7,-3,-3,4,4,
+};
+
+const std::vector<int16_t> testWav2 = std::vector<int16_t> (512, 0);
+
+/* Golden mfcc output for testwav1. */
+const std::vector<float> golden_mfcc_output_testWav1 {
+    -835.24603, 21.010452, 18.699404, 7.4338417, 19.028961, -5.401735, 6.4761047, -11.400679,
+    8.392709, 12.202361, 8.403276, -13.508412, -18.307348
+};
+
+/* Golden mfcc output for the all zero wav. */
+const std::vector<float> golden_mfcc_output_testWav2 {
+    -1131.37085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+
+arm::app::audio::Wav2LetterMFCC GetMFCCInstance()
+{
+    const auto sampFreq = arm::app::audio::Wav2LetterMFCC::ms_defaultSamplingFreq;
+    const auto frameLenMs = 32;
+    const auto numMfccFeats = 13;
+    const auto frameLenSamples = sampFreq * frameLenMs * 0.001;
+    return arm::app::audio::Wav2LetterMFCC(numMfccFeats, frameLenSamples);
+}
+
+template <class T>
+void TestQuantisedMFCC()
+{
+    const auto quantScale = 0.1410219967365265;
+    const auto quantOffset = 11;
+    std::vector<T> mfccOutput = GetMFCCInstance().MfccComputeQuant<T>(testWav1, quantScale, quantOffset);
+
+    long min_val = std::numeric_limits<T>::min();
+    long max_val = std::numeric_limits<T>::max();
+
+    for (size_t i = 0; i < golden_mfcc_output_testWav1.size(); i++){
+        long TestWavMfcc = (std::lround((golden_mfcc_output_testWav1[i] / quantScale) + quantOffset));
+        T quantizedTestWavMfcc = static_cast<T>(std::max(min_val, std::min(TestWavMfcc, max_val)));
+
+        REQUIRE(quantizedTestWavMfcc  == Approx(mfccOutput[i]).margin(2));
+    }
+}
+
+template void TestQuantisedMFCC<int8_t>();
+template void TestQuantisedMFCC<uint8_t>();
+template void TestQuantisedMFCC<int16_t>();
+
+TEST_CASE("MFCC calculation")
+{
+    hal_platform    platform;
+    data_acq_module dataAcq;
+    data_psn_module dataPsn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_platform_init(&platform);
+
+    SECTION("FP32")
+    {
+        auto mfccOutput = GetMFCCInstance().MfccCompute(testWav1);
+        REQUIRE_THAT( mfccOutput, Catch::Approx( golden_mfcc_output_testWav1 ).margin(0.3) );
+
+        auto mfccOutput2 = GetMFCCInstance().MfccCompute(testWav2);
+        REQUIRE_THAT( mfccOutput2, Catch::Approx( golden_mfcc_output_testWav2 ).margin(0.001) );
+    }
+
+    SECTION("int8_t")
+    {
+        TestQuantisedMFCC<int8_t>();
+    }
+
+    SECTION("uint8_t")
+    {
+        TestQuantisedMFCC<uint8_t>();
+    }
+
+    SECTION("int16_t")
+    {
+        TestQuantisedMFCC<int16_t>();
+    }
+}
diff --git a/tests/use_case/asr/OutputDecodeTests.cc b/tests/use_case/asr/OutputDecodeTests.cc
new file mode 100644
index 0000000..22153f3
--- /dev/null
+++ b/tests/use_case/asr/OutputDecodeTests.cc
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+#include "OutputDecode.hpp"
+
+#include "catch.hpp"
+
+TEST_CASE("Running output decode on test vector") {
+
+    std::vector<arm::app::ClassificationResult> vecResult(20);
+    /* Number of test inputs. */
+    const size_t numStrings = 8; 
+    
+    /* The test inputs. */
+    std::string testText[numStrings][20] 
+    {
+        {"a", "b", "c", "d", "e", "f", "g", "g", "g", " ", "h", "h", "i", " ", " ", "j", "k", "\'", "\'", "l"},  /* initial */
+        {" ", "b", "c", "d", "e", "f", "g", "g", "g", " ", "h", "h", "i", " ", " ", "j", "k", "\'", "\'", " "},  /* space start and end */
+        {"\'", "b", "c", "d", "e", "f", "g", "g", "g", " ", "h", "h", "i", " ", " ", "j", "k", "\'", "l", "\'"}, /* apostrophe start and end */
+        {"a", "a", "c", "d", "e", "f", "g", "g", "g", " ", "h", "h", "i", " ", " ", "j", "k", "\'", "l", "l"},   /* Double start and end */
+        {"a", "b", "c", "d", "e", "f", "g", "g", "o", "$", "o", "h", "i", " ", " ", "j", "k", "\'", "\'", "l"},  /* Legit double character */
+        {"a", "$", "a", "d", "e", "f", "g", "g", "o", "$", "o", "h", "i", " ", " ", "j", "k", "l", "$", "l"},    /* Legit double character start and end */
+        {"$", "a", "b", "d", "e", "f", "g", "g", "o", "$", "o", "h", "i", " ", " ", "j", "k", "l", "$", "$"},    /* $$ */
+        {"$", "a", "b", "d", "e", "f", "g", "g", "o", "$", "o", "h", "i", " ", " ", "j", "k", "l", "l", "l"}
+    };
+
+    /* The golden outputs for the above test inputs. */
+    std::string expectedOutput[numStrings] =
+    {
+        {"abcdefg hi jk\'l"},
+        {" bcdefg hi jk\' "},
+        {"\'bcdefg hi jk\'l\'"},
+        {"acdefg hi jk\'l"},
+        {"abcdefgoohi jk\'l"},
+        {"aadefgoohi jkll"},
+        {"abdefgoohi jkl"},
+        {"abdefgoohi jkl"}
+    };
+
+    /*For each test input. */
+    for (size_t h = 0; h < numStrings; ++h)
+    {
+        /* Generate fake vecResults.m_label to mimic AsrClassifier output containing the testText. */
+        for (size_t i = 0; i < 20; i++)
+        {
+            vecResult[i].m_label = testText[h][i];
+        }
+        /* Call function with fake vecResults and save returned string into 'buff'. */
+        std::string buff = arm::app::audio::asr::DecodeOutput(vecResult); 
+
+        /* Check that the string returned from the function matches the expected output given above. */
+        REQUIRE(buff.compare(expectedOutput[h]) == 0); 
+    }
+}
\ No newline at end of file
diff --git a/tests/use_case/asr/Wav2LetterPostprocessingTest.cc b/tests/use_case/asr/Wav2LetterPostprocessingTest.cc
new file mode 100644
index 0000000..9ed2e1b
--- /dev/null
+++ b/tests/use_case/asr/Wav2LetterPostprocessingTest.cc
@@ -0,0 +1,199 @@
+/*
+ * 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.
+ */
+#include "Wav2LetterPostprocess.hpp"
+#include "Wav2LetterModel.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+template <typename T>
+static TfLiteTensor GetTestTensor(
+                        std::vector <int>&      shape,
+                        T                       initVal,
+                        std::vector<T>&         vectorBuf)
+{
+    REQUIRE(0 != shape.size());
+
+    shape.insert(shape.begin(), shape.size());
+    uint32_t sizeInBytes = sizeof(T);
+    for (size_t i = 1; i < shape.size(); ++i) {
+        sizeInBytes *= shape[i];
+    }
+
+    /* Allocate mem. */
+    vectorBuf = std::vector<T>(sizeInBytes, initVal);
+    TfLiteIntArray* dims = tflite::testing::IntArrayFromInts(shape.data());
+    return tflite::testing::CreateQuantizedTensor(
+                                vectorBuf.data(), dims,
+                                1, 0, "test-tensor");
+}
+
+TEST_CASE("Checking return value")
+{
+    SECTION("Mismatched post processing parameters and tensor size")
+    {
+        const uint32_t ctxLen = 5;
+        const uint32_t innerLen = 3;
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, 0};
+
+        std::vector <int> tensorShape = {1, 1, 1, 13};
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+        REQUIRE(false == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+    }
+
+    SECTION("Post processing succeeds")
+    {
+        const uint32_t ctxLen = 5;
+        const uint32_t innerLen = 3;
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, 0};
+
+        std::vector <int> tensorShape = {1, 1, 13, 1};
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should not erase anything. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+    }
+}
+
+
+TEST_CASE("Postprocessing - erasing required elements")
+{
+    constexpr uint32_t ctxLen = 5;
+    constexpr uint32_t innerLen = 3;
+    constexpr uint32_t nRows = 2*ctxLen + innerLen;
+    constexpr uint32_t nCols = 10;
+    constexpr uint32_t blankTokenIdx = nCols - 1;
+    std::vector <int> tensorShape = {1, 1, nRows, nCols};
+
+    SECTION("First and last iteration")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should not erase anything. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, true));
+        REQUIRE(originalVec == tensorVec);
+    }
+
+    SECTION("Right context erase")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should erase the right context only. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+        REQUIRE(originalVec != tensorVec);
+
+        /* The last ctxLen * 10 elements should be gone. */
+        for (size_t i = 0; i < ctxLen; ++i) {
+            for (size_t j = 0; j < nCols; ++j) {
+                /* Check right context elements are zeroed. */
+                if (j == blankTokenIdx) {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 1);
+                } else {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 0);
+                }
+
+                /* Check left context is preserved. */
+                CHECK(tensorVec[i*nCols + j] == originalVec[i*nCols + j]);
+            }
+        }
+
+        /* Check inner elements are preserved. */
+        for (size_t i = ctxLen * nCols; i < (ctxLen + innerLen) * nCols; ++i) {
+            CHECK(tensorVec[i] == originalVec[i]);
+        }
+    }
+
+    SECTION("Left and right context erase")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should erase right context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+
+        /* Calling it the second time should erase the left context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+
+        REQUIRE(originalVec != tensorVec);
+
+        /* The first and last ctxLen * 10 elements should be gone. */
+        for (size_t i = 0; i < ctxLen; ++i) {
+            for (size_t j = 0; j < nCols; ++j) {
+                /* Check left and right context elements are zeroed. */
+                if (j == blankTokenIdx) {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 1);
+                    CHECK(tensorVec[i*nCols + j] == 1);
+                } else {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 0);
+                    CHECK(tensorVec[i*nCols + j] == 0);
+                }
+            }
+        }
+
+        /* Check inner elements are preserved. */
+        for (size_t i = ctxLen * nCols; i < (ctxLen + innerLen) * nCols; ++i) {
+            /* Check left context is preserved. */
+            CHECK(tensorVec[i] == originalVec[i]);
+        }
+    }
+
+    SECTION("Try left context erase")
+    {
+        /* Should not be able to erase the left context if it is the first iteration. */
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* Calling it the second time should erase the left context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, true));
+
+        REQUIRE(originalVec == tensorVec);
+    }
+}
diff --git a/tests/use_case/asr/Wav2LetterPreprocessingTest.cc b/tests/use_case/asr/Wav2LetterPreprocessingTest.cc
new file mode 100644
index 0000000..1391011
--- /dev/null
+++ b/tests/use_case/asr/Wav2LetterPreprocessingTest.cc
@@ -0,0 +1,152 @@
+/*
+ * 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.
+ */
+#include "Wav2LetterPreprocess.hpp"
+
+#include <limits>
+#include <algorithm>
+#include <catch.hpp>
+
+constexpr uint32_t numMfccFeatures = 13;
+constexpr uint32_t numMfccVectors  = 10;
+
+/* Test vector output: generated using test-asr-preprocessing.py. */
+int8_t expectedResult[numMfccVectors][numMfccFeatures * 3] = {
+    /* Feature vec 0. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,    /* MFCCs.   */
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,    /* Delta 1. */
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,    /* Delta 2. */
+
+    /* Feature vec 1. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 2. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -12, -12, -12,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 3. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 4 : this should have valid delta 1 and delta 2. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -38, -29,  -9,   1,  -2,  -7,  -8,  -8, -12, -16, -14,  -5,   5,
+    -68, -50, -13,   5,   0,  -9,  -9,  -8, -13, -20, -19,  -3,  15,
+
+    /* Feature vec 5 : this should have valid delta 1 and delta 2. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -62, -45, -11,   5,   0,  -8,  -9,  -8, -12, -19, -17,  -3,  13,
+    -27, -22, -13,  -9, -11, -12, -12, -11, -11, -13, -13, -10,  -6,
+
+    /* Feature vec 6. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 7. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -12, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 8. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -12, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 9. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10
+};
+
+void PopulateTestWavVector(std::vector<int16_t>& vec)
+{
+    constexpr int int16max = std::numeric_limits<int16_t>::max();
+    int val = 0;
+    for (size_t i = 0; i < vec.size(); ++i, ++val) {
+
+        /* We want a differential filter response from both - order 1
+         * and 2 => Don't have a linear signal here - we use a signal
+         * using squares for example. Alternate sign flips might work
+         * just as well and will be computationally less work! */
+        int valsq = val * val;
+        if (valsq > int16max) {
+            val = 0;
+            valsq = 0;
+        }
+        vec[i] = valsq;
+    }
+}
+
+TEST_CASE("Preprocessing calculation INT8")
+{
+    /* Initialise the HAL and platform. */
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Constants. */
+    const uint32_t  windowLen       = 512;
+    const uint32_t  windowStride    = 160;
+    const int       dimArray[]      = {3, 1, numMfccFeatures * 3, numMfccVectors};
+    const float     quantScale      = 0.1410219967365265;
+    const int       quantOffset     = -11;
+
+    /* Test wav memory. */
+    std::vector <int16_t> testWav((windowStride * numMfccVectors) +
+                                  (windowLen - windowStride));
+
+    /* Populate with dummy input. */
+    PopulateTestWavVector(testWav);
+
+    /* Allocate mem for tensor. */
+    std::vector<int8_t> tensorVec(dimArray[1]*dimArray[2]*dimArray[3]);
+
+    /* Initialise dimensions and the test tensor. */
+    TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+    TfLiteTensor tensor = tflite::testing::CreateQuantizedTensor(
+        tensorVec.data(), dims, quantScale, quantOffset, "preprocessedInput");
+
+    /* Initialise pre-processing module. */
+    arm::app::audio::asr::Preprocess prep{
+        numMfccFeatures, windowLen, windowStride, numMfccVectors};
+
+    /* Invoke pre-processing. */
+    REQUIRE(prep.Invoke(testWav.data(), testWav.size(), &tensor));
+
+    /* Wrap the tensor with a std::vector for ease. */
+    int8_t * tensorData = tflite::GetTensorData<int8_t>(&tensor);
+    std::vector <int8_t> vecResults =
+        std::vector<int8_t>(tensorData, tensorData + tensor.bytes);
+
+    /* Check sizes. */
+    REQUIRE(vecResults.size() == sizeof(expectedResult));
+
+    /* Check that the elements have been calculated correctly. */
+    for (uint32_t j = 0; j < numMfccVectors; ++j) {
+        for (uint32_t i = 0; i < numMfccFeatures * 3; ++i) {
+            size_t tensorIdx = (j * numMfccFeatures * 3) + i;
+            CHECK(vecResults[tensorIdx] == expectedResult[j][i]);
+        }
+    }
+}
diff --git a/tests/use_case/img_class/ImgClassTests.cc b/tests/use_case/img_class/ImgClassTests.cc
new file mode 100644
index 0000000..09f82da
--- /dev/null
+++ b/tests/use_case/img_class/ImgClassTests.cc
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/tests/use_case/img_class/ImgClassificationUCTest.cc b/tests/use_case/img_class/ImgClassificationUCTest.cc
new file mode 100644
index 0000000..abfcc44
--- /dev/null
+++ b/tests/use_case/img_class/ImgClassificationUCTest.cc
@@ -0,0 +1,140 @@
+/*
+ * 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.
+ */
+#include "ClassificationResult.hpp"
+#include "Classifier.hpp"
+#include "hal.h"
+#include "Labels.hpp"
+#include "MobileNetModel.hpp"
+#include "UseCaseHandler.hpp"
+#include "UseCaseCommonUtils.hpp"
+
+#include <catch.hpp>
+
+TEST_CASE("Model info")
+{
+    /* Model wrapper object. */
+    arm::app::MobileNetModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<arm::app::Model&>("model", model);
+
+    REQUIRE(model.ShowModelInfoHandler());
+}
+
+
+TEST_CASE("Inference by index", "[.]")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::MobileNetModel model;    
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+    caseContext.Set<uint32_t>("imgIndex", 0);
+    arm::app::Classifier classifier;    /* Classifier wrapper object. */
+    caseContext.Set<arm::app::Classifier&>("classifier", classifier);
+
+    std::vector <std::string> labels;
+    GetLabelsVector(labels);
+    caseContext.Set<const std::vector <std::string>&>("labels", labels);
+
+    REQUIRE(arm::app::ClassifyImageHandler(caseContext, 0, false));
+
+    auto results = caseContext.Get<std::vector<arm::app::ClassificationResult>>("results");
+
+    REQUIRE(results[0].m_labelIdx == 282);
+}
+
+
+TEST_CASE("Inference run all images", "[.]")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::MobileNetModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+    caseContext.Set<uint32_t>("imgIndex", 0);
+    arm::app::Classifier classifier;    /* classifier wrapper object. */
+    caseContext.Set<arm::app::Classifier&>("classifier", classifier);
+
+    std::vector <std::string> labels;
+    GetLabelsVector(labels);
+    caseContext.Set<const std::vector <std::string>&>("labels", labels);
+
+    REQUIRE(arm::app::ClassifyImageHandler(caseContext, 0, true));
+}
+
+
+TEST_CASE("List all images")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::MobileNetModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+
+    REQUIRE(arm::app::ListFilesHandler(caseContext));
+}
\ No newline at end of file
diff --git a/tests/use_case/img_class/InferenceTestMobilenetV2.cc b/tests/use_case/img_class/InferenceTestMobilenetV2.cc
new file mode 100644
index 0000000..698382f
--- /dev/null
+++ b/tests/use_case/img_class/InferenceTestMobilenetV2.cc
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+#include "hal.h"
+#include "ImageUtils.hpp"
+#include "MobileNetModel.hpp"
+#include "TensorFlowLiteMicro.hpp"
+#include "TestData_img_class.hpp"
+
+#include <catch.hpp>
+
+
+bool RunInference(arm::app::Model& model, const uint8_t imageData[])
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    const size_t copySz = inputTensor->bytes < IFM_DATA_SIZE ?
+                            inputTensor->bytes :
+                            IFM_DATA_SIZE;
+    memcpy(inputTensor->data.data, imageData, copySz);
+
+    if(model.IsDataSigned()){
+        convertImgIoInt8(inputTensor->data.data, copySz);
+    }
+
+    return model.RunInference();
+}
+
+template<typename T>
+void TestInference(int imageIdx, arm::app::Model& model, T tolerance) {
+    auto image = get_ifm_data_array(imageIdx);
+    auto goldenFV = get_ofm_data_array(imageIdx);
+
+    REQUIRE(RunInference(model, image));
+
+    TfLiteTensor* outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == OFM_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++) {
+        REQUIRE((int)tensorData[i] == Approx((int)((T)goldenFV[i])).epsilon(tolerance));
+    }
+}
+
+
+TEST_CASE("Running inference with TensorFlow Lite Micro and MobileNeV2 Uint8", "[MobileNetV2]")
+{
+    SECTION("Executing inferences sequentially")
+    {
+        arm::app::MobileNetModel model{};
+
+        REQUIRE_FALSE(model.IsInited());
+        REQUIRE(model.Init());
+        REQUIRE(model.IsInited());
+
+        for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+            TestInference<uint8_t>(i, model, 1);
+        }
+    }
+
+    for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+        DYNAMIC_SECTION("Executing inference with re-init")
+        {
+            arm::app::MobileNetModel model{};
+
+            REQUIRE_FALSE(model.IsInited());
+            REQUIRE(model.Init());
+            REQUIRE(model.IsInited());
+
+            TestInference<uint8_t>(i, model, 1);
+        }
+    }
+}
diff --git a/tests/use_case/kws/InferenceTestDSCNN.cc b/tests/use_case/kws/InferenceTestDSCNN.cc
new file mode 100644
index 0000000..06358a4
--- /dev/null
+++ b/tests/use_case/kws/InferenceTestDSCNN.cc
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+#include "DsCnnModel.hpp"
+#include "hal.h"
+#include "TestData_kws.hpp"
+#include "TensorFlowLiteMicro.hpp"
+
+#include <catch.hpp>
+#include <random>
+
+bool RunInference(arm::app::Model& model, const int8_t vec[])
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    const size_t copySz = inputTensor->bytes < IFM_DATA_SIZE ?
+                            inputTensor->bytes :
+                            IFM_DATA_SIZE;
+    memcpy(inputTensor->data.data, vec, copySz);
+
+    return model.RunInference();
+}
+
+bool RunInferenceRandom(arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    std::random_device rndDevice;
+    std::mt19937 mersenneGen{rndDevice()};
+    std::uniform_int_distribution<short> dist {-128, 127};
+
+    auto gen = [&dist, &mersenneGen](){
+                   return dist(mersenneGen);
+               };
+
+    std::vector<int8_t> randomAudio(inputTensor->bytes);
+    std::generate(std::begin(randomAudio), std::end(randomAudio), gen);
+
+    REQUIRE(RunInference(model, randomAudio.data()));
+    return true;
+}
+
+template<typename T>
+void TestInference(const T* input_goldenFV, const T* output_goldenFV, arm::app::Model& model)
+{
+    REQUIRE(RunInference(model, input_goldenFV));
+
+    TfLiteTensor* outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == OFM_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++) {
+        REQUIRE((int)tensorData[i] == (int)((T)output_goldenFV[i]));
+    }
+}
+
+TEST_CASE("Running random inference with TensorFlow Lite Micro and DsCnnModel Int8", "[DS_CNN]")
+{
+    arm::app::DsCnnModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    REQUIRE(RunInferenceRandom(model));
+}
+
+TEST_CASE("Running inference with TensorFlow Lite Micro and DsCnnModel Uint8", "[DS_CNN]")
+{
+    for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+        const int8_t* input_goldenFV = get_ifm_data_array(i);;
+        const int8_t* output_goldenFV = get_ofm_data_array(i);
+
+        DYNAMIC_SECTION("Executing inference with re-init")
+        {
+            arm::app::DsCnnModel model{};
+
+            REQUIRE_FALSE(model.IsInited());
+            REQUIRE(model.Init());
+            REQUIRE(model.IsInited());
+
+            TestInference<int8_t>(input_goldenFV, output_goldenFV, model);
+
+        }
+    }
+}
diff --git a/tests/use_case/kws/KWSHandlerTest.cc b/tests/use_case/kws/KWSHandlerTest.cc
new file mode 100644
index 0000000..dee2f6f
--- /dev/null
+++ b/tests/use_case/kws/KWSHandlerTest.cc
@@ -0,0 +1,180 @@
+/*
+ * 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.
+ */
+#include <catch.hpp>
+#include "DsCnnModel.hpp"
+#include "hal.h"
+
+#include "KwsResult.hpp"
+#include "Labels.hpp"
+#include "UseCaseHandler.hpp"
+#include "Classifier.hpp"
+#include "UseCaseCommonUtils.hpp"
+
+TEST_CASE("Model info")
+{
+    /* Model wrapper object. */
+    arm::app::DsCnnModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<arm::app::Model&>("model", model);
+
+    REQUIRE(model.ShowModelInfoHandler());
+}
+
+
+TEST_CASE("Inference by index")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::DsCnnModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+    caseContext.Set<int>("frameLength", g_FrameLength);  /* 640 sample length for DSCNN. */
+    caseContext.Set<int>("frameStride", g_FrameStride);  /* 320 sample stride for DSCNN. */
+    caseContext.Set<float>("scoreThreshold", 0.5);       /* Normalised score threshold. */
+
+    arm::app::Classifier classifier;                     /* classifier wrapper object. */
+    caseContext.Set<arm::app::Classifier&>("classifier", classifier);
+
+    auto checker = [&](uint32_t audioIndex, std::vector<uint32_t> labelIndex)
+    {
+        caseContext.Set<uint32_t>("audioIndex", audioIndex);
+
+        std::vector<std::string> labels;
+        GetLabelsVector(labels);
+        caseContext.Set<const std::vector<std::string> &>("labels", labels);
+
+        REQUIRE(arm::app::ClassifyAudioHandler(caseContext, audioIndex, false));
+        REQUIRE(caseContext.Has("results"));
+
+        auto results = caseContext.Get<std::vector<arm::app::kws::KwsResult>>("results");
+
+        REQUIRE(results.size() == labelIndex.size());
+
+        for (size_t i = 0; i < results.size(); i++ ) {
+            REQUIRE(results[i].m_resultVec.size());
+            REQUIRE(results[i].m_resultVec[0].m_labelIdx == labelIndex[i]);
+        }
+
+    };
+
+    SECTION("Index = 0, short clip down")
+    {
+        /* Result: down. */
+        checker(0, {5});
+    }
+
+    SECTION("Index = 1, long clip right->left->up")
+    {
+        /* Result: right->right->left->up->up. */
+        checker(1, {7, 1, 6, 4, 4});
+    }
+
+    SECTION("Index = 2, short clip yes")
+    {
+        /* Result: yes. */
+        checker(2, {2});
+    }
+
+    SECTION("Index = 3, long clip yes->no->go->stop")
+    {
+        /* Result: yes->go->no->go->go->go->stop. */
+        checker(3, {2, 11, 3, 11, 11, 11, 10});
+    }
+}
+
+
+TEST_CASE("Inference run all clips")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::DsCnnModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+    caseContext.Set<uint32_t>("clipIndex", 0);
+    caseContext.Set<int>("frameLength", g_FrameLength);  /* 640 sample length for DSCNN. */
+    caseContext.Set<int>("frameStride", g_FrameStride);  /* 320 sample stride for DSCNN. */
+    caseContext.Set<float>("scoreThreshold", 0.9);       /* Normalised score threshold. */
+    arm::app::Classifier classifier;                     /* classifier wrapper object. */
+    caseContext.Set<arm::app::Classifier&>("classifier", classifier);
+
+    std::vector <std::string> labels;
+    GetLabelsVector(labels);
+    caseContext.Set<const std::vector <std::string>&>("labels", labels);
+    REQUIRE(arm::app::ClassifyAudioHandler(caseContext, 0, true));
+}
+
+
+TEST_CASE("List all audio clips")
+{
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Model wrapper object. */
+    arm::app::DsCnnModel model;
+
+    /* Load the model. */
+    REQUIRE(model.Init());
+
+    /* Instantiate application context. */
+    arm::app::ApplicationContext caseContext;
+
+    caseContext.Set<hal_platform&>("platform", platform);
+    caseContext.Set<arm::app::Model&>("model", model);
+
+    REQUIRE(arm::app::ListFilesHandler(caseContext));
+}
\ No newline at end of file
diff --git a/tests/use_case/kws/KwsTests.cc b/tests/use_case/kws/KwsTests.cc
new file mode 100644
index 0000000..09f82da
--- /dev/null
+++ b/tests/use_case/kws/KwsTests.cc
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/tests/use_case/kws/MfccTests.cc b/tests/use_case/kws/MfccTests.cc
new file mode 100644
index 0000000..407861f
--- /dev/null
+++ b/tests/use_case/kws/MfccTests.cc
@@ -0,0 +1,156 @@
+/*
+ * 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.
+ */
+#include "DsCnnMfcc.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+/* First 640 samples from yes.wav. */
+const std::vector<int16_t> testWav = std::vector<int16_t>{
+    139, 143, 164, 163, 157, 156, 151, 148, 172, 171,
+    165, 169, 149, 142, 145, 147, 166, 146, 112, 132,
+    132, 136, 165, 176, 176, 152, 138, 158, 179, 185,
+    183, 148, 121, 130, 167, 204, 163, 132, 165, 184,
+    193, 205, 210, 204, 195, 178, 168, 197, 207, 201,
+    197, 177, 185, 196, 191, 198, 196, 183, 193, 181,
+    157, 170, 167, 159, 164, 152, 146, 167, 180, 171,
+    194, 232, 204, 173, 171, 172, 184, 169, 175, 199,
+    200, 195, 185, 214, 214, 193, 196, 191, 204, 191,
+    172, 187, 183, 192, 203, 172, 182, 228, 232, 205,
+    177, 174, 191, 210, 210, 211, 197, 177, 198, 217,
+    233, 236, 203, 191, 169, 145, 149, 161, 198, 206,
+    176, 137, 142, 181, 200, 215, 201, 188, 166, 162,
+    184, 155, 135, 132, 126, 142, 169, 184, 172, 156,
+    132, 119, 150, 147, 154, 160, 125, 130, 137, 154,
+    161, 168, 195, 182, 160, 134, 138, 146, 130, 120,
+    101, 122, 137, 118, 117, 131, 145, 140, 146, 148,
+    148, 168, 159, 134, 114, 114, 130, 147, 147, 134,
+    125, 98, 107, 127, 99, 79, 84, 107, 117, 114,
+    93, 92, 127, 112, 109, 110, 96, 118, 97, 87,
+    110, 95, 128, 153, 147, 165, 146, 106, 101, 137,
+    139, 96, 73, 90, 91, 51, 69, 102, 100, 103,
+    96, 101, 123, 107, 82, 89, 118, 127, 99, 100,
+    111, 97, 111, 123, 106, 121, 133, 103, 100, 88,
+    85, 111, 114, 125, 102, 91, 97, 84, 139, 157,
+    109, 66, 72, 129, 111, 90, 127, 126, 101, 109,
+    142, 138, 129, 159, 140, 80, 74, 78, 76, 98,
+    68, 42, 106, 143, 112, 102, 115, 114, 82, 75,
+    92, 80, 110, 114, 66, 86, 119, 101, 101, 103,
+    118, 145, 85, 40, 62, 88, 95, 87, 73, 64,
+    86, 71, 71, 105, 80, 73, 96, 92, 85, 90,
+    81, 86, 105, 100, 89, 78, 102, 114, 95, 98,
+    69, 70, 108, 112, 111, 90, 104, 137, 143, 160,
+    145, 121, 98, 86, 91, 87, 115, 123, 109, 99,
+    85, 120, 131, 116, 125, 144, 153, 111, 98, 110,
+    93, 89, 101, 137, 155, 142, 108, 94, 136, 145,
+    129, 129, 122, 109, 90, 76, 81, 110, 119, 96,
+    95, 102, 105, 111, 90, 89, 111, 115, 86, 51,
+    107, 140, 105, 105, 110, 142, 125, 76, 75, 69,
+    65, 52, 61, 69, 55, 42, 47, 58, 37, 35,
+    24, 20, 44, 22, 16, 26, 6, 3, 4, 23,
+    60, 51, 30, 12, 24, 31, -9, -16, -13, 13,
+    19, 9, 37, 55, 70, 36, 23, 57, 45, 33,
+    50, 59, 18, 11, 62, 74, 52, 8, -3, 26,
+    51, 48, -5, -9, 12, -7, -12, -5, 28, 41,
+    -2, -30, -13, 31, 33, -12, -22, -8, -15, -17,
+    2, -6, -25, -27, -24, -8, 4, -9, -52, -47,
+    -9, -32, -45, -5, 41, 15, -32, -14, 2, -1,
+    -10, -30, -32, -25, -21, -17, -14, 8, -4, -13,
+    34, 18, -36, -38, -18, -19, -28, -17, -14, -16,
+    -2, -20, -27, 12, 11, -17, -33, -12, -22, -64,
+    -42, -26, -23, -22, -37, -51, -53, -30, -18, -48,
+    -69, -38, -54, -96, -72, -49, -50, -57, -41, -22,
+    -43, -64, -54, -23, -49, -69, -41, -44, -42, -49,
+    -40, -26, -54, -50, -38, -49, -70, -94, -89, -69,
+    -56, -65, -71, -47, -39, -49, -79, -91, -56, -46,
+    -62, -86, -64, -32, -47, -50, -71, -77, -65, -68,
+    -52, -51, -61, -67, -61, -81, -93, -52, -59, -62,
+    -51, -75, -76, -50, -32, -54, -68, -70, -43, 1,
+    -42, -92, -80, -41, -38, -79, -69, -49, -82, -122,
+    -93, -21, -24, -61, -70, -73, -62, -74, -69, -43,
+    -25, -15, -43, -23, -26, -69, -44, -12, 1, -51,
+    -78, -13, 3, -53, -105, -72, -24, -62, -66, -31,
+    -40, -65, -86, -64, -44, -55, -63, -61, -37, -41,
+};
+
+/* Golden audio ops mfcc output for the above wav. */
+const std::vector<float> testWavMfcc {
+    -22.67135, -0.61615, 2.07233, 0.58137, 1.01655, 0.85816, 0.46039, 0.03393, 1.16511, 0.0072,
+};
+
+arm::app::audio::DsCnnMFCC GetMFCCInstance() {
+    const int sampFreq = arm::app::audio::DsCnnMFCC::ms_defaultSamplingFreq;
+    const int frameLenMs = 40;
+    const int frameLenSamples = sampFreq * frameLenMs * 0.001;
+    const int numMfccFeats = 10;
+
+   return arm::app::audio::DsCnnMFCC(numMfccFeats, frameLenSamples);
+}
+
+template <class T>
+void TestQuantisedMFCC() {
+    const float quantScale = 1.1088106632232666;
+    const int quantOffset = 95;
+    std::vector<T> mfccOutput = GetMFCCInstance().MfccComputeQuant<T>(testWav, quantScale, quantOffset);
+
+    const long min_val = std::numeric_limits<T>::min();
+    const long max_val = std::numeric_limits<T>::max();
+
+    for (size_t i = 0; i < testWavMfcc.size(); ++i){
+        long TestWavMfcc = (std::lround((testWavMfcc[i] / quantScale) + quantOffset));
+        T quantizedTestWavMfcc = static_cast<T>(std::max(min_val, std::min(TestWavMfcc, max_val)));
+
+        REQUIRE(quantizedTestWavMfcc  == Approx(mfccOutput[i]).margin(0));
+    }
+}
+template void TestQuantisedMFCC<int8_t>();
+template void TestQuantisedMFCC<uint8_t>();
+template void TestQuantisedMFCC<int16_t>();
+
+
+TEST_CASE("MFCC calculation test") {
+    hal_platform    platform;
+    data_acq_module dataAcq;
+    data_psn_module dataPsn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_platform_init(&platform);
+
+    SECTION("FP32")
+    {
+        auto mfccOutput = GetMFCCInstance().MfccCompute(testWav);
+        REQUIRE_THAT( mfccOutput, Catch::Approx(testWavMfcc).margin(0.0001) );
+    }
+
+    SECTION("int8_t")
+    {
+        TestQuantisedMFCC<int8_t>();
+    }
+
+    SECTION("uint8_t")
+    {
+        TestQuantisedMFCC<uint8_t>();
+    }
+
+    SECTION("MFCC quant calculation test - int16_t")
+    {
+        TestQuantisedMFCC<int16_t>();
+    }
+}
\ No newline at end of file
diff --git a/tests/use_case/kws_asr/InferenceTestDSCNN.cc b/tests/use_case/kws_asr/InferenceTestDSCNN.cc
new file mode 100644
index 0000000..f0e5c02
--- /dev/null
+++ b/tests/use_case/kws_asr/InferenceTestDSCNN.cc
@@ -0,0 +1,111 @@
+/*
+ * 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.
+ */
+#include "DsCnnModel.hpp"
+#include "hal.h"
+#include "TestData_kws.hpp"
+#include "TensorFlowLiteMicro.hpp"
+
+#include <catch.hpp>
+#include <random>
+
+namespace arm {
+namespace app {
+namespace kws {
+bool RunInference(arm::app::Model& model, const int8_t vec[])
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    const size_t copySz = inputTensor->bytes < IFM_DATA_SIZE ?
+                            inputTensor->bytes :
+                            IFM_DATA_SIZE;
+    memcpy(inputTensor->data.data, vec, copySz);
+
+    return model.RunInference();
+}
+
+bool RunInferenceRandom(arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    std::random_device rndDevice;
+    std::mt19937 mersenneGen{rndDevice()};
+    std::uniform_int_distribution<short> dist {-128, 127};
+
+    auto gen = [&dist, &mersenneGen](){
+                   return dist(mersenneGen);
+               };
+
+    std::vector<int8_t> randomAudio(inputTensor->bytes);
+    std::generate(std::begin(randomAudio), std::end(randomAudio), gen);
+
+    REQUIRE(RunInference(model, randomAudio.data()));
+    return true;
+}
+
+template<typename T>
+void TestInference(const T* input_goldenFV, const T* output_goldenFV, arm::app::Model& model)
+{
+    REQUIRE(RunInference(model, input_goldenFV));
+
+    TfLiteTensor* outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == OFM_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++) {
+        REQUIRE((int)tensorData[i] == (int)((T)output_goldenFV[i]));
+    }
+}
+
+TEST_CASE("Running random inference with Tflu and DsCnnModel Int8", "[DS_CNN]")
+{
+    arm::app::DsCnnModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    REQUIRE(RunInferenceRandom(model));
+}
+
+TEST_CASE("Running inference with Tflu and DsCnnModel Uint8", "[DS_CNN]")
+{
+    for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+        const int8_t* input_goldenFV = get_ifm_data_array(i);
+        const int8_t* output_goldenFV = get_ofm_data_array(i);
+
+        DYNAMIC_SECTION("Executing inference with re-init")
+        {
+            arm::app::DsCnnModel model{};
+
+            REQUIRE_FALSE(model.IsInited());
+            REQUIRE(model.Init());
+            REQUIRE(model.IsInited());
+
+            TestInference<int8_t>(input_goldenFV, output_goldenFV, model);
+
+        }
+    }
+}
+
+} //namespace
+} //namespace
+} //namespace
diff --git a/tests/use_case/kws_asr/InferenceTestWav2Letter.cc b/tests/use_case/kws_asr/InferenceTestWav2Letter.cc
new file mode 100644
index 0000000..ee63c2f
--- /dev/null
+++ b/tests/use_case/kws_asr/InferenceTestWav2Letter.cc
@@ -0,0 +1,114 @@
+/*
+ * 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.
+ */
+#include "hal.h"
+#include "TensorFlowLiteMicro.hpp"
+#include "Wav2LetterModel.hpp"
+#include "TestData_asr.hpp"
+
+#include <catch.hpp>
+#include <random>
+
+namespace arm {
+namespace app {
+namespace asr {
+
+bool RunInference(arm::app::Model& model, const int8_t vec[], const size_t copySz)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    memcpy(inputTensor->data.data, vec, copySz);
+
+    return model.RunInference();
+}
+
+bool RunInferenceRandom(arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    std::random_device rndDevice;
+    std::mt19937 mersenneGen{rndDevice()};
+    std::uniform_int_distribution<short> dist {-128, 127};
+
+    auto gen = [&dist, &mersenneGen](){
+                   return dist(mersenneGen);
+               };
+
+    std::vector<int8_t> randomAudio(inputTensor->bytes);
+    std::generate(std::begin(randomAudio), std::end(randomAudio), gen);
+
+    REQUIRE(RunInference(model, randomAudio.data(), inputTensor->bytes));
+    return true;
+}
+
+/* Skip this test, Wav2LetterModel if not Vela optimized but only from ML-zoo will fail. */
+TEST_CASE("Running random inference with Tflu and Wav2LetterModel Int8", "[Wav2Letter][.]")
+{
+    arm::app::Wav2LetterModel model{};
+
+    REQUIRE_FALSE(model.IsInited());
+    REQUIRE(model.Init());
+    REQUIRE(model.IsInited());
+
+    REQUIRE(RunInferenceRandom(model));
+}
+
+
+template<typename T>
+void TestInference(const T* input_goldenFV, const T* output_goldenFV, arm::app::Model& model)
+{
+    TfLiteTensor* inputTensor = model.GetInputTensor(0);
+    REQUIRE(inputTensor);
+
+    REQUIRE(RunInference(model, input_goldenFV, inputTensor->bytes));
+
+    TfLiteTensor* outputTensor = model.GetOutputTensor(0);
+
+    REQUIRE(outputTensor);
+    REQUIRE(outputTensor->bytes == OFM_DATA_SIZE);
+    auto tensorData = tflite::GetTensorData<T>(outputTensor);
+    REQUIRE(tensorData);
+
+    for (size_t i = 0; i < outputTensor->bytes; i++) {
+        REQUIRE((int)tensorData[i] == (int)((T)output_goldenFV[i]));
+    }
+}
+
+TEST_CASE("Running inference with Tflu and Wav2LetterModel Int8", "[Wav2Letter][.]")
+{
+    for (uint32_t i = 0 ; i < NUMBER_OF_FM_FILES; ++i) {
+        auto input_goldenFV = get_ifm_data_array(i);;
+        auto output_goldenFV = get_ofm_data_array(i);
+
+        DYNAMIC_SECTION("Executing inference with re-init")
+        {
+            arm::app::Wav2LetterModel model{};
+
+            REQUIRE_FALSE(model.IsInited());
+            REQUIRE(model.Init());
+            REQUIRE(model.IsInited());
+
+            TestInference<int8_t>(input_goldenFV, output_goldenFV, model);
+
+        }
+    }
+}
+
+} //namespace
+} //namespace
+} //namespace
diff --git a/tests/use_case/kws_asr/InitModels.cc b/tests/use_case/kws_asr/InitModels.cc
new file mode 100644
index 0000000..770944d
--- /dev/null
+++ b/tests/use_case/kws_asr/InitModels.cc
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+#include "DsCnnModel.hpp"
+#include "Wav2LetterModel.hpp"
+
+#include <catch.hpp>
+
+/* Skip this test, Wav2LetterModel if not Vela optimized but only from ML-zoo will fail. */
+TEST_CASE("Init two Models", "[.]")
+{
+    arm::app::DsCnnModel model1;
+    arm::app::DsCnnModel model2;
+
+    /* Ideally we should load the wav2letter model here, but there is
+     * none available to run on native (ops not supported on unoptimised
+     * version). However, we can certainly create two instances of the
+     * same type of model to see if our tensor arena re-use works as
+     * intended.
+     *
+     * @TODO: uncomment this when this model can run on native pipeline. */
+    //arm::app::Wav2LetterModel model2;     /* model2. */
+
+    /* Load/initialise the first model. */
+    REQUIRE(model1.Init());
+
+    /* Allocator instance should have been created. */
+    REQUIRE(nullptr != model1.GetAllocator());
+
+    /* Load the second model using the same allocator as model 1. */
+    REQUIRE(model2.Init(model1.GetAllocator()));
+
+    /* Make sure they point to the same allocator object. */
+    REQUIRE(model1.GetAllocator() == model2.GetAllocator());
+
+    /* Both models should report being initialised. */
+    REQUIRE(true == model1.IsInited());
+    REQUIRE(true == model2.IsInited());
+}
\ No newline at end of file
diff --git a/tests/use_case/kws_asr/KwsAsrTests.cc b/tests/use_case/kws_asr/KwsAsrTests.cc
new file mode 100644
index 0000000..09f82da
--- /dev/null
+++ b/tests/use_case/kws_asr/KwsAsrTests.cc
@@ -0,0 +1,18 @@
+/*
+ * 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.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
diff --git a/tests/use_case/kws_asr/MfccTests.cc b/tests/use_case/kws_asr/MfccTests.cc
new file mode 100644
index 0000000..9509519
--- /dev/null
+++ b/tests/use_case/kws_asr/MfccTests.cc
@@ -0,0 +1,156 @@
+/*
+ * 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.
+ */
+#include "DsCnnMfcc.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+/* First 640 samples from yes.wav. */
+const std::vector<int16_t> testWav = std::vector<int16_t>{
+    139, 143, 164, 163, 157, 156, 151, 148, 172, 171,
+    165, 169, 149, 142, 145, 147, 166, 146, 112, 132,
+    132, 136, 165, 176, 176, 152, 138, 158, 179, 185,
+    183, 148, 121, 130, 167, 204, 163, 132, 165, 184,
+    193, 205, 210, 204, 195, 178, 168, 197, 207, 201,
+    197, 177, 185, 196, 191, 198, 196, 183, 193, 181,
+    157, 170, 167, 159, 164, 152, 146, 167, 180, 171,
+    194, 232, 204, 173, 171, 172, 184, 169, 175, 199,
+    200, 195, 185, 214, 214, 193, 196, 191, 204, 191,
+    172, 187, 183, 192, 203, 172, 182, 228, 232, 205,
+    177, 174, 191, 210, 210, 211, 197, 177, 198, 217,
+    233, 236, 203, 191, 169, 145, 149, 161, 198, 206,
+    176, 137, 142, 181, 200, 215, 201, 188, 166, 162,
+    184, 155, 135, 132, 126, 142, 169, 184, 172, 156,
+    132, 119, 150, 147, 154, 160, 125, 130, 137, 154,
+    161, 168, 195, 182, 160, 134, 138, 146, 130, 120,
+    101, 122, 137, 118, 117, 131, 145, 140, 146, 148,
+    148, 168, 159, 134, 114, 114, 130, 147, 147, 134,
+    125, 98, 107, 127, 99, 79, 84, 107, 117, 114,
+    93, 92, 127, 112, 109, 110, 96, 118, 97, 87,
+    110, 95, 128, 153, 147, 165, 146, 106, 101, 137,
+    139, 96, 73, 90, 91, 51, 69, 102, 100, 103,
+    96, 101, 123, 107, 82, 89, 118, 127, 99, 100,
+    111, 97, 111, 123, 106, 121, 133, 103, 100, 88,
+    85, 111, 114, 125, 102, 91, 97, 84, 139, 157,
+    109, 66, 72, 129, 111, 90, 127, 126, 101, 109,
+    142, 138, 129, 159, 140, 80, 74, 78, 76, 98,
+    68, 42, 106, 143, 112, 102, 115, 114, 82, 75,
+    92, 80, 110, 114, 66, 86, 119, 101, 101, 103,
+    118, 145, 85, 40, 62, 88, 95, 87, 73, 64,
+    86, 71, 71, 105, 80, 73, 96, 92, 85, 90,
+    81, 86, 105, 100, 89, 78, 102, 114, 95, 98,
+    69, 70, 108, 112, 111, 90, 104, 137, 143, 160,
+    145, 121, 98, 86, 91, 87, 115, 123, 109, 99,
+    85, 120, 131, 116, 125, 144, 153, 111, 98, 110,
+    93, 89, 101, 137, 155, 142, 108, 94, 136, 145,
+    129, 129, 122, 109, 90, 76, 81, 110, 119, 96,
+    95, 102, 105, 111, 90, 89, 111, 115, 86, 51,
+    107, 140, 105, 105, 110, 142, 125, 76, 75, 69,
+    65, 52, 61, 69, 55, 42, 47, 58, 37, 35,
+    24, 20, 44, 22, 16, 26, 6, 3, 4, 23,
+    60, 51, 30, 12, 24, 31, -9, -16, -13, 13,
+    19, 9, 37, 55, 70, 36, 23, 57, 45, 33,
+    50, 59, 18, 11, 62, 74, 52, 8, -3, 26,
+    51, 48, -5, -9, 12, -7, -12, -5, 28, 41,
+    -2, -30, -13, 31, 33, -12, -22, -8, -15, -17,
+    2, -6, -25, -27, -24, -8, 4, -9, -52, -47,
+    -9, -32, -45, -5, 41, 15, -32, -14, 2, -1,
+    -10, -30, -32, -25, -21, -17, -14, 8, -4, -13,
+    34, 18, -36, -38, -18, -19, -28, -17, -14, -16,
+    -2, -20, -27, 12, 11, -17, -33, -12, -22, -64,
+    -42, -26, -23, -22, -37, -51, -53, -30, -18, -48,
+    -69, -38, -54, -96, -72, -49, -50, -57, -41, -22,
+    -43, -64, -54, -23, -49, -69, -41, -44, -42, -49,
+    -40, -26, -54, -50, -38, -49, -70, -94, -89, -69,
+    -56, -65, -71, -47, -39, -49, -79, -91, -56, -46,
+    -62, -86, -64, -32, -47, -50, -71, -77, -65, -68,
+    -52, -51, -61, -67, -61, -81, -93, -52, -59, -62,
+    -51, -75, -76, -50, -32, -54, -68, -70, -43, 1,
+    -42, -92, -80, -41, -38, -79, -69, -49, -82, -122,
+    -93, -21, -24, -61, -70, -73, -62, -74, -69, -43,
+    -25, -15, -43, -23, -26, -69, -44, -12, 1, -51,
+    -78, -13, 3, -53, -105, -72, -24, -62, -66, -31,
+    -40, -65, -86, -64, -44, -55, -63, -61, -37, -41,
+};
+
+/* Golden audio ops mfcc output for the above wav. */
+const std::vector<float> testWavMfcc {
+    -22.67135, -0.61615, 2.07233, 0.58137, 1.01655, 0.85816, 0.46039, 0.03393, 1.16511, 0.0072,
+};
+
+arm::app::audio::DsCnnMFCC GetMFCCInstance() {
+    const int sampFreq = arm::app::audio::DsCnnMFCC::ms_defaultSamplingFreq;
+    const int frameLenMs = 40;
+    const int frameLenSamples = sampFreq * frameLenMs * 0.001;
+    const int numMfccFeats = 10;
+
+   return arm::app::audio::DsCnnMFCC(numMfccFeats, frameLenSamples);
+}
+
+template <class T>
+void TestQuntisedMFCC() {
+    const float quantScale = 1.1088106632232666;
+    const int quantOffset = 95;
+    std::vector<T> mfccOutput = GetMFCCInstance().MfccComputeQuant<T>(testWav, quantScale, quantOffset);
+
+    const long min_val = std::numeric_limits<T>::min();
+    const long max_val = std::numeric_limits<T>::max();
+
+    for (size_t i = 0; i < testWavMfcc.size(); ++i){
+        long TestWavMfcc = (std::lround((testWavMfcc[i] / quantScale) + quantOffset));
+        T quantizedTestWavMfcc = static_cast<T>(std::max(min_val, std::min(TestWavMfcc, max_val)));
+
+        REQUIRE(quantizedTestWavMfcc  == Approx(mfccOutput[i]).margin(0));
+    }
+}
+template void TestQuntisedMFCC<int8_t>();
+template void TestQuntisedMFCC<uint8_t>();
+template void TestQuntisedMFCC<int16_t>();
+
+TEST_CASE("MFCC calculation test")
+{
+    hal_platform    platform;
+    data_acq_module dataAcq;
+    data_psn_module dataPsn;
+    platform_timer  timer;
+
+    /* Initialise the HAL and platform. */
+    hal_init(&platform, &dataAcq, &dataPsn, &timer);
+    hal_platform_init(&platform);
+
+    SECTION("FP32")
+    {
+        auto mfccOutput = GetMFCCInstance().MfccCompute(testWav);
+        REQUIRE_THAT( mfccOutput, Catch::Approx( testWavMfcc ).margin(0.0001) );
+    }
+
+    SECTION("int8_t")
+    {
+        TestQuntisedMFCC<int8_t>();
+    }
+
+    SECTION("uint8_t")
+    {
+        TestQuntisedMFCC<uint8_t>();
+    }
+
+    SECTION("MFCC quant calculation test - int16_t")
+    {
+        TestQuntisedMFCC<int16_t>();
+    }
+}
\ No newline at end of file
diff --git a/tests/use_case/kws_asr/Wav2LetterPostprocessingTest.cc b/tests/use_case/kws_asr/Wav2LetterPostprocessingTest.cc
new file mode 100644
index 0000000..6fd7df3
--- /dev/null
+++ b/tests/use_case/kws_asr/Wav2LetterPostprocessingTest.cc
@@ -0,0 +1,194 @@
+/*
+ * 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.
+ */
+#include "Wav2LetterPostprocess.hpp"
+#include "Wav2LetterModel.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+template <typename T>
+static TfLiteTensor GetTestTensor(std::vector <int>& shape,
+                                  T                  initVal,
+                                  std::vector<T>&    vectorBuf)
+{
+    REQUIRE(0 != shape.size());
+
+    shape.insert(shape.begin(), shape.size());
+    uint32_t sizeInBytes = sizeof(T);
+    for (size_t i = 1; i < shape.size(); ++i) {
+        sizeInBytes *= shape[i];
+    }
+
+    /* Allocate mem. */
+    vectorBuf = std::vector<T>(sizeInBytes, initVal);
+    TfLiteIntArray* dims = tflite::testing::IntArrayFromInts(shape.data());
+    return tflite::testing::CreateQuantizedTensor(
+                                vectorBuf.data(), dims,
+                                1, 0, "test-tensor");
+}
+
+TEST_CASE("Checking return value")
+{
+    SECTION("Mismatched post processing parameters and tensor size")
+    {
+        const uint32_t ctxLen = 5;
+        const uint32_t innerLen = 3;
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, 0};
+
+        std::vector <int> tensorShape = {1, 1, 1, 13};
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+        REQUIRE(false == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+    }
+
+    SECTION("Post processing succeeds")
+    {
+        const uint32_t ctxLen = 5;
+        const uint32_t innerLen = 3;
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, 0};
+
+        std::vector <int> tensorShape = {1, 1, 13, 1};
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should not erase anything. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+    }
+}
+
+TEST_CASE("Postprocessing - erasing required elements")
+{
+    constexpr uint32_t ctxLen = 5;
+    constexpr uint32_t innerLen = 3;
+    constexpr uint32_t nRows = 2*ctxLen + innerLen;
+    constexpr uint32_t nCols = 10;
+    constexpr uint32_t blankTokenIdx = nCols - 1;
+    std::vector <int> tensorShape = {1, 1, nRows, nCols};
+
+    SECTION("First and last iteration")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should not erase anything. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, true));
+        REQUIRE(originalVec == tensorVec);
+    }
+
+    SECTION("Right context erase")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should erase the right context only. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+        REQUIRE(originalVec != tensorVec);
+
+        /* The last ctxLen * 10 elements should be gone. */
+        for (size_t i = 0; i < ctxLen; ++i) {
+            for (size_t j = 0; j < nCols; ++j) {
+                /* Check right context elements are zeroed. */
+                if (j == blankTokenIdx) {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 1);
+                } else {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i*nCols + j] == 0);
+                }
+
+                /* Check left context is preserved. */
+                CHECK(tensorVec[i*nCols + j] == originalVec[i*nCols + j]);
+            }
+        }
+
+        /* Check inner elements are preserved. */
+        for (size_t i = ctxLen * nCols; i < (ctxLen + innerLen) * nCols; ++i) {
+            CHECK(tensorVec[i] == originalVec[i]);
+        }
+    }
+
+    SECTION("Left and right context erase")
+    {
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* This step should erase right context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+
+        /* Calling it the second time should erase the left context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, false));
+
+        REQUIRE(originalVec != tensorVec);
+
+        /* The first and last ctxLen * 10 elements should be gone. */
+        for (size_t i = 0; i < ctxLen; ++i) {
+            for (size_t j = 0; j < nCols; ++j) {
+                /* Check left and right context elements are zeroed. */
+                if (j == blankTokenIdx) {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i * nCols + j] == 1);
+                    CHECK(tensorVec[i * nCols + j] == 1);
+                } else {
+                    CHECK(tensorVec[(ctxLen + innerLen) * nCols + i * nCols + j] == 0);
+                    CHECK(tensorVec[i * nCols + j] == 0);
+                }
+            }
+        }
+
+        /* Check inner elements are preserved. */
+        for (size_t i = ctxLen * nCols; i < (ctxLen + innerLen) * nCols; ++i) {
+            /* Check left context is preserved. */
+            CHECK(tensorVec[i] == originalVec[i]);
+        }
+    }
+
+    SECTION("Try left context erase")
+    {
+        /* Should not be able to erase the left context if it is the first iteration. */
+        arm::app::audio::asr::Postprocess post{ctxLen, innerLen, blankTokenIdx};
+
+        std::vector <int8_t> tensorVec;
+        TfLiteTensor tensor = GetTestTensor<int8_t>(
+                                tensorShape, 100, tensorVec);
+
+        /* Copy elements to compare later. */
+        std::vector <int8_t> originalVec = tensorVec;
+
+        /* Calling it the second time should erase the left context. */
+        REQUIRE(true == post.Invoke(&tensor, arm::app::Wav2LetterModel::ms_outputRowsIdx, true));
+        REQUIRE(originalVec == tensorVec);
+    }
+}
\ No newline at end of file
diff --git a/tests/use_case/kws_asr/Wav2LetterPreprocessingTest.cc b/tests/use_case/kws_asr/Wav2LetterPreprocessingTest.cc
new file mode 100644
index 0000000..e71366a
--- /dev/null
+++ b/tests/use_case/kws_asr/Wav2LetterPreprocessingTest.cc
@@ -0,0 +1,152 @@
+/*
+ * 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.
+ */
+#include "Wav2LetterPreprocess.hpp"
+
+#include <algorithm>
+#include <catch.hpp>
+#include <limits>
+
+constexpr uint32_t numMfccFeatures = 13;
+constexpr uint32_t numMfccVectors  = 10;
+
+/* Test vector output: generated using test-asr-preprocessing.py. */
+int8_t expectedResult[numMfccVectors][numMfccFeatures*3] = {
+    /* Feature vec 0. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,    /* MFCCs.   */
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,    /* Delta 1. */
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,    /* Delta 2. */
+
+    /* Feature vec 1. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 2. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -12, -12, -12,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 3. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 4 : this should have valid delta 1 and delta 2. */
+    -31,   4,  -9,  -9, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -38, -29,  -9,   1,  -2,  -7,  -8,  -8, -12, -16, -14,  -5,   5,
+    -68, -50, -13,   5,   0,  -9,  -9,  -8, -13, -20, -19,  -3,  15,
+
+    /* Feature vec 5 : this should have valid delta 1 and delta 2. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -11, -12, -12,
+    -62, -45, -11,   5,   0,  -8,  -9,  -8, -12, -19, -17,  -3,  13,
+    -27, -22, -13,  -9, -11, -12, -12, -11, -11, -13, -13, -10,  -6,
+
+    /* Feature vec 6. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 7. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -12, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 8. */
+    -32,   4,  -9,  -8, -10, -10, -11, -11, -11, -12, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+
+    /* Feature vec 9. */
+    -31,   4,  -9,  -8, -10, -10, -11, -11, -11, -11, -12, -11, -11,
+    -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
+    -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10
+};
+
+void PopulateTestWavVector(std::vector<int16_t>& vec)
+{
+    constexpr int int16max = std::numeric_limits<int16_t>::max();
+    int val = 0;
+    for (size_t i = 0; i < vec.size(); ++i, ++val) {
+
+        /* We want a differential filter response from both - order 1
+         * and 2 => Don't have a linear signal here - we use a signal
+         * using squares for example. Alternate sign flips might work
+         * just as well and will be computationally less work! */
+        int valsq = val * val;
+        if (valsq > int16max) {
+            val = 0;
+            valsq = 0;
+        }
+        vec[i] = valsq;
+    }
+}
+
+TEST_CASE("Preprocessing calculation INT8")
+{
+    /* Initialise the HAL and platform. */
+    hal_platform    platform;
+    data_acq_module data_acq;
+    data_psn_module data_psn;
+    platform_timer  timer;
+    hal_init(&platform, &data_acq, &data_psn, &timer);
+    hal_platform_init(&platform);
+
+    /* Constants. */
+    const uint32_t  windowLen       = 512;
+    const uint32_t  windowStride    = 160;
+    const int       dimArray[]      = {3, 1, numMfccFeatures * 3, numMfccVectors};
+    const float     quantScale      = 0.1410219967365265;
+    const int       quantOffset     = -11;
+
+    /* Test wav memory. */
+    std::vector <int16_t> testWav((windowStride * numMfccVectors) +
+                                  (windowLen - windowStride));
+
+    /* Populate with dummy input. */
+    PopulateTestWavVector(testWav);
+
+    /* Allocate mem for tensor. */
+    std::vector<int8_t> tensorVec(dimArray[1]*dimArray[2]*dimArray[3]);
+
+    /* Initialise dimensions and the test tensor. */
+    TfLiteIntArray* dims= tflite::testing::IntArrayFromInts(dimArray);
+    TfLiteTensor tensor = tflite::testing::CreateQuantizedTensor(
+        tensorVec.data(), dims, quantScale, quantOffset, "preprocessedInput");
+
+    /* Initialise pre-processing module. */
+    arm::app::audio::asr::Preprocess prep{
+        numMfccFeatures, windowLen, windowStride, numMfccVectors};
+
+    /* Invoke pre-processing. */
+    REQUIRE(prep.Invoke(testWav.data(), testWav.size(), &tensor));
+
+    /* Wrap the tensor with a std::vector for ease. */
+    int8_t * tensorData = tflite::GetTensorData<int8_t>(&tensor);
+    std::vector <int8_t> vecResults =
+        std::vector<int8_t>(tensorData, tensorData + tensor.bytes);
+
+    /* Check sizes. */
+    REQUIRE(vecResults.size() == sizeof(expectedResult));
+
+    /* Check that the elements have been calculated correctly. */
+    for (uint32_t j = 0; j < numMfccVectors; ++j) {
+        for (uint32_t i = 0; i < numMfccFeatures * 3; ++i) {
+            size_t tensorIdx = (j * numMfccFeatures * 3) + i;
+            CHECK(vecResults[tensorIdx] == expectedResult[j][i]);
+        }
+    }
+}
diff --git a/tests/utils/ImageUtils.cc b/tests/utils/ImageUtils.cc
new file mode 100644
index 0000000..f77ce1e
--- /dev/null
+++ b/tests/utils/ImageUtils.cc
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+#include "ImageUtils.hpp"
+
+void convertImgIoInt8(void * data, const size_t sz)
+{
+    uint8_t * tmp_req_data          = (uint8_t *)data;
+    int8_t * tmp_signed_req_data    = (int8_t *) data;
+
+    for (size_t i = 0; i < sz; ++i) {
+        tmp_signed_req_data[i] = (int8_t)(
+                (int32_t)(tmp_req_data[i]) - 128);
+    }
+}
+
+void convertImgIoGreyscale(const uint8_t * srcPtr, uint8_t * dstPtr, const size_t sz)
+{
+    for (size_t i = 0; i < sz; ++i, srcPtr += 3) {
+        *dstPtr++ = 0.2989 * (*srcPtr) +
+                    0.587 * (*(srcPtr+1)) +
+                    0.114 * (*(srcPtr+2));
+    }
+}
\ No newline at end of file
diff --git a/tests/utils/ImageUtils.hpp b/tests/utils/ImageUtils.hpp
new file mode 100644
index 0000000..838dcef
--- /dev/null
+++ b/tests/utils/ImageUtils.hpp
@@ -0,0 +1,26 @@
+/*
+ * 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 IMAGEUTILS_HPP
+#define IMAGEUTILS_HPP
+
+#include <catch.hpp>
+
+void convertImgIoInt8(void * data, const size_t sz);
+
+void convertImgIoGreyscale(const uint8_t * srcPtr, uint8_t * dstPtr, const size_t sz);
+
+#endif /* IMAGEUTILS_HPP */