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