isp_isf.c revision 956c553ab0ce72f8074ad0fda2ffd66a0305700c
14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* 24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** Copyright 2003-2010, VisualOn, Inc. 34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** 44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** Licensed under the Apache License, Version 2.0 (the "License"); 54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** you may not use this file except in compliance with the License. 64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** You may obtain a copy of the License at 74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** 84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** http://www.apache.org/licenses/LICENSE-2.0 94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** 104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** Unless required by applicable law or agreed to in writing, software 114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** distributed under the License is distributed on an "AS IS" BASIS, 124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** See the License for the specific language governing permissions and 144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ** limitations under the License. 154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */ 164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*********************************************************************** 184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* File: isp_isf.c * 194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* * 204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* Description: * 214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* Isp_isf Transformation isp to isf * 224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* Isf_isp Transformation isf to isp * 234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* * 244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* The transformation from isp[i] to isf[i] and isf[i] to isp[i] * 254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* are approximated by a look-up table and interpolation * 264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber* * 274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber************************************************************************/ 284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h" 304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "basic_op.h" 314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "isp_isf.tab" /* Look-up table for transformations */ 324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Isp_isf( 344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ 354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ 364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 m /* (i) : LPC order */ 374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ) 384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word32 i, ind; 404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word32 L_tmp; 414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ind = 127; /* beging at end of table -1 */ 424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = (m - 1); i >= 0; i--) 434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber if (i >= (m - 2)) 454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { /* m-2 is a constant */ 464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ind = 127; /* beging at end of table -1 */ 474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* find value in table that is just greater than isp[i] */ 494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber while (table[ind] < isp[i]) 504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ind--; 514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */ 524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]); 534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */ 544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isf[i] = add1(isf[i], (ind << 7)); 554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isf[m - 1] = (isf[m - 1] >> 1); 574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return; 584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Isf_isp( 6260d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ 63eb16561336e6445f7edae047998f2459e046cdfeMark Salyzyn Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ 64715dcb9c90d86c1a02a0da056f3cee8875ad1230Wei Jia Word16 m /* (i) : LPC order */ 654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ) 664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{ 674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word16 offset; 684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Word32 i, ind, L_tmp; 694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < m - 1; i++) 714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isp[i] = isf[i]; 734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isp[m - 1] = (isf[m - 1] << 1); 754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber for (i = 0; i < m; i++) 774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber { 784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */ 794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */ 804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */ 824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset); 834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber isp[i] = add1(table[ind], (Word16)((L_tmp >> 8))); 844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber } 854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber return; 874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber} 884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber 924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber