www.pudn.com > SMV_Code.rar > agc.c
/*=========================================================================*/ /* Each of the companies; Ericsson, Lucent, Mindspeed, Motorola, Nokia, */ /* Nortel Networks, and Qualcomm (hereinafter referred to individually as */ /* “Source” or collectively as “Sources”) do hereby state: */ /* */ /* To the extent to which the Source(s) may legally and freely do so, */ /* the Source(s), upon submission of a Contribution, grant(s) a free, */ /* irrevocable, non-exclusive, license to the Third Generation Partnership */ /* Project 2 (3GPP2) and its Organizational Partners: ARIB, CCSA, TIA, */ /* TTA, and TTC, under the Source’s copyright or copyright license rights */ /* in the Contribution, to, in whole or in part, copy, make derivative */ /* works, perform, display and distribute the Contribution and derivative */ /* works thereof consistent with 3GPP2’s and each Organizational Partner’s */ /* policies and procedures, with the right to (i) sublicense the foregoing */ /* rights consistent with 3GPP2’s and each Organizational Partner’s */ /* policies and procedures and (ii) copyright and sell, if applicable) in */ /* 3GPP2's name or each Organizational Partner’s name any 3GPP2 or */ /* transposed Publication even though this Publication may contain the */ /* Contribution or a derivative work thereof. The Contribution shall */ /* disclose any known limitations on the Source’s rights to license as */ /* herein provided. */ /* */ /* When a Contribution is submitted by the Source(s) to assist the */ /* formulating groups of 3GPP2 or any of its Organizational Partners, */ /* it is proposed to the Committee as a basis for discussion and is not */ /* to be construed as a binding proposal on the Source(s). The Source(s) */ /* specifically reserve(s) the right to amend or modify the material */ /* contained in the Contribution. Nothing contained in the Contribution */ /* shall, except as herein expressly provided, be construed as conferring */ /* by implication, estoppel or otherwise, any license or right under */ /* (i) any existing or later issuing patent, whether or not the use of */ /* information in the document necessarily employs an invention of any */ /* existing or later issued patent, (ii) any copyright, (iii) any */ /* trademark, or (iv) any other intellectual property right. */ /* */ /* With respect to the Software necessary for the practice of any or all */ /* Normative portions of the Selectable Mode Vocoder (SMV) as it exists on */ /* the date of submittal of this form, should the SMV be approved as a */ /* Specification or Report by 3GPP2, or as a transposed Standard by any of */ /* the 3GPP2’s Organizational Partners, the Source(s) state(s) that a */ /* worldwide license to reproduce, use and distribute the Software, the */ /* license rights to which are held by the Source(s), will be made */ /* available to applicants under terms and conditions that are reasonable */ /* and non-discriminatory, which may include monetary compensation, */ /* and only to the extent necessary for the practice of any or all of the */ /* Normative portions of the SMV or the field of use of practice of the */ /* SMV Specification, Report, or Standard. The statement contained above */ /* is irrevocable and shall be binding upon the Source(s). In the event */ /* the rights of the Source(s) in and to copyright or copyright license */ /* rights subject to such commitment are assigned or transferred, */ /* the Source(s) shall notify the assignee or transferee of the existence */ /* of such commitments. */ /*=========================================================================*/ /* */ /*-------------------------------------------------------------------*/ /*===================================================================*/ /* ..Includes. */ /*---------------------------------------------------------------------------*/ #include#include #include "basic_op40.h" #include "basic_op.h" #include "dtmf.h" #include "tables.h" /*===========================================================================*/ /* ..Defines. */ /*---------------------------------------------------------------------------*/ #define SQRT_ITERATIONS 16 /*===========================================================================*/ /* ..Functions. */ /*---------------------------------------------------------------------------*/ short sqrt_approx(long); /*===========================================================================*/ /* ..Scales input data block to avoid overflow in goertzel filters. */ /*---------------------------------------------------------------------------*/ void agc ( DTMF_DETECTOR* D, /* (i) - pointer to detector structure */ short* data /* (i/o) - data buffer */ ) { /* ..(local) variables..*/ register int j; short *dinP; short *doutP; short gain_const; short gain_lev; short gain_amp; short gain_scale; long Lgain_lim; long Lgain_power; Acc accA; /* ..execute..*/ /* Compute constants that depend on N (with rounding) */ /* (Use hardcoded integer values in final implementation!) */ Lgain_lim = (long) ((2147483648. * (1. / 64.) * (1. / (float) N)) + 0.5); gain_const = (short) ((32768. * (sqrt (64. / (float) N))) + 0.5); gain_lev = (short) ((32768. * (.5*sqrt(2.) / (float) N)) + 0.5); dinP = data; accA = 0; for (j = 0; j < N; j++) { accA = L_mac40(accA, *dinP, *dinP); dinP++; } accA =L_shr40(accA,6); /* A = A / 64 */ Lgain_power = accA ; dinP = data; doutP = data; if (Lgain_power>Lgain_lim ) { accA = L_mult(gain_const, sqrt_approx(Lgain_power)); accA=L_shr40(accA,16); gain_amp = extract_l40( (accA)); gain_scale = divide_s(gain_lev,gain_amp); /* scale the data by 'gain_scale' */ for (j = 0; j < N; j++) { accA = L_mult(gain_scale, (*dinP++)); accA= L_shr40(accA,16); *doutP++ =extract_l40(accA); } } return; } /* Fixed point square root approximation */ short sqrt_approx ( /* (o) - output: 0 <= y < 1.0 (Q15) */ long L_x /* (i) - input: 0 <= x < 1.0 (Q31) */ ) { /* ..(local) variables..*/ register int j; short y; Acc accA; Acc accB; Acc accC; /* ..execute..*/ accC = (0x40000000); /* delta = 0.5 */ y = 0x4000; /* y = 0.5 */ accA = L_mult(y,y); accA = L_sub40(accA, L_x); /* (A) = yold*yold - x */ for (j=0; j 0) { accB = L_sub40(accB, accC); /* (B) = yold - (1/2)*delta */ } else { accB = L_add40(accB, accC); /* (B) = yold + (1/2)*delta */ } accB=L_shr40(accB,16); y = extract_l40(accB); /* (BH) --> ynew */ accA = L_mult(y,y); accA = L_sub40(accA, L_x); /* (A) = yold*yold - x */ } return y; }