194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/* 294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * Copyright (C) 2003 - 2016 Sony Corporation 394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * 494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * Licensed under the Apache License, Version 2.0 (the "License"); 594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * you may not use this file except in compliance with the License. 694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * You may obtain a copy of the License at 794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * 894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * http://www.apache.org/licenses/LICENSE-2.0 994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * 1094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * Unless required by applicable law or agreed to in writing, software 1194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * distributed under the License is distributed on an "AS IS" BASIS, 1294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * See the License for the specific language governing permissions and 1494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * limitations under the License. 1594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi */ 1694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 1794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi#include "ldac.h" 1894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 1994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 2094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Subfunction: Get Scale Factor Index 2194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 2294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi__inline static int get_scale_factor_id_ldac( 2394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiSCALAR val) 2494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 2594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int id; 2694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi IEEE754_FI fi; 2794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 2894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi fi.f = val; 2994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi id = ((fi.i & 0x7fffffff) >> 23) - 111; 3094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 3194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi if (id < 0) { 3294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi id = 0; 3394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 3494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi if (id > LDAC_NIDSF-1) { 3594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi id = LDAC_NIDSF-1; 3694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 3794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 3894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return id; 3994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 4094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 4194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 4294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Normalize Spectrum 4394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 4494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochistatic SCALAR sa_val_ldac[LDAC_MAXNSPS] = { 4594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi -0.75, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi}; 4794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 4894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiDECLFUNC void norm_spectrum_ldac( 4994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiAC *p_ac) 5094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 5194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int iqu, isp; 5294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int lsp, hsp; 5394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int nqus = p_ac->p_ab->nqus; 5494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int idsf; 5594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int *p_idsf = p_ac->a_idsf; 5694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR maxspec, tmp; 5794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR *p_spec = p_ac->p_acsub->a_spec; 5894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 5994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (iqu = 0; iqu < nqus; iqu++) { 6094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi lsp = ga_isp_ldac[iqu]; 6194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi hsp = ga_isp_ldac[iqu+1]; 6294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 6394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi maxspec = fabs(p_spec[lsp]); 6494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (isp = lsp+1; isp < hsp; isp++) { 6594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi tmp = fabs(p_spec[isp]); 6694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi if (maxspec < tmp) { 6794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi maxspec = tmp; 6894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 6994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 7094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi idsf = get_scale_factor_id_ldac(maxspec); 7194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 7294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi if (idsf > 0) { 7394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi tmp = ga_isf_ldac[idsf]; 7494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (isp = lsp; isp < hsp; isp++) { 7594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi p_spec[isp] *= tmp; 7694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 7794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 7894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi else { 7994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (isp = lsp; isp < hsp; isp++) { 8094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi p_spec[isp] = sa_val_ldac[isp-lsp]; 8194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 8294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 8394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 8494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi p_idsf[iqu] = idsf; 8594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 8694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 8794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return; 8894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 8994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 9094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 9194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Subfunction: Quantize Spectrum Core 9294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 9394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi__inline static void quant_spectrum_core_ldac( 9494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiAC *p_ac, 9594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochiint iqu) 9694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 9794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int i; 9894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int isp = ga_isp_ldac[iqu]; 9994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int nsps = ga_nsps_ldac[iqu]; 10094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int *p_qspec = p_ac->a_qspec+isp; 10194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR qf = ga_qf_ldac[p_ac->a_idwl1[iqu]]; 10294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp; 10394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 10494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi IEEE754_FI fi; 10594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi const float fc = (float)((1 << 23) + (1 << 22)); 10694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 10794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (i = 0; i < nsps; i++) { 10894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi fi.f = p_nspec[i] * qf + fc; 10994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi p_qspec[i] = (short)fi.i; 11094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 11194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 11294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return; 11394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 11494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 11594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 11694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Quantize Spectrum 11794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 11894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiDECLFUNC void quant_spectrum_ldac( 11994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiAC *p_ac) 12094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 12194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int iqu; 12294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int nqus = p_ac->p_ab->nqus; 12394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 12494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (iqu = 0; iqu < nqus; iqu++) { 12594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi quant_spectrum_core_ldac(p_ac, iqu); 12694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 12794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 12894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return; 12994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 13094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 13194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 13294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Subfunction: Quantize Residual Spectrum Core 13394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 13494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi__inline static void quant_residual_core_ldac( 13594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiAC *p_ac, 13694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochiint iqu) 13794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 13894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int i; 13994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int isp = ga_isp_ldac[iqu]; 14094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int nsps = ga_nsps_ldac[iqu]; 14194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int *p_qspec = p_ac->a_qspec+isp; 14294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int *p_rspec = p_ac->a_rspec+isp; 14394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR ldqspec; 14494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR iqf = ga_iqf_ldac[LDAC_MAXIDWL1]; 14594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR rqsf = ga_qf_ldac[p_ac->a_idwl2[iqu]] * ga_irsf_ldac[LDAC_MAXIDWL1] 14694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi * _scalar(0.996093750); 14794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp; 14894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 14994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi IEEE754_FI fi; 15094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi const float fc = (float)((1 << 23) + (1 << 22)); 15194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 15294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (i = 0; i < nsps; i++) { 15394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi ldqspec = p_qspec[i] * iqf; 15494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi fi.f = (p_nspec[i] - ldqspec) * rqsf + fc; 15594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi p_rspec[i] = (short)fi.i; 15694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 15794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 15894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return; 15994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 16094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 16194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi/*************************************************************************************************** 16294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi Quantize Residual Spectrum 16394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi***************************************************************************************************/ 16494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiDECLFUNC void quant_residual_ldac( 16594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato KenmochiAC *p_ac) 16694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi{ 16794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int iqu; 16894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int nqus = p_ac->p_ab->nqus; 16994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi int *p_idwl2 = p_ac->a_idwl2; 17094704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 17194704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi for (iqu = 0; iqu < nqus; iqu++) { 17294704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi if (p_idwl2[iqu] > 0) { 17394704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi quant_residual_core_ldac(p_ac, iqu); 17494704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 17594704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi } 17694704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 17794704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi return; 17894704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi} 17994704431a4da8fbf32cb7c2f964d7aeb140300b9Chisato Kenmochi 180