lsf_check.c revision 14b43beb7ce4440b30dcea31196de5b4a529cb6b
1/*
2 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11/******************************************************************
12
13 iLBC Speech Coder ANSI-C Source Code
14
15 WebRtcIlbcfix_LsfCheck.c
16
17******************************************************************/
18
19#include "defines.h"
20#include "constants.h"
21
22/*----------------------------------------------------------------*
23 *  check for stability of lsf coefficients
24 *---------------------------------------------------------------*/
25
26int WebRtcIlbcfix_LsfCheck(
27    WebRtc_Word16 *lsf, /* LSF parameters */
28    int dim, /* dimension of LSF */
29    int NoAn)  /* No of analysis per frame */
30{
31  int k,n,m, Nit=2, change=0,pos;
32  const WebRtc_Word16 eps=319;  /* 0.039 in Q13 (50 Hz)*/
33  const WebRtc_Word16 eps2=160;  /* eps/2.0 in Q13;*/
34  const WebRtc_Word16 maxlsf=25723; /* 3.14; (4000 Hz)*/
35  const WebRtc_Word16 minlsf=82;  /* 0.01; (0 Hz)*/
36
37  /* LSF separation check*/
38  for (n=0;n<Nit;n++) {  /* Run through a 2 times */
39    for (m=0;m<NoAn;m++) { /* Number of analyses per frame */
40      for (k=0;k<(dim-1);k++) {
41        pos=m*dim+k;
42
43        /* Seperate coefficients with a safety margin of 50 Hz */
44        if ((lsf[pos+1]-lsf[pos])<eps) {
45
46          if (lsf[pos+1]<lsf[pos]) {
47            lsf[pos+1]= lsf[pos]+eps2;
48            lsf[pos]= lsf[pos+1]-eps2;
49          } else {
50            lsf[pos]-=eps2;
51            lsf[pos+1]+=eps2;
52          }
53          change=1;
54        }
55
56        /* Limit minimum and maximum LSF */
57        if (lsf[pos]<minlsf) {
58          lsf[pos]=minlsf;
59          change=1;
60        }
61
62        if (lsf[pos]>maxlsf) {
63          lsf[pos]=maxlsf;
64          change=1;
65        }
66      }
67    }
68  }
69
70  return change;
71}
72