| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef bbs_PHASE_EM_H |
| #define bbs_PHASE_EM_H |
| |
| /* ---- includes ----------------------------------------------------------- */ |
| |
| /** |
| * Phase data type. |
| * This data type represents a phase or angle value and takes advantage |
| * of the circular value range when doing arithmetig with an integer |
| * by ignoring overflow. |
| * The phase value range lies within [ - PI, PI [; |
| * The corresponding integer value range is [ MININT, MAXINT + 1 [. |
| * The phase data type is to be used whereever an angle is needed. |
| */ |
| |
| #include "b_BasicEm/Basic.h" |
| |
| /* ---- related objects --------------------------------------------------- */ |
| |
| /* ---- typedefs ----------------------------------------------------------- */ |
| |
| /** 8 bit phase value */ |
| typedef int8 phase8; |
| |
| /** 16 bit phase value */ |
| typedef int16 phase16; |
| |
| /** 32 bit phase value */ |
| typedef int32 phase32; |
| |
| /* ---- constants ---------------------------------------------------------- */ |
| |
| /** value PI in a phase16 expression */ |
| #define bbs_M_PI_16 32768 |
| |
| /** value PI/2 in a phase16 expression */ |
| #define bbs_M_PI_2_16 16384 |
| |
| /** value PI/4 in a phase16 expression */ |
| #define bbs_M_PI_4_16 8192 |
| |
| /** value PI in a phase8 expression */ |
| #define bbs_M_PI_8 128 |
| |
| /** value PI/2 in a phase8 expression */ |
| #define bbs_M_PI_2_8 64 |
| |
| /** value ( 32768 / PI ) in the format 14.1 */ |
| #define bbs_PHASE_MAX_BY_PI 20861 |
| |
| /** sine interpolation method */ |
| #define bbs_SIN_INTERPOLATION_METHOD_2 |
| |
| /* ---- object definition -------------------------------------------------- */ |
| |
| /* ---- associated objects ------------------------------------------------- */ |
| |
| /* ---- external functions ------------------------------------------------- */ |
| |
| /* ---- \ghd{ constructor/destructor } ------------------------------------- */ |
| |
| /* ---- \ghd{ operators } -------------------------------------------------- */ |
| |
| /* ---- \ghd{ query functions } -------------------------------------------- */ |
| |
| /** |
| * Computes sine of a phase |
| * The return value has the format 8.24 |
| * The function approximates ( int32 )( sin( ( M_PI * phaseA ) / ( 1<<15 ) ) * ( 1<<24 ) ) |
| * Max error: 8.5E-5 (METHOD1); 7.0E-5 (METHOD2) |
| * Std error: 4.4E-5 (METHOD1); 3.2E-5 (METHOD2) |
| */ |
| int32 bbs_sin32( phase16 phaseA ); |
| |
| /** |
| * Computes cosine of a phase |
| * The return value has the format 8.24 |
| * The function approximates ( int32 )( cos( ( M_PI * phaseA ) / ( 1<<15 ) ) * ( 1<<24 ) ) |
| * Max error: 8.5E-5 (METHOD1); 7.0E-5 (METHOD2) |
| * Std error: 4.4E-5 (METHOD1); 3.2E-5 (METHOD2) |
| */ |
| int32 bbs_cos32( phase16 phaseA ); |
| |
| /** |
| * Computes sine of a phase |
| * The return value has the format 2.14 |
| * see sin32 for details |
| */ |
| int16 bbs_sin16( phase16 phaseA ); |
| |
| /** |
| * Computes cosine of a phase |
| * The return value has the format 2.14 |
| * see cos32 for details |
| */ |
| int16 bbs_cos16( phase16 phaseA ); |
| |
| /** |
| * Computes arcus tangens between [0,1[, where valA has the format 16.16 |
| * The function approximates ( int16 )( atan( double( valA ) / ( ( 1 << 16 ) ) / M_PI ) * ( 1 << 15 ) ) |
| * Max error: 5.1E-5 PI |
| * Std error: 2.7E-5 PI |
| */ |
| phase16 bbs_atan16( uint32 valA ); |
| |
| /** |
| * Computes phase from a 2d vector as angle enclosed between vector and (0,0). |
| * It is vec = ( cos( angle ), sin( angle ) ); |
| * Max error: 5.4E-5 PI |
| * Std error: 2.9E-5 PI |
| */ |
| phase16 bbs_phase16( int32 xA, int32 yA ); |
| |
| /* ---- \ghd{ modify functions } ------------------------------------------- */ |
| |
| /* ---- \ghd{ memory I/O } ------------------------------------------------- */ |
| |
| /* ---- \ghd{ exec functions } --------------------------------------------- */ |
| |
| #endif /* bbs_PHASE_EM_H */ |
| |