summaryrefslogtreecommitdiff
path: root/fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c')
-rw-r--r--fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c b/fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c
new file mode 100644
index 0000000..87908ed
--- /dev/null
+++ b/fw/midi-dials/Drivers/CMSIS/DSP/Examples/ARM/arm_linear_interp_example/arm_linear_interp_example_f32.c
@@ -0,0 +1,204 @@
+/* ----------------------------------------------------------------------
+* Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+*
+* $Date: 17. January 2013
+* $Revision: V1.4.0
+*
+* Project: CMSIS DSP Library
+* Title: arm_linear_interp_example_f32.c
+*
+* Description: Example code demonstrating usage of sin function
+* and uses linear interpolation to get higher precision
+*
+* Target Processor: Cortex-M4/Cortex-M3
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* - Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* - Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+* - Neither the name of ARM LIMITED nor the names of its contributors
+* may be used to endorse or promote products derived from this
+* software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+ * -------------------------------------------------------------------- */
+
+
+/**
+ * @ingroup groupExamples
+ */
+
+/**
+ * @defgroup LinearInterpExample Linear Interpolate Example
+ *
+ * <b> CMSIS DSP Software Library -- Linear Interpolate Example </b>
+ *
+ * <b> Description </b>
+ * This example demonstrates usage of linear interpolate modules and fast math modules.
+ * Method 1 uses fast math sine function to calculate sine values using cubic interpolation and method 2 uses
+ * linear interpolation function and results are compared to reference output.
+ * Example shows linear interpolation function can be used to get higher precision compared to fast math sin calculation.
+ *
+ * \par Block Diagram:
+ * \par
+ * \image html linearInterpExampleMethod1.gif "Method 1: Sine caluclation using fast math"
+ * \par
+ * \image html linearInterpExampleMethod2.gif "Method 2: Sine caluclation using interpolation function"
+ *
+ * \par Variables Description:
+ * \par
+ * \li \c testInputSin_f32 points to the input values for sine calculation
+ * \li \c testRefSinOutput32_f32 points to the reference values caculated from sin() matlab function
+ * \li \c testOutput points to output buffer calculation from cubic interpolation
+ * \li \c testLinIntOutput points to output buffer calculation from linear interpolation
+ * \li \c snr1 Signal to noise ratio for reference and cubic interpolation output
+ * \li \c snr2 Signal to noise ratio for reference and linear interpolation output
+ *
+ * \par CMSIS DSP Software Library Functions Used:
+ * \par
+ * - arm_sin_f32()
+ * - arm_linear_interp_f32()
+ *
+ * <b> Refer </b>
+ * \link arm_linear_interp_example_f32.c \endlink
+ *
+ */
+
+
+/** \example arm_linear_interp_example_f32.c
+ */
+
+#include "arm_math.h"
+#include "math_helper.h"
+
+#define SNR_THRESHOLD 90
+#define TEST_LENGTH_SAMPLES 10
+#define XSPACING (0.00005f)
+
+/* ----------------------------------------------------------------------
+* Test input data for F32 SIN function
+* Generated by the MATLAB rand() function
+* randn('state', 0)
+* xi = (((1/4.18318581819710)* randn(blockSize, 1) * 2* pi));
+* --------------------------------------------------------------------*/
+float32_t testInputSin_f32[TEST_LENGTH_SAMPLES] =
+{
+ -0.649716504673081170, -2.501723745497831200,
+ 0.188250329003310100, 0.432092748487532540,
+ -1.722010988459680800, 1.788766476323060600,
+ 1.786136060975809500, -0.056525543169408797,
+ 0.491596272728153760, 0.262309671126153390
+};
+
+/*------------------------------------------------------------------------------
+* Reference out of SIN F32 function for Block Size = 10
+* Calculated from sin(testInputSin_f32)
+*------------------------------------------------------------------------------*/
+float32_t testRefSinOutput32_f32[TEST_LENGTH_SAMPLES] =
+{
+ -0.604960695383043530, -0.597090287967934840,
+ 0.187140422442966500, 0.418772124875992690,
+ -0.988588831792106880, 0.976338412038794010,
+ 0.976903856413481100, -0.056495446835214236,
+ 0.472033731854734240, 0.259311907228582830
+};
+
+/*------------------------------------------------------------------------------
+* Method 1: Test out Buffer Calculated from Cubic Interpolation
+*------------------------------------------------------------------------------*/
+float32_t testOutput[TEST_LENGTH_SAMPLES];
+
+/*------------------------------------------------------------------------------
+* Method 2: Test out buffer Calculated from Linear Interpolation
+*------------------------------------------------------------------------------*/
+float32_t testLinIntOutput[TEST_LENGTH_SAMPLES];
+
+/*------------------------------------------------------------------------------
+* External table used for linear interpolation
+*------------------------------------------------------------------------------*/
+extern float arm_linear_interep_table[188495];
+
+/* ----------------------------------------------------------------------
+* Global Variables for caluclating SNR's for Method1 & Method 2
+* ------------------------------------------------------------------- */
+float32_t snr1;
+float32_t snr2;
+
+/* ----------------------------------------------------------------------------
+* Calculation of Sine values from Cubic Interpolation and Linear interpolation
+* ---------------------------------------------------------------------------- */
+int32_t main(void)
+{
+ uint32_t i;
+ arm_status status;
+
+ arm_linear_interp_instance_f32 S = {188495, -3.141592653589793238, XSPACING, &arm_linear_interep_table[0]};
+
+ /*------------------------------------------------------------------------------
+ * Method 1: Test out Calculated from Cubic Interpolation
+ *------------------------------------------------------------------------------*/
+ for(i=0; i< TEST_LENGTH_SAMPLES; i++)
+ {
+ testOutput[i] = arm_sin_f32(testInputSin_f32[i]);
+ }
+
+ /*------------------------------------------------------------------------------
+ * Method 2: Test out Calculated from Cubic Interpolation and Linear interpolation
+ *------------------------------------------------------------------------------*/
+
+ for(i=0; i< TEST_LENGTH_SAMPLES; i++)
+ {
+ testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]);
+ }
+
+ /*------------------------------------------------------------------------------
+ * SNR calculation for method 1
+ *------------------------------------------------------------------------------*/
+ snr1 = arm_snr_f32(testRefSinOutput32_f32, testOutput, 2);
+
+ /*------------------------------------------------------------------------------
+ * SNR calculation for method 2
+ *------------------------------------------------------------------------------*/
+ snr2 = arm_snr_f32(testRefSinOutput32_f32, testLinIntOutput, 2);
+
+ /*------------------------------------------------------------------------------
+ * Initialise status depending on SNR calculations
+ *------------------------------------------------------------------------------*/
+ if ( snr2 > snr1)
+ {
+ status = ARM_MATH_SUCCESS;
+ }
+ else
+ {
+ status = ARM_MATH_TEST_FAILURE;
+ }
+
+ /* ----------------------------------------------------------------------
+ ** Loop here if the signals fail the PASS check.
+ ** This denotes a test failure
+ ** ------------------------------------------------------------------- */
+ if ( status != ARM_MATH_SUCCESS)
+ {
+ while (1);
+ }
+
+ while (1); /* main function does not return */
+}
+
+ /** \endlink */