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