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