diff --git a/Include/dsp/interpolation_functions_f16.h b/Include/dsp/interpolation_functions_f16.h index e102869f..5072165f 100755 --- a/Include/dsp/interpolation_functions_f16.h +++ b/Include/dsp/interpolation_functions_f16.h @@ -26,12 +26,78 @@ #ifndef _INTERPOLATION_FUNCTIONS_F16_H_ #define _INTERPOLATION_FUNCTIONS_F16_H_ +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + #ifdef __cplusplus extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) + +typedef struct +{ + uint32_t nValues; /**< nValues */ + float16_t x1; /**< x1 */ + float16_t xSpacing; /**< xSpacing */ + float16_t *pYData; /**< pointer to the table of Y values */ +} arm_linear_interp_instance_f16; + +/** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ +typedef struct +{ + uint16_t numRows;/**< number of rows in the data table. */ + uint16_t numCols;/**< number of columns in the data table. */ + float16_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_f16; + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + float16_t arm_linear_interp_f16( + arm_linear_interp_instance_f16 * S, + float16_t x); + + /** + * @} end of LinearInterpolate group + */ + +/** + * @addtogroup BilinearInterpolate + * @{ + */ + + /** + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + float16_t arm_bilinear_interp_f16( + const arm_bilinear_interp_instance_f16 * S, + float16_t X, + float16_t Y); + + + /** + * @} end of BilinearInterpolate group + */ #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ #ifdef __cplusplus } diff --git a/PythonWrapper/setup.py b/PythonWrapper/setup.py index a860aa76..6dc67669 100644 --- a/PythonWrapper/setup.py +++ b/PythonWrapper/setup.py @@ -55,7 +55,7 @@ common.remove(os.path.join(ROOT,"Source","CommonTables","CommonTables.c")) interpolation = glob.glob(os.path.join(ROOT,"Source","InterpolationFunctions","*.c")) interpolation.remove(os.path.join(ROOT,"Source","InterpolationFunctions","InterpolationFunctions.c")) - +interpolation.remove(os.path.join(ROOT,"Source","InterpolationFunctions","InterpolationFunctionsF16.c")) #modulesrc = glob.glob(os.path.join("cmsisdsp_pkg","src","*.c")) modulesrc = [] diff --git a/Source/InterpolationFunctions/CMakeLists.txt b/Source/InterpolationFunctions/CMakeLists.txt index 82fb0349..7ce79cfe 100755 --- a/Source/InterpolationFunctions/CMakeLists.txt +++ b/Source/InterpolationFunctions/CMakeLists.txt @@ -5,9 +5,20 @@ project(CMSISDSPInterpolation) include(configLib) include(configDsp) -file(GLOB SRC "./*_*.c") -add_library(CMSISDSPInterpolation STATIC ${SRC}) +add_library(CMSISDSPInterpolation STATIC) + +target_sources(CMSISDSPInterpolation PRIVATE arm_bilinear_interp_f32.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_bilinear_interp_q15.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_bilinear_interp_q31.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_bilinear_interp_q7.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_linear_interp_f32.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_linear_interp_q15.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_linear_interp_q31.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_linear_interp_q7.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_spline_interp_f32.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_spline_interp_init_f32.c) + configLib(CMSISDSPInterpolation ${ROOT}) configDsp(CMSISDSPInterpolation ${ROOT}) @@ -17,3 +28,7 @@ target_include_directories(CMSISDSPInterpolation PUBLIC "${DSP}/Include") +if ((NOT ARMAC5) AND (NOT DISABLEFLOAT16)) +target_sources(CMSISDSPInterpolation PRIVATE arm_bilinear_interp_f16.c) +target_sources(CMSISDSPInterpolation PRIVATE arm_linear_interp_f16.c) +endif() \ No newline at end of file diff --git a/Source/InterpolationFunctions/InterpolationFunctionsF16.c b/Source/InterpolationFunctions/InterpolationFunctionsF16.c new file mode 100755 index 00000000..d778de9d --- /dev/null +++ b/Source/InterpolationFunctions/InterpolationFunctionsF16.c @@ -0,0 +1,33 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: InterpolationFunctions.c + * Description: Combination of all interpolation function source files. + * + * $Date: 22. July 2020 + * $Revision: V1.0.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2020 ARM Limited or its affiliates. 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 + * + * 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 "arm_bilinear_interp_f16.c" +#include "arm_linear_interp_f16.c" + + + diff --git a/Source/InterpolationFunctions/arm_bilinear_interp_f16.c b/Source/InterpolationFunctions/arm_bilinear_interp_f16.c new file mode 100755 index 00000000..154b5dc3 --- /dev/null +++ b/Source/InterpolationFunctions/arm_bilinear_interp_f16.c @@ -0,0 +1,167 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_bilinear_interp_f16.c + * Description: Floating-point bilinear interpolation + * + * $Date: 22 July 2020 + * $Revision: V1.9.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2020 ARM Limited or its affiliates. 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 + * + * 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 "dsp/interpolation_functions_f16.h" + +#if defined(ARM_FLOAT16_SUPPORTED) + + +/** + @ingroup groupInterpolation + */ + +/** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
+   *   typedef struct
+   *   {
+   *     uint16_t numRows;
+   *     uint16_t numCols;
+   *     float16_t *pData;
+   * } arm_bilinear_interp_instance_f16;
+   * 
+ * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
+   *     XF = floor(x)
+   *     YF = floor(y)
+   * 
+ * \par + * The interpolated output point is computed as: + *
+   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
+   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
+   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
+   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
+   * 
+ * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + + /** + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + float16_t arm_bilinear_interp_f16( + const arm_bilinear_interp_instance_f16 * S, + float16_t X, + float16_t Y) + { + float16_t out; + float16_t f00, f01, f10, f11; + float16_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float16_t xdiff, ydiff; + float16_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if (xIndex < 0 || xIndex > (S->numCols - 2) || yIndex < 0 || yIndex > (S->numRows - 2)) + { + return (0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex ) + (yIndex ) * S->numCols; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex ) + (yIndex+1) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + } + + /** + * @} end of BilinearInterpolate group + */ + + +#endif /* #if defined(ARM_FLOAT16_SUPPORTED) */ + diff --git a/Source/InterpolationFunctions/arm_linear_interp_f16.c b/Source/InterpolationFunctions/arm_linear_interp_f16.c new file mode 100755 index 00000000..0fd13ea9 --- /dev/null +++ b/Source/InterpolationFunctions/arm_linear_interp_f16.c @@ -0,0 +1,131 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_linear_interp_f16.c + * Description: Floating-point linear interpolation + * + * $Date: 22 July 2020 + * $Revision: V1.9.0 + * + * Target Processor: Cortex-M cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2020 ARM Limited or its affiliates. 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 + * + * 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 "dsp/interpolation_functions_f16.h" + +#if defined(ARM_FLOAT16_SUPPORTED) + + +/** + @ingroup groupInterpolation + */ + +/** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
+   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
+   *       where x0, x1 are nearest values of input x
+   *             y0, y1 are nearest values to output y
+   * 
+ * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + +/** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + float16_t arm_linear_interp_f16( + arm_linear_interp_instance_f16 * S, + float16_t x) + { + float16_t y; + float16_t x0, x1; /* Nearest input values */ + float16_t y0, y1; /* Nearest output values */ + float16_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float16_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (int32_t) ((x - S->x1) / xSpacing); + + if (i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if ((uint32_t)i >= (S->nValues - 1)) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues - 1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i + 1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); + + } + + /* returns output value */ + return (y); + } + + /** + * @} end of LinearInterpolate group + */ + + +#endif /* #if defined(ARM_FLOAT16_SUPPORTED) */ + diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt index 6b4ea120..51b1665d 100644 --- a/Testing/CMakeLists.txt +++ b/Testing/CMakeLists.txt @@ -328,6 +328,7 @@ if ((NOT ARMAC5) AND (FLOAT16TESTS) AND ((FLOAT16) OR (MVEF) OR (HELIUM) OR (NEO set(TESTSRC16 Source/Tests/BasicTestsF16.cpp Source/Tests/ComplexTestsF16.cpp + Source/Tests/InterpolationTestsF16.cpp Source/Tests/FIRF16.cpp Source/Tests/BIQUADF16.cpp Source/Tests/MISCF16.cpp diff --git a/Testing/Include/Tests/InterpolationTestsF16.h b/Testing/Include/Tests/InterpolationTestsF16.h new file mode 100755 index 00000000..5e4e03bf --- /dev/null +++ b/Testing/Include/Tests/InterpolationTestsF16.h @@ -0,0 +1,33 @@ +#include "Test.h" +#include "Pattern.h" + +#include "dsp/interpolation_functions_f16.h" + +class InterpolationTestsF16:public Client::Suite + { + public: + InterpolationTestsF16(Testing::testID_t id); + virtual void setUp(Testing::testID_t,std::vector& params,Client::PatternMgr *mgr); + virtual void tearDown(Testing::testID_t,Client::PatternMgr *mgr); + private: + #include "InterpolationTestsF16_decl.h" + + Client::Pattern input; + Client::Pattern y; + Client::Pattern config; + Client::LocalPattern output; + // Reference patterns are not loaded when we are in dump mode + Client::RefPattern ref; + + arm_linear_interp_instance_f16 S; + arm_bilinear_interp_instance_f16 SBI; + + + Client::Pattern inputX; + Client::Pattern inputY; + Client::Pattern outputX; + + Client::LocalPattern buffer; + Client::LocalPattern splineCoefs; + + }; diff --git a/Testing/PatternGeneration/Interpolate.py b/Testing/PatternGeneration/Interpolate.py index 0455a1c1..2c092bad 100755 --- a/Testing/PatternGeneration/Interpolate.py +++ b/Testing/PatternGeneration/Interpolate.py @@ -22,9 +22,9 @@ def writeTests(config,format): data=data[:-1] z = f(data) - if format != 0: + if format != 0 and format != 16: data = data / 2.0**11 - if format != 0: + if format != 0 and format != 16: config.writeInputQ31(1, data,"Input") else: config.writeInput(1, data) @@ -81,10 +81,10 @@ def writeTests(config,format): ref=np.array([f(i[0],i[1]) for i in inputVals]) - if format != 0: + if format != 0 and format != 16: inputSamples = inputSamples / 2.0**11 data = inputSamples.reshape(np.size(inputSamples)) - if format != 0: + if format != 0 and format != 16: config.writeInputQ31(2, data,"Input") else: config.writeInput(2, data) @@ -130,11 +130,13 @@ def generatePatterns(): PARAMDIR = os.path.join("Parameters","DSP","Interpolation","Interpolation") configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32") + configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16") configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31") configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15") configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7") writeTests(configf32,0) + writeTests(configf16,16) writeTests(configq31,31) writeTests(configq15,15) writeTests(configq7,7) diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Config2_s16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Config2_s16.txt new file mode 100755 index 00000000..e1a80be2 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Config2_s16.txt @@ -0,0 +1,6 @@ +H +2 +// 7 +0x0007 +// 8 +0x0008 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input1_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input1_f16.txt new file mode 100755 index 00000000..d3c792e8 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input1_f16.txt @@ -0,0 +1,82 @@ +H +40 +// 0.500000 +0x3800 +// 1.500000 +0x3e00 +// 2.500000 +0x4100 +// 3.500000 +0x4300 +// 4.500000 +0x4480 +// 5.500000 +0x4580 +// 6.500000 +0x4680 +// 7.500000 +0x4780 +// 8.500000 +0x4840 +// 9.500000 +0x48c0 +// 10.500000 +0x4940 +// 11.500000 +0x49c0 +// 12.500000 +0x4a40 +// 13.500000 +0x4ac0 +// 14.500000 +0x4b40 +// 15.500000 +0x4bc0 +// 16.500000 +0x4c20 +// 17.500000 +0x4c60 +// 18.500000 +0x4ca0 +// 19.500000 +0x4ce0 +// 20.500000 +0x4d20 +// 21.500000 +0x4d60 +// 22.500000 +0x4da0 +// 23.500000 +0x4de0 +// 24.500000 +0x4e20 +// 25.500000 +0x4e60 +// 26.500000 +0x4ea0 +// 27.500000 +0x4ee0 +// 28.500000 +0x4f20 +// 29.500000 +0x4f60 +// 30.500000 +0x4fa0 +// 31.500000 +0x4fe0 +// 32.500000 +0x5010 +// 33.500000 +0x5030 +// 34.500000 +0x5050 +// 35.500000 +0x5070 +// 36.500000 +0x5090 +// 37.500000 +0x50b0 +// 38.500000 +0x50d0 +// 39.500000 +0x50f0 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input2_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input2_f16.txt new file mode 100755 index 00000000..891e7264 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Input2_f16.txt @@ -0,0 +1,602 @@ +H +300 +// 0.500000 +0x3800 +// 0.500000 +0x3800 +// 0.944444 +0x3b8e +// 0.500000 +0x3800 +// 1.388889 +0x3d8e +// 0.500000 +0x3800 +// 1.833333 +0x3f55 +// 0.500000 +0x3800 +// 2.277778 +0x408e +// 0.500000 +0x3800 +// 2.722222 +0x4172 +// 0.500000 +0x3800 +// 3.166667 +0x4255 +// 0.500000 +0x3800 +// 3.611111 +0x4339 +// 0.500000 +0x3800 +// 4.055556 +0x440e +// 0.500000 +0x3800 +// 4.500000 +0x4480 +// 0.500000 +0x3800 +// 0.500000 +0x3800 +// 0.857143 +0x3adb +// 0.944444 +0x3b8e +// 0.857143 +0x3adb +// 1.388889 +0x3d8e +// 0.857143 +0x3adb +// 1.833333 +0x3f55 +// 0.857143 +0x3adb +// 2.277778 +0x408e +// 0.857143 +0x3adb +// 2.722222 +0x4172 +// 0.857143 +0x3adb +// 3.166667 +0x4255 +// 0.857143 +0x3adb +// 3.611111 +0x4339 +// 0.857143 +0x3adb +// 4.055556 +0x440e +// 0.857143 +0x3adb +// 4.500000 +0x4480 +// 0.857143 +0x3adb +// 0.500000 +0x3800 +// 1.214286 +0x3cdb +// 0.944444 +0x3b8e +// 1.214286 +0x3cdb +// 1.388889 +0x3d8e +// 1.214286 +0x3cdb +// 1.833333 +0x3f55 +// 1.214286 +0x3cdb +// 2.277778 +0x408e +// 1.214286 +0x3cdb +// 2.722222 +0x4172 +// 1.214286 +0x3cdb +// 3.166667 +0x4255 +// 1.214286 +0x3cdb +// 3.611111 +0x4339 +// 1.214286 +0x3cdb +// 4.055556 +0x440e +// 1.214286 +0x3cdb +// 4.500000 +0x4480 +// 1.214286 +0x3cdb +// 0.500000 +0x3800 +// 1.571429 +0x3e49 +// 0.944444 +0x3b8e +// 1.571429 +0x3e49 +// 1.388889 +0x3d8e +// 1.571429 +0x3e49 +// 1.833333 +0x3f55 +// 1.571429 +0x3e49 +// 2.277778 +0x408e +// 1.571429 +0x3e49 +// 2.722222 +0x4172 +// 1.571429 +0x3e49 +// 3.166667 +0x4255 +// 1.571429 +0x3e49 +// 3.611111 +0x4339 +// 1.571429 +0x3e49 +// 4.055556 +0x440e +// 1.571429 +0x3e49 +// 4.500000 +0x4480 +// 1.571429 +0x3e49 +// 0.500000 +0x3800 +// 1.928571 +0x3fb7 +// 0.944444 +0x3b8e +// 1.928571 +0x3fb7 +// 1.388889 +0x3d8e +// 1.928571 +0x3fb7 +// 1.833333 +0x3f55 +// 1.928571 +0x3fb7 +// 2.277778 +0x408e +// 1.928571 +0x3fb7 +// 2.722222 +0x4172 +// 1.928571 +0x3fb7 +// 3.166667 +0x4255 +// 1.928571 +0x3fb7 +// 3.611111 +0x4339 +// 1.928571 +0x3fb7 +// 4.055556 +0x440e +// 1.928571 +0x3fb7 +// 4.500000 +0x4480 +// 1.928571 +0x3fb7 +// 0.500000 +0x3800 +// 2.285714 +0x4092 +// 0.944444 +0x3b8e +// 2.285714 +0x4092 +// 1.388889 +0x3d8e +// 2.285714 +0x4092 +// 1.833333 +0x3f55 +// 2.285714 +0x4092 +// 2.277778 +0x408e +// 2.285714 +0x4092 +// 2.722222 +0x4172 +// 2.285714 +0x4092 +// 3.166667 +0x4255 +// 2.285714 +0x4092 +// 3.611111 +0x4339 +// 2.285714 +0x4092 +// 4.055556 +0x440e +// 2.285714 +0x4092 +// 4.500000 +0x4480 +// 2.285714 +0x4092 +// 0.500000 +0x3800 +// 2.642857 +0x4149 +// 0.944444 +0x3b8e +// 2.642857 +0x4149 +// 1.388889 +0x3d8e +// 2.642857 +0x4149 +// 1.833333 +0x3f55 +// 2.642857 +0x4149 +// 2.277778 +0x408e +// 2.642857 +0x4149 +// 2.722222 +0x4172 +// 2.642857 +0x4149 +// 3.166667 +0x4255 +// 2.642857 +0x4149 +// 3.611111 +0x4339 +// 2.642857 +0x4149 +// 4.055556 +0x440e +// 2.642857 +0x4149 +// 4.500000 +0x4480 +// 2.642857 +0x4149 +// 0.500000 +0x3800 +// 3.000000 +0x4200 +// 0.944444 +0x3b8e +// 3.000000 +0x4200 +// 1.388889 +0x3d8e +// 3.000000 +0x4200 +// 1.833333 +0x3f55 +// 3.000000 +0x4200 +// 2.277778 +0x408e +// 3.000000 +0x4200 +// 2.722222 +0x4172 +// 3.000000 +0x4200 +// 3.166667 +0x4255 +// 3.000000 +0x4200 +// 3.611111 +0x4339 +// 3.000000 +0x4200 +// 4.055556 +0x440e +// 3.000000 +0x4200 +// 4.500000 +0x4480 +// 3.000000 +0x4200 +// 0.500000 +0x3800 +// 3.357143 +0x42b7 +// 0.944444 +0x3b8e +// 3.357143 +0x42b7 +// 1.388889 +0x3d8e +// 3.357143 +0x42b7 +// 1.833333 +0x3f55 +// 3.357143 +0x42b7 +// 2.277778 +0x408e +// 3.357143 +0x42b7 +// 2.722222 +0x4172 +// 3.357143 +0x42b7 +// 3.166667 +0x4255 +// 3.357143 +0x42b7 +// 3.611111 +0x4339 +// 3.357143 +0x42b7 +// 4.055556 +0x440e +// 3.357143 +0x42b7 +// 4.500000 +0x4480 +// 3.357143 +0x42b7 +// 0.500000 +0x3800 +// 3.714286 +0x436e +// 0.944444 +0x3b8e +// 3.714286 +0x436e +// 1.388889 +0x3d8e +// 3.714286 +0x436e +// 1.833333 +0x3f55 +// 3.714286 +0x436e +// 2.277778 +0x408e +// 3.714286 +0x436e +// 2.722222 +0x4172 +// 3.714286 +0x436e +// 3.166667 +0x4255 +// 3.714286 +0x436e +// 3.611111 +0x4339 +// 3.714286 +0x436e +// 4.055556 +0x440e +// 3.714286 +0x436e +// 4.500000 +0x4480 +// 3.714286 +0x436e +// 0.500000 +0x3800 +// 4.071429 +0x4412 +// 0.944444 +0x3b8e +// 4.071429 +0x4412 +// 1.388889 +0x3d8e +// 4.071429 +0x4412 +// 1.833333 +0x3f55 +// 4.071429 +0x4412 +// 2.277778 +0x408e +// 4.071429 +0x4412 +// 2.722222 +0x4172 +// 4.071429 +0x4412 +// 3.166667 +0x4255 +// 4.071429 +0x4412 +// 3.611111 +0x4339 +// 4.071429 +0x4412 +// 4.055556 +0x440e +// 4.071429 +0x4412 +// 4.500000 +0x4480 +// 4.071429 +0x4412 +// 0.500000 +0x3800 +// 4.428571 +0x446e +// 0.944444 +0x3b8e +// 4.428571 +0x446e +// 1.388889 +0x3d8e +// 4.428571 +0x446e +// 1.833333 +0x3f55 +// 4.428571 +0x446e +// 2.277778 +0x408e +// 4.428571 +0x446e +// 2.722222 +0x4172 +// 4.428571 +0x446e +// 3.166667 +0x4255 +// 4.428571 +0x446e +// 3.611111 +0x4339 +// 4.428571 +0x446e +// 4.055556 +0x440e +// 4.428571 +0x446e +// 4.500000 +0x4480 +// 4.428571 +0x446e +// 0.500000 +0x3800 +// 4.785714 +0x44c9 +// 0.944444 +0x3b8e +// 4.785714 +0x44c9 +// 1.388889 +0x3d8e +// 4.785714 +0x44c9 +// 1.833333 +0x3f55 +// 4.785714 +0x44c9 +// 2.277778 +0x408e +// 4.785714 +0x44c9 +// 2.722222 +0x4172 +// 4.785714 +0x44c9 +// 3.166667 +0x4255 +// 4.785714 +0x44c9 +// 3.611111 +0x4339 +// 4.785714 +0x44c9 +// 4.055556 +0x440e +// 4.785714 +0x44c9 +// 4.500000 +0x4480 +// 4.785714 +0x44c9 +// 0.500000 +0x3800 +// 5.142857 +0x4525 +// 0.944444 +0x3b8e +// 5.142857 +0x4525 +// 1.388889 +0x3d8e +// 5.142857 +0x4525 +// 1.833333 +0x3f55 +// 5.142857 +0x4525 +// 2.277778 +0x408e +// 5.142857 +0x4525 +// 2.722222 +0x4172 +// 5.142857 +0x4525 +// 3.166667 +0x4255 +// 5.142857 +0x4525 +// 3.611111 +0x4339 +// 5.142857 +0x4525 +// 4.055556 +0x440e +// 5.142857 +0x4525 +// 4.500000 +0x4480 +// 5.142857 +0x4525 +// 0.500000 +0x3800 +// 5.500000 +0x4580 +// 0.944444 +0x3b8e +// 5.500000 +0x4580 +// 1.388889 +0x3d8e +// 5.500000 +0x4580 +// 1.833333 +0x3f55 +// 5.500000 +0x4580 +// 2.277778 +0x408e +// 5.500000 +0x4580 +// 2.722222 +0x4172 +// 5.500000 +0x4580 +// 3.166667 +0x4255 +// 5.500000 +0x4580 +// 3.611111 +0x4339 +// 5.500000 +0x4580 +// 4.055556 +0x440e +// 5.500000 +0x4580 +// 4.500000 +0x4480 +// 5.500000 +0x4580 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX3_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX3_f16.txt new file mode 100755 index 00000000..49e1b9bd --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX3_f16.txt @@ -0,0 +1,10 @@ +H +4 +// 0.000000 +0x0 +// 3.000000 +0x4200 +// 10.000000 +0x4900 +// 20.000000 +0x4d00 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX4_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX4_f16.txt new file mode 100755 index 00000000..70449cf2 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX4_f16.txt @@ -0,0 +1,20 @@ +H +9 +// 0.000000 +0x0 +// 0.785398 +0x3a48 +// 1.570796 +0x3e48 +// 2.356194 +0x40b6 +// 3.141593 +0x4248 +// 3.926991 +0x43db +// 4.712389 +0x44b6 +// 5.497787 +0x457f +// 6.283185 +0x4648 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX5_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX5_f16.txt new file mode 100755 index 00000000..d8becd96 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputX5_f16.txt @@ -0,0 +1,8 @@ +H +3 +// 0.000000 +0x0 +// 3.000000 +0x4200 +// 10.000000 +0x4900 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY3_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY3_f16.txt new file mode 100755 index 00000000..95f9c6b4 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY3_f16.txt @@ -0,0 +1,10 @@ +H +4 +// 0.000000 +0x0 +// 9.000000 +0x4880 +// 100.000000 +0x5640 +// 400.000000 +0x5e40 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY4_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY4_f16.txt new file mode 100755 index 00000000..9b0da457 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY4_f16.txt @@ -0,0 +1,20 @@ +H +9 +// 0.000000 +0x0 +// 0.707107 +0x39a8 +// 1.000000 +0x3c00 +// 0.707107 +0x39a8 +// 0.000000 +0x0 +// -0.707107 +0xb9a8 +// -1.000000 +0xbc00 +// -0.707107 +0xb9a8 +// -0.000000 +0x8000 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY5_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY5_f16.txt new file mode 100755 index 00000000..d8becd96 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/InputY5_f16.txt @@ -0,0 +1,8 @@ +H +3 +// 0.000000 +0x0 +// 3.000000 +0x4200 +// 10.000000 +0x4900 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX3_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX3_f16.txt new file mode 100755 index 00000000..b0f7a9a4 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX3_f16.txt @@ -0,0 +1,42 @@ +H +20 +// 0.000000 +0x0 +// 1.000000 +0x3c00 +// 2.000000 +0x4000 +// 3.000000 +0x4200 +// 4.000000 +0x4400 +// 5.000000 +0x4500 +// 6.000000 +0x4600 +// 7.000000 +0x4700 +// 8.000000 +0x4800 +// 9.000000 +0x4880 +// 10.000000 +0x4900 +// 11.000000 +0x4980 +// 12.000000 +0x4a00 +// 13.000000 +0x4a80 +// 14.000000 +0x4b00 +// 15.000000 +0x4b80 +// 16.000000 +0x4c00 +// 17.000000 +0x4c40 +// 18.000000 +0x4c80 +// 19.000000 +0x4cc0 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX4_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX4_f16.txt new file mode 100755 index 00000000..dfc37750 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX4_f16.txt @@ -0,0 +1,68 @@ +H +33 +// 0.000000 +0x0 +// 0.196350 +0x3248 +// 0.392699 +0x3648 +// 0.589049 +0x38b6 +// 0.785398 +0x3a48 +// 0.981748 +0x3bdb +// 1.178097 +0x3cb6 +// 1.374447 +0x3d7f +// 1.570796 +0x3e48 +// 1.767146 +0x3f12 +// 1.963495 +0x3fdb +// 2.159845 +0x4052 +// 2.356194 +0x40b6 +// 2.552544 +0x411b +// 2.748894 +0x417f +// 2.945243 +0x41e4 +// 3.141593 +0x4248 +// 3.337942 +0x42ad +// 3.534292 +0x4312 +// 3.730641 +0x4376 +// 3.926991 +0x43db +// 4.123340 +0x4420 +// 4.319690 +0x4452 +// 4.516039 +0x4484 +// 4.712389 +0x44b6 +// 4.908739 +0x44e9 +// 5.105088 +0x451b +// 5.301438 +0x454d +// 5.497787 +0x457f +// 5.694137 +0x45b2 +// 5.890486 +0x45e4 +// 6.086836 +0x4616 +// 6.283185 +0x4648 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX5_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX5_f16.txt new file mode 100755 index 00000000..b82cb188 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/OutputX5_f16.txt @@ -0,0 +1,62 @@ +H +30 +// -10.000000 +0xc900 +// -9.000000 +0xc880 +// -8.000000 +0xc800 +// -7.000000 +0xc700 +// -6.000000 +0xc600 +// -5.000000 +0xc500 +// -4.000000 +0xc400 +// -3.000000 +0xc200 +// -2.000000 +0xc000 +// -1.000000 +0xbc00 +// 0.000000 +0x0 +// 1.000000 +0x3c00 +// 2.000000 +0x4000 +// 3.000000 +0x4200 +// 4.000000 +0x4400 +// 5.000000 +0x4500 +// 6.000000 +0x4600 +// 7.000000 +0x4700 +// 8.000000 +0x4800 +// 9.000000 +0x4880 +// 10.000000 +0x4900 +// 11.000000 +0x4980 +// 12.000000 +0x4a00 +// 13.000000 +0x4a80 +// 14.000000 +0x4b00 +// 15.000000 +0x4b80 +// 16.000000 +0x4c00 +// 17.000000 +0x4c40 +// 18.000000 +0x4c80 +// 19.000000 +0x4cc0 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference1_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference1_f16.txt new file mode 100755 index 00000000..353af9a7 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference1_f16.txt @@ -0,0 +1,82 @@ +H +40 +// 0.999836 +0x3c00 +// 0.997208 +0x3bfa +// 0.984118 +0x3bdf +// 0.945255 +0x3b90 +// 0.859251 +0x3ae0 +// 0.702426 +0x399f +// 0.456301 +0x374d +// 0.119531 +0x2fa6 +// -0.277482 +0xb471 +// -0.661314 +0xb94a +// -0.918537 +0xbb59 +// -0.925695 +0xbb68 +// -0.611097 +0xb8e4 +// -0.030945 +0xa7ec +// 0.589481 +0x38b7 +// 0.915804 +0x3b54 +// 0.695054 +0x398f +// -0.004498 +0x9c9b +// -0.712082 +0xb9b2 +// -0.829765 +0xbaa3 +// -0.183298 +0xb1de +// 0.647457 +0x392e +// 0.765024 +0x3a1f +// -0.024301 +0xa639 +// -0.770387 +0xba2a +// -0.447708 +0xb72a +// 0.521104 +0x382b +// 0.650064 +0x3933 +// -0.298863 +0xb4c8 +// -0.688210 +0xb981 +// 0.207648 +0x32a5 +// 0.656951 +0x3941 +// -0.253282 +0xb40d +// -0.570816 +0xb891 +// 0.398647 +0x3661 +// 0.379176 +0x3611 +// -0.548368 +0xb863 +// -0.036721 +0xa8b3 +// 0.524152 +0x3831 +// -0.358152 +0xb5bb diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference2_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference2_f16.txt new file mode 100755 index 00000000..11a6132e --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference2_f16.txt @@ -0,0 +1,302 @@ +H +150 +// 0.373384 +0x35f9 +// 0.203820 +0x3286 +// 0.011612 +0x21f2 +// -0.183830 +0xb1e2 +// -0.345125 +0xb586 +// -0.485933 +0xb7c6 +// -0.560815 +0xb87d +// -0.525820 +0xb835 +// -0.435634 +0xb6f8 +// 0.040890 +0x293c +// 0.026219 +0x26b6 +// -0.324983 +0xb533 +// -0.122774 +0xafdc +// 0.158492 +0x3112 +// 0.004431 +0x1c8a +// -0.410827 +0xb693 +// -0.590305 +0xb8b9 +// -0.376814 +0xb607 +// -0.151634 +0xb0da +// 0.155369 +0x30f9 +// -0.057384 +0xab58 +// -0.300094 +0xb4cd +// -0.099685 +0xae61 +// 0.164026 +0x3140 +// 0.075748 +0x2cd9 +// -0.223723 +0xb329 +// -0.350221 +0xb59b +// -0.188431 +0xb208 +// -0.028933 +0xa768 +// 0.114515 +0x2f54 +// 0.034722 +0x2872 +// 0.093922 +0x2e03 +// 0.028388 +0x2744 +// -0.054967 +0xab09 +// -0.038428 +0xa8eb +// 0.038047 +0x28df +// 0.069578 +0x2c74 +// 0.026203 +0x26b5 +// -0.013765 +0xa30c +// -0.029893 +0xa7a7 +// 0.126828 +0x300f +// 0.487939 +0x37cf +// 0.156461 +0x3102 +// -0.273959 +0xb462 +// -0.152604 +0xb0e2 +// 0.299816 +0x34cc +// 0.489377 +0x37d4 +// 0.240837 +0x33b5 +// 0.001402 +0x15be +// -0.174301 +0xb194 +// -0.145827 +0xb0ab +// 0.144655 +0x30a1 +// 0.077152 +0x2cf0 +// -0.041492 +0xa950 +// 0.115844 +0x2f6a +// 0.438769 +0x3705 +// 0.583165 +0x38aa +// 0.430014 +0x36e1 +// 0.250144 +0x3401 +// -0.116764 +0xaf79 +// -0.509673 +0xb814 +// -0.382953 +0xb621 +// -0.054002 +0xaaea +// 0.303839 +0x34dd +// 0.479948 +0x37ae +// 0.547017 +0x3860 +// 0.595451 +0x38c3 +// 0.612827 +0x38e7 +// 0.557279 +0x3875 +// -0.008740 +0xa07a +// -0.873518 +0xbafd +// -0.910562 +0xbb49 +// -0.185156 +0xb1ed +// 0.649170 +0x3932 +// 0.844051 +0x3ac1 +// 0.655264 +0x393e +// 0.607736 +0x38dd +// 0.795640 +0x3a5d +// 0.864414 +0x3aea +// 0.099283 +0x2e5b +// -0.814436 +0xba84 +// -0.928275 +0xbb6d +// -0.201519 +0xb273 +// 0.645323 +0x392a +// 0.793662 +0x3a59 +// 0.522901 +0x382f +// 0.437868 +0x3702 +// 0.662386 +0x394d +// 0.777657 +0x3a39 +// 0.128210 +0x301a +// -0.755355 +0xba0b +// -0.945988 +0xbb91 +// -0.217881 +0xb2f9 +// 0.641475 +0x3922 +// 0.743273 +0x39f2 +// 0.390537 +0x3640 +// 0.268001 +0x344a +// 0.529132 +0x383c +// 0.690901 +0x3987 +// 0.157136 +0x3107 +// -0.719795 +0xb9c2 +// -0.950653 +0xbb9b +// -0.225545 +0xb338 +// 0.636130 +0x3917 +// 0.712439 +0x39b3 +// 0.317528 +0x3515 +// 0.175498 +0x319e +// 0.454936 +0x3747 +// 0.640823 +0x3920 +// 0.171852 +0x3180 +// -0.778323 +0xba3a +// -0.903125 +0xbb3a +// -0.198415 +0xb259 +// 0.624797 +0x3900 +// 0.759823 +0x3a14 +// 0.481938 +0x37b6 +// 0.392455 +0x3647 +// 0.616975 +0x38f0 +// 0.737463 +0x39e6 +// 0.129721 +0x3027 +// -0.836852 +0xbab2 +// -0.855598 +0xbad8 +// -0.171286 +0xb17b +// 0.613463 +0x38e8 +// 0.807207 +0x3a75 +// 0.646348 +0x392c +// 0.609412 +0x38e0 +// 0.779014 +0x3a3b +// 0.834102 +0x3aac +// 0.087591 +0x2d9b +// -0.681885 +0xb975 +// -0.591371 +0xb8bb +// -0.101033 +0xae77 +// 0.446422 +0x3725 +// 0.648792 +0x3931 +// 0.644111 +0x3927 +// 0.668335 +0x3959 +// 0.740732 +0x39ed +// 0.717385 +0x39bd +// 0.023824 +0x2619 +// -0.206676 +0xb29d +// -0.002096 +0x984b +// 0.033904 +0x2857 +// 0.045820 +0x29dd +// 0.181680 +0x31d0 +// 0.391905 +0x3645 +// 0.490207 +0x37d8 +// 0.401969 +0x366e +// 0.280633 +0x347d +// -0.072398 +0xaca2 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference3_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference3_f16.txt new file mode 100755 index 00000000..8bef82d7 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference3_f16.txt @@ -0,0 +1,42 @@ +H +20 +// 0.000000 +0x0 +// 1.000000 +0x3c00 +// 4.000000 +0x4400 +// 9.000000 +0x4880 +// 16.000000 +0x4c00 +// 25.000000 +0x4e40 +// 36.000000 +0x5080 +// 49.000000 +0x5220 +// 64.000000 +0x5400 +// 81.000000 +0x5510 +// 100.000000 +0x5640 +// 121.000000 +0x5790 +// 144.000000 +0x5880 +// 169.000000 +0x5948 +// 196.000000 +0x5a20 +// 225.000000 +0x5b08 +// 256.000000 +0x5c00 +// 289.000000 +0x5c84 +// 324.000000 +0x5d10 +// 361.000000 +0x5da4 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference4_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference4_f16.txt new file mode 100755 index 00000000..d99c3496 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference4_f16.txt @@ -0,0 +1,68 @@ +H +33 +// 0.000000 +0x0 +// 0.194708 +0x323b +// 0.382243 +0x361e +// 0.555433 +0x3872 +// 0.707107 +0x39a8 +// 0.830791 +0x3aa5 +// 0.922816 +0x3b62 +// 0.980209 +0x3bd7 +// 1.000000 +0x3c00 +// 0.980209 +0x3bd7 +// 0.922816 +0x3b62 +// 0.830791 +0x3aa5 +// 0.707107 +0x39a8 +// 0.555433 +0x3872 +// 0.382243 +0x361e +// 0.194708 +0x323b +// 0.000000 +0x0 +// -0.194708 +0xb23b +// -0.382243 +0xb61e +// -0.555433 +0xb872 +// -0.707107 +0xb9a8 +// -0.830791 +0xbaa5 +// -0.922816 +0xbb62 +// -0.980209 +0xbbd7 +// -1.000000 +0xbc00 +// -0.980209 +0xbbd7 +// -0.922816 +0xbb62 +// -0.830791 +0xbaa5 +// -0.707107 +0xb9a8 +// -0.555433 +0xb872 +// -0.382243 +0xb61e +// -0.194708 +0xb23b +// -0.000000 +0x8000 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference5_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference5_f16.txt new file mode 100755 index 00000000..b82cb188 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/Reference5_f16.txt @@ -0,0 +1,62 @@ +H +30 +// -10.000000 +0xc900 +// -9.000000 +0xc880 +// -8.000000 +0xc800 +// -7.000000 +0xc700 +// -6.000000 +0xc600 +// -5.000000 +0xc500 +// -4.000000 +0xc400 +// -3.000000 +0xc200 +// -2.000000 +0xc000 +// -1.000000 +0xbc00 +// 0.000000 +0x0 +// 1.000000 +0x3c00 +// 2.000000 +0x4000 +// 3.000000 +0x4200 +// 4.000000 +0x4400 +// 5.000000 +0x4500 +// 6.000000 +0x4600 +// 7.000000 +0x4700 +// 8.000000 +0x4800 +// 9.000000 +0x4880 +// 10.000000 +0x4900 +// 11.000000 +0x4980 +// 12.000000 +0x4a00 +// 13.000000 +0x4a80 +// 14.000000 +0x4b00 +// 15.000000 +0x4b80 +// 16.000000 +0x4c00 +// 17.000000 +0x4c40 +// 18.000000 +0x4c80 +// 19.000000 +0x4cc0 diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals1_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals1_f16.txt new file mode 100755 index 00000000..c3dd1ecd --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals1_f16.txt @@ -0,0 +1,84 @@ +H +41 +// 1.000000 +0x3c00 +// 0.999671 +0x3bff +// 0.994745 +0x3bf5 +// 0.973491 +0x3bca +// 0.917019 +0x3b56 +// 0.801483 +0x3a69 +// 0.603369 +0x38d4 +// 0.309233 +0x34f3 +// -0.070172 +0xac7e +// -0.484793 +0xb7c2 +// -0.837836 +0xbab4 +// -0.999238 +0xbbfe +// -0.852151 +0xbad1 +// -0.370043 +0xb5ec +// 0.308154 +0x34ee +// 0.870807 +0x3af7 +// 0.960802 +0x3bb0 +// 0.429307 +0x36de +// -0.438304 +0xb703 +// -0.985860 +0xbbe3 +// -0.673670 +0xb964 +// 0.307075 +0x34ea +// 0.987839 +0x3be7 +// 0.542209 +0x3856 +// -0.590811 +0xb8ba +// -0.949963 +0xbb9a +// 0.054547 +0x2afb +// 0.987662 +0x3be7 +// 0.312466 +0x3500 +// -0.910193 +0xbb48 +// -0.466228 +0xb776 +// 0.881524 +0x3b0d +// 0.432377 +0x36eb +// -0.938941 +0xbb83 +// -0.202690 +0xb27c +// 0.999984 +0x3c00 +// -0.241631 +0xb3bb +// -0.855104 +0xbad7 +// 0.781662 +0x3a41 +// 0.266643 +0x3444 +// -0.982948 +0xbbdd diff --git a/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals2_f16.txt b/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals2_f16.txt new file mode 100755 index 00000000..a43d32a6 --- /dev/null +++ b/Testing/Patterns/DSP/Interpolation/InterpolationF16/YVals2_f16.txt @@ -0,0 +1,114 @@ +H +56 +// 0.764099 +0x3a1d +// 0.954734 +0x3ba3 +// -0.986643 +0xbbe5 +// -0.438943 +0xb706 +// -0.922467 +0xbb61 +// 0.683706 +0x3978 +// -0.724533 +0xb9cc +// 0.364190 +0x35d4 +// -0.589486 +0xb8b7 +// 0.472403 +0x378f +// -0.708934 +0xb9ac +// -0.067933 +0xac59 +// 0.470253 +0x3786 +// 0.886085 +0x3b17 +// -0.328930 +0xb543 +// 0.619429 +0x38f5 +// -0.505195 +0xb80b +// 0.681926 +0x3975 +// 0.030388 +0x27c8 +// -0.436752 +0xb6fd +// -0.902880 +0xbb39 +// -0.831844 +0xbaa8 +// -0.915192 +0xbb52 +// 0.962043 +0x3bb2 +// 0.537273 +0x384c +// 0.960055 +0x3bae +// -0.761489 +0xba18 +// 0.642363 +0x3924 +// -0.424511 +0xb6cb +// -0.991667 +0xbbef +// 0.964409 +0x3bb7 +// 0.023198 +0x25f0 +// 0.676648 +0x396a +// -0.316092 +0xb50f +// 0.946295 +0x3b92 +// -0.922467 +0xbb61 +// -0.821471 +0xba92 +// 0.892290 +0x3b23 +// 0.688341 +0x3982 +// 0.995808 +0x3bf7 +// -0.871183 +0xbaf8 +// 0.484313 +0x37c0 +// 0.048810 +0x2a3f +// 0.868424 +0x3af3 +// -0.791713 +0xba55 +// 0.358250 +0x35bb +// -0.346284 +0xb58a +// -0.067933 +0xac59 +// -0.998178 +0xbbfc +// -0.201840 +0xb275 +// -0.934347 +0xbb7a +// 0.876246 +0x3b03 +// -0.210401 +0xb2bc +// 0.486444 +0x37c8 +// -0.086315 +0xad86 +// 0.995582 +0x3bf7 diff --git a/Testing/Source/Tests/InterpolationTestsF16.cpp b/Testing/Source/Tests/InterpolationTestsF16.cpp new file mode 100755 index 00000000..088260d1 --- /dev/null +++ b/Testing/Source/Tests/InterpolationTestsF16.cpp @@ -0,0 +1,202 @@ +#include "InterpolationTestsF16.h" +#include +#include "Error.h" + +#define SNR_THRESHOLD 55 + +/* + +Reference patterns are generated with +a double precision computation. + +*/ + +#define REL_ERROR (5.0e-3) +#define ABS_ERROR (5.0e-3) + + + + void InterpolationTestsF16::test_linear_interp_f16() + { + const float16_t *inp = input.ptr(); + float16_t *outp = output.ptr(); + + unsigned long nb; + for(nb = 0; nb < input.nbSamples(); nb++) + { + outp[nb] = arm_linear_interp_f16(&S,inp[nb]); + } + + ASSERT_EMPTY_TAIL(output); + + ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD); + + ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR); + + } + + + void InterpolationTestsF16::test_bilinear_interp_f16() + { + const float16_t *inp = input.ptr(); + float16_t *outp = output.ptr(); + float16_t x,y; + unsigned long nb; + for(nb = 0; nb < input.nbSamples(); nb += 2) + { + x = inp[nb]; + y = inp[nb+1]; + *outp++=arm_bilinear_interp_f16(&SBI,x,y); + } + + ASSERT_EMPTY_TAIL(output); + + ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD); + + ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR); + + } + + #if 0 + void InterpolationTestsF16::test_spline_square_f16() + { + const float16_t *inpX = inputX.ptr(); + const float16_t *inpY = inputY.ptr(); + const float16_t *outX = outputX.ptr(); + float16_t *outp = output.ptr(); + float16_t *buf = buffer.ptr(); // ((2*4-1)*sizeof(float16_t)) + float16_t *coef = splineCoefs.ptr(); // ((3*(4-1))*sizeof(float16_t)) + + arm_spline_instance_f16 S; + arm_spline_init_f16(&S, ARM_SPLINE_PARABOLIC_RUNOUT, inpX, inpY, 4, coef, buf); + arm_spline_f16(&S, outX, outp, 20); + + ASSERT_EMPTY_TAIL(buffer); + ASSERT_EMPTY_TAIL(splineCoefs); + ASSERT_EMPTY_TAIL(output); + ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD); + } + + void InterpolationTestsF16::test_spline_sine_f16() + { + const float16_t *inpX = inputX.ptr(); + const float16_t *inpY = inputY.ptr(); + const float16_t *outX = outputX.ptr(); + float16_t *outp = output.ptr(); + float16_t *buf = buffer.ptr(); // ((2*9-1)*sizeof(float16_t)) + float16_t *coef = splineCoefs.ptr(); // ((3*(9-1))*sizeof(float16_t)) + + arm_spline_instance_f16 S; + arm_spline_init_f16(&S, ARM_SPLINE_NATURAL, inpX, inpY, 9, coef, buf); + arm_spline_f16(&S, outX, outp, 33); + + ASSERT_EMPTY_TAIL(buffer); + ASSERT_EMPTY_TAIL(splineCoefs); + ASSERT_EMPTY_TAIL(output); + ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD); + } + + void InterpolationTestsF16::test_spline_ramp_f16() + { + const float16_t *inpX = inputX.ptr(); + const float16_t *inpY = inputY.ptr(); + const float16_t *outX = outputX.ptr(); + float16_t *outp = output.ptr(); + float16_t *buf = buffer.ptr(); // ((2*3-1)*sizeof(float16_t)) + float16_t *coef = splineCoefs.ptr(); // ((3*(3-1))*sizeof(float16_t)) + + arm_spline_instance_f16 S; + arm_spline_init_f16(&S, ARM_SPLINE_PARABOLIC_RUNOUT, inpX, inpY, 3, coef, buf); + arm_spline_f16(&S, outX, outp, 30); + + ASSERT_EMPTY_TAIL(buffer); + ASSERT_EMPTY_TAIL(splineCoefs); + ASSERT_EMPTY_TAIL(output); + ASSERT_SNR(output,ref,(float16_t)SNR_THRESHOLD); + } +#endif + + void InterpolationTestsF16::setUp(Testing::testID_t id,std::vector& params,Client::PatternMgr *mgr) + { + + const int16_t *pConfig; + Testing::nbSamples_t nb=MAX_NB_SAMPLES; + (void)params; + + + switch(id) + { + case InterpolationTestsF16::TEST_LINEAR_INTERP_F16_1: + input.reload(InterpolationTestsF16::INPUT_F16_ID,mgr,nb); + y.reload(InterpolationTestsF16::YVAL_F16_ID,mgr,nb); + ref.reload(InterpolationTestsF16::REF_LINEAR_F16_ID,mgr,nb); + + + S.nValues=y.nbSamples(); /**< nValues */ + /* Those values must be coherent with the ones in the + Python script generating the patterns */ + S.x1=0.0; /**< x1 */ + S.xSpacing=1.0; /**< xSpacing */ + S.pYData=y.ptr(); /**< pointer to the table of Y values */ + break; + + case InterpolationTestsF16::TEST_BILINEAR_INTERP_F16_2: + input.reload(InterpolationTestsF16::INPUTBI_F16_ID,mgr,nb); + config.reload(InterpolationTestsF16::CONFIGBI_S16_ID,mgr,nb); + y.reload(InterpolationTestsF16::YVALBI_F16_ID,mgr,nb); + ref.reload(InterpolationTestsF16::REF_BILINEAR_F16_ID,mgr,nb); + + pConfig = config.ptr(); + + SBI.numRows = pConfig[1]; + SBI.numCols = pConfig[0]; + + SBI.pData = y.ptr(); + + break; +#if 0 + case TEST_SPLINE_SQUARE_F16_3: + inputX.reload(InterpolationTestsF16::INPUT_SPLINE_SQU_X_F16_ID,mgr,4); + inputY.reload(InterpolationTestsF16::INPUT_SPLINE_SQU_Y_F16_ID,mgr,4); + outputX.reload(InterpolationTestsF16::OUTPUT_SPLINE_SQU_X_F16_ID,mgr,20); + ref.reload(InterpolationTestsF16::REF_SPLINE_SQU_F16_ID,mgr,20); + splineCoefs.create(3*(4-1),InterpolationTestsF16::COEFS_SPLINE_F16_ID,mgr); + + buffer.create(2*4-1,InterpolationTestsF16::TEMP_SPLINE_F16_ID,mgr); + output.create(20,InterpolationTestsF16::OUT_SAMPLES_F16_ID,mgr); + break; + + case TEST_SPLINE_SINE_F16_4: + inputX.reload(InterpolationTestsF16::INPUT_SPLINE_SIN_X_F16_ID,mgr,9); + inputY.reload(InterpolationTestsF16::INPUT_SPLINE_SIN_Y_F16_ID,mgr,9); + outputX.reload(InterpolationTestsF16::OUTPUT_SPLINE_SIN_X_F16_ID,mgr,33); + ref.reload(InterpolationTestsF16::REF_SPLINE_SIN_F16_ID,mgr,33); + splineCoefs.create(3*(9-1),InterpolationTestsF16::COEFS_SPLINE_F16_ID,mgr); + + buffer.create(2*9-1,InterpolationTestsF16::TEMP_SPLINE_F16_ID,mgr); + output.create(33,InterpolationTestsF16::OUT_SAMPLES_F16_ID,mgr); + break; + + case TEST_SPLINE_RAMP_F16_5: + inputX.reload(InterpolationTestsF16::INPUT_SPLINE_RAM_X_F16_ID,mgr,3); + inputY.reload(InterpolationTestsF16::INPUT_SPLINE_RAM_Y_F16_ID,mgr,3); + outputX.reload(InterpolationTestsF16::OUTPUT_SPLINE_RAM_X_F16_ID,mgr,30); + ref.reload(InterpolationTestsF16::REF_SPLINE_RAM_F16_ID,mgr,30); + splineCoefs.create(3*(3-1),InterpolationTestsF16::COEFS_SPLINE_F16_ID,mgr); + + buffer.create(2*3-1,InterpolationTestsF16::TEMP_SPLINE_F16_ID,mgr); + output.create(30,InterpolationTestsF16::OUT_SAMPLES_F16_ID,mgr); + break; +#endif + } + + + + output.create(ref.nbSamples(),InterpolationTestsF16::OUT_SAMPLES_F16_ID,mgr); + } + + void InterpolationTestsF16::tearDown(Testing::testID_t id,Client::PatternMgr *mgr) + { + (void)id; + output.dump(mgr); + } diff --git a/Testing/desc_f16.txt b/Testing/desc_f16.txt index 0b29a3c2..08101bd0 100755 --- a/Testing/desc_f16.txt +++ b/Testing/desc_f16.txt @@ -5,6 +5,50 @@ group Root { class = DSPTests folder = DSP + group Interpolation Tests{ + class = InterpolationTests + folder = Interpolation + + suite Interpolation Tests F16{ + class = InterpolationTestsF16 + folder = InterpolationF16 + + Pattern INPUT_F16_ID : Input1_f16.txt + Pattern INPUTBI_F16_ID : Input2_f16.txt + Pattern CONFIGBI_S16_ID : Config2_s16.txt + + Pattern YVAL_F16_ID : YVals1_f16.txt + Pattern YVALBI_F16_ID : YVals2_f16.txt + + Pattern REF_LINEAR_F16_ID : Reference1_f16.txt + Pattern REF_BILINEAR_F16_ID : Reference2_f16.txt + + Pattern REF_SPLINE_SQU_F16_ID : Reference3_f16.txt + Pattern REF_SPLINE_SIN_F16_ID : Reference4_f16.txt + Pattern REF_SPLINE_RAM_F16_ID : Reference5_f16.txt + + Pattern INPUT_SPLINE_SQU_X_F16_ID : InputX3_f16.txt + Pattern INPUT_SPLINE_SQU_Y_F16_ID : InputY3_f16.txt + Pattern OUTPUT_SPLINE_SQU_X_F16_ID : OutputX3_f16.txt + Pattern INPUT_SPLINE_SIN_X_F16_ID : InputX4_f16.txt + Pattern INPUT_SPLINE_SIN_Y_F16_ID : InputY4_f16.txt + Pattern OUTPUT_SPLINE_SIN_X_F16_ID : OutputX4_f16.txt + Pattern INPUT_SPLINE_RAM_X_F16_ID : InputX5_f16.txt + Pattern INPUT_SPLINE_RAM_Y_F16_ID : InputY5_f16.txt + Pattern OUTPUT_SPLINE_RAM_X_F16_ID : OutputX5_f16.txt + + + Output OUT_SAMPLES_F16_ID : Output + Output COEFS_SPLINE_F16_ID : SplineCoefs + Output TEMP_SPLINE_F16_ID : SplineTemp + + Functions { + Test arm_linear_interp_f16:test_linear_interp_f16 + Test arm_bilinear_interp_f16:test_bilinear_interp_f16 + } + } + } + group Basic Tests { class = BasicTests folder = BasicMaths