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