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 */
39typedef int8 phase8;
40
41/** 16 bit phase value */
42typedef int16 phase16;
43
44/** 32 bit phase value */
45typedef 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 */
89int32 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 */
98int32 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 */
105int16 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 */
112int16 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 */
120phase16 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 */
128phase16 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