1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef bbs_PHASE_EM_H
18 #define bbs_PHASE_EM_H
19 
20 /* ---- includes ----------------------------------------------------------- */
21 
22 /**
23  * Phase data type.
24  * This data type represents a phase or angle value and takes advantage
25  * of the circular value range when doing arithmetig with an integer
26  * by ignoring overflow.
27  * The phase value range lies within [ - PI, PI [;
28  * The corresponding integer value range is [ MININT, MAXINT + 1 [.
29  * The phase data type is to be used whereever an angle is needed.
30  */
31 
32 #include "b_BasicEm/Basic.h"
33 
34 /* ---- related objects  --------------------------------------------------- */
35 
36 /* ---- typedefs ----------------------------------------------------------- */
37 
38 /** 8 bit phase value */
39 typedef int8 phase8;
40 
41 /** 16 bit phase value */
42 typedef int16 phase16;
43 
44 /** 32 bit phase value */
45 typedef int32 phase32;
46 
47 /* ---- constants ---------------------------------------------------------- */
48 
49 /** value PI in a phase16 expression */
50 #define bbs_M_PI_16 32768
51 
52 /** value PI/2 in a phase16 expression */
53 #define bbs_M_PI_2_16 16384
54 
55 /** value PI/4 in a phase16 expression */
56 #define bbs_M_PI_4_16 8192
57 
58 /** value PI in a phase8 expression */
59 #define bbs_M_PI_8 128
60 
61 /** value PI/2 in a phase8 expression */
62 #define bbs_M_PI_2_8 64
63 
64 /** value ( 32768 / PI ) in the format 14.1 */
65 #define bbs_PHASE_MAX_BY_PI 20861
66 
67 /** sine interpolation method */
68 #define bbs_SIN_INTERPOLATION_METHOD_2
69 
70 /* ---- object definition -------------------------------------------------- */
71 
72 /* ---- associated objects ------------------------------------------------- */
73 
74 /* ---- external functions ------------------------------------------------- */
75 
76 /* ---- \ghd{ constructor/destructor } ------------------------------------- */
77 
78 /* ---- \ghd{ operators } -------------------------------------------------- */
79 
80 /* ---- \ghd{ query functions } -------------------------------------------- */
81 
82 /**
83  * Computes sine of a phase
84  * The return value has the format 8.24
85  * The function approximates ( int32 )( sin( ( M_PI * phaseA ) / ( 1<<15 ) ) * ( 1<<24 ) )
86  * Max error: 8.5E-5 (METHOD1); 7.0E-5 (METHOD2)
87  * Std error: 4.4E-5 (METHOD1); 3.2E-5 (METHOD2)
88  */
89 int32 bbs_sin32( phase16 phaseA );
90 
91 /**
92  * Computes cosine of a phase
93  * The return value has the format 8.24
94  * The function approximates ( int32 )( cos( ( M_PI * phaseA ) / ( 1<<15 ) ) * ( 1<<24 ) )
95  * Max error: 8.5E-5 (METHOD1); 7.0E-5 (METHOD2)
96  * Std error: 4.4E-5 (METHOD1); 3.2E-5 (METHOD2)
97  */
98 int32 bbs_cos32( phase16 phaseA );
99 
100 /**
101  * Computes sine of a phase
102  * The return value has the format 2.14
103  * see sin32 for details
104  */
105 int16 bbs_sin16( phase16 phaseA );
106 
107 /**
108  * Computes cosine of a phase
109  * The return value has the format 2.14
110  * see cos32 for details
111  */
112 int16 bbs_cos16( phase16 phaseA );
113 
114 /**
115  * Computes arcus tangens between [0,1[, where valA has the format 16.16
116  * The function approximates ( int16 )( atan( double( valA ) / ( ( 1 << 16 ) ) / M_PI ) * ( 1 << 15 ) )
117  * Max error: 5.1E-5 PI
118  * Std error: 2.7E-5 PI
119  */
120 phase16 bbs_atan16( uint32 valA );
121 
122 /**
123  * Computes phase from a 2d vector as angle enclosed between vector and (0,0).
124  * It is vec = ( cos( angle ), sin( angle ) );
125  * Max error: 5.4E-5 PI
126  * Std error: 2.9E-5 PI
127  */
128 phase16 bbs_phase16( int32 xA, int32 yA );
129 
130 /* ---- \ghd{ modify functions } ------------------------------------------- */
131 
132 /* ---- \ghd{ memory I/O } ------------------------------------------------- */
133 
134 /* ---- \ghd{ exec functions } --------------------------------------------- */
135 
136 #endif /* bbs_PHASE_EM_H */
137 
138