Home | History | Annotate | Download | only in b_BasicEm
      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