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_Lsp2Lsf.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 * conversion from LSP coefficients to LSF coefficients 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *---------------------------------------------------------------*/ 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcIlbcfix_Lsp2Lsf( 27fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *lsp, /* (i) lsp vector -1...+1 in Q15 */ 28fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *lsf, /* (o) Lsf vector 0...Pi in Q13 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ordered, so that lsf[i]<lsf[i+1]) */ 30fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t m /* (i) Number of coefficients */ 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ) 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 33fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t i, k; 34fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t diff; /* diff between table value and desired value (Q15) */ 35fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t freq; /* lsf/(2*pi) (Q16) */ 36fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *lspPtr, *lsfPtr, *cosTblPtr; 37fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t tmp; 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* set the index to maximum index value in WebRtcIlbcfix_kCos */ 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org k = 63; 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Start with the highest LSP and then work the way down 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org For each LSP the lsf is calculated by first order approximation 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org of the acos(x) function 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lspPtr = &lsp[9]; 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lsfPtr = &lsf[9]; 49fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org cosTblPtr=(int16_t*)&WebRtcIlbcfix_kCos[k]; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for(i=m-1; i>=0; i--) 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org locate value in the table, which is just above lsp[i], 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org basically an approximation to acos(x) 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 56fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org while( (((int32_t)(*cosTblPtr)-(*lspPtr)) < 0)&&(k>0) ) 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org k-=1; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cosTblPtr--; 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Calculate diff, which is used in the linear approximation of acos(x) */ 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org diff = (*lspPtr)-(*cosTblPtr); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org The linear approximation of acos(lsp[i]) : 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org acos(lsp[i])= k*512 + (WebRtcIlbcfix_kAcosDerivative[ind]*offset >> 11) 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* tmp (linear offset) in Q16 */ 71fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(WebRtcIlbcfix_kAcosDerivative[k],diff, 11); 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* freq in Q16 */ 74fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org freq = (int16_t)WEBRTC_SPL_LSHIFT_W16(k,9)+tmp; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* lsf = freq*2*pi */ 77fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (*lsfPtr) = (int16_t)(((int32_t)freq*25736)>>15); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lsfPtr--; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lspPtr--; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 85