blob: 684b2ce8cecfc155b86759e2826850a13c44e8c0 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
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
Mirko Bonadei06c2aa92018-02-01 15:11:41 +010019#include "modules/audio_coding/codecs/ilbc/defines.h"
20#include "modules/audio_coding/codecs/ilbc/constants.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000021
22/*----------------------------------------------------------------*
23 * check for stability of lsf coefficients
24 *---------------------------------------------------------------*/
25
26int WebRtcIlbcfix_LsfCheck(
pbos@webrtc.org0946a562013-04-09 00:28:06 +000027 int16_t *lsf, /* LSF parameters */
niklase@google.com470e71d2011-07-07 08:21:25 +000028 int dim, /* dimension of LSF */
29 int NoAn) /* No of analysis per frame */
30{
31 int k,n,m, Nit=2, change=0,pos;
pbos@webrtc.org0946a562013-04-09 00:28:06 +000032 const int16_t eps=319; /* 0.039 in Q13 (50 Hz)*/
33 const int16_t eps2=160; /* eps/2.0 in Q13;*/
34 const int16_t maxlsf=25723; /* 3.14; (4000 Hz)*/
35 const int16_t minlsf=82; /* 0.01; (0 Hz)*/
niklase@google.com470e71d2011-07-07 08:21:25 +000036
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}