1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/* 2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Use of this source code is governed by a BSD-style license 5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * that can be found in the LICENSE file in the root of the source 6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * tree. An additional intellectual property rights grant can be found 7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * in the file PATENTS. All contributing project authors may 8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * be found in the AUTHORS file in the root of the source tree. 9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */ 10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************** 12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com iLBC Speech Coder ANSI-C Source Code 14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtcIlbcfix_GetLspPoly.c 16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com******************************************************************/ 18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "defines.h" 20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*----------------------------------------------------------------* 22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Construct the polynomials F1(z) and F2(z) from the LSP 23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * (Computations are done in Q24) 24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * The expansion is performed using the following recursion: 26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * 27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[0] = 1; 28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * tmp = -2.0 * lsp[0]; 29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[1] = tmp; 30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * for (i=2; i<=5; i++) { 31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * b = -2.0 * lsp[2*i-2]; 32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[i] = tmp*f[i-1] + 2.0*f[i-2]; 33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * for (j=i; j>=2; j--) { 34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[j] = f[j] + tmp*f[j-1] + f[j-2]; 35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * } 36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[i] = f[i] + tmp; 37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * } 38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *---------------------------------------------------------------*/ 39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid WebRtcIlbcfix_GetLspPoly( 410946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int16_t *lsp, /* (i) LSP in Q15 */ 420946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int32_t *f) /* (o) polonymial in Q24 */ 43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{ 440946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int32_t tmpW32; 45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com int i, j; 460946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int16_t high, low; 470946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int16_t *lspPtr; 480946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org int32_t *fPtr; 49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com lspPtr = lsp; 51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com fPtr = f; 52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com /* f[0] = 1.0 (Q24) */ 530946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org (*fPtr) = (int32_t)16777216; 54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com fPtr++; 55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com (*fPtr) = WEBRTC_SPL_MUL((*lspPtr), -1024); 57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com fPtr++; 58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com lspPtr+=2; 59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com for(i=2; i<=5; i++) 61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com { 62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com (*fPtr) = fPtr[-2]; 63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com for(j=i; j>1; j--) 65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com { 66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com /* Compute f[j] = f[j] + tmp*f[j-1] + f[j-2]; */ 6778ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org high = (int16_t)(fPtr[-1] >> 16); 6878ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org low = (int16_t)((fPtr[-1] - ((int32_t)high << 16)) >> 1); 69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 704ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org tmpW32 = ((high * *lspPtr) << 2) + (((low * *lspPtr) >> 15) << 2); 71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com (*fPtr) += fPtr[-2]; 73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com (*fPtr) -= tmpW32; 74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com fPtr--; 75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com } 764ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org *fPtr -= *lspPtr << 10; 77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com 78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com fPtr+=i; 79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com lspPtr+=2; 80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com } 81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com return; 82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com} 83