STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
arm_sin_cos_f32.c
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------
2 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
3 *
4 * $Date: 19. March 2015
5 * $Revision: V.1.4.5
6 *
7 * Project: CMSIS DSP Library
8 * Title: arm_sin_cos_f32.c
9 *
10 * Description: Sine and Cosine calculation for floating-point values.
11 *
12 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * - Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 * - Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in
21 * the documentation and/or other materials provided with the
22 * distribution.
23 * - Neither the name of ARM LIMITED nor the names of its contributors
24 * may be used to endorse or promote products derived from this
25 * software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
30 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
31 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
33 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
34 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGE.
39 * -------------------------------------------------------------------- */
40 
41 #include "arm_math.h"
42 #include "arm_common_tables.h"
43 
85  float32_t theta,
86  float32_t * pSinVal,
87  float32_t * pCosVal)
88 {
89  float32_t fract, in; /* Temporary variables for input, output */
90  uint16_t indexS, indexC; /* Index variable */
91  float32_t f1, f2, d1, d2; /* Two nearest output values */
92  int32_t n;
93  float32_t findex, Dn, Df, temp;
94 
95  /* input x is in degrees */
96  /* Scale the input, divide input by 360, for cosine add 0.25 (pi/2) to read sine table */
97  in = theta * 0.00277777777778f;
98 
99  /* Calculation of floor value of input */
100  n = (int32_t) in;
101 
102  /* Make negative values towards -infinity */
103  if(in < 0.0f)
104  {
105  n--;
106  }
107  /* Map input value to [0 1] */
108  in = in - (float32_t) n;
109 
110  /* Calculation of index of the table */
111  findex = (float32_t) FAST_MATH_TABLE_SIZE * in;
112  indexS = ((uint16_t)findex) & 0x1ff;
113  indexC = (indexS + (FAST_MATH_TABLE_SIZE / 4)) & 0x1ff;
114 
115  /* fractional value calculation */
116  fract = findex - (float32_t) indexS;
117 
118  /* Read two nearest values of input value from the cos & sin tables */
119  f1 = sinTable_f32[indexC+0];
120  f2 = sinTable_f32[indexC+1];
121  d1 = -sinTable_f32[indexS+0];
122  d2 = -sinTable_f32[indexS+1];
123 
124  Dn = 0.0122718463030f; // delta between the two points (fixed), in this case 2*pi/FAST_MATH_TABLE_SIZE
125  Df = f2 - f1; // delta between the values of the functions
126  temp = Dn*(d1 + d2) - 2*Df;
127  temp = fract*temp + (3*Df - (d2 + 2*d1)*Dn);
128  temp = fract*temp + d1*Dn;
129 
130  /* Calculation of cosine value */
131  *pCosVal = fract*temp + f1;
132 
133  /* Read two nearest values of input value from the cos & sin tables */
134  f1 = sinTable_f32[indexS+0];
135  f2 = sinTable_f32[indexS+1];
136  d1 = sinTable_f32[indexC+0];
137  d2 = sinTable_f32[indexC+1];
138 
139  Df = f2 - f1; // delta between the values of the functions
140  temp = Dn*(d1 + d2) - 2*Df;
141  temp = fract*temp + (3*Df - (d2 + 2*d1)*Dn);
142  temp = fract*temp + d1*Dn;
143 
144  /* Calculation of sine value */
145  *pSinVal = fract*temp + f1;
146 }
void arm_sin_cos_f32(float32_t theta, float32_t *pSinVal, float32_t *pCosVal)
Floating-point sin_cos function.
float float32_t
32-bit floating-point type definition.
Definition: arm_math.h:407
const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE+1]
#define FAST_MATH_TABLE_SIZE
Macros required for SINE and COSINE Fast math approximations.
Definition: arm_math.h:341