Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2003 - 2016 Sony Corporation
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "ldac.h"
     18 
     19 /***************************************************************************************************
     20     Subfunction: Get Scale Factor Index
     21 ***************************************************************************************************/
     22 __inline static int get_scale_factor_id_ldac(
     23 SCALAR val)
     24 {
     25     int id;
     26     IEEE754_FI fi;
     27 
     28     fi.f = val;
     29     id = ((fi.i & 0x7fffffff) >> 23) - 111;
     30 
     31     if (id < 0) {
     32         id = 0;
     33     }
     34     if (id > LDAC_NIDSF-1) {
     35         id = LDAC_NIDSF-1;
     36     }
     37 
     38     return id;
     39 }
     40 
     41 /***************************************************************************************************
     42     Normalize Spectrum
     43 ***************************************************************************************************/
     44 static SCALAR sa_val_ldac[LDAC_MAXNSPS] = {
     45     -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,
     46 };
     47 
     48 DECLFUNC void norm_spectrum_ldac(
     49 AC *p_ac)
     50 {
     51     int iqu, isp;
     52     int lsp, hsp;
     53     int nqus = p_ac->p_ab->nqus;
     54     int idsf;
     55     int *p_idsf = p_ac->a_idsf;
     56     SCALAR maxspec, tmp;
     57     SCALAR *p_spec = p_ac->p_acsub->a_spec;
     58 
     59     for (iqu = 0; iqu < nqus; iqu++) {
     60         lsp = ga_isp_ldac[iqu];
     61         hsp = ga_isp_ldac[iqu+1];
     62 
     63         maxspec = fabs(p_spec[lsp]);
     64         for (isp = lsp+1; isp < hsp; isp++) {
     65             tmp = fabs(p_spec[isp]);
     66             if (maxspec < tmp) {
     67                 maxspec = tmp;
     68             }
     69         }
     70         idsf = get_scale_factor_id_ldac(maxspec);
     71 
     72         if (idsf > 0) {
     73             tmp = ga_isf_ldac[idsf];
     74             for (isp = lsp; isp < hsp; isp++) {
     75                 p_spec[isp] *= tmp;
     76             }
     77         }
     78         else {
     79             for (isp = lsp; isp < hsp; isp++) {
     80                 p_spec[isp] = sa_val_ldac[isp-lsp];
     81             }
     82         }
     83 
     84         p_idsf[iqu] = idsf;
     85     }
     86 
     87     return;
     88 }
     89 
     90 /***************************************************************************************************
     91     Subfunction: Quantize Spectrum Core
     92 ***************************************************************************************************/
     93 __inline static void quant_spectrum_core_ldac(
     94 AC *p_ac,
     95 int iqu)
     96 {
     97     int i;
     98     int isp = ga_isp_ldac[iqu];
     99     int nsps = ga_nsps_ldac[iqu];
    100     int *p_qspec = p_ac->a_qspec+isp;
    101     SCALAR qf = ga_qf_ldac[p_ac->a_idwl1[iqu]];
    102     SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp;
    103 
    104     IEEE754_FI fi;
    105     const float fc = (float)((1 << 23) + (1 << 22));
    106 
    107     for (i = 0; i < nsps; i++) {
    108         fi.f = p_nspec[i] * qf + fc;
    109         p_qspec[i] = (short)fi.i;
    110     }
    111 
    112     return;
    113 }
    114 
    115 /***************************************************************************************************
    116     Quantize Spectrum
    117 ***************************************************************************************************/
    118 DECLFUNC void quant_spectrum_ldac(
    119 AC *p_ac)
    120 {
    121     int iqu;
    122     int nqus = p_ac->p_ab->nqus;
    123 
    124     for (iqu = 0; iqu < nqus; iqu++) {
    125         quant_spectrum_core_ldac(p_ac, iqu);
    126     }
    127 
    128     return;
    129 }
    130 
    131 /***************************************************************************************************
    132     Subfunction: Quantize Residual Spectrum Core
    133 ***************************************************************************************************/
    134 __inline static void quant_residual_core_ldac(
    135 AC *p_ac,
    136 int iqu)
    137 {
    138     int i;
    139     int isp = ga_isp_ldac[iqu];
    140     int nsps = ga_nsps_ldac[iqu];
    141     int *p_qspec = p_ac->a_qspec+isp;
    142     int *p_rspec = p_ac->a_rspec+isp;
    143     SCALAR ldqspec;
    144     SCALAR iqf = ga_iqf_ldac[LDAC_MAXIDWL1];
    145     SCALAR rqsf = ga_qf_ldac[p_ac->a_idwl2[iqu]] * ga_irsf_ldac[LDAC_MAXIDWL1]
    146             * _scalar(0.996093750);
    147     SCALAR *p_nspec = p_ac->p_acsub->a_spec+isp;
    148 
    149     IEEE754_FI fi;
    150     const float fc = (float)((1 << 23) + (1 << 22));
    151 
    152     for (i = 0; i < nsps; i++) {
    153         ldqspec = p_qspec[i] * iqf;
    154         fi.f = (p_nspec[i] - ldqspec) * rqsf + fc;
    155         p_rspec[i] = (short)fi.i;
    156     }
    157 
    158     return;
    159 }
    160 
    161 /***************************************************************************************************
    162     Quantize Residual Spectrum
    163 ***************************************************************************************************/
    164 DECLFUNC void quant_residual_ldac(
    165 AC *p_ac)
    166 {
    167     int iqu;
    168     int nqus = p_ac->p_ab->nqus;
    169     int *p_idwl2 = p_ac->a_idwl2;
    170 
    171     for (iqu = 0; iqu < nqus; iqu++) {
    172         if (p_idwl2[iqu] > 0) {
    173             quant_residual_core_ldac(p_ac, iqu);
    174         }
    175     }
    176 
    177     return;
    178 }
    179 
    180