|  | /* | 
|  | *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | /****************************************************************** | 
|  |  | 
|  | iLBC Speech Coder ANSI-C Source Code | 
|  |  | 
|  | WebRtcIlbcfix_LsfCheck.c | 
|  |  | 
|  | ******************************************************************/ | 
|  |  | 
|  | #include "modules/audio_coding/codecs/ilbc/lsf_check.h" | 
|  |  | 
|  | #include "modules/audio_coding/codecs/ilbc/constants.h" | 
|  | #include "modules/audio_coding/codecs/ilbc/defines.h" | 
|  |  | 
|  | /*----------------------------------------------------------------* | 
|  | *  check for stability of lsf coefficients | 
|  | *---------------------------------------------------------------*/ | 
|  |  | 
|  | int WebRtcIlbcfix_LsfCheck( | 
|  | int16_t *lsf, /* LSF parameters */ | 
|  | int dim, /* dimension of LSF */ | 
|  | int NoAn)  /* No of analysis per frame */ | 
|  | { | 
|  | int k,n,m, Nit=2, change=0,pos; | 
|  | const int16_t eps=319;  /* 0.039 in Q13 (50 Hz)*/ | 
|  | const int16_t eps2=160;  /* eps/2.0 in Q13;*/ | 
|  | const int16_t maxlsf=25723; /* 3.14; (4000 Hz)*/ | 
|  | const int16_t minlsf=82;  /* 0.01; (0 Hz)*/ | 
|  |  | 
|  | /* LSF separation check*/ | 
|  | for (n=0;n<Nit;n++) {  /* Run through a 2 times */ | 
|  | for (m=0;m<NoAn;m++) { /* Number of analyses per frame */ | 
|  | for (k=0;k<(dim-1);k++) { | 
|  | pos=m*dim+k; | 
|  |  | 
|  | /* Seperate coefficients with a safety margin of 50 Hz */ | 
|  | if ((lsf[pos+1]-lsf[pos])<eps) { | 
|  |  | 
|  | if (lsf[pos+1]<lsf[pos]) { | 
|  | lsf[pos+1]= lsf[pos]+eps2; | 
|  | lsf[pos]= lsf[pos+1]-eps2; | 
|  | } else { | 
|  | lsf[pos]-=eps2; | 
|  | lsf[pos+1]+=eps2; | 
|  | } | 
|  | change=1; | 
|  | } | 
|  |  | 
|  | /* Limit minimum and maximum LSF */ | 
|  | if (lsf[pos]<minlsf) { | 
|  | lsf[pos]=minlsf; | 
|  | change=1; | 
|  | } | 
|  |  | 
|  | if (lsf[pos]>maxlsf) { | 
|  | lsf[pos]=maxlsf; | 
|  | change=1; | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return change; | 
|  | } |