From 96d6da4e252b06dcfdc041e7df23e86161c33007 Mon Sep 17 00:00:00 2001 From: rihab kouki Date: Tue, 28 Jul 2020 11:24:49 +0100 Subject: Official ARM version: v5.6.0 --- DSP/Source/FastMathFunctions/arm_cos_f32.c | 83 ++++++++++++++++-------------- 1 file changed, 45 insertions(+), 38 deletions(-) (limited to 'DSP/Source/FastMathFunctions/arm_cos_f32.c') diff --git a/DSP/Source/FastMathFunctions/arm_cos_f32.c b/DSP/Source/FastMathFunctions/arm_cos_f32.c index e604b3c..26bd66e 100644 --- a/DSP/Source/FastMathFunctions/arm_cos_f32.c +++ b/DSP/Source/FastMathFunctions/arm_cos_f32.c @@ -3,13 +3,13 @@ * Title: arm_cos_f32.c * Description: Fast cosine calculation for floating-point values * - * $Date: 27. January 2017 - * $Revision: V.1.5.1 + * $Date: 18. March 2019 + * $Revision: V1.6.0 * * Target Processor: Cortex-M cores * -------------------------------------------------------------------- */ /* - * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. + * Copyright (C) 2010-2019 ARM Limited or its affiliates. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -28,56 +28,57 @@ #include "arm_math.h" #include "arm_common_tables.h" + /** - * @ingroup groupFastMath + @ingroup groupFastMath */ /** - * @defgroup cos Cosine - * - * Computes the trigonometric cosine function using a combination of table lookup - * and linear interpolation. There are separate functions for - * Q15, Q31, and floating-point data types. - * The input to the floating-point version is in radians and in the range [0 2*pi) while the - * fixed-point Q15 and Q31 have a scaled input with the range - * [0 +0.9999] mapping to [0 2*pi). The fixed-point range is chosen so that a - * value of 2*pi wraps around to 0. - * - * The implementation is based on table lookup using 256 values together with linear interpolation. - * The steps used are: - * -# Calculation of the nearest integer table index - * -# Compute the fractional portion (fract) of the table index. - * -# The final result equals (1.0f-fract)*a + fract*b; - * - * where - *
- *    b=Table[index+0];
- *    c=Table[index+1];
- * 
+ @defgroup cos Cosine + + Computes the trigonometric cosine function using a combination of table lookup + and linear interpolation. There are separate functions for + Q15, Q31, and floating-point data types. + The input to the floating-point version is in radians while the + fixed-point Q15 and Q31 have a scaled input with the range + [0 +0.9999] mapping to [0 2*pi). The fixed-point range is chosen so that a + value of 2*pi wraps around to 0. + + The implementation is based on table lookup using 256 values together with linear interpolation. + The steps used are: + -# Calculation of the nearest integer table index + -# Compute the fractional portion (fract) of the table index. + -# The final result equals (1.0f-fract)*a + fract*b; + + where +
+     b = Table[index];
+     c = Table[index+1];
+  
*/ - /** - * @addtogroup cos - * @{ +/** + @addtogroup cos + @{ */ /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). + @brief Fast approximation to the trigonometric cosine function for floating-point data. + @param[in] x input value in radians + @return cos(x) */ float32_t arm_cos_f32( float32_t x) { - float32_t cosVal, fract, in; /* Temporary variables for input, output */ + float32_t cosVal, fract, in; /* Temporary input, output variables */ uint16_t index; /* Index variable */ float32_t a, b; /* Two nearest output values */ int32_t n; float32_t findex; /* input x is in radians */ - /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi, add 0.25 (pi/2) to read sine table */ + /* Scale input to [0 1] range from [0 2*PI] , divide input by 2*pi, add 0.25 (pi/2) to read sine table */ in = x * 0.159154943092f + 0.25f; /* Calculation of floor value of input */ @@ -93,8 +94,14 @@ float32_t arm_cos_f32( in = in - (float32_t) n; /* Calculation of index of the table */ - findex = (float32_t) FAST_MATH_TABLE_SIZE * in; - index = ((uint16_t)findex) & 0x1ff; + findex = (float32_t)FAST_MATH_TABLE_SIZE * in; + index = (uint16_t)findex; + + /* when "in" is exactly 1, we need to rotate the index down to 0 */ + if (index >= FAST_MATH_TABLE_SIZE) { + index = 0; + findex -= (float32_t)FAST_MATH_TABLE_SIZE; + } /* fractional value calculation */ fract = findex - (float32_t) index; @@ -104,12 +111,12 @@ float32_t arm_cos_f32( b = sinTable_f32[index+1]; /* Linear interpolation process */ - cosVal = (1.0f-fract)*a + fract*b; + cosVal = (1.0f - fract) * a + fract * b; - /* Return the output value */ + /* Return output value */ return (cosVal); } /** - * @} end of cos group + @} end of cos group */ -- cgit