| /* | |
| * 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_Lsf2Poly.c | |
| ******************************************************************/ | |
| #include "modules/audio_coding/codecs/ilbc/lsf_to_poly.h" | |
| #include "modules/audio_coding/codecs/ilbc/constants.h" | |
| #include "modules/audio_coding/codecs/ilbc/defines.h" | |
| #include "modules/audio_coding/codecs/ilbc/get_lsp_poly.h" | |
| #include "modules/audio_coding/codecs/ilbc/lsf_to_lsp.h" | |
| void WebRtcIlbcfix_Lsf2Poly( | |
| int16_t *a, /* (o) predictor coefficients (order = 10) in Q12 */ | |
| int16_t *lsf /* (i) line spectral frequencies in Q13 */ | |
| ) { | |
| int32_t f[2][6]; /* f[0][] and f[1][] corresponds to | |
| F1(z) and F2(z) respectivly */ | |
| int32_t *f1ptr, *f2ptr; | |
| int16_t *a1ptr, *a2ptr; | |
| int32_t tmpW32; | |
| int16_t lsp[10]; | |
| int i; | |
| /* Convert lsf to lsp */ | |
| WebRtcIlbcfix_Lsf2Lsp(lsf, lsp, LPC_FILTERORDER); | |
| /* Get F1(z) and F2(z) from the lsp */ | |
| f1ptr=f[0]; | |
| f2ptr=f[1]; | |
| WebRtcIlbcfix_GetLspPoly(&lsp[0],f1ptr); | |
| WebRtcIlbcfix_GetLspPoly(&lsp[1],f2ptr); | |
| /* for i = 5 down to 1 | |
| Compute f1[i] += f1[i-1]; | |
| and f2[i] += f2[i-1]; | |
| */ | |
| f1ptr=&f[0][5]; | |
| f2ptr=&f[1][5]; | |
| for (i=5; i>0; i--) | |
| { | |
| (*f1ptr) += (*(f1ptr-1)); | |
| (*f2ptr) -= (*(f2ptr-1)); | |
| f1ptr--; | |
| f2ptr--; | |
| } | |
| /* Get the A(z) coefficients | |
| a[0] = 1.0 | |
| for i = 1 to 5 | |
| a[i] = (f1[i] + f2[i] + round)>>13; | |
| for i = 1 to 5 | |
| a[11-i] = (f1[i] - f2[i] + round)>>13; | |
| */ | |
| a[0]=4096; | |
| a1ptr=&a[1]; | |
| a2ptr=&a[10]; | |
| f1ptr=&f[0][1]; | |
| f2ptr=&f[1][1]; | |
| for (i=5; i>0; i--) | |
| { | |
| tmpW32 = (*f1ptr) + (*f2ptr); | |
| *a1ptr = (int16_t)((tmpW32 + 4096) >> 13); | |
| tmpW32 = (*f1ptr) - (*f2ptr); | |
| *a2ptr = (int16_t)((tmpW32 + 4096) >> 13); | |
| a1ptr++; | |
| a2ptr--; | |
| f1ptr++; | |
| f2ptr++; | |
| } | |
| return; | |
| } |