Subversion Repositories AFRtranscoder

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* ----------------------------------------------------------------------
  2.  * Project:      CMSIS DSP Library
  3.  * Title:        arm_cos_q15.c
  4.  * Description:  Fast cosine calculation for Q15 values
  5.  *
  6.  * $Date:        27. January 2017
  7.  * $Revision:    V.1.5.1
  8.  *
  9.  * Target Processor: Cortex-M cores
  10.  * -------------------------------------------------------------------- */
  11. /*
  12.  * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
  13.  *
  14.  * SPDX-License-Identifier: Apache-2.0
  15.  *
  16.  * Licensed under the Apache License, Version 2.0 (the License); you may
  17.  * not use this file except in compliance with the License.
  18.  * You may obtain a copy of the License at
  19.  *
  20.  * www.apache.org/licenses/LICENSE-2.0
  21.  *
  22.  * Unless required by applicable law or agreed to in writing, software
  23.  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  24.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25.  * See the License for the specific language governing permissions and
  26.  * limitations under the License.
  27.  */
  28.  
  29. #include "arm_math.h"
  30. #include "arm_common_tables.h"
  31.  
  32. /**
  33.  * @ingroup groupFastMath
  34.  */
  35.  
  36.  /**
  37.  * @addtogroup cos
  38.  * @{
  39.  */
  40.  
  41. /**
  42.  * @brief Fast approximation to the trigonometric cosine function for Q15 data.
  43.  * @param[in] x Scaled input value in radians.
  44.  * @return  cos(x).
  45.  *
  46.  * The Q15 input value is in the range [0 +0.9999] and is mapped to a radian
  47.  * value in the range [0 2*pi).
  48.  */
  49.  
  50. q15_t arm_cos_q15(
  51.   q15_t x)
  52. {
  53.   q15_t cosVal;                                  /* Temporary variables for input, output */
  54.   int32_t index;                                 /* Index variables */
  55.   q15_t a, b;                                    /* Four nearest output values */
  56.   q15_t fract;                                   /* Temporary values for fractional values */
  57.  
  58.   /* add 0.25 (pi/2) to read sine table */
  59.   x = (uint16_t)x + 0x2000;
  60.   if (x < 0)
  61.   {   /* convert negative numbers to corresponding positive ones */
  62.       x = (uint16_t)x + 0x8000;
  63.   }
  64.  
  65.   /* Calculate the nearest index */
  66.   index = (uint32_t)x >> FAST_MATH_Q15_SHIFT;
  67.  
  68.   /* Calculation of fractional value */
  69.   fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9;
  70.  
  71.   /* Read two nearest values of input value from the sin table */
  72.   a = sinTable_q15[index];
  73.   b = sinTable_q15[index+1];
  74.  
  75.   /* Linear interpolation process */
  76.   cosVal = (q31_t)(0x8000-fract)*a >> 16;
  77.   cosVal = (q15_t)((((q31_t)cosVal << 16) + ((q31_t)fract*b)) >> 16);
  78.  
  79.   return cosVal << 1;
  80. }
  81.  
  82. /**
  83.  * @} end of cos group
  84.  */
  85.