| /* |
| * Copyright (C) 2003 - 2016 Sony Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "ldac.h" |
| |
| /*************************************************************************************************** |
| Subfunction: Get Scale Factor Index |
| ***************************************************************************************************/ |
| __inline static int get_scale_factor_id_ldac( |
| SCALAR val) |
| { |
| int id; |
| IEEE754_FI fi; |
| |
| fi.f = val; |
| id = ((fi.i & 0x7fffffff) >> 23) - 111; |
| |
| if (id < 0) { |
| id = 0; |
| } |
| if (id > LDAC_NIDSF-1) { |
| id = LDAC_NIDSF-1; |
| } |
| |
| return id; |
| } |
| |
| /*************************************************************************************************** |
| Normalize Spectrum |
| ***************************************************************************************************/ |
| static SCALAR sa_val_ldac[LDAC_MAXNSPS] = { |
| -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, |
| }; |
| |
| DECLFUNC void norm_spectrum_ldac( |
| AC *p_ac) |
| { |
| int iqu, isp; |
| int lsp, hsp; |
| int nqus = p_ac->p_ab->nqus; |
| int idsf; |
| int *p_idsf = p_ac->a_idsf; |
| SCALAR maxspec, tmp; |
| SCALAR *p_spec = p_ac->p_acsub->a_spec; |
| |
| for (iqu = 0; iqu < nqus; iqu++) { |
| lsp = ga_isp_ldac[iqu]; |
| hsp = ga_isp_ldac[iqu+1]; |
| |
| maxspec = fabs(p_spec[lsp]); |
| for (isp = lsp+1; isp < hsp; isp++) { |
| tmp = fabs(p_spec[isp]); |
| if (maxspec < tmp) { |
| maxspec = tmp; |
| } |
| } |
| idsf = get_scale_factor_id_ldac(maxspec); |
| |
| if (idsf > 0) { |
| tmp = ga_isf_ldac[idsf]; |
| for (isp = lsp; isp < hsp; isp++) { |
| p_spec[isp] *= tmp; |
| } |
| } |
| else { |
| for (isp = lsp; isp < hsp; isp++) { |
| p_spec[isp] = sa_val_ldac[isp-lsp]; |
| } |
| } |
| |
| p_idsf[iqu] = idsf; |
| } |
| |
| return; |
| } |
| |
| /*************************************************************************************************** |
| Subfunction: Quantize Spectrum Core |
| ***************************************************************************************************/ |
| __inline static void quant_spectrum_core_ldac( |
| AC *p_ac, |
| int iqu) |
| { |
| int i; |
| int isp = ga_isp_ldac[iqu]; |
| int nsps = ga_nsps_ldac[iqu]; |
| int *p_qspec = p_ac->a_qspec+isp; |
| SCALAR qf = ga_qf_ldac[p_ac->a_idwl1[iqu]]; |
| SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp; |
| |
| IEEE754_FI fi; |
| const float fc = (float)((1 << 23) + (1 << 22)); |
| |
| for (i = 0; i < nsps; i++) { |
| fi.f = p_nspec[i] * qf + fc; |
| p_qspec[i] = (short)fi.i; |
| } |
| |
| return; |
| } |
| |
| /*************************************************************************************************** |
| Quantize Spectrum |
| ***************************************************************************************************/ |
| DECLFUNC void quant_spectrum_ldac( |
| AC *p_ac) |
| { |
| int iqu; |
| int nqus = p_ac->p_ab->nqus; |
| |
| for (iqu = 0; iqu < nqus; iqu++) { |
| quant_spectrum_core_ldac(p_ac, iqu); |
| } |
| |
| return; |
| } |
| |
| /*************************************************************************************************** |
| Subfunction: Quantize Residual Spectrum Core |
| ***************************************************************************************************/ |
| __inline static void quant_residual_core_ldac( |
| AC *p_ac, |
| int iqu) |
| { |
| int i; |
| int isp = ga_isp_ldac[iqu]; |
| int nsps = ga_nsps_ldac[iqu]; |
| int *p_qspec = p_ac->a_qspec+isp; |
| int *p_rspec = p_ac->a_rspec+isp; |
| SCALAR ldqspec; |
| SCALAR iqf = ga_iqf_ldac[LDAC_MAXIDWL1]; |
| SCALAR rqsf = ga_qf_ldac[p_ac->a_idwl2[iqu]] * ga_irsf_ldac[LDAC_MAXIDWL1] |
| * _scalar(0.996093750); |
| SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp; |
| |
| IEEE754_FI fi; |
| const float fc = (float)((1 << 23) + (1 << 22)); |
| |
| for (i = 0; i < nsps; i++) { |
| ldqspec = p_qspec[i] * iqf; |
| fi.f = (p_nspec[i] - ldqspec) * rqsf + fc; |
| p_rspec[i] = (short)fi.i; |
| } |
| |
| return; |
| } |
| |
| /*************************************************************************************************** |
| Quantize Residual Spectrum |
| ***************************************************************************************************/ |
| DECLFUNC void quant_residual_ldac( |
| AC *p_ac) |
| { |
| int iqu; |
| int nqus = p_ac->p_ab->nqus; |
| int *p_idwl2 = p_ac->a_idwl2; |
| |
| for (iqu = 0; iqu < nqus; iqu++) { |
| if (p_idwl2[iqu] > 0) { |
| quant_residual_core_ldac(p_ac, iqu); |
| } |
| } |
| |
| return; |
| } |
| |