| /* | |
| * 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; | |
| } | |