www.pudn.com > SMV_Code.rar > dtmf20ms.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 "agc.h" #include "check.h" #include "dtmf_det.h" #include "dtmf.h" #include "goertzel.h" #include "tables.h" /*===========================================================================*/ /* ..Defines. */ /*---------------------------------------------------------------------------*/ /*===========================================================================*/ /* ..Globals. */ /*---------------------------------------------------------------------------*/ /*===========================================================================*/ /* ..EVRC 20ms DTMF Detector Task (called every 160 samples) */ /*---------------------------------------------------------------------------*/ /* buffer[] (simulates EVRC data buffering) * * new data read in from file * (new_dataP) (160 points) * |--------------------------------| * |<------A------->|<------B------>|<------C------->| * |----------------|--------------------------------|----------------| * lookback data to be processed by vocoder lookahead * (80 points) (cur_dataP) (160 points) (80 points) * * * Muting Logic: * ------------- * if (block B AND block C contain "possible DTMF"), * then mute blocks A and B; * if ( (DtmfDetectStatLast == 1) // Valid DTMF tone in last DTMF block? * AND (80pt DTMF block A contains "possible DTMF") ), * then mute blocks A, B, and C; */ short Dtmf20ms ( DTMF_DETECTOR* D, /* (i) - pointer to detector structure */ short* buffer, /* (i) - EVRC data buffer (see comments above) */ short* digit /* (i) - DTMF digit or -1 if no DTMF detect*/ ) { /*....(static) variables....*/ static long dtmfblock10ms = 0; /* 10ms DTMF block counter */ /* (Not needed in DSP implementation!!) */ /*....(local) variables....*/ register int j; short DtmfDetectStatLast; short digit1,digit2; short possible_tone_block_A; short possible_tone_block_B; short possible_tone_block_C; short* dataP; short* cur_dataP; short* new_dataP; short dtmf_buf[N]; short mute = 0; /* =1 mute current 160, =2 mute current+ look_ahead */ /*....execute....*/ dataP = &buffer[0]; /* start of look-back */ cur_dataP = &buffer[80]; /* current 160pt frame to be processed */ new_dataP = &buffer[160]; /* start of data read in from file */ possible_tone_block_A = D->PossibleDtmfLast; /* Move data to local buffer since DtmfDetector() overwrites data...*/ for (j=0; j DtmfDetectStat; digit1= -1; if (D->DtmfDetectStat ==1 ) digit1 = D->DtmfDigit; dtmfblock10ms++; /* Process second N samples (lookahead) */ for (j=0; j DtmfDetectStat ==1 ) digit2 =D->DtmfDigit; dtmfblock10ms++; /* Decide whether or not to mute */ if ( possible_tone_block_B && possible_tone_block_C ) { mute=1; for (j=0; j<160; j++) { cur_dataP[j] = 0; } } if ( (possible_tone_block_A) && (DtmfDetectStatLast == 1) ) { mute=2; for (j=0; j<240; j++) { cur_dataP[j] = 0; } } D->PossibleDtmfLast = possible_tone_block_C; *digit = -1; if (digit1> -1 ) *digit=digit1; if (digit2> -1 ) *digit=digit2; return mute; }