156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_math.h
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contains common math routines for the various audio engines.
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2005
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control:
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Revision: 584 $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-03-08 09:49:24 -0800 (Thu, 08 Mar 2007) $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef _EAS_MATH_H
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define _EAS_MATH_H
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/** coefs for pan, generates sin, cos */
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define COEFF_PAN_G2    -27146      /* -0.82842712474619 = 2 - 4/sqrt(2) */
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define COEFF_PAN_G0    23170       /* 0.707106781186547 = 1/sqrt(2) */
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkscoefficients for approximating
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks2^x = gn2toX0 + gn2toX1*x + gn2toX2*x^2 + gn2toX3*x^3
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkswhere x is a int.frac number representing number of octaves.
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksActually, we approximate only the 2^(frac) using the power series
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksand implement the 2^(int) as a shift, so that
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks2^x == 2^(int.frac) == 2^(int) * 2^(fract)
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    == (gn2toX0 + gn2toX1*x + gn2toX2*x^2 + gn2toX3*x^3) << (int)
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksThe gn2toX.. were generated using a best fit for a 3rd
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksorder polynomial, instead of taking the coefficients from
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksa truncated Taylor (or Maclaurin?) series.
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GN2_TO_X0   32768   /*  1                   */
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GN2_TO_X1   22833   /*  0.696807861328125   */
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GN2_TO_X2   7344    /*  0.22412109375       */
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GN2_TO_X3   2588    /*  0.0789794921875     */
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Fixed Point Math
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * These macros are used for fixed point multiplies. If the processor
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * supports fixed point multiplies, replace these macros with inline
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * assembly code to improve performance.
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* Fixed point multiply 0.15 x 0.15 = 0.15 returned as 32-bits */
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define FMUL_15x15(a,b) \
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e(704) <avoid multiply for performance>*/ \
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (((EAS_I32)(a) * (EAS_I32)(b)) >> 15)
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* Fixed point multiply 0.7 x 0.7 = 0.15 returned as 32-bits */
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define FMUL_7x7(a,b) \
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e(704) <avoid multiply for performance>*/ \
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (((EAS_I32)(a) * (EAS_I32)(b) ) << 1)
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* Fixed point multiply 0.8 x 0.8 = 0.15 returned as 32-bits */
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define FMUL_8x8(a,b) \
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e(704) <avoid multiply for performance>*/ \
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (((EAS_I32)(a) * (EAS_I32)(b) ) >> 1)
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* Fixed point multiply 0.8 x 1.15 = 0.15 returned as 32-bits */
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define FMUL_8x15(a,b) \
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e(704) <avoid divide for performance>*/ \
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (((EAS_I32)((a) << 7) * (EAS_I32)(b)) >> 15)
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* macros for fractional phase accumulator */
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksNote: changed the _U32 to _I32 on 03/14/02. This should not
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksaffect the phase calculations, and should allow us to reuse these
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksmacros for other audio sample related math.
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define HARDWARE_BIT_WIDTH      32
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_PHASE_INT_BITS      1
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_PHASE_FRAC_BITS     15
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define PHASE_FRAC_MASK         (EAS_U32) ((0x1L << NUM_PHASE_FRAC_BITS) -1)
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GET_PHASE_INT_PART(x)   (EAS_U32)((EAS_U32)(x) >> NUM_PHASE_FRAC_BITS)
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GET_PHASE_FRAC_PART(x)  (EAS_U32)((EAS_U32)(x) & PHASE_FRAC_MASK)
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DEFAULT_PHASE_FRAC      0
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DEFAULT_PHASE_INT       0
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksLinear interpolation calculates:
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksoutput = (1-frac) * sample[n] + (frac) * sample[n+1]
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkswhere conceptually  0 <= frac < 1
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksFor a fixed point implementation, frac is actually an integer value
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkswith an implied binary point one position to the left. The value of
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksone (unity) is given by PHASE_ONE
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksone half and one quarter are useful for 4-point linear interp.
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define PHASE_ONE               (EAS_I32) (0x1L << NUM_PHASE_FRAC_BITS)
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks Multiply the signed audio sample by the unsigned fraction.
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks-  a is the signed audio sample
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks-  b is the unsigned fraction (cast to signed int as long as coef
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    uses (n-1) or less bits, where n == hardware bit width)
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_AUDIO_COEF(audio,coef)         /*lint -e704 <avoid divide for performance>*/ \
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)(                                  \
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                           \
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(audio)) * ((EAS_I32)(coef))  \
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                           \
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> NUM_PHASE_FRAC_BITS                      \
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        )               \
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        /* lint +704 <restore checking>*/
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* wet / dry calculation macros */
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_WET_DRY_FRAC_BITS       7   // 15
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_WET_DRY_INT_BITS        9   // 1
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* define a 1.0 */
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define WET_DRY_ONE                 (EAS_I32) ((0x1L << NUM_WET_DRY_FRAC_BITS))
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define WET_DRY_MINUS_ONE           (EAS_I32) (~WET_DRY_ONE)
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define WET_DRY_FULL_SCALE          (EAS_I32) (WET_DRY_ONE - 1)
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_AUDIO_WET_DRY_COEF(audio,coef) /*lint -e(702) <avoid divide for performance>*/ \
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)(                                      \
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                               \
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(audio)) * ((EAS_I32)(coef))      \
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                               \
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> NUM_WET_DRY_FRAC_BITS                        \
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                                     )
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* Envelope 1 (EG1) calculation macros */
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_EG1_INT_BITS            1
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_EG1_FRAC_BITS           15
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* the max positive gain used in the synth for EG1 */
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* SYNTH_FULL_SCALE_EG1_GAIN must match the value in the dls2eas
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconverter, otherwise, the values we read from the .eas file are bogus. */
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define SYNTH_FULL_SCALE_EG1_GAIN   (EAS_I32) ((0x1L << NUM_EG1_FRAC_BITS) -1)
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* define a 1.0 */
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EG1_ONE                     (EAS_I32) ((0x1L << NUM_EG1_FRAC_BITS))
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EG1_MINUS_ONE               (EAS_I32) (~SYNTH_FULL_SCALE_EG1_GAIN)
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EG1_HALF                    (EAS_I32) (EG1_ONE/2)
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define EG1_MINUS_HALF              (EAS_I32) (EG1_MINUS_ONE/2)
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksWe implement the EG1 using a linear gain value, which means that the
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksattack segment is handled by incrementing (adding) the linear gain.
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksHowever, EG1 treats the Decay, Sustain, and Release differently than
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe Attack portion. For Decay, Sustain, and Release, the gain is
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkslinear on dB scale, which is equivalent to exponential damping on
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksa linear scale. Because we use a linear gain for EG1, we implement
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe Decay and Release as multiplication (instead of incrementing
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksas we did for the attack segment).
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksTherefore, we need the following macro to implement the multiplication
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks(i.e., exponential damping) during the Decay and Release segments of
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe EG1
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_EG1_EG1(gain,damping)      /*lint -e(704) <avoid divide for performance>*/ \
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)(                                      \
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                               \
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(gain)) * ((EAS_I32)(damping))    \
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                               \
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> NUM_EG1_FRAC_BITS                            \
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        )
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Use the following macro specifically for the filter, when multiplying
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// the b1 coefficient. The 0 <= |b1| < 2, which therefore might overflow
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// in certain conditions because we store b1 as a 1.15 value.
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// Instead, we could store b1 as b1p (b1' == b1 "prime") where
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// b1p == b1/2, thus ensuring no potential overflow for b1p because
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// 0 <= |b1p| < 1
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// However, during the filter calculation, we must account for the fact
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// that we are using b1p instead of b1, and thereby multiply by
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// an extra factor of 2. Rather than multiply by an extra factor of 2,
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// we can instead shift the result right by one less, hence the
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks// modified shift right value of (NUM_EG1_FRAC_BITS -1)
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_EG1_EG1_X2(gain,damping)       /*lint -e(702) <avoid divide for performance>*/ \
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)(                                      \
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                               \
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(gain)) * ((EAS_I32)(damping))    \
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                               \
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> (NUM_EG1_FRAC_BITS -1)                       \
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        )
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define SATURATE_EG1(x)     /*lint -e{734} saturation operation */              \
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ((EAS_I32)(x) > SYNTH_FULL_SCALE_EG1_GAIN)  ? (SYNTH_FULL_SCALE_EG1_GAIN) : \
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ((EAS_I32)(x) < EG1_MINUS_ONE)              ? (EG1_MINUS_ONE) : (x);
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* use "digital cents" == "dents" instead of cents */
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* we coudl re-use the phase frac macros, but if we do,
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkswe must change the phase macros to cast to _I32 instead of _U32,
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksbecause using a _U32 cast causes problems when shifting the exponent
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksfor the 2^x calculation, because right shift a negative values MUST
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksbe sign extended, or else the 2^x calculation is wrong */
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* use "digital cents" == "dents" instead of cents */
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_DENTS_FRAC_BITS     12
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_DENTS_INT_BITS      (HARDWARE_BIT_WIDTH - NUM_DENTS_FRAC_BITS)
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DENTS_FRAC_MASK             (EAS_I32) ((0x1L << NUM_DENTS_FRAC_BITS) -1)
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GET_DENTS_INT_PART(x)       /*lint -e(704) <avoid divide for performance>*/ \
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                            (EAS_I32)((EAS_I32)(x) >> NUM_DENTS_FRAC_BITS)
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define GET_DENTS_FRAC_PART(x)  (EAS_I32)((EAS_I32)(x) & DENTS_FRAC_MASK)
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DENTS_ONE               (EAS_I32) (0x1L << NUM_DENTS_FRAC_BITS)
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* use CENTS_TO_DENTS to convert a value in cents to dents */
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define CENTS_TO_DENTS (EAS_I32) (DENTS_ONE * (0x1L << NUM_EG1_FRAC_BITS) / 1200L)                          \
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksFor gain, the LFO generates a value that modulates in terms
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksof dB. However, we use a linear gain value, so we must convert
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe LFO value in dB to a linear gain. Normally, we would use
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparkslinear gain = 10^x, where x = LFO value in dB / 20.
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksInstead, we implement 10^x using our 2^x approximation.
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksbecause
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks  10^x = 2^(log2(10^x)) = 2^(x * log2(10))
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksso we need to multiply by log2(10) which is just a constant.
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksAh, but just wait -- our 2^x actually doesn't exactly implement
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks2^x, but it actually assumes that the input is in cents, and within
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe 2^x approximation converts its input from cents to octaves
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksby dividing its input by 1200.
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksSo, in order to convert the LFO gain value in dB to something
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthat our existing 2^x approximation can use, multiply the LFO gain
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksby log2(10) * 1200 / 20
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksThe divide by 20 helps convert dB to linear gain, and we might
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksas well incorporate that operation into this conversion.
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksOf course, we need to keep some fractional bits, so multiply
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksthe constant by NUM_EG1_FRAC_BITS
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* use LFO_GAIN_TO_CENTS to convert the LFO gain value to cents */
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DOUBLE_LOG2_10  (double) (3.32192809488736) /* log2(10) */
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DOUBLE_LFO_GAIN_TO_CENTS    (double)                \
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (                                                       \
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                (DOUBLE_LOG2_10) *                          \
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                1200.0  /                                   \
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                20.0                                        \
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    )
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define LFO_GAIN_TO_CENTS   (EAS_I32)                       \
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (                                                       \
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                DOUBLE_LFO_GAIN_TO_CENTS *                  \
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                (0x1L << NUM_EG1_FRAC_BITS)                 \
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    )
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define LFO_GAIN_TO_CENTS (EAS_I32) (1671981156L >> (23 - NUM_EG1_FRAC_BITS))
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_DENTS_COEF(dents,coef)     /*lint -e704 <avoid divide for performance>*/   \
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)(                                  \
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                           \
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(dents)) * ((EAS_I32)(coef))  \
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                           \
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> NUM_DENTS_FRAC_BITS                      \
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        )               \
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                        /* lint +e704 <restore checking>*/
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* we use 16-bits in the PC per audio sample */
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define BITS_PER_AUDIO_SAMPLE   16
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* we define 1 as 1.0 - 1 LSbit */
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DISTORTION_ONE          (EAS_I32)((0x1L << (BITS_PER_AUDIO_SAMPLE-1)) -1)
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define DISTORTION_MINUS_ONE    (EAS_I32)(~DISTORTION_ONE)
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* drive coef is given as int.frac */
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_DRIVE_COEF_INT_BITS     1
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define NUM_DRIVE_COEF_FRAC_BITS    4
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_AUDIO_DRIVE(audio,drive)       /*lint -e(702) <avoid divide for performance>*/ \
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)   (                               \
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                           \
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(audio)) * ((EAS_I32)(drive)) \
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                           \
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> NUM_DRIVE_COEF_FRAC_BITS                 \
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                                )
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define MULT_AUDIO_AUDIO(audio1,audio2)         /*lint -e(702) <avoid divide for performance>*/ \
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_I32)   (                                   \
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (                                               \
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                ((EAS_I32)(audio1)) * ((EAS_I32)(audio2))   \
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            )                                               \
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            >> (BITS_PER_AUDIO_SAMPLE-1)                    \
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                                    )
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define SATURATE(x)                                                         \
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ((((EAS_I32)(x)) > DISTORTION_ONE)      ? (DISTORTION_ONE) :            \
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    (((EAS_I32)(x)) < DISTORTION_MINUS_ONE) ? (DISTORTION_MINUS_ONE) :  ((EAS_I32)(x)));
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_Calculate2toX()
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Calculate 2^x
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nCents -     measured in cents
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nResult - int.frac result (where frac has NUM_DENTS_FRAC_BITS)
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_I32 EAS_Calculate2toX (EAS_I32 nCents);
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_LogToLinear16()
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Transform log value to linear gain multiplier using piece-wise linear
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * approximation
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nGain - log scale value in 20.10 format. Even though gain is normally
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * stored in 6.10 (16-bit) format we use 32-bit numbers here to eliminate
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the need for saturation checking when combining gain values.
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns a 16-bit linear value approximately equal to 2^(nGain/1024)
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_U16 EAS_LogToLinear16 (EAS_I32 nGain);
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_VolumeToGain()
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Transform volume control in 1dB increments to gain multiplier
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * volume - 100 = 0dB, 99 = -1dB, 0 = -inf
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Returns a 16-bit linear value
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_I16 EAS_VolumeToGain (EAS_INT volume);
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_fsqrt()
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Calculates the square root of a 32-bit fixed point value
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * n = value of interest
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * returns the square root of n
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_U16 EAS_fsqrt (EAS_U32 n);
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_flog2()
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Calculates the log2 of a 32-bit fixed point value
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * n = value of interest
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * returns the log2 of n
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_I32 EAS_flog2 (EAS_U32 n);
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
413