C++程序  |  138行  |  4.09 KB

/*
 * 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 */