1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_sin_q15.c
4  * Description:  Fast sine calculation for Q15 values
5  *
6  * $Date:        23 April 2021
7  * $Revision:    V1.9.0
8  *
9  * Target Processor: Cortex-M and Cortex-A cores
10  * -------------------------------------------------------------------- */
11 /*
12  * Copyright (C) 2010-2021 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 "dsp/fast_math_functions.h"
30 #include "arm_common_tables.h"
31 
32 /**
33   @ingroup groupFastMath
34  */
35 
36 /**
37   @addtogroup sin
38   @{
39  */
40 
41 /**
42   @brief         Fast approximation to the trigonometric sine function for Q15 data.
43   @param[in]     x  Scaled input value in radians
44   @return        sin(x)
45 
46   The Q15 input value is in the range [0 +0.9999] and is mapped to a radian value in the range [0 2*PI).
47  */
48 
arm_sin_q15(q15_t x)49 q15_t arm_sin_q15(
50   q15_t x)
51 {
52   q15_t sinVal;                                  /* Temporary input, output variables */
53   int32_t index;                                 /* Index variable */
54   q15_t a, b;                                    /* Two nearest output values */
55   q15_t fract;                                   /* Temporary values for fractional values */
56 
57 
58   if (x < 0)
59   { /* convert negative numbers to corresponding positive ones */
60     x = (uint16_t)x + 0x8000;
61   }
62 
63   /* Calculate the nearest index */
64   index = (uint32_t)x >> FAST_MATH_Q15_SHIFT;
65 
66   /* Calculation of fractional value */
67   fract = (x - (index << FAST_MATH_Q15_SHIFT)) << 9;
68 
69   /* Read two nearest values of input value from the sin table */
70   a = sinTable_q15[index];
71   b = sinTable_q15[index+1];
72 
73   /* Linear interpolation process */
74   sinVal = (q31_t) (0x8000 - fract) * a >> 16;
75   sinVal = (q15_t) ((((q31_t) sinVal << 16) + ((q31_t) fract * b)) >> 16);
76 
77   /* Return output value */
78   return (sinVal << 1);
79 }
80 
81 /**
82   @} end of sin group
83  */
84