/*
 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
 *
 * 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.
 */
/**
 * @file picosig2.c
 *
 * Signal Generation PU - Internal functions - Implementation
 *
 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
 * All rights reserved.
 *
 * History:
 * - 2009-04-20 -- initial version
 *
 */
#include "picoos.h"
#include "picodsp.h"
#include "picosig2.h"
#include "picofftsg.h"

#ifdef __cplusplus
extern "C" {
#endif
#if 0
}
#endif
/*---------------------------------------------------------------------------
 * INTERNAL FUNCTIONS DECLARATION
 *---------------------------------------------------------------------------*/
static void gen_hann2(sig_innerobj_t *sig_inObj);
static void get_simple_excitation(sig_innerobj_t *sig_inObj,
        picoos_int16 *nextPeak);
static void enh_wind_init(sig_innerobj_t *sig_inObj);
static void init_rand(sig_innerobj_t *sig_inObj);
static void get_trig(picoos_int32 ang, picoos_int32 *table, picoos_int32 *cs,
        picoos_int32 *sn);

/*---------------------------------------------------------------------------
 * PICO SYSTEM FUNCTIONS
 *---------------------------------------------------------------------------*/
/**
 * allocation of DSP memory for SIG PU
 * @param   mm : memory manager
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  PICO_OK : allocation successful
 * @return  PICO_ERR_OTHER : allocation NOT successful
 * @callgraph
 * @callergraph
 */
pico_status_t sigAllocate(picoos_MemoryManager mm, sig_innerobj_t *sig_inObj)
{
    picoos_int16 *data_i;
    picoos_int32 *d32;
    picoos_int32 nCount;

    sig_inObj->int_vec22 =
    sig_inObj->int_vec23 =
    sig_inObj->int_vec24 =
    sig_inObj->int_vec25 =
    sig_inObj->int_vec26 =
    sig_inObj->int_vec28 =
    sig_inObj->int_vec29 =
    sig_inObj->int_vec30 =
    sig_inObj->int_vec31 =
    sig_inObj->int_vec32 =
    sig_inObj->int_vec33 =
    sig_inObj->int_vec34 =
    sig_inObj->int_vec35 =
    sig_inObj->int_vec36 =
    sig_inObj->int_vec37 =
    sig_inObj->int_vec39 =
    sig_inObj->int_vec40 = NULL;

    sig_inObj->sig_vec1 = NULL;

    sig_inObj->idx_vect1 = sig_inObj->idx_vect2 = sig_inObj->idx_vect4 = NULL;
    sig_inObj->idx_vect5 = sig_inObj->idx_vect6 = sig_inObj->idx_vect7 =
    sig_inObj->idx_vect8 = sig_inObj->idx_vect9 = NULL;
    sig_inObj->ivalue17 = sig_inObj->ivalue18 = 0;

    /*-----------------------------------------------------------------
     * Memory allocations
     * NOTE : it would be far better to do a single allocation
     *          and to do pointer initialization inside this routine
     * ------------------------------------------------------------------*/
    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_FFTSIZE);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect1 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_HFFTSIZE_P1);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect2 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_FFTSIZE);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect4 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_FFTSIZE);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect5 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_FFTSIZE);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect6 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_HFFTSIZE_P1);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect7 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_MAX_EX);
    if (NULL == data_i) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect8 = data_i;

    data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16)
            * PICODSP_MAX_EX);
    if (data_i == NULL) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->idx_vect9 = data_i;

    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec22 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec23 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec24 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec25 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE * 2);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec26 = d32;

    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec28 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec29 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec38 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec30 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec31 = d32;

    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec32 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec33 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_N_RAND_TABLE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec34 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_N_RAND_TABLE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec35 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_N_RAND_TABLE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec36 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_N_RAND_TABLE);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec37 = d32;

    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_HFFTSIZE_P1);
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec39 = d32;
    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (1
            + PICODSP_COS_TABLE_LEN));
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->int_vec40 = d32;

    for (nCount = 0; nCount < CEPST_BUFF_SIZE; nCount++) {
        d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (PICODSP_CEPORDER));
        if (NULL == d32) {
            sigDeallocate(mm, sig_inObj);
            return PICO_ERR_OTHER;
        }
        sig_inObj->int_vec41[nCount] = d32;
    }

    for (nCount = 0; nCount < PHASE_BUFF_SIZE; nCount++) {
        d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (PICODSP_PHASEORDER));
        if (NULL == d32) {
            sigDeallocate(mm, sig_inObj);
            return PICO_ERR_OTHER;
        }
        sig_inObj->int_vec42[nCount] = d32;
    }

    d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32)
            * PICODSP_FFTSIZE * 2); /* - fixed point */
    if (NULL == d32) {
        sigDeallocate(mm, sig_inObj);
        return PICO_ERR_OTHER;
    }
    sig_inObj->sig_vec1 = d32;

    return PICO_OK;
}/*sigAllocate*/

/**
 * frees DSP memory for SIG PU
 * @param   mm : memory manager
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @callgraph
 * @callergraph
 */
void sigDeallocate(picoos_MemoryManager mm, sig_innerobj_t *sig_inObj)
{
    picoos_int32 nCount;
    /*-----------------------------------------------------------------
     * Memory de-allocations
     * ------------------------------------------------------------------*/
    if (NULL != sig_inObj->idx_vect1)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect1));
    if (NULL != sig_inObj->idx_vect2)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect2));
    if (NULL != sig_inObj->idx_vect4)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect4));
    if (NULL != sig_inObj->idx_vect5)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect5));
    if (NULL != sig_inObj->idx_vect6)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect6));
    if (NULL != sig_inObj->idx_vect7)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect7));
    if (NULL != sig_inObj->idx_vect8)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect8));
    if (NULL != sig_inObj->idx_vect9)
        picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect9));

    if (NULL != sig_inObj->int_vec22)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec22));
    if (NULL != sig_inObj->int_vec23)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec23));
    if (NULL != sig_inObj->int_vec24)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec24));
    if (NULL != sig_inObj->int_vec25)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec25));
    if (NULL != sig_inObj->int_vec26)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec26));
    if (NULL != sig_inObj->int_vec28)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec28));
    if (NULL != sig_inObj->int_vec29)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec29));
    if (NULL != sig_inObj->int_vec38)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec38));
    if (NULL != sig_inObj->int_vec30)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec30));
    if (NULL != sig_inObj->int_vec31)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec31));
    if (NULL != sig_inObj->int_vec32)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec32));
    if (NULL != sig_inObj->int_vec33)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec33));
    if (NULL != sig_inObj->int_vec34)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec34));
    if (NULL != sig_inObj->int_vec35)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec35));
    if (NULL != sig_inObj->int_vec36)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec36));
    if (NULL != sig_inObj->int_vec37)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec37));
    if (NULL != sig_inObj->int_vec39)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec39));
    if (NULL != sig_inObj->int_vec40)
        picoos_deallocate(mm, (void *) &(sig_inObj->int_vec40));

    for (nCount = 0; nCount < CEPST_BUFF_SIZE; nCount++) {
        if (NULL != sig_inObj->int_vec41[nCount]) {
            picoos_deallocate(mm, (void *) &(sig_inObj->int_vec41[nCount]));
        }
    }

    for (nCount = 0; nCount < PHASE_BUFF_SIZE; nCount++) {
        if (NULL != sig_inObj->int_vec42[nCount]) {
            picoos_deallocate(mm, (void *) &(sig_inObj->int_vec42[nCount]));
        }
    }

    if (NULL != sig_inObj->sig_vec1) {
        picoos_deallocate(mm, (void *) &(sig_inObj->sig_vec1));
    }
}/*sigDeAllocate*/

/**
 * initializes all memory neededed by DSP at instance creation time
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @callgraph
 * @callergraph
 */
void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 resetMode)
{
    picoos_int32 i, j;
    picoos_int32 *pnt;

    if (resetMode == PICO_RESET_SOFT) {
        /*minimal initialization when receiving a soft reset */
        return;
    }
    /*-----------------------------------------------------------------
     * Initialization
     * ------------------------------------------------------------------*/
    sig_inObj->warp_p = PICODSP_FREQ_WARP_FACT;
    sig_inObj->VCutoff_p = PICODSP_V_CUTOFF_FREQ; /*voicing cut off frequency in Hz (will be modeled in the future)*/
    sig_inObj->UVCutoff_p = PICODSP_UV_CUTOFF_FREQ;/*unvoiced frames only (periodize lowest components to mask bad voicing transitions)*/
    sig_inObj->Fs_p = PICODSP_SAMP_FREQ; /*Sampling freq*/

    sig_inObj->m1_p = PICODSP_CEPORDER;
    sig_inObj->m2_p = PICODSP_FFTSIZE; /*also initializes windowLen*/
    sig_inObj->framesz_p = PICODSP_DISPLACE; /*1/4th of the frame size = displacement*/
    sig_inObj->hfftsize_p = PICODSP_H_FFTSIZE; /*half of the FFT size*/
    sig_inObj->voxbnd_p = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
            / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
            * (picoos_single) sig_inObj->VCutoff_p);
    sig_inObj->voxbnd2_p
            = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
                    / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
                    * (picoos_single) sig_inObj->UVCutoff_p);
    sig_inObj->hop_p = sig_inObj->framesz_p;
    sig_inObj->nextPeak_p = (((int) (PICODSP_FFTSIZE))
            / ((int) PICODSP_DISPLACE) - 1) * sig_inObj->hop_p;
    sig_inObj->phId_p = 0; /*phonetic id*/
    sig_inObj->E_p = (picoos_single) 0.0f;
    sig_inObj->F0_p = (picoos_single) 0.0f;
    sig_inObj->voiced_p = 0;
    sig_inObj->nV = sig_inObj->nU = 0;
    sig_inObj->sMod_p = (picoos_single) 1.0f;

    /*cleanup vectors*/
    for (i = 0; i < 2 * PICODSP_FFTSIZE; i++) {
        sig_inObj->sig_vec1[i] = 0;
        sig_inObj->int_vec26[i] = 0; /*wav buff cleanup */
    }

    for (i = 0; i < PICODSP_FFTSIZE; i++) {
        sig_inObj->idx_vect1[i] = sig_inObj->idx_vect4[i]
                = sig_inObj->idx_vect5[i] = sig_inObj->idx_vect6[i] = 0;
        sig_inObj->int_vec32[i] = sig_inObj->int_vec33[i] = 0;
    }

    for (i = 0; i < PICODSP_HFFTSIZE_P1; i++) {
        sig_inObj->idx_vect2[i] = (picoos_int16) 0;
    }

    for (i = 0; i < CEPST_BUFF_SIZE; i++) {
        sig_inObj->F0Buff[i]=0;
        sig_inObj->PhIdBuff[i]=0;
        sig_inObj->VoicingBuff[i]=0;
        sig_inObj->FuVBuff[i]=0;
        if (NULL != sig_inObj->CepBuff[i]) {
            pnt = sig_inObj->CepBuff[i];
            for (j = 0; j < PICODSP_CEPORDER; j++) {
                pnt[j] = 0;
            }
        }
    }

    for (i = 0; i < PHASE_BUFF_SIZE; i++) {
        if (NULL != sig_inObj->int_vec42[i]) {
            pnt = sig_inObj->int_vec42[i];
            for (j = 0; j < PICODSP_PHASEORDER; j++) {
                pnt[j] = 0;
            }
        }
    }
    sig_inObj->n_available=0;
    /*---------------------------------------------
     Init    formant enhancement window
     hanning window,
     Post Filter Hermite's interpolator Matrix
     Mel-2-Lin lookup tables
     ---------------------------------------------*/
    enh_wind_init(sig_inObj); /*creates the formant enhancement window*/
    init_rand(sig_inObj);
    gen_hann2(sig_inObj);
    mel_2_lin_init(sig_inObj);

}/*sigDspInitialize*/

/*-------------------------------------------------------------------------------
 PROCESSING FUNCTIONS : CALLED WITHIN sigStep (cfr. picosig.c)
 --------------------------------------------------------------------------------*/
/**
 * convert from mel scale to linear scale
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @param   scmeanMGC : mean value of the MGC
 * @return  void
 * @callgraph
 * @callergraph
 * @remarks translated from matlab code to c-code
 * Input
 * - c1 : input mfcc vector (ceporder=m1, real)
 * - m1 : input order
 * - A,B,D : lookup tables
 * - m2 : output order
 * - Xr,Xi (m2=FFT size, real) temporary arrays for FFT
 * - WNr,WNi (m2=FFT size, real) cos and sin precalculated tables
 * Output
 * - Xr (m2=FFT size, real) linear cepstral vector
 */
void mel_2_lin_lookup(sig_innerobj_t *sig_inObj, picoos_uint32 scmeanMGC)
{
    /*Local vars*/
    picoos_int16 nI, k;
    picoos_int32 delta, term1, term2;

    /*Local vars to be linked with sig data object*/
    picoos_int32 *c1, *XXr;
    picoos_single K1;
    picoos_int32 *D, K2, shift;
    picoos_int16 m1, *A, m2, m4, voiced, i;

    /*Link local variables with sig data object*/
    c1 = sig_inObj->wcep_pI;
    m1 = sig_inObj->m1_p;
    m2 = PICODSP_FFTSIZE;
    m4 = m2 >> 1;

    A = sig_inObj->A_p;
    D = sig_inObj->d_p;

    XXr = sig_inObj->wcep_pI;
    voiced = sig_inObj->voiced_p;

    shift = 27 - scmeanMGC;
    K2 = 1 << shift;
    K1 = (picoos_single) PICODSP_START_FLOAT_NORM * K2;
    XXr[0] = (picoos_int32) ((picoos_single) c1[0] * K1);
    for (nI = 1; nI < m1; nI++) {
        XXr[nI] = c1[nI] << shift;
    }
    i = sizeof(picoos_int32) * (PICODSP_FFTSIZE + 1 - m1);
    picoos_mem_set(XXr + m1, 0, i);
    dfct_nmf(m4, XXr); /* DFCT directly in fixed point */

    /* *****************************************************************************************
     Linear frequency scale envelope through interpolation.
     Two additions and one multiplication per entry.

     Optimization of linear interpolation algorithm
     - Start from 1 and stop at PICODSP_H_FFTSIZE-1 because 0 and PICODSP_H_FFTSIZE are invariant points
     - B[k]=A[k]+1 except for 0 and PICODSP_H_FFTSIZE
     - get rid of extra -1 operation by adapting the table A[]

     *******************************************************************************************/
    for (nI = 1; nI < PICODSP_H_FFTSIZE; nI++) {
        k = A[nI];
        term2 = XXr[k];
        term1 = XXr[k + 1];
        delta = term1 - term2;
        XXr[nI] = term2 + ((D[nI] * delta) >> 5); /* ok because nI<=A[nI] <=B[nI] */
    }
}/*mel_2_lin_lookup*/

/**
 * calculate phase
 * @remarks voiced phase taken from phase codebook and smoothed,
 * @remarks unvoiced phase - random
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @callgraph
 * @callergraph
 */
void phase_spec2(sig_innerobj_t *sig_inObj)
{
    picoos_int16 nI, iRand, firstUV;
    picoos_int32 *tmp1, *tmp2;
    picoos_int16 VOXBND_M1;
    picoos_int32 *spect, *ang;
    picoos_int16 voiced, m2;
    picoos_int32 *co, *so, *c, *s, voxbnd, voxbnd2;
    picoos_int16 i,j, k, n_comp;
    picoos_int16 *Pvoxbnd;
    picoos_int32 *phs_p2, *phs_p1, *phs_n1, *phs_n2;
    picoos_int32 *phs;

    /*Link local variables to sig data object*/
    spect = sig_inObj->wcep_pI; /* spect_p;*/
    /* current spect scale : times PICODSP_FIX_SCALE1 */
    ang = sig_inObj->ang_p;
    voxbnd = (picoos_int32) (sig_inObj->voxbnd_p * sig_inObj->voicing);
    voxbnd2 = sig_inObj->voxbnd2_p;
    voiced = sig_inObj->voiced_p;
    m2 = sig_inObj->m2_p;
    VOXBND_M1 = voxbnd - 1;
    firstUV = 1;

    /*code starts here*/
    if (voiced == 1) {
        firstUV = voxbnd;
        Pvoxbnd =  sig_inObj->VoxBndBuff;
        n_comp   = Pvoxbnd[2];
        phs_p2 = sig_inObj->PhsBuff[0];
        phs_p1 = sig_inObj->PhsBuff[1];
        phs    = sig_inObj->PhsBuff[2];
        phs_n1 = sig_inObj->PhsBuff[3];
        phs_n2 = sig_inObj->PhsBuff[4];

        /* find and smooth components which have full context */
        j = n_comp;
        for (i=0; i<5; i++) {
            if (Pvoxbnd[i]<j) j = Pvoxbnd[i];
        }
        for (i=0; i<j; i++) {
            ang[i] = -(((phs_p2[i]+phs_p1[i]+phs[i]+phs_n1[i]+phs_n2[i])<<6) / 5);
        }

        /* find and smooth components which at least one component on each side */
        k = n_comp;
        if (Pvoxbnd[2]<k) k = Pvoxbnd[2];
        if (Pvoxbnd[4]<k) k = Pvoxbnd[4];
        for (i=j; i<k; i++) {  /* smooth using only two surrounding neighbours */
                ang[i] = -(((phs_p1[i]+phs[i]+phs_n1[i])<<6) / 3);
        }

        /* handle rest of components - at least one side does not exist */
        for (i=k; i<n_comp; i++) {
            ang[i] = -(phs[i]<<6); /* - simple copy without smoothing */
        }

        /*Phase unwrap - cumsum */
        tmp1 = &(ang[1]);
        tmp2 = &(ang[0]);
        /* current ang scale : PICODSP_M_PI = PICODSP_FIX_SCALE2 */
        FAST_DEVICE(VOXBND_M1,*(tmp1++)+=*(tmp2)-PICODSP_FIX_SCALE2;*(tmp2)=(*tmp2>=0)?(*tmp2)>>PICODSP_SHIFT_FACT4:-((-(*tmp2))>>PICODSP_SHIFT_FACT4);tmp2++);
        *tmp2 = (*tmp2 >= 0) ? (*tmp2) >> PICODSP_SHIFT_FACT4 : -((-(*tmp2))
                >> PICODSP_SHIFT_FACT4); /*ang[voxbnd-1]/=2;*/
    }

    /* now for the unvoiced part */
    iRand = sig_inObj->iRand;
    c = sig_inObj->randCosTbl + iRand;
    s = sig_inObj->randSinTbl + iRand;
    co = sig_inObj->outCosTbl + firstUV;
    so = sig_inObj->outSinTbl + firstUV;
    for (nI = firstUV; nI < PICODSP_HFFTSIZE_P1 - 1; nI++) {
        *co++ = *c++;
        *so++ = *s++;
    }
    *co = 1;
    *so = 0;
    sig_inObj->iRand += (PICODSP_HFFTSIZE_P1 - firstUV);
    if (sig_inObj->iRand > PICODSP_N_RAND_TABLE - PICODSP_HFFTSIZE_P1)
        sig_inObj->iRand = 1 + sig_inObj->iRand + PICODSP_HFFTSIZE_P1
            - PICODSP_N_RAND_TABLE;
}/*phase_spec2*/

/**
 * Prepare Envelope spectrum for inverse FFT
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @remarks make phase bilateral -->> angh (FFT size, real)
 * @remarks combine in complex input vector for IFFT F = e**(spet/2+j*ang)
 * @remarks Compute energy -->> E (scalar, real)
 * @callgraph
 * @callergraph
 * Input
 * - spect (FFT size, real)
 * - ang (half FFT size -1, real)
 * - m2    fftsize
 *  - WNr,WNi (FFT size, real) the tabulated sine and cosine values
 *  - brev (FFT size, real) the tabulated bit reversal indexes
 * Output
 * - Fr, Fi (FFT size, complex) the envelope spectrum
 * - E (scalar, real) the energy
 */
void env_spec(sig_innerobj_t *sig_inObj)
{

    picoos_int16 nI;
    picoos_int32 fcX, fsX, fExp, voxbnd;
    picoos_int32 *spect, *ang, *ctbl;
    picoos_int16 voiced, prev_voiced;
    picoos_int32 *co, *so;
    picoos_int32 *Fr, *Fi;
    picoos_single mult;

    /*Link local variables to sig object*/
    spect = sig_inObj->wcep_pI; /*spect_p*/
    /*  current spect scale : times PICODSP_FIX_SCALE1 */
    ang = sig_inObj->ang_p;
    /*  current spect scale : PICODSP_M_PI =  PICODSP_FIX_SCALE2 */
    Fr = sig_inObj->F2r_p;
    Fi = sig_inObj->F2i_p;
    voiced = sig_inObj->voiced_p;
    prev_voiced = sig_inObj->prevVoiced_p;
    voxbnd = (picoos_int32) (sig_inObj->voxbnd_p * sig_inObj->voicing);
    ctbl = sig_inObj->cos_table;
    /*  ctbl scale : times 4096 */
    mult = PICODSP_ENVSPEC_K1 / PICODSP_FIX_SCALE1;

    /*remove dc from real part*/
    if (sig_inObj->F0_p > 120) {
        spect[0] = spect[1] = 0;
        spect[2] /= PICODSP_ENVSPEC_K2;
    } else {
        spect[0] = 0;
    }

    /* if using rand table, use sin and cos tables as well */
    if (voiced || (prev_voiced)) {
        /*Envelope becomes a complex exponential : F=exp(.5*spect + j*angh);*/
        for (nI = 0; nI < voxbnd; nI++) {
            get_trig(ang[nI], ctbl, &fcX, &fsX);
            fExp = (picoos_int32) EXP((double)spect[nI]*mult);
            Fr[nI] = fExp * fcX;
            Fi[nI] = fExp * fsX;
        }
        /*         ao=sig_inObj->ang_p+(picoos_int32)voxbnd; */
        co = sig_inObj->outCosTbl + voxbnd;
        so = sig_inObj->outSinTbl + voxbnd;

        for (nI = voxbnd; nI < PICODSP_HFFTSIZE_P1; nI++) {
            fcX = *co++;
            fsX = *so++;
            fExp = (picoos_int32) EXP((double)spect[nI]*mult);
            Fr[nI] = fExp * fcX;
            Fi[nI] = fExp * fsX;
        }
    } else {
        /*ao=sig_inObj->ang_p+1;*/
        co = sig_inObj->outCosTbl + 1;
        so = sig_inObj->outSinTbl + 1;
        for (nI = 1; nI < PICODSP_HFFTSIZE_P1; nI++) {
            fcX = *co++;
            fsX = *so++;
            fExp = (picoos_int32) EXP((double)spect[nI]*mult);

            Fr[nI] = fExp * fcX;
            Fi[nI] = fExp * fsX;
        }
    }

}/*env_spec*/

/**
 * Calculates the impulse response of the comlpex spectrum through inverse rFFT
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @remarks Imp corresponds with the real part of the FFT
 * @callgraph
 * @callergraph
 * Input
 * - Fr, Fi (FFT size, real & imaginary) the complex envelope spectrum (only first half of spectrum)
 * Output
 * - Imp: impulse response (length: m2)
 * - E (scalar, real) RMS value
 */
void impulse_response(sig_innerobj_t *sig_inObj)
{
    /*Define local variables*/
    picoos_single f;
    picoos_int16 nI, nn, m2, m4, voiced;
    picoos_single *E;
    picoos_int32 *norm_window; /* - fixed point */
    picoos_int32 *fr, *Fr, *Fi, *t1, ff; /* - fixed point */

    /*Link local variables with sig object*/
    m2 = sig_inObj->m2_p;
    m4 = m2 >> 1;
    Fr = sig_inObj->F2r_p;
    Fi = sig_inObj->F2i_p;
    norm_window = sig_inObj->norm_window_p;
    E = &(sig_inObj->E_p); /*as pointer: value will be modified*/
    voiced = sig_inObj->voiced_p;
    fr = sig_inObj->imp_p;

    /*Inverse FFT*/
    for (nI = 0, nn = 0; nI < m4; nI++, nn += 2) {
        fr[nn] = Fr[nI]; /* - fixed point */
    }

    fr[1] = (picoos_int32) (Fr[m4]);
    for (nI = 1, nn = 3; nI < m4; nI++, nn += 2) {
        fr[nn] = -Fi[nI]; /* - fixed point */
    }

    rdft(m2, -1, fr);
    /*window, normalize and differentiate*/
    *E = norm_result(m2, fr, norm_window);

    if (*E > 0) {
        f = *E * PICODSP_FIXRESP_NORM;
    } else {
        f = 20; /*PICODSP_FIXRESP_NORM*/
    }
    ff = (picoos_int32) f;
    if (ff < 1)
        ff = 1;
    /*normalize impulse response*/
    t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,*(t1++) /= ff;); /* - fixed point */

} /* impulse_response */

/**
 * time domain pitch synchronous overlap add over two frames (when no voicing transition)
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @remarks Special treatment at voicing boundaries
 * @remarks Introduced to get rid of time-domain aliasing (and additional speed up)
 * @callgraph
 * @callergraph
 */
void td_psola2(sig_innerobj_t *sig_inObj)
{
    picoos_int16 nI;
    picoos_int16 hop, m2, *nextPeak, voiced;
    picoos_int32 *t1, *t2;
    picoos_int16 cnt;
    picoos_int32 *fr, *v1, ff, f;
    picoos_int16 a, i;
    picoos_int32 *window;
    picoos_int16 s = (picoos_int16) 1;
    window = sig_inObj->window_p;

    /*Link local variables with sig object*/
    hop = sig_inObj->hop_p;
    m2 = sig_inObj->m2_p;
    nextPeak = &(sig_inObj->nextPeak_p);
    voiced = sig_inObj->voiced_p;
    fr = sig_inObj->imp_p;
    /*toggle the pointers and initialize signal vector */
    v1 = sig_inObj->sig_vec1;

    t1 = v1;
    FAST_DEVICE(PICODSP_FFTSIZE-PICODSP_DISPLACE,*(t1++)=0;);
    t1 = &(v1[PICODSP_FFTSIZE - PICODSP_DISPLACE]);
    t2 = &(v1[PICODSP_FFTSIZE]);
    FAST_DEVICE(PICODSP_FFTSIZE, *(t1++)=*(t2++););
    t1 = &(v1[2 * PICODSP_FFTSIZE - PICODSP_DISPLACE]);FAST_DEVICE(PICODSP_DISPLACE,*(t1++)=0;);
    /*calculate excitation points*/
    get_simple_excitation(sig_inObj, nextPeak);

    /*TD-PSOLA based on excitation vector */
    if ((sig_inObj->nU == 0) && (sig_inObj->voiced_p == 1)) {
        /* purely voiced */
        for (nI = 0; nI < sig_inObj->nV; nI++) {
            f = sig_inObj->EnV[nI];
            a = 0;
            cnt = PICODSP_FFTSIZE;
            ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1;
            t1 = &(v1[a + sig_inObj->LocV[nI]]);
            t2 = &(fr[a]);
            if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;);
        }
    } else if ((sig_inObj->nV == 0) && (sig_inObj->voiced_p == 0)) {
        /* PURELY UNVOICED*/
        for (nI = 0; nI < sig_inObj->nU; nI++) {
            f = sig_inObj->EnU[nI];
            s = -s; /*reverse order to reduce the periodicity effect*/
            if (s == 1) {
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[a + sig_inObj->LocU[nI]]);
                t2 = &(fr[a]);
                if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; );
            } else { /*s==-1*/
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]);
                t2 = &(fr[a]);
                if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; );
            }
        }
    } else if (sig_inObj->VoicTrans == 0) {
        /*voicing transition from unvoiced to voiced*/
        for (nI = 0; nI < sig_inObj->nV; nI++) {
            f = sig_inObj->EnV[nI];
            a = 0;
            cnt = PICODSP_FFTSIZE;
            ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1;
            t1 = &(v1[a + sig_inObj->LocV[nI]]);
            t2 = &(fr[a]);
            if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;);
        }
        /*add remaining stuff from unvoiced part*/
        for (nI = 0; nI < sig_inObj->nU; nI++) {
            f = sig_inObj->EnU[nI];
            s = -s; /*reverse order to reduce the periodicity effect*/
            if (s == 1) {
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[a + sig_inObj->LocU[nI]]);
                t2 = &(sig_inObj->ImpResp_p[a]); /*saved impulse response*/
                if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; );
            } else {
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]);
                t2 = &(sig_inObj->ImpResp_p[a]);
                if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; );
            }
        }
    } else {
        /*voiced to unvoiced*/
        for (nI = 0; nI < sig_inObj->nU; nI++) {
            f = sig_inObj->EnU[nI];
            s = -s; /*reverse order to reduce the periodicity effect*/
            if (s > 0) {
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[a + sig_inObj->LocU[nI]]);
                t2 = &(fr[a]);
                if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; );
            } else {
                a = 0;
                cnt = PICODSP_FFTSIZE;
                ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1;
                t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]);
                t2 = &(fr[a]);
                if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; );
            }
        }
        /*add remaining stuff from voiced part*/
        for (nI = 0; nI < sig_inObj->nV; nI++) {
            f = sig_inObj->EnV[nI];
            a = 0;
            cnt = PICODSP_FFTSIZE;
            ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1;
            t1 = &(v1[a + sig_inObj->LocV[nI]]);
            t2 = &(sig_inObj->ImpResp_p[a]);
            if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;);
        }
    }

    t1 = sig_inObj->sig_vec1;
    for (i = 0; i < PICODSP_FFTSIZE; i++, t1++) {
        if (*t1 >= 0)
            *t1 >>= PICODSP_SHIFT_FACT5;
        else
            *t1 = -((-*t1) >> PICODSP_SHIFT_FACT5);
    }

}/*td_psola2*/

/**
 * overlap + add summing of impulse responses on the final destination sample buffer
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @remarks Special treatment at voicing boundaries
 * @remarks Introduced to get rid of time-domain aliasing (and additional speed up)
 * Input
 * - wlet : the generic impulse response (FFT size, real)
 * - window : the windowing funcion (FFT size, real) fixed
 * - WavBuff : the destination buffer with past samples (FFT size*2, short)
 * - m2 : fftsize
 * Output
 * - WavBuff : the destination buffer with updated samples (FFT size*2, short)
 * @callgraph
 * @callergraph
 */
void overlap_add(sig_innerobj_t *sig_inObj)
{
    /*Local variables*/
    picoos_int32 *w, *v;

    /*Link local variables with sig object*/
    w = sig_inObj->WavBuff_p;
    v = sig_inObj->sig_vec1;

    FAST_DEVICE(PICODSP_FFTSIZE, *(w++)+=*(v++)<<PICODSP_SHIFT_FACT6;);

}/*overlap_add*/

/*-------------------------------------------------------------------------------
 INITIALIZATION AND INTERNAL    FUNCTIONS
 --------------------------------------------------------------------------------*/
/**
 * Hanning window initialization
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @return  PICO_OK
 * @callgraph
 * @callergraph
 */
static void gen_hann2(sig_innerobj_t *sig_inObj)
{
    picoos_int32 *hann;
    picoos_int32 *norm;
    /*link local variables with sig object*/
    hann = sig_inObj->window_p;
    norm = sig_inObj->norm_window_p;

    norm[0] = 80224;
    norm[1] = 320832;
    norm[2] = 721696;
    norm[3] = 1282560;
    norm[4] = 2003104;
    norm[5] = 2882880;
    norm[6] = 3921376;
    norm[7] = 5117984;
    norm[8] = 6471952;
    norm[9] = 7982496;
    norm[10] = 9648720;
    norm[11] = 11469616;
    norm[12] = 13444080;
    norm[13] = 15570960;
    norm[14] = 17848976;
    norm[15] = 20276752;
    norm[16] = 22852864;
    norm[17] = 25575744;
    norm[18] = 28443776;
    norm[19] = 31455264;
    norm[20] = 34608368;
    norm[21] = 37901248;
    norm[22] = 41331904;
    norm[23] = 44898304;
    norm[24] = 48598304;
    norm[25] = 52429696;
    norm[26] = 56390192;
    norm[27] = 60477408;
    norm[28] = 64688944;
    norm[29] = 69022240;
    norm[30] = 73474720;
    norm[31] = 78043744;
    norm[32] = 82726544;
    norm[33] = 87520352;
    norm[34] = 92422272;
    norm[35] = 97429408;
    norm[36] = 102538752;
    norm[37] = 107747248;
    norm[38] = 113051776;
    norm[39] = 118449184;
    norm[40] = 123936224;
    norm[41] = 129509648;
    norm[42] = 135166080;
    norm[43] = 140902192;
    norm[44] = 146714528;
    norm[45] = 152599584;
    norm[46] = 158553904;
    norm[47] = 164573888;
    norm[48] = 170655936;
    norm[49] = 176796448;
    norm[50] = 182991712;
    norm[51] = 189238064;
    norm[52] = 195531744;
    norm[53] = 201868992;
    norm[54] = 208246016;
    norm[55] = 214659040;
    norm[56] = 221104176;
    norm[57] = 227577616;
    norm[58] = 234075488;
    norm[59] = 240593872;
    norm[60] = 247128912;
    norm[61] = 253676688;
    norm[62] = 260233280;
    norm[63] = 266794768;
    norm[64] = 273357248;
    norm[65] = 279916768;
    norm[66] = 286469440;
    norm[67] = 293011360;
    norm[68] = 299538560;
    norm[69] = 306047168;
    norm[70] = 312533312;
    norm[71] = 318993088;
    norm[72] = 325422656;
    norm[73] = 331818144;
    norm[74] = 338175744;
    norm[75] = 344491680;
    norm[76] = 350762176;
    norm[77] = 356983424;
    norm[78] = 363151808;
    norm[79] = 369263520;
    norm[80] = 375315008;
    norm[81] = 381302592;
    norm[82] = 387222720;
    norm[83] = 393071872;
    norm[84] = 398846528;
    norm[85] = 404543232;
    norm[86] = 410158560;
    norm[87] = 415689216;
    norm[88] = 421131840;
    norm[89] = 426483200;
    norm[90] = 431740096;
    norm[91] = 436899392;
    norm[92] = 441958016;
    norm[93] = 446912928;
    norm[94] = 451761152;
    norm[95] = 456499840;
    norm[96] = 461126080;
    norm[97] = 465637152;
    norm[98] = 470030400;
    norm[99] = 474303104;
    norm[100] = 478452800;
    norm[101] = 482476960;
    norm[102] = 486373184;
    norm[103] = 490139200;
    norm[104] = 493772640;
    norm[105] = 497271424;
    norm[106] = 500633440;
    norm[107] = 503856704;
    norm[108] = 506939200;
    norm[109] = 509879168;
    norm[110] = 512674880;
    norm[111] = 515324544;
    norm[112] = 517826688;
    norm[113] = 520179776;
    norm[114] = 522382368;
    norm[115] = 524433184;
    norm[116] = 526331008;
    norm[117] = 528074688;
    norm[118] = 529663200;
    norm[119] = 531095552;
    norm[120] = 532370944;
    norm[121] = 533488576;
    norm[122] = 534447808;
    norm[123] = 535248000;
    norm[124] = 535888768;
    norm[125] = 536369664;
    norm[126] = 536690432;
    norm[127] = 536850880;
    norm[128] = 536850880;
    norm[129] = 536690432;
    norm[130] = 536369664;
    norm[131] = 535888768;
    norm[132] = 535248000;
    norm[133] = 534447808;
    norm[134] = 533488576;
    norm[135] = 532370944;
    norm[136] = 531095552;
    norm[137] = 529663200;
    norm[138] = 528074688;
    norm[139] = 526331008;
    norm[140] = 524433216;
    norm[141] = 522382368;
    norm[142] = 520179776;
    norm[143] = 517826688;
    norm[144] = 515324544;
    norm[145] = 512674880;
    norm[146] = 509879168;
    norm[147] = 506939200;
    norm[148] = 503856704;
    norm[149] = 500633472;
    norm[150] = 497271424;
    norm[151] = 493772672;
    norm[152] = 490139200;
    norm[153] = 486373184;
    norm[154] = 482476992;
    norm[155] = 478452800;
    norm[156] = 474303104;
    norm[157] = 470030400;
    norm[158] = 465637184;
    norm[159] = 461126080;
    norm[160] = 456499840;
    norm[161] = 451761152;
    norm[162] = 446912960;
    norm[163] = 441958016;
    norm[164] = 436899424;
    norm[165] = 431740096;
    norm[166] = 426483200;
    norm[167] = 421131840;
    norm[168] = 415689216;
    norm[169] = 410158560;
    norm[170] = 404543232;
    norm[171] = 398846528;
    norm[172] = 393071872;
    norm[173] = 387222720;
    norm[174] = 381302592;
    norm[175] = 375315008;
    norm[176] = 369263552;
    norm[177] = 363151808;
    norm[178] = 356983456;
    norm[179] = 350762176;
    norm[180] = 344491712;
    norm[181] = 338175776;
    norm[182] = 331818144;
    norm[183] = 325422656;
    norm[184] = 318993088;
    norm[185] = 312533312;
    norm[186] = 306047168;
    norm[187] = 299538560;
    norm[188] = 293011360;
    norm[189] = 286469472;
    norm[190] = 279916800;
    norm[191] = 273357248;
    norm[192] = 266794784;
    norm[193] = 260233280;
    norm[194] = 253676688;
    norm[195] = 247128928;
    norm[196] = 240593888;
    norm[197] = 234075488;
    norm[198] = 227577632;
    norm[199] = 221104192;
    norm[200] = 214659040;
    norm[201] = 208246032;
    norm[202] = 201868992;
    norm[203] = 195531744;
    norm[204] = 189238080;
    norm[205] = 182991728;
    norm[206] = 176796448;
    norm[207] = 170655952;
    norm[208] = 164573888;
    norm[209] = 158553920;
    norm[210] = 152599600;
    norm[211] = 146714528;
    norm[212] = 140902208;
    norm[213] = 135166096;
    norm[214] = 129509648;
    norm[215] = 123936240;
    norm[216] = 118449184;
    norm[217] = 113051776;
    norm[218] = 107747248;
    norm[219] = 102538752;
    norm[220] = 97429424;
    norm[221] = 92422288;
    norm[222] = 87520352;
    norm[223] = 82726544;
    norm[224] = 78043744;
    norm[225] = 73474736;
    norm[226] = 69022240;
    norm[227] = 64688944;
    norm[228] = 60477424;
    norm[229] = 56390192;
    norm[230] = 52429696;
    norm[231] = 48598304;
    norm[232] = 44898304;
    norm[233] = 41331904;
    norm[234] = 37901248;
    norm[235] = 34608384;
    norm[236] = 31455264;
    norm[237] = 28443792;
    norm[238] = 25575744;
    norm[239] = 22852864;
    norm[240] = 20276752;
    norm[241] = 17848976;
    norm[242] = 15570960;
    norm[243] = 13444080;
    norm[244] = 11469616;
    norm[245] = 9648720;
    norm[246] = 7982512;
    norm[247] = 6471952;
    norm[248] = 5117984;
    norm[249] = 3921376;
    norm[250] = 2882880;
    norm[251] = 2003104;
    norm[252] = 1282560;
    norm[253] = 721696;
    norm[254] = 320832;
    norm[255] = 80224;
    hann[0] = 0;
    hann[1] = 0;
    hann[2] = 1;
    hann[3] = 2;
    hann[4] = 3;
    hann[5] = 5;
    hann[6] = 7;
    hann[7] = 9;
    hann[8] = 12;
    hann[9] = 15;
    hann[10] = 18;
    hann[11] = 21;
    hann[12] = 25;
    hann[13] = 29;
    hann[14] = 34;
    hann[15] = 38;
    hann[16] = 43;
    hann[17] = 48;
    hann[18] = 54;
    hann[19] = 59;
    hann[20] = 66;
    hann[21] = 72;
    hann[22] = 78;
    hann[23] = 85;
    hann[24] = 92;
    hann[25] = 100;
    hann[26] = 107;
    hann[27] = 115;
    hann[28] = 123;
    hann[29] = 131;
    hann[30] = 140;
    hann[31] = 148;
    hann[32] = 157;
    hann[33] = 166;
    hann[34] = 176;
    hann[35] = 185;
    hann[36] = 195;
    hann[37] = 205;
    hann[38] = 215;
    hann[39] = 225;
    hann[40] = 236;
    hann[41] = 247;
    hann[42] = 257;
    hann[43] = 268;
    hann[44] = 279;
    hann[45] = 291;
    hann[46] = 302;
    hann[47] = 313;
    hann[48] = 325;
    hann[49] = 337;
    hann[50] = 349;
    hann[51] = 360;
    hann[52] = 372;
    hann[53] = 385;
    hann[54] = 397;
    hann[55] = 409;
    hann[56] = 421;
    hann[57] = 434;
    hann[58] = 446;
    hann[59] = 458;
    hann[60] = 471;
    hann[61] = 483;
    hann[62] = 496;
    hann[63] = 508;
    hann[64] = 521;
    hann[65] = 533;
    hann[66] = 546;
    hann[67] = 558;
    hann[68] = 571;
    hann[69] = 583;
    hann[70] = 596;
    hann[71] = 608;
    hann[72] = 620;
    hann[73] = 632;
    hann[74] = 645;
    hann[75] = 657;
    hann[76] = 669;
    hann[77] = 680;
    hann[78] = 692;
    hann[79] = 704;
    hann[80] = 715;
    hann[81] = 727;
    hann[82] = 738;
    hann[83] = 749;
    hann[84] = 760;
    hann[85] = 771;
    hann[86] = 782;
    hann[87] = 792;
    hann[88] = 803;
    hann[89] = 813;
    hann[90] = 823;
    hann[91] = 833;
    hann[92] = 842;
    hann[93] = 852;
    hann[94] = 861;
    hann[95] = 870;
    hann[96] = 879;
    hann[97] = 888;
    hann[98] = 896;
    hann[99] = 904;
    hann[100] = 912;
    hann[101] = 920;
    hann[102] = 927;
    hann[103] = 934;
    hann[104] = 941;
    hann[105] = 948;
    hann[106] = 954;
    hann[107] = 961;
    hann[108] = 966;
    hann[109] = 972;
    hann[110] = 977;
    hann[111] = 982;
    hann[112] = 987;
    hann[113] = 992;
    hann[114] = 996;
    hann[115] = 1000;
    hann[116] = 1003;
    hann[117] = 1007;
    hann[118] = 1010;
    hann[119] = 1012;
    hann[120] = 1015;
    hann[121] = 1017;
    hann[122] = 1019;
    hann[123] = 1020;
    hann[124] = 1022;
    hann[125] = 1023;
    hann[126] = 1023;
    hann[127] = 1023;
    hann[128] = 1023;
    hann[129] = 1023;
    hann[130] = 1023;
    hann[131] = 1022;
    hann[132] = 1020;
    hann[133] = 1019;
    hann[134] = 1017;
    hann[135] = 1015;
    hann[136] = 1012;
    hann[137] = 1010;
    hann[138] = 1007;
    hann[139] = 1003;
    hann[140] = 1000;
    hann[141] = 996;
    hann[142] = 992;
    hann[143] = 987;
    hann[144] = 982;
    hann[145] = 977;
    hann[146] = 972;
    hann[147] = 966;
    hann[148] = 961;
    hann[149] = 954;
    hann[150] = 948;
    hann[151] = 941;
    hann[152] = 934;
    hann[153] = 927;
    hann[154] = 920;
    hann[155] = 912;
    hann[156] = 904;
    hann[157] = 896;
    hann[158] = 888;
    hann[159] = 879;
    hann[160] = 870;
    hann[161] = 861;
    hann[162] = 852;
    hann[163] = 842;
    hann[164] = 833;
    hann[165] = 823;
    hann[166] = 813;
    hann[167] = 803;
    hann[168] = 792;
    hann[169] = 782;
    hann[170] = 771;
    hann[171] = 760;
    hann[172] = 749;
    hann[173] = 738;
    hann[174] = 727;
    hann[175] = 715;
    hann[176] = 704;
    hann[177] = 692;
    hann[178] = 680;
    hann[179] = 669;
    hann[180] = 657;
    hann[181] = 645;
    hann[182] = 632;
    hann[183] = 620;
    hann[184] = 608;
    hann[185] = 596;
    hann[186] = 583;
    hann[187] = 571;
    hann[188] = 558;
    hann[189] = 546;
    hann[190] = 533;
    hann[191] = 521;
    hann[192] = 508;
    hann[193] = 496;
    hann[194] = 483;
    hann[195] = 471;
    hann[196] = 458;
    hann[197] = 446;
    hann[198] = 434;
    hann[199] = 421;
    hann[200] = 409;
    hann[201] = 397;
    hann[202] = 385;
    hann[203] = 372;
    hann[204] = 360;
    hann[205] = 349;
    hann[206] = 337;
    hann[207] = 325;
    hann[208] = 313;
    hann[209] = 302;
    hann[210] = 291;
    hann[211] = 279;
    hann[212] = 268;
    hann[213] = 257;
    hann[214] = 247;
    hann[215] = 236;
    hann[216] = 225;
    hann[217] = 215;
    hann[218] = 205;
    hann[219] = 195;
    hann[220] = 185;
    hann[221] = 176;
    hann[222] = 166;
    hann[223] = 157;
    hann[224] = 148;
    hann[225] = 140;
    hann[226] = 131;
    hann[227] = 123;
    hann[228] = 115;
    hann[229] = 107;
    hann[230] = 100;
    hann[231] = 92;
    hann[232] = 85;
    hann[233] = 78;
    hann[234] = 72;
    hann[235] = 66;
    hann[236] = 59;
    hann[237] = 54;
    hann[238] = 48;
    hann[239] = 43;
    hann[240] = 38;
    hann[241] = 34;
    hann[242] = 29;
    hann[243] = 25;
    hann[244] = 21;
    hann[245] = 18;
    hann[246] = 15;
    hann[247] = 12;
    hann[248] = 9;
    hann[249] = 7;
    hann[250] = 5;
    hann[251] = 3;
    hann[252] = 2;
    hann[253] = 1;
    hann[254] = 0;
    hann[255] = 0;

} /* gen_hann2 */

/**
 * Creates the non uniform enhancement window (bilinearly mapped hannning window)
 * in order to reduce the formant enhancement in the high spectrum
 * @param    mm : memory manager
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @return   void
 * @callgraph
 * @callergraph
 * @remarks the outgput is based on the matlab script below\n
 matlab script
 -------------
 function makeEnhWind(alpha)
 N=129; % =HFFTSIZEE_P1
 s=(bilinmap(alpha,N));
 h=[hann(N)'];
 x=(1:N)/N;
 W=interp1(x,h,s); W(1)=0;

 fid=fopen('enhwind.txt','wt');
 fprintf(fid,'picoos_int16 enh_wind_init(sig_innerobj_t *sig_inObj) {\n');
 for i=1:N,
 fprintf(fid,['   sig_inObj->enhwind[' int2str(i) '] = (picoos_single)' num2str(W(i),'%0.7g') ';\n']);
 end;
 fprintf(fid,'   return PICO_OK;\n');
 fprintf(fid,' }; \n');
 fclose(fid);
 %figure(1); plot(x*8,W);
 */
static void enh_wind_init(sig_innerobj_t *sig_inObj)
{
    /*     picoos_int16 i; */
    picoos_int32 *c;

    c = sig_inObj->cos_table;

    c[0] = 4096;
    c[1] = 4095;
    c[2] = 4095;
    c[3] = 4095;
    c[4] = 4095;
    c[5] = 4095;
    c[6] = 4095;
    c[7] = 4095;
    c[8] = 4094;
    c[9] = 4094;
    c[10] = 4094;
    c[11] = 4093;
    c[12] = 4093;
    c[13] = 4092;
    c[14] = 4092;
    c[15] = 4091;
    c[16] = 4091;
    c[17] = 4090;
    c[18] = 4089;
    c[19] = 4089;
    c[20] = 4088;
    c[21] = 4087;
    c[22] = 4086;
    c[23] = 4085;
    c[24] = 4084;
    c[25] = 4083;
    c[26] = 4082;
    c[27] = 4081;
    c[28] = 4080;
    c[29] = 4079;
    c[30] = 4078;
    c[31] = 4077;
    c[32] = 4076;
    c[33] = 4075;
    c[34] = 4073;
    c[35] = 4072;
    c[36] = 4071;
    c[37] = 4069;
    c[38] = 4068;
    c[39] = 4066;
    c[40] = 4065;
    c[41] = 4063;
    c[42] = 4062;
    c[43] = 4060;
    c[44] = 4058;
    c[45] = 4057;
    c[46] = 4055;
    c[47] = 4053;
    c[48] = 4051;
    c[49] = 4049;
    c[50] = 4047;
    c[51] = 4045;
    c[52] = 4043;
    c[53] = 4041;
    c[54] = 4039;
    c[55] = 4037;
    c[56] = 4035;
    c[57] = 4033;
    c[58] = 4031;
    c[59] = 4029;
    c[60] = 4026;
    c[61] = 4024;
    c[62] = 4022;
    c[63] = 4019;
    c[64] = 4017;
    c[65] = 4014;
    c[66] = 4012;
    c[67] = 4009;
    c[68] = 4007;
    c[69] = 4004;
    c[70] = 4001;
    c[71] = 3999;
    c[72] = 3996;
    c[73] = 3993;
    c[74] = 3990;
    c[75] = 3988;
    c[76] = 3985;
    c[77] = 3982;
    c[78] = 3979;
    c[79] = 3976;
    c[80] = 3973;
    c[81] = 3970;
    c[82] = 3967;
    c[83] = 3963;
    c[84] = 3960;
    c[85] = 3957;
    c[86] = 3954;
    c[87] = 3950;
    c[88] = 3947;
    c[89] = 3944;
    c[90] = 3940;
    c[91] = 3937;
    c[92] = 3933;
    c[93] = 3930;
    c[94] = 3926;
    c[95] = 3923;
    c[96] = 3919;
    c[97] = 3915;
    c[98] = 3912;
    c[99] = 3908;
    c[100] = 3904;
    c[101] = 3900;
    c[102] = 3897;
    c[103] = 3893;
    c[104] = 3889;
    c[105] = 3885;
    c[106] = 3881;
    c[107] = 3877;
    c[108] = 3873;
    c[109] = 3869;
    c[110] = 3864;
    c[111] = 3860;
    c[112] = 3856;
    c[113] = 3852;
    c[114] = 3848;
    c[115] = 3843;
    c[116] = 3839;
    c[117] = 3834;
    c[118] = 3830;
    c[119] = 3826;
    c[120] = 3821;
    c[121] = 3816;
    c[122] = 3812;
    c[123] = 3807;
    c[124] = 3803;
    c[125] = 3798;
    c[126] = 3793;
    c[127] = 3789;
    c[128] = 3784;
    c[129] = 3779;
    c[130] = 3774;
    c[131] = 3769;
    c[132] = 3764;
    c[133] = 3759;
    c[134] = 3754;
    c[135] = 3749;
    c[136] = 3744;
    c[137] = 3739;
    c[138] = 3734;
    c[139] = 3729;
    c[140] = 3723;
    c[141] = 3718;
    c[142] = 3713;
    c[143] = 3708;
    c[144] = 3702;
    c[145] = 3697;
    c[146] = 3691;
    c[147] = 3686;
    c[148] = 3680;
    c[149] = 3675;
    c[150] = 3669;
    c[151] = 3664;
    c[152] = 3658;
    c[153] = 3652;
    c[154] = 3647;
    c[155] = 3641;
    c[156] = 3635;
    c[157] = 3629;
    c[158] = 3624;
    c[159] = 3618;
    c[160] = 3612;
    c[161] = 3606;
    c[162] = 3600;
    c[163] = 3594;
    c[164] = 3588;
    c[165] = 3582;
    c[166] = 3576;
    c[167] = 3570;
    c[168] = 3563;
    c[169] = 3557;
    c[170] = 3551;
    c[171] = 3545;
    c[172] = 3538;
    c[173] = 3532;
    c[174] = 3526;
    c[175] = 3519;
    c[176] = 3513;
    c[177] = 3506;
    c[178] = 3500;
    c[179] = 3493;
    c[180] = 3487;
    c[181] = 3480;
    c[182] = 3473;
    c[183] = 3467;
    c[184] = 3460;
    c[185] = 3453;
    c[186] = 3447;
    c[187] = 3440;
    c[188] = 3433;
    c[189] = 3426;
    c[190] = 3419;
    c[191] = 3412;
    c[192] = 3405;
    c[193] = 3398;
    c[194] = 3391;
    c[195] = 3384;
    c[196] = 3377;
    c[197] = 3370;
    c[198] = 3363;
    c[199] = 3356;
    c[200] = 3348;
    c[201] = 3341;
    c[202] = 3334;
    c[203] = 3326;
    c[204] = 3319;
    c[205] = 3312;
    c[206] = 3304;
    c[207] = 3297;
    c[208] = 3289;
    c[209] = 3282;
    c[210] = 3274;
    c[211] = 3267;
    c[212] = 3259;
    c[213] = 3252;
    c[214] = 3244;
    c[215] = 3236;
    c[216] = 3229;
    c[217] = 3221;
    c[218] = 3213;
    c[219] = 3205;
    c[220] = 3197;
    c[221] = 3190;
    c[222] = 3182;
    c[223] = 3174;
    c[224] = 3166;
    c[225] = 3158;
    c[226] = 3150;
    c[227] = 3142;
    c[228] = 3134;
    c[229] = 3126;
    c[230] = 3117;
    c[231] = 3109;
    c[232] = 3101;
    c[233] = 3093;
    c[234] = 3085;
    c[235] = 3076;
    c[236] = 3068;
    c[237] = 3060;
    c[238] = 3051;
    c[239] = 3043;
    c[240] = 3034;
    c[241] = 3026;
    c[242] = 3018;
    c[243] = 3009;
    c[244] = 3000;
    c[245] = 2992;
    c[246] = 2983;
    c[247] = 2975;
    c[248] = 2966;
    c[249] = 2957;
    c[250] = 2949;
    c[251] = 2940;
    c[252] = 2931;
    c[253] = 2922;
    c[254] = 2914;
    c[255] = 2905;
    c[256] = 2896;
    c[257] = 2887;
    c[258] = 2878;
    c[259] = 2869;
    c[260] = 2860;
    c[261] = 2851;
    c[262] = 2842;
    c[263] = 2833;
    c[264] = 2824;
    c[265] = 2815;
    c[266] = 2806;
    c[267] = 2796;
    c[268] = 2787;
    c[269] = 2778;
    c[270] = 2769;
    c[271] = 2760;
    c[272] = 2750;
    c[273] = 2741;
    c[274] = 2732;
    c[275] = 2722;
    c[276] = 2713;
    c[277] = 2703;
    c[278] = 2694;
    c[279] = 2684;
    c[280] = 2675;
    c[281] = 2665;
    c[282] = 2656;
    c[283] = 2646;
    c[284] = 2637;
    c[285] = 2627;
    c[286] = 2617;
    c[287] = 2608;
    c[288] = 2598;
    c[289] = 2588;
    c[290] = 2578;
    c[291] = 2569;
    c[292] = 2559;
    c[293] = 2549;
    c[294] = 2539;
    c[295] = 2529;
    c[296] = 2519;
    c[297] = 2510;
    c[298] = 2500;
    c[299] = 2490;
    c[300] = 2480;
    c[301] = 2470;
    c[302] = 2460;
    c[303] = 2450;
    c[304] = 2439;
    c[305] = 2429;
    c[306] = 2419;
    c[307] = 2409;
    c[308] = 2399;
    c[309] = 2389;
    c[310] = 2379;
    c[311] = 2368;
    c[312] = 2358;
    c[313] = 2348;
    c[314] = 2337;
    c[315] = 2327;
    c[316] = 2317;
    c[317] = 2306;
    c[318] = 2296;
    c[319] = 2286;
    c[320] = 2275;
    c[321] = 2265;
    c[322] = 2254;
    c[323] = 2244;
    c[324] = 2233;
    c[325] = 2223;
    c[326] = 2212;
    c[327] = 2201;
    c[328] = 2191;
    c[329] = 2180;
    c[330] = 2170;
    c[331] = 2159;
    c[332] = 2148;
    c[333] = 2138;
    c[334] = 2127;
    c[335] = 2116;
    c[336] = 2105;
    c[337] = 2094;
    c[338] = 2084;
    c[339] = 2073;
    c[340] = 2062;
    c[341] = 2051;
    c[342] = 2040;
    c[343] = 2029;
    c[344] = 2018;
    c[345] = 2007;
    c[346] = 1997;
    c[347] = 1986;
    c[348] = 1975;
    c[349] = 1964;
    c[350] = 1952;
    c[351] = 1941;
    c[352] = 1930;
    c[353] = 1919;
    c[354] = 1908;
    c[355] = 1897;
    c[356] = 1886;
    c[357] = 1875;
    c[358] = 1864;
    c[359] = 1852;
    c[360] = 1841;
    c[361] = 1830;
    c[362] = 1819;
    c[363] = 1807;
    c[364] = 1796;
    c[365] = 1785;
    c[366] = 1773;
    c[367] = 1762;
    c[368] = 1751;
    c[369] = 1739;
    c[370] = 1728;
    c[371] = 1717;
    c[372] = 1705;
    c[373] = 1694;
    c[374] = 1682;
    c[375] = 1671;
    c[376] = 1659;
    c[377] = 1648;
    c[378] = 1636;
    c[379] = 1625;
    c[380] = 1613;
    c[381] = 1602;
    c[382] = 1590;
    c[383] = 1579;
    c[384] = 1567;
    c[385] = 1555;
    c[386] = 1544;
    c[387] = 1532;
    c[388] = 1520;
    c[389] = 1509;
    c[390] = 1497;
    c[391] = 1485;
    c[392] = 1474;
    c[393] = 1462;
    c[394] = 1450;
    c[395] = 1438;
    c[396] = 1427;
    c[397] = 1415;
    c[398] = 1403;
    c[399] = 1391;
    c[400] = 1379;
    c[401] = 1368;
    c[402] = 1356;
    c[403] = 1344;
    c[404] = 1332;
    c[405] = 1320;
    c[406] = 1308;
    c[407] = 1296;
    c[408] = 1284;
    c[409] = 1272;
    c[410] = 1260;
    c[411] = 1248;
    c[412] = 1237;
    c[413] = 1225;
    c[414] = 1213;
    c[415] = 1201;
    c[416] = 1189;
    c[417] = 1176;
    c[418] = 1164;
    c[419] = 1152;
    c[420] = 1140;
    c[421] = 1128;
    c[422] = 1116;
    c[423] = 1104;
    c[424] = 1092;
    c[425] = 1080;
    c[426] = 1068;
    c[427] = 1056;
    c[428] = 1043;
    c[429] = 1031;
    c[430] = 1019;
    c[431] = 1007;
    c[432] = 995;
    c[433] = 983;
    c[434] = 970;
    c[435] = 958;
    c[436] = 946;
    c[437] = 934;
    c[438] = 921;
    c[439] = 909;
    c[440] = 897;
    c[441] = 885;
    c[442] = 872;
    c[443] = 860;
    c[444] = 848;
    c[445] = 836;
    c[446] = 823;
    c[447] = 811;
    c[448] = 799;
    c[449] = 786;
    c[450] = 774;
    c[451] = 762;
    c[452] = 749;
    c[453] = 737;
    c[454] = 725;
    c[455] = 712;
    c[456] = 700;
    c[457] = 687;
    c[458] = 675;
    c[459] = 663;
    c[460] = 650;
    c[461] = 638;
    c[462] = 625;
    c[463] = 613;
    c[464] = 601;
    c[465] = 588;
    c[466] = 576;
    c[467] = 563;
    c[468] = 551;
    c[469] = 538;
    c[470] = 526;
    c[471] = 513;
    c[472] = 501;
    c[473] = 488;
    c[474] = 476;
    c[475] = 463;
    c[476] = 451;
    c[477] = 438;
    c[478] = 426;
    c[479] = 413;
    c[480] = 401;
    c[481] = 388;
    c[482] = 376;
    c[483] = 363;
    c[484] = 351;
    c[485] = 338;
    c[486] = 326;
    c[487] = 313;
    c[488] = 301;
    c[489] = 288;
    c[490] = 276;
    c[491] = 263;
    c[492] = 251;
    c[493] = 238;
    c[494] = 226;
    c[495] = 213;
    c[496] = 200;
    c[497] = 188;
    c[498] = 175;
    c[499] = 163;
    c[500] = 150;
    c[501] = 138;
    c[502] = 125;
    c[503] = 113;
    c[504] = 100;
    c[505] = 87;
    c[506] = 75;
    c[507] = 62;
    c[508] = 50;
    c[509] = 37;
    c[510] = 25;
    c[511] = 12;
    c[512] = 0;
} /*enh_wind_init*/

/**
 * Initializes a useful large array of random numbers
 * @param  sig_inObj : sig PU internal object of the sub-object
 * @return void
 * @callgraph
 * @callergraph
 */
static void init_rand(sig_innerobj_t *sig_inObj)
{
    picoos_int32 *q = sig_inObj->int_vec34;
    picoos_int32 *r = sig_inObj->int_vec35;

    sig_inObj->iRand = 0;

    q[0] = -2198;
    r[0] = 3455;
    q[1] = 3226;
    r[1] = -2522;
    q[2] = -845;
    r[2] = 4007;
    q[3] = -1227;
    r[3] = 3907;
    q[4] = -3480;
    r[4] = 2158;
    q[5] = -1325;
    r[5] = -3875;
    q[6] = 2089;
    r[6] = -3522;
    q[7] = -468;
    r[7] = 4069;
    q[8] = 711;
    r[8] = -4033;
    q[9] = 3862;
    r[9] = 1362;
    q[10] = 4054;
    r[10] = -579;
    q[11] = 2825;
    r[11] = 2965;
    q[12] = 2704;
    r[12] = -3076;
    q[13] = 4081;
    r[13] = 344;
    q[14] = -3912;
    r[14] = 1211;
    q[15] = -3541;
    r[15] = 2058;
    q[16] = 2694;
    r[16] = 3084;
    q[17] = 835;
    r[17] = 4009;
    q[18] = -2578;
    r[18] = -3182;
    q[19] = 3205;
    r[19] = 2550;
    q[20] = -4074;
    r[20] = -418;
    q[21] = -183;
    r[21] = -4091;
    q[22] = -2665;
    r[22] = -3110;
    q[23] = -1367;
    r[23] = 3860;
    q[24] = -2266;
    r[24] = -3411;
    q[25] = 3327;
    r[25] = -2387;
    q[26] = -2807;
    r[26] = -2982;
    q[27] = -3175;
    r[27] = -2587;
    q[28] = -4095;
    r[28] = 27;
    q[29] = -811;
    r[29] = -4014;
    q[30] = 4082;
    r[30] = 332;
    q[31] = -2175;
    r[31] = 3470;
    q[32] = 3112;
    r[32] = 2662;
    q[33] = 1168;
    r[33] = -3925;
    q[34] = 2659;
    r[34] = 3115;
    q[35] = 4048;
    r[35] = 622;
    q[36] = 4092;
    r[36] = -165;
    q[37] = -4036;
    r[37] = 697;
    q[38] = 1081;
    r[38] = -3950;
    q[39] = -548;
    r[39] = 4059;
    q[40] = 4038;
    r[40] = 685;
    q[41] = -511;
    r[41] = 4063;
    q[42] = 3317;
    r[42] = -2402;
    q[43] = -3180;
    r[43] = 2580;
    q[44] = 851;
    r[44] = -4006;
    q[45] = 2458;
    r[45] = -3276;
    q[46] = -1453;
    r[46] = 3829;
    q[47] = -3577;
    r[47] = 1995;
    q[48] = -3708;
    r[48] = -1738;
    q[49] = -3890;
    r[49] = 1282;
    q[50] = 4041;
    r[50] = 666;
    q[51] = -3511;
    r[51] = -2108;
    q[52] = -1454;
    r[52] = -3828;
    q[53] = 2124;
    r[53] = 3502;
    q[54] = -3159;
    r[54] = 2606;
    q[55] = 2384;
    r[55] = -3330;
    q[56] = -3767;
    r[56] = -1607;
    q[57] = -4063;
    r[57] = -513;
    q[58] = 3952;
    r[58] = -1075;
    q[59] = -3778;
    r[59] = -1581;
    q[60] = -301;
    r[60] = -4084;
    q[61] = -4026;
    r[61] = 751;
    q[62] = -3346;
    r[62] = 2361;
    q[63] = -2426;
    r[63] = 3299;
    q[64] = 428;
    r[64] = -4073;
    q[65] = 3968;
    r[65] = 1012;
    q[66] = 2900;
    r[66] = -2892;
    q[67] = -263;
    r[67] = 4087;
    q[68] = 4083;
    r[68] = 322;
    q[69] = 2024;
    r[69] = 3560;
    q[70] = 4015;
    r[70] = 808;
    q[71] = -3971;
    r[71] = -1000;
    q[72] = 3785;
    r[72] = -1564;
    q[73] = -3726;
    r[73] = 1701;
    q[74] = -3714;
    r[74] = 1725;
    q[75] = 743;
    r[75] = 4027;
    q[76] = 875;
    r[76] = -4001;
    q[77] = 294;
    r[77] = 4085;
    q[78] = 2611;
    r[78] = 3155;
    q[79] = 2491;
    r[79] = -3251;
    q[80] = 1558;
    r[80] = 3787;
    q[81] = -2063;
    r[81] = -3538;
    q[82] = 3809;
    r[82] = -1505;
    q[83] = -2987;
    r[83] = 2802;
    q[84] = -1955;
    r[84] = 3599;
    q[85] = 1980;
    r[85] = -3585;
    q[86] = -539;
    r[86] = -4060;
    q[87] = -3210;
    r[87] = 2543;
    q[88] = 2415;
    r[88] = -3308;
    q[89] = 1587;
    r[89] = 3775;
    q[90] = -3943;
    r[90] = 1106;
    q[91] = 3476;
    r[91] = 2165;
    q[92] = 2253;
    r[92] = 3420;
    q[93] = -2584;
    r[93] = 3177;
    q[94] = 3804;
    r[94] = -1518;
    q[95] = -3637;
    r[95] = 1883;
    q[96] = 3289;
    r[96] = -2440;
    q[97] = -1621;
    r[97] = 3761;
    q[98] = 1645;
    r[98] = 3751;
    q[99] = -3471;
    r[99] = 2173;
    q[100] = 4071;
    r[100] = -449;
    q[101] = -872;
    r[101] = -4001;
    q[102] = -3897;
    r[102] = 1259;
    q[103] = -3590;
    r[103] = 1970;
    q[104] = -2456;
    r[104] = -3277;
    q[105] = -3004;
    r[105] = 2783;
    q[106] = 2589;
    r[106] = 3173;
    q[107] = 3727;
    r[107] = -1698;
    q[108] = 2992;
    r[108] = 2796;
    q[109] = 794;
    r[109] = -4018;
    q[110] = -918;
    r[110] = 3991;
    q[111] = 1446;
    r[111] = -3831;
    q[112] = 3871;
    r[112] = -1338;
    q[113] = -612;
    r[113] = -4049;
    q[114] = -1566;
    r[114] = -3784;
    q[115] = 672;
    r[115] = -4040;
    q[116] = 3841;
    r[116] = 1422;
    q[117] = 3545;
    r[117] = -2051;
    q[118] = -1982;
    r[118] = -3584;
    q[119] = -3413;
    r[119] = 2263;
    q[120] = -3265;
    r[120] = -2473;
    q[121] = -2876;
    r[121] = -2915;
    q[122] = 4094;
    r[122] = -117;
    q[123] = -269;
    r[123] = 4087;
    q[124] = -4077;
    r[124] = 391;
    q[125] = -3759;
    r[125] = 1626;
    q[126] = 1639;
    r[126] = 3753;
    q[127] = 3041;
    r[127] = -2743;
    q[128] = 5;
    r[128] = 4095;
    q[129] = 2778;
    r[129] = -3009;
    q[130] = 1121;
    r[130] = -3939;
    q[131] = -455;
    r[131] = -4070;
    q[132] = 3532;
    r[132] = 2073;
    q[133] = -143;
    r[133] = -4093;
    q[134] = -2357;
    r[134] = -3349;
    q[135] = 458;
    r[135] = 4070;
    q[136] = -2887;
    r[136] = -2904;
    q[137] = -1104;
    r[137] = 3944;
    q[138] = -2104;
    r[138] = -3513;
    q[139] = 126;
    r[139] = 4094;
    q[140] = -3655;
    r[140] = -1848;
    q[141] = -3896;
    r[141] = 1263;
    q[142] = -3874;
    r[142] = -1327;
    q[143] = 4058;
    r[143] = 553;
    q[144] = -1831;
    r[144] = -3663;
    q[145] = -255;
    r[145] = -4088;
    q[146] = -1211;
    r[146] = 3912;
    q[147] = 445;
    r[147] = 4071;
    q[148] = 2268;
    r[148] = 3410;
    q[149] = -4010;
    r[149] = 833;
    q[150] = 2621;
    r[150] = 3147;
    q[151] = -250;
    r[151] = 4088;
    q[152] = -3409;
    r[152] = -2269;
    q[153] = -2710;
    r[153] = -3070;
    q[154] = 4063;
    r[154] = 518;
    q[155] = -3611;
    r[155] = -1933;
    q[156] = -3707;
    r[156] = -1741;
    q[157] = -1151;
    r[157] = -3930;
    q[158] = 3976;
    r[158] = -983;
    q[159] = -1736;
    r[159] = 3709;
    q[160] = 3669;
    r[160] = 1820;
    q[161] = -143;
    r[161] = 4093;
    q[162] = -3879;
    r[162] = -1313;
    q[163] = -2242;
    r[163] = -3427;
    q[164] = -4095;
    r[164] = 0;
    q[165] = -1159;
    r[165] = -3928;
    q[166] = -3155;
    r[166] = 2611;
    q[167] = -2887;
    r[167] = -2904;
    q[168] = -4095;
    r[168] = 56;
    q[169] = -3861;
    r[169] = -1364;
    q[170] = -2814;
    r[170] = 2976;
    q[171] = -3680;
    r[171] = -1798;
    q[172] = -4094;
    r[172] = -107;
    q[173] = -3626;
    r[173] = 1903;
    q[174] = 3403;
    r[174] = 2278;
    q[175] = -1735;
    r[175] = -3710;
    q[176] = -2126;
    r[176] = -3500;
    q[177] = 3183;
    r[177] = -2577;
    q[178] = -3499;
    r[178] = 2128;
    q[179] = -1736;
    r[179] = 3709;
    q[180] = 2592;
    r[180] = -3170;
    q[181] = 3875;
    r[181] = 1326;
    q[182] = 3596;
    r[182] = 1960;
    q[183] = 3915;
    r[183] = -1202;
    q[184] = 1570;
    r[184] = 3783;
    q[185] = -3319;
    r[185] = -2400;
    q[186] = 4019;
    r[186] = 787;
    q[187] = -187;
    r[187] = 4091;
    q[188] = 1370;
    r[188] = -3859;
    q[189] = -4091;
    r[189] = 199;
    q[190] = 3626;
    r[190] = 1904;
    q[191] = -2943;
    r[191] = 2848;
    q[192] = 56;
    r[192] = 4095;
    q[193] = 2824;
    r[193] = 2966;
    q[194] = -3994;
    r[194] = -904;
    q[195] = 56;
    r[195] = 4095;
    q[196] = -2045;
    r[196] = 3548;
    q[197] = -3653;
    r[197] = 1850;
    q[198] = -2864;
    r[198] = 2927;
    q[199] = -1996;
    r[199] = 3576;
    q[200] = -4061;
    r[200] = 527;
    q[201] = 159;
    r[201] = 4092;
    q[202] = -3363;
    r[202] = 2336;
    q[203] = -4074;
    r[203] = 421;
    q[204] = 2043;
    r[204] = 3549;
    q[205] = 4095;
    r[205] = -70;
    q[206] = -2107;
    r[206] = -3512;
    q[207] = -1973;
    r[207] = 3589;
    q[208] = -3138;
    r[208] = 2631;
    q[209] = -3625;
    r[209] = -1905;
    q[210] = 2413;
    r[210] = 3309;
    q[211] = -50;
    r[211] = -4095;
    q[212] = 2813;
    r[212] = 2976;
    q[213] = -535;
    r[213] = -4060;
    q[214] = 1250;
    r[214] = 3900;
    q[215] = 1670;
    r[215] = -3739;
    q[216] = 1945;
    r[216] = -3604;
    q[217] = -476;
    r[217] = -4068;
    q[218] = -3659;
    r[218] = -1840;
    q[219] = 2745;
    r[219] = 3039;
    q[220] = -674;
    r[220] = -4040;
    q[221] = 2383;
    r[221] = 3330;
    q[222] = 4086;
    r[222] = 274;
    q[223] = -4030;
    r[223] = 730;
    q[224] = 768;
    r[224] = -4023;
    q[225] = 3925;
    r[225] = 1170;
    q[226] = 785;
    r[226] = 4019;
    q[227] = -3101;
    r[227] = -2675;
    q[228] = 4030;
    r[228] = -729;
    q[229] = 3422;
    r[229] = 2249;
    q[230] = -3847;
    r[230] = 1403;
    q[231] = 3902;
    r[231] = -1243;
    q[232] = 2114;
    r[232] = -3507;
    q[233] = -2359;
    r[233] = 3348;
    q[234] = 3754;
    r[234] = -1638;
    q[235] = -4095;
    r[235] = -83;
    q[236] = 2301;
    r[236] = -3388;
    q[237] = 3336;
    r[237] = 2375;
    q[238] = -2045;
    r[238] = 3548;
    q[239] = -413;
    r[239] = -4075;
    q[240] = 1848;
    r[240] = 3655;
    q[241] = 4072;
    r[241] = -437;
    q[242] = 4069;
    r[242] = -463;
    q[243] = 1386;
    r[243] = -3854;
    q[244] = 966;
    r[244] = 3980;
    q[245] = -1684;
    r[245] = -3733;
    q[246] = 2953;
    r[246] = 2837;
    q[247] = -3961;
    r[247] = -1040;
    q[248] = 3512;
    r[248] = -2107;
    q[249] = 1363;
    r[249] = 3862;
    q[250] = 1883;
    r[250] = 3637;
    q[251] = 2657;
    r[251] = 3116;
    q[252] = 2347;
    r[252] = -3356;
    q[253] = -1635;
    r[253] = -3755;
    q[254] = 3170;
    r[254] = 2593;
    q[255] = 2856;
    r[255] = 2935;
    q[256] = 494;
    r[256] = 4066;
    q[257] = 1936;
    r[257] = -3609;
    q[258] = 245;
    r[258] = 4088;
    q[259] = -1211;
    r[259] = -3912;
    q[260] = -3600;
    r[260] = 1952;
    q[261] = 1632;
    r[261] = 3756;
    q[262] = 2341;
    r[262] = 3360;
    q[263] = 186;
    r[263] = -4091;
    q[264] = 4011;
    r[264] = 829;
    q[265] = -3490;
    r[265] = -2143;
    q[266] = 269;
    r[266] = -4087;
    q[267] = -2939;
    r[267] = 2852;
    q[268] = 1600;
    r[268] = 3770;
    q[269] = -3405;
    r[269] = -2275;
    q[270] = -3134;
    r[270] = -2636;
    q[271] = 2642;
    r[271] = -3129;
    q[272] = 3629;
    r[272] = 1898;
    q[273] = 3413;
    r[273] = 2264;
    q[274] = 2050;
    r[274] = 3545;
    q[275] = 988;
    r[275] = -3975;
    q[276] = -660;
    r[276] = 4042;
    q[277] = 978;
    r[277] = -3977;
    q[278] = 1965;
    r[278] = -3593;
    q[279] = -1513;
    r[279] = -3806;
    q[280] = -4076;
    r[280] = 401;
    q[281] = -4094;
    r[281] = -92;
    q[282] = -1914;
    r[282] = 3621;
    q[283] = 2006;
    r[283] = -3570;
    q[284] = -1550;
    r[284] = -3791;
    q[285] = 3774;
    r[285] = -1591;
    q[286] = -3958;
    r[286] = 1052;
    q[287] = -3576;
    r[287] = 1997;
    q[288] = -382;
    r[288] = 4078;
    q[289] = 1288;
    r[289] = 3888;
    q[290] = -2965;
    r[290] = -2825;
    q[291] = 1608;
    r[291] = 3767;
    q[292] = 3052;
    r[292] = -2731;
    q[293] = -622;
    r[293] = 4048;
    q[294] = -3836;
    r[294] = 1434;
    q[295] = -3542;
    r[295] = 2056;
    q[296] = -2648;
    r[296] = 3124;
    q[297] = -1178;
    r[297] = -3922;
    q[298] = -1109;
    r[298] = 3942;
    q[299] = 3910;
    r[299] = 1217;
    q[300] = 1199;
    r[300] = -3916;
    q[301] = -3386;
    r[301] = 2303;
    q[302] = -3453;
    r[302] = 2202;
    q[303] = -2877;
    r[303] = 2914;
    q[304] = 4095;
    r[304] = -47;
    q[305] = 3635;
    r[305] = 1886;
    q[306] = -2134;
    r[306] = -3495;
    q[307] = 613;
    r[307] = -4049;
    q[308] = -2700;
    r[308] = 3079;
    q[309] = 4091;
    r[309] = -195;
    q[310] = 3989;
    r[310] = -927;
    q[311] = -2385;
    r[311] = 3329;
    q[312] = 4094;
    r[312] = -103;
    q[313] = 1044;
    r[313] = -3960;
    q[314] = -1734;
    r[314] = -3710;
    q[315] = 1646;
    r[315] = 3750;
    q[316] = 575;
    r[316] = 4055;
    q[317] = -2629;
    r[317] = -3140;
    q[318] = 3266;
    r[318] = 2471;
    q[319] = 4091;
    r[319] = -194;
    q[320] = -2154;
    r[320] = 3483;
    q[321] = 659;
    r[321] = 4042;
    q[322] = -1785;
    r[322] = -3686;
    q[323] = -717;
    r[323] = -4032;
    q[324] = 4095;
    r[324] = -37;
    q[325] = -2963;
    r[325] = -2827;
    q[326] = -2645;
    r[326] = -3126;
    q[327] = 2619;
    r[327] = -3148;
    q[328] = 1855;
    r[328] = -3651;
    q[329] = -3726;
    r[329] = 1699;
    q[330] = -3437;
    r[330] = 2227;
    q[331] = 2948;
    r[331] = 2842;
    q[332] = -2125;
    r[332] = 3501;
    q[333] = -1700;
    r[333] = 3726;
    q[334] = 4094;
    r[334] = -101;
    q[335] = 2084;
    r[335] = -3525;
    q[336] = 3225;
    r[336] = -2524;
    q[337] = 2220;
    r[337] = 3442;
    q[338] = 3174;
    r[338] = 2588;
    q[339] = 229;
    r[339] = -4089;
    q[340] = -2381;
    r[340] = -3332;
    q[341] = -3677;
    r[341] = -1803;
    q[342] = -3191;
    r[342] = -2567;
    q[343] = 2465;
    r[343] = 3270;
    q[344] = 2681;
    r[344] = -3096;
    q[345] = 975;
    r[345] = -3978;
    q[346] = 2004;
    r[346] = -3572;
    q[347] = -3442;
    r[347] = -2219;
    q[348] = 3676;
    r[348] = -1805;
    q[349] = -3753;
    r[349] = 1638;
    q[350] = 3544;
    r[350] = 2053;
    q[351] = 397;
    r[351] = -4076;
    q[352] = 2221;
    r[352] = 3440;
    q[353] = -302;
    r[353] = 4084;
    q[354] = 4083;
    r[354] = -323;
    q[355] = -2253;
    r[355] = -3420;
    q[356] = -3038;
    r[356] = 2746;
    q[357] = 2884;
    r[357] = 2908;
    q[358] = 4070;
    r[358] = 454;
    q[359] = -1072;
    r[359] = -3953;
    q[360] = 3831;
    r[360] = 1449;
    q[361] = 3663;
    r[361] = -1831;
    q[362] = -1971;
    r[362] = 3590;
    q[363] = 3226;
    r[363] = -2522;
    q[364] = -145;
    r[364] = -4093;
    q[365] = 1882;
    r[365] = -3637;
    q[366] = 529;
    r[366] = 4061;
    q[367] = 2637;
    r[367] = 3133;
    q[368] = -4077;
    r[368] = 389;
    q[369] = 2156;
    r[369] = -3482;
    q[370] = -3276;
    r[370] = 2458;
    q[371] = -2687;
    r[371] = -3090;
    q[372] = 3469;
    r[372] = -2177;
    q[373] = -4093;
    r[373] = -139;
    q[374] = -850;
    r[374] = 4006;
    q[375] = -625;
    r[375] = 4048;
    q[376] = 1110;
    r[376] = -3942;
    q[377] = -3078;
    r[377] = -2702;
    q[378] = -2719;
    r[378] = 3063;
    q[379] = 742;
    r[379] = 4028;
    q[380] = -3902;
    r[380] = -1245;
    q[381] = 3888;
    r[381] = -1287;
    q[382] = -4081;
    r[382] = 347;
    q[383] = 1070;
    r[383] = 3953;
    q[384] = -996;
    r[384] = -3972;
    q[385] = 4041;
    r[385] = -668;
    q[386] = -2712;
    r[386] = 3069;
    q[387] = -3403;
    r[387] = -2279;
    q[388] = -3320;
    r[388] = -2398;
    q[389] = 3036;
    r[389] = -2749;
    q[390] = 1308;
    r[390] = -3881;
    q[391] = 2256;
    r[391] = 3418;
    q[392] = -1486;
    r[392] = 3816;
    q[393] = -2771;
    r[393] = -3015;
    q[394] = -3883;
    r[394] = -1302;
    q[395] = -3867;
    r[395] = -1349;
    q[396] = 3952;
    r[396] = -1075;
    q[397] = -789;
    r[397] = 4019;
    q[398] = 1458;
    r[398] = 3827;
    q[399] = 3832;
    r[399] = -1446;
    q[400] = -3001;
    r[400] = -2787;
    q[401] = 3463;
    r[401] = 2186;
    q[402] = 3606;
    r[402] = 1942;
    q[403] = 4023;
    r[403] = 764;
    q[404] = 3387;
    r[404] = 2303;
    q[405] = 2648;
    r[405] = -3124;
    q[406] = 1370;
    r[406] = -3860;
    q[407] = -3134;
    r[407] = 2636;
    q[408] = 4051;
    r[408] = -600;
    q[409] = -1977;
    r[409] = -3587;
    q[410] = 3160;
    r[410] = 2605;
    q[411] = 4042;
    r[411] = 659;
    q[412] = 3004;
    r[412] = 2783;
    q[413] = 3370;
    r[413] = 2327;
    q[414] = -419;
    r[414] = -4074;
    q[415] = -1968;
    r[415] = 3591;
    q[416] = -3705;
    r[416] = -1746;
    q[417] = -3331;
    r[417] = -2383;
    q[418] = -3634;
    r[418] = 1888;
    q[419] = -1981;
    r[419] = -3584;
    q[420] = 4069;
    r[420] = -469;
    q[421] = -628;
    r[421] = -4047;
    q[422] = -1900;
    r[422] = 3628;
    q[423] = 1039;
    r[423] = -3961;
    q[424] = 2554;
    r[424] = -3201;
    q[425] = -2955;
    r[425] = 2836;
    q[426] = 2286;
    r[426] = -3398;
    q[427] = -1624;
    r[427] = 3760;
    q[428] = 2213;
    r[428] = 3446;
    q[429] = -3989;
    r[429] = -926;
    q[430] = 192;
    r[430] = -4091;
    q[431] = -723;
    r[431] = 4031;
    q[432] = 2878;
    r[432] = 2913;
    q[433] = -2109;
    r[433] = 3511;
    q[434] = 1463;
    r[434] = -3825;
    q[435] = -741;
    r[435] = -4028;
    q[436] = -1314;
    r[436] = -3879;
    q[437] = 3115;
    r[437] = 2659;
    q[438] = -3160;
    r[438] = -2605;
    q[439] = 1868;
    r[439] = 3644;
    q[440] = -824;
    r[440] = 4012;
    q[441] = 781;
    r[441] = 4020;
    q[442] = -1257;
    r[442] = -3898;
    q[443] = 3331;
    r[443] = -2382;
    q[444] = 1642;
    r[444] = -3752;
    q[445] = 3748;
    r[445] = -1650;
    q[446] = -487;
    r[446] = -4066;
    q[447] = 3085;
    r[447] = -2694;
    q[448] = 4009;
    r[448] = 839;
    q[449] = -2308;
    r[449] = -3383;
    q[450] = 3850;
    r[450] = 1397;
    q[451] = -4078;
    r[451] = -374;
    q[452] = 2989;
    r[452] = -2799;
    q[453] = 3023;
    r[453] = -2762;
    q[454] = 1397;
    r[454] = -3850;
    q[455] = 323;
    r[455] = 4083;
    q[456] = 268;
    r[456] = -4087;
    q[457] = 2414;
    r[457] = 3308;
    q[458] = 3876;
    r[458] = 1322;
    q[459] = -3584;
    r[459] = 1982;
    q[460] = 1603;
    r[460] = 3769;
    q[461] = -1502;
    r[461] = 3810;
    q[462] = 1318;
    r[462] = 3878;
    q[463] = 1554;
    r[463] = -3789;
    q[464] = 2492;
    r[464] = 3250;
    q[465] = -4093;
    r[465] = -154;
    q[466] = 4008;
    r[466] = 842;
    q[467] = -2279;
    r[467] = 3403;
    q[468] = 3013;
    r[468] = 2774;
    q[469] = 2557;
    r[469] = 3199;
    q[470] = 4068;
    r[470] = 475;
    q[471] = 3324;
    r[471] = -2392;
    q[472] = 2653;
    r[472] = -3120;
    q[473] = 796;
    r[473] = 4017;
    q[474] = -1312;
    r[474] = 3880;
    q[475] = 1794;
    r[475] = 3681;
    q[476] = -2347;
    r[476] = -3356;
    q[477] = -4008;
    r[477] = -840;
    q[478] = -3773;
    r[478] = -1592;
    q[479] = 1609;
    r[479] = 3766;
    q[480] = -1564;
    r[480] = -3785;
    q[481] = 3004;
    r[481] = 2784;
    q[482] = 1258;
    r[482] = 3897;
    q[483] = 3729;
    r[483] = 1693;
    q[484] = -4095;
    r[484] = -28;
    q[485] = -4093;
    r[485] = -146;
    q[486] = 1393;
    r[486] = -3851;
    q[487] = 297;
    r[487] = -4085;
    q[488] = 2294;
    r[488] = 3393;
    q[489] = -2562;
    r[489] = 3195;
    q[490] = -1716;
    r[490] = -3718;
    q[491] = 2224;
    r[491] = -3439;
    q[492] = 2032;
    r[492] = 3555;
    q[493] = -2968;
    r[493] = 2822;
    q[494] = 2338;
    r[494] = 3363;
    q[495] = 1584;
    r[495] = -3776;
    q[496] = -3072;
    r[496] = 2708;
    q[497] = -1596;
    r[497] = -3771;
    q[498] = -2256;
    r[498] = -3418;
    q[499] = 4095;
    r[499] = 89;
    q[500] = -1949;
    r[500] = 3602;
    q[501] = 1844;
    r[501] = 3657;
    q[502] = -3375;
    r[502] = 2319;
    q[503] = -1481;
    r[503] = -3818;
    q[504] = 3228;
    r[504] = -2520;
    q[505] = 1116;
    r[505] = 3940;
    q[506] = -2783;
    r[506] = 3004;
    q[507] = 3915;
    r[507] = 1201;
    q[508] = 283;
    r[508] = 4086;
    q[509] = -3732;
    r[509] = 1685;
    q[510] = -433;
    r[510] = -4072;
    q[511] = -3667;
    r[511] = 1823;
    q[512] = 3883;
    r[512] = 1300;
    q[513] = -3742;
    r[513] = 1663;
    q[514] = 4093;
    r[514] = -143;
    q[515] = 3874;
    r[515] = 1328;
    q[516] = -3800;
    r[516] = 1528;
    q[517] = -1257;
    r[517] = 3898;
    q[518] = -1606;
    r[518] = 3767;
    q[519] = 3394;
    r[519] = 2291;
    q[520] = 2255;
    r[520] = 3419;
    q[521] = -4094;
    r[521] = 120;
    q[522] = -3767;
    r[522] = 1606;
    q[523] = 1849;
    r[523] = -3654;
    q[524] = -2883;
    r[524] = 2908;
    q[525] = 3469;
    r[525] = 2176;
    q[526] = 2654;
    r[526] = 3119;
    q[527] = -239;
    r[527] = 4088;
    q[528] = -651;
    r[528] = 4043;
    q[529] = -1140;
    r[529] = 3934;
    q[530] = 328;
    r[530] = -4082;
    q[531] = 3246;
    r[531] = 2497;
    q[532] = 4026;
    r[532] = -753;
    q[533] = -2041;
    r[533] = -3550;
    q[534] = -1154;
    r[534] = 3929;
    q[535] = -2710;
    r[535] = 3070;
    q[536] = -2860;
    r[536] = 2932;
    q[537] = 2097;
    r[537] = 3517;
    q[538] = 3492;
    r[538] = -2140;
    q[539] = 3123;
    r[539] = 2649;
    q[540] = 3360;
    r[540] = 2342;
    q[541] = 2498;
    r[541] = 3245;
    q[542] = 3976;
    r[542] = 982;
    q[543] = -2441;
    r[543] = -3288;
    q[544] = 3601;
    r[544] = 1951;
    q[545] = -4008;
    r[545] = -842;
    q[546] = 1243;
    r[546] = 3902;
    q[547] = 4069;
    r[547] = 466;
    q[548] = -2031;
    r[548] = 3556;
    q[549] = 4077;
    r[549] = 386;
    q[550] = -3112;
    r[550] = -2663;
    q[551] = 4087;
    r[551] = -262;
    q[552] = 4087;
    r[552] = 266;
    q[553] = -3907;
    r[553] = -1228;
    q[554] = -1611;
    r[554] = 3765;
    q[555] = 3066;
    r[555] = -2715;
    q[556] = 2657;
    r[556] = 3117;
    q[557] = 3912;
    r[557] = -1213;
    q[558] = -2531;
    r[558] = -3220;
    q[559] = 3500;
    r[559] = -2127;
    q[560] = -76;
    r[560] = -4095;
    q[561] = 3413;
    r[561] = -2264;
    q[562] = -4071;
    r[562] = -448;
    q[563] = 828;
    r[563] = 4011;
    q[564] = 3664;
    r[564] = 1830;
    q[565] = -1578;
    r[565] = 3779;
    q[566] = 3555;
    r[566] = 2033;
    q[567] = 3868;
    r[567] = -1345;
    q[568] = 4054;
    r[568] = -580;
    q[569] = -4094;
    r[569] = 124;
    q[570] = -3820;
    r[570] = -1477;
    q[571] = -3658;
    r[571] = -1842;
    q[572] = 2595;
    r[572] = 3168;
    q[573] = 3354;
    r[573] = 2350;
    q[574] = -701;
    r[574] = -4035;
    q[575] = -772;
    r[575] = -4022;
    q[576] = 2799;
    r[576] = 2990;
    q[577] = -3632;
    r[577] = 1893;
    q[578] = 310;
    r[578] = 4084;
    q[579] = 3984;
    r[579] = -947;
    q[580] = 3794;
    r[580] = -1542;
    q[581] = -2419;
    r[581] = 3304;
    q[582] = -3916;
    r[582] = 1200;
    q[583] = -3886;
    r[583] = 1292;
    q[584] = -3299;
    r[584] = 2426;
    q[585] = -437;
    r[585] = 4072;
    q[586] = 2053;
    r[586] = -3544;
    q[587] = 3987;
    r[587] = 937;
    q[588] = -789;
    r[588] = -4019;
    q[589] = 4055;
    r[589] = -575;
    q[590] = -3894;
    r[590] = 1270;
    q[591] = 4003;
    r[591] = -864;
    q[592] = -3060;
    r[592] = 2721;
    q[593] = -4009;
    r[593] = 836;
    q[594] = -1655;
    r[594] = -3746;
    q[595] = 3954;
    r[595] = -1067;
    q[596] = -773;
    r[596] = 4022;
    q[597] = -422;
    r[597] = 4074;
    q[598] = -3384;
    r[598] = 2306;
    q[599] = 195;
    r[599] = -4091;
    q[600] = -298;
    r[600] = 4085;
    q[601] = -3988;
    r[601] = 931;
    q[602] = 2014;
    r[602] = -3566;
    q[603] = 3349;
    r[603] = -2357;
    q[604] = 3800;
    r[604] = 1526;
    q[605] = 3858;
    r[605] = 1374;
    q[606] = 2947;
    r[606] = 2844;
    q[607] = -1483;
    r[607] = -3818;
    q[608] = 4056;
    r[608] = -565;
    q[609] = 2612;
    r[609] = -3154;
    q[610] = 2326;
    r[610] = 3371;
    q[611] = -3545;
    r[611] = 2051;
    q[612] = -1001;
    r[612] = -3971;
    q[613] = 3211;
    r[613] = 2541;
    q[614] = -2717;
    r[614] = 3065;
    q[615] = -3159;
    r[615] = -2606;
    q[616] = 2869;
    r[616] = -2922;
    q[617] = -1290;
    r[617] = -3887;
    q[618] = 2479;
    r[618] = 3260;
    q[619] = 3420;
    r[619] = 2252;
    q[620] = 1823;
    r[620] = 3667;
    q[621] = 3368;
    r[621] = 2330;
    q[622] = -3819;
    r[622] = -1480;
    q[623] = 3800;
    r[623] = 1528;
    q[624] = 3773;
    r[624] = 1594;
    q[625] = -189;
    r[625] = -4091;
    q[626] = -4067;
    r[626] = -485;
    q[627] = 2277;
    r[627] = -3404;
    q[628] = -4089;
    r[628] = -233;
    q[629] = -3634;
    r[629] = 1889;
    q[630] = 3292;
    r[630] = 2437;
    q[631] = -530;
    r[631] = 4061;
    q[632] = -3109;
    r[632] = 2666;
    q[633] = -3741;
    r[633] = 1667;
    q[634] = -1903;
    r[634] = -3626;
    q[635] = 3879;
    r[635] = -1315;
    q[636] = 4083;
    r[636] = -315;
    q[637] = -1148;
    r[637] = 3931;
    q[638] = 2630;
    r[638] = 3139;
    q[639] = -4001;
    r[639] = 876;
    q[640] = -2295;
    r[640] = -3392;
    q[641] = 1090;
    r[641] = -3948;
    q[642] = -3024;
    r[642] = 2762;
    q[643] = 2728;
    r[643] = -3054;
    q[644] = -3305;
    r[644] = 2419;
    q[645] = 60;
    r[645] = 4095;
    q[646] = 4048;
    r[646] = -620;
    q[647] = 589;
    r[647] = -4053;
    q[648] = -3867;
    r[648] = 1347;
    q[649] = -2944;
    r[649] = -2847;
    q[650] = -2721;
    r[650] = 3060;
    q[651] = 2928;
    r[651] = 2863;
    q[652] = 801;
    r[652] = 4016;
    q[653] = -3644;
    r[653] = 1870;
    q[654] = -1648;
    r[654] = -3749;
    q[655] = 825;
    r[655] = -4012;
    q[656] = -2036;
    r[656] = -3553;
    q[657] = -1192;
    r[657] = -3918;
    q[658] = 2875;
    r[658] = 2916;
    q[659] = -1831;
    r[659] = -3663;
    q[660] = -2865;
    r[660] = -2926;
    q[661] = -575;
    r[661] = -4055;
    q[662] = -3870;
    r[662] = 1340;
    q[663] = -4080;
    r[663] = -356;
    q[664] = -2176;
    r[664] = -3469;
    q[665] = -2986;
    r[665] = -2803;
    q[666] = 3978;
    r[666] = -972;
    q[667] = 2437;
    r[667] = 3291;
    q[668] = -3528;
    r[668] = 2080;
    q[669] = -3300;
    r[669] = -2425;
    q[670] = 3085;
    r[670] = 2693;
    q[671] = -3700;
    r[671] = -1756;
    q[672] = 3216;
    r[672] = -2535;
    q[673] = 4094;
    r[673] = -91;
    q[674] = 3775;
    r[674] = -1589;
    q[675] = 1097;
    r[675] = -3946;
    q[676] = -152;
    r[676] = -4093;
    q[677] = -3490;
    r[677] = 2142;
    q[678] = 3747;
    r[678] = 1654;
    q[679] = -1490;
    r[679] = -3815;
    q[680] = -3998;
    r[680] = -886;
    q[681] = 3726;
    r[681] = -1700;
    q[682] = -1600;
    r[682] = 3770;
    q[683] = -87;
    r[683] = 4095;
    q[684] = 2538;
    r[684] = -3214;
    q[685] = -4095;
    r[685] = 52;
    q[686] = -3993;
    r[686] = -910;
    q[687] = 4051;
    r[687] = 603;
    q[688] = -1242;
    r[688] = -3902;
    q[689] = 2155;
    r[689] = 3482;
    q[690] = 1270;
    r[690] = 3893;
    q[691] = 1919;
    r[691] = -3618;
    q[692] = -3145;
    r[692] = 2623;
    q[693] = 2475;
    r[693] = 3263;
    q[694] = 2226;
    r[694] = -3437;
    q[695] = -3894;
    r[695] = -1269;
    q[696] = -429;
    r[696] = 4073;
    q[697] = -1346;
    r[697] = 3868;
    q[698] = 1297;
    r[698] = 3885;
    q[699] = 1699;
    r[699] = 3726;
    q[700] = -3375;
    r[700] = 2319;
    q[701] = 1577;
    r[701] = -3779;
    q[702] = -63;
    r[702] = 4095;
    q[703] = 1215;
    r[703] = -3911;
    q[704] = -1492;
    r[704] = 3814;
    q[705] = -1530;
    r[705] = -3799;
    q[706] = 3442;
    r[706] = 2218;
    q[707] = -3867;
    r[707] = -1349;
    q[708] = -3291;
    r[708] = -2437;
    q[709] = -2253;
    r[709] = -3420;
    q[710] = -150;
    r[710] = -4093;
    q[711] = -2686;
    r[711] = -3092;
    q[712] = 3470;
    r[712] = 2175;
    q[713] = -3826;
    r[713] = -1461;
    q[714] = -3148;
    r[714] = 2619;
    q[715] = -3858;
    r[715] = 1375;
    q[716] = -3844;
    r[716] = -1412;
    q[717] = -3652;
    r[717] = 1854;
    q[718] = 4018;
    r[718] = -791;
    q[719] = 179;
    r[719] = -4092;
    q[720] = 3498;
    r[720] = 2129;
    q[721] = -1999;
    r[721] = -3574;
    q[722] = 3531;
    r[722] = 2075;
    q[723] = 4050;
    r[723] = -606;
    q[724] = -1639;
    r[724] = 3753;
    q[725] = -3661;
    r[725] = 1835;
    q[726] = 4039;
    r[726] = 679;
    q[727] = 3561;
    r[727] = 2023;
    q[728] = 528;
    r[728] = 4061;
    q[729] = -634;
    r[729] = -4046;
    q[730] = 364;
    r[730] = -4079;
    q[731] = 2735;
    r[731] = 3048;
    q[732] = 3978;
    r[732] = 973;
    q[733] = -4073;
    r[733] = -427;
    q[734] = -3722;
    r[734] = 1708;
    q[735] = 2356;
    r[735] = -3350;
    q[736] = -1125;
    r[736] = -3938;
    q[737] = 4054;
    r[737] = 580;
    q[738] = 3328;
    r[738] = -2387;
    q[739] = 1439;
    r[739] = -3834;
    q[740] = 1746;
    r[740] = 3705;
    q[741] = 2507;
    r[741] = 3238;
    q[742] = 3839;
    r[742] = -1427;
    q[743] = 488;
    r[743] = -4066;
    q[744] = 1187;
    r[744] = 3920;
    q[745] = 2038;
    r[745] = -3552;
    q[746] = -905;
    r[746] = -3994;
    q[747] = -236;
    r[747] = 4089;
    q[748] = 208;
    r[748] = -4090;
    q[749] = 1660;
    r[749] = 3744;
    q[750] = -4074;
    r[750] = -415;
    q[751] = -2304;
    r[751] = 3385;
    q[752] = -2457;
    r[752] = 3276;
    q[753] = 3302;
    r[753] = 2423;
    q[754] = 1778;
    r[754] = -3689;
    q[755] = 2019;
    r[755] = 3563;
    q[756] = 4037;
    r[756] = 687;
    q[757] = -2365;
    r[757] = 3343;
    q[758] = 5;
    r[758] = -4095;
    q[759] = 160;
    r[759] = -4092;

} /*initRand*/

/**
 * initializes the MEL-2_LINEAR LOOKUP TABLE
 * @param   sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @remarks translated from matlab code to c-code
 * @callgraph
 * @callergraph
 *
 *  input
 *  - bilinTab : base address of bilinTable destination vector
 *  - alpha : warping factor
 *  - size : size of the vectors to be generated
 *  - A,B : base address of array of indexes for lookup table implementation
 *  - D : base address of delta array for lookup table implementation
 *
 *  output
 *  - bilinTab, A, B, D  : initialized vectors
 */
void mel_2_lin_init(sig_innerobj_t *sig_inObj)
{

    /*Declare variables tied to  I/O PARAMS formerly passed by value or reference*/
    picoos_single alpha;
    picoos_int32 *D;
    picoos_int32 size;
    picoos_int16 *A;

    /*Link local variables with sig data object*/

    alpha = sig_inObj->warp_p;
    size = (sig_inObj->hfftsize_p) + 1;
    A = sig_inObj->A_p;
    D = sig_inObj->d_p;
    /*
     fixed point interpolation tables
     scaling factor: 0x20
     corresponding bit shift: 5
     */

    A[0] = 0;
    D[0] = 0;
    A[1] = 2;
    D[1] = 14;
    A[2] = 4;
    D[2] = 29;
    A[3] = 7;
    D[3] = 11;
    A[4] = 9;
    D[4] = 24;
    A[5] = 12;
    D[5] = 5;
    A[6] = 14;
    D[6] = 18;
    A[7] = 16;
    D[7] = 30;
    A[8] = 19;
    D[8] = 9;
    A[9] = 21;
    D[9] = 19;
    A[10] = 23;
    D[10] = 29;
    A[11] = 26;
    D[11] = 5;
    A[12] = 28;
    D[12] = 12;
    A[13] = 30;
    D[13] = 19;
    A[14] = 32;
    D[14] = 24;
    A[15] = 34;
    D[15] = 27;
    A[16] = 36;
    D[16] = 30;
    A[17] = 38;
    D[17] = 31;
    A[18] = 40;
    D[18] = 31;
    A[19] = 42;
    D[19] = 29;
    A[20] = 44;
    D[20] = 26;
    A[21] = 46;
    D[21] = 22;
    A[22] = 48;
    D[22] = 17;
    A[23] = 50;
    D[23] = 10;
    A[24] = 52;
    D[24] = 2;
    A[25] = 53;
    D[25] = 24;
    A[26] = 55;
    D[26] = 13;
    A[27] = 57;
    D[27] = 1;
    A[28] = 58;
    D[28] = 20;
    A[29] = 60;
    D[29] = 5;
    A[30] = 61;
    D[30] = 21;
    A[31] = 63;
    D[31] = 4;
    A[32] = 64;
    D[32] = 18;
    A[33] = 65;
    D[33] = 31;
    A[34] = 67;
    D[34] = 11;
    A[35] = 68;
    D[35] = 21;
    A[36] = 69;
    D[36] = 31;
    A[37] = 71;
    D[37] = 7;
    A[38] = 72;
    D[38] = 14;
    A[39] = 73;
    D[39] = 21;
    A[40] = 74;
    D[40] = 27;
    A[41] = 75;
    D[41] = 31;
    A[42] = 77;
    D[42] = 3;
    A[43] = 78;
    D[43] = 6;
    A[44] = 79;
    D[44] = 8;
    A[45] = 80;
    D[45] = 10;
    A[46] = 81;
    D[46] = 10;
    A[47] = 82;
    D[47] = 10;
    A[48] = 83;
    D[48] = 9;
    A[49] = 84;
    D[49] = 8;
    A[50] = 85;
    D[50] = 6;
    A[51] = 86;
    D[51] = 3;
    A[52] = 86;
    D[52] = 31;
    A[53] = 87;
    D[53] = 27;
    A[54] = 88;
    D[54] = 23;
    A[55] = 89;
    D[55] = 18;
    A[56] = 90;
    D[56] = 12;
    A[57] = 91;
    D[57] = 6;
    A[58] = 91;
    D[58] = 31;
    A[59] = 92;
    D[59] = 24;
    A[60] = 93;
    D[60] = 16;
    A[61] = 94;
    D[61] = 8;
    A[62] = 94;
    D[62] = 31;
    A[63] = 95;
    D[63] = 22;
    A[64] = 96;
    D[64] = 13;
    A[65] = 97;
    D[65] = 3;
    A[66] = 97;
    D[66] = 25;
    A[67] = 98;
    D[67] = 14;
    A[68] = 99;
    D[68] = 3;
    A[69] = 99;
    D[69] = 24;
    A[70] = 100;
    D[70] = 13;
    A[71] = 101;
    D[71] = 1;
    A[72] = 101;
    D[72] = 21;
    A[73] = 102;
    D[73] = 8;
    A[74] = 102;
    D[74] = 27;
    A[75] = 103;
    D[75] = 14;
    A[76] = 104;
    D[76] = 1;
    A[77] = 104;
    D[77] = 19;
    A[78] = 105;
    D[78] = 6;
    A[79] = 105;
    D[79] = 24;
    A[80] = 106;
    D[80] = 9;
    A[81] = 106;
    D[81] = 27;
    A[82] = 107;
    D[82] = 12;
    A[83] = 107;
    D[83] = 29;
    A[84] = 108;
    D[84] = 14;
    A[85] = 108;
    D[85] = 31;
    A[86] = 109;
    D[86] = 15;
    A[87] = 109;
    D[87] = 31;
    A[88] = 110;
    D[88] = 16;
    A[89] = 110;
    D[89] = 31;
    A[90] = 111;
    D[90] = 15;
    A[91] = 111;
    D[91] = 31;
    A[92] = 112;
    D[92] = 14;
    A[93] = 112;
    D[93] = 30;
    A[94] = 113;
    D[94] = 13;
    A[95] = 113;
    D[95] = 28;
    A[96] = 114;
    D[96] = 11;
    A[97] = 114;
    D[97] = 26;
    A[98] = 115;
    D[98] = 9;
    A[99] = 115;
    D[99] = 23;
    A[100] = 116;
    D[100] = 6;
    A[101] = 116;
    D[101] = 20;
    A[102] = 117;
    D[102] = 2;
    A[103] = 117;
    D[103] = 16;
    A[104] = 117;
    D[104] = 31;
    A[105] = 118;
    D[105] = 13;
    A[106] = 118;
    D[106] = 27;
    A[107] = 119;
    D[107] = 8;
    A[108] = 119;
    D[108] = 22;
    A[109] = 120;
    D[109] = 4;
    A[110] = 120;
    D[110] = 17;
    A[111] = 120;
    D[111] = 31;
    A[112] = 121;
    D[112] = 13;
    A[113] = 121;
    D[113] = 26;
    A[114] = 122;
    D[114] = 8;
    A[115] = 122;
    D[115] = 21;
    A[116] = 123;
    D[116] = 2;
    A[117] = 123;
    D[117] = 15;
    A[118] = 123;
    D[118] = 29;
    A[119] = 124;
    D[119] = 10;
    A[120] = 124;
    D[120] = 23;
    A[121] = 125;
    D[121] = 4;
    A[122] = 125;
    D[122] = 17;
    A[123] = 125;
    D[123] = 31;
    A[124] = 126;
    D[124] = 12;
    A[125] = 126;
    D[125] = 25;
    A[126] = 127;
    D[126] = 6;
    A[127] = 127;
    D[127] = 19;
    A[128] = 128;
    D[128] = 0;

}/*mel_2_lin_init*/

/**
 * function to be documented
 * @param    ang : ??
 * @param    table : ??
 * @param    cs : ??
 * @param    sn : ??
 * @return  void
 * @callgraph
 * @callergraph
 */
static void get_trig(picoos_int32 ang, picoos_int32 *table, picoos_int32 *cs,
        picoos_int32 *sn)
{
    picoos_int32 i, j, k;

    i = k = ang >> PICODSP_PI_SHIFT; /*  * PICODSP_COS_TABLE_LEN2/PICODSP_FIX_SCALE2 */
    if (i < 0)
        i = -i;
    j = 1;
    i &= (PICODSP_COS_TABLE_LEN4 - 1);
    if (i > PICODSP_COS_TABLE_LEN2)
        i = PICODSP_COS_TABLE_LEN4 - i;
    if (i > PICODSP_COS_TABLE_LEN) {
        j = -1;
        i = PICODSP_COS_TABLE_LEN2 - i;
    }
    if (j == 1)
        *cs = table[i];
    else
        *cs = -table[i];

    i = k - PICODSP_COS_TABLE_LEN;
    if (i < 0)
        i = -i;
    j = 1;
    i &= (PICODSP_COS_TABLE_LEN4 - 1);
    if (i > PICODSP_COS_TABLE_LEN2)
        i = PICODSP_COS_TABLE_LEN4 - i;
    if (i > PICODSP_COS_TABLE_LEN) {
        j = -1;
        i = PICODSP_COS_TABLE_LEN2 - i;
    }
    if (j == 1)
        *sn = table[i];
    else
        *sn = -table[i];
}/*get_trig*/

/**
 * function to be documented
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @return  void
 * @callgraph
 * @callergraph
 */
void save_transition_frame(sig_innerobj_t *sig_inObj)
{
    picoos_int32 *tmp, *tmp2; /*for loop unrolling*/

    if (sig_inObj->voiced_p != sig_inObj->prevVoiced_p) {
        sig_inObj->VoicTrans = sig_inObj->prevVoiced_p; /*remember last voicing transition*/
        tmp = sig_inObj->ImpResp_p;
        tmp2 = sig_inObj->imp_p;
        FAST_DEVICE(PICODSP_FFTSIZE,*(tmp++)=*(tmp2++););
        if (sig_inObj->voiced_p == 1)
            sig_inObj->nV = 0;
        else
            sig_inObj->nU = 0; /*to avoid problems in case of very short voiced or unvoiced parts (less than 4 frames long)*/
    }
}/*save_transition_frame*/

/**
 * calculates an unweighted excitation window
 * @param    sig_inObj : sig PU internal object of the sub-object
 * @param    nextPeak : position of next peak (excitation position)
 * @return  PICO_OK
 * @callgraph
 * @callergraph
 * input
 * - hop : hop size in samples
 * - winlen : excitation window length
 * - E : energy
 * - F0 : pitch
 * - nextPeak : state that remembers next excitation index
 * - Fs - sampling frequency
 * output
 * - LocV, LocU : (MAX_EN size) location of excitation points
 * - EnV,  EnU    : (MAX_EN size) RMS values of excitation (scaled)
 * - nV, nU :    (integers) number of excitation points
 * - nextPeak    new position of lastPeak to calculate next frame
 */
static void get_simple_excitation(sig_innerobj_t *sig_inObj,
        picoos_int16 *nextPeak)
{
    /*Define local variables*/
    picoos_int16 nI, nJ, k;
    /* picoos_single    InvSqrt3=(picoos_single)2/(picoos_single)sqrt(3.0); *//*constant*/
    picoos_int32 Ti, sqrtTi;
    picoos_int16 hop, winlen, Fs;
    picoos_single E, F0;
    picoos_int16 voiced;
    picoos_single fact; /*normalization factor*/
    picoos_single rounding = 0.5f;

    /*Link local variables to sig object*/
    hop = sig_inObj->hop_p;
    winlen = sig_inObj->m2_p;
    Fs = sig_inObj->Fs_p;
    E = sig_inObj->E_p;
    F0 = sig_inObj->F0_p;
    voiced = sig_inObj->voiced_p;

    E = (E > 5) ? 9 : (E > 1) ? 2 * E - 1 : E;


    /* shift previous excitation window by hop samples*/
    for (nI = 0; nI < sig_inObj->nV; nI++) {
        sig_inObj->LocV[nI] = sig_inObj->LocV[nI] - hop;
    }
    for (nI = 0; nI < sig_inObj->nU; nI++) {
        sig_inObj->LocU[nI] = sig_inObj->LocU[nI] - hop;
    }

    /*get rid of the voiced points that fall out of the interval*/
    nI = 0;
    while ((sig_inObj->LocV[nI] < 0) && nI < sig_inObj->nV)
        nI++;

    for (nJ = nI; nJ < sig_inObj->nV; nJ++) {
        sig_inObj->LocV[nJ - nI] = sig_inObj->LocV[nJ];
        sig_inObj->EnV[nJ - nI] = sig_inObj->EnV[nJ];
    }
    sig_inObj->nV -= nI;
    /*get rid of the unvoiced points that fall out of the interval */
    nI = 0;
    while ((sig_inObj->LocU[nI] < 0) && nI < sig_inObj->nU)
        nI++;

    for (nJ = nI; nJ < sig_inObj->nU; nJ++) {
        sig_inObj->LocU[nJ - nI] = sig_inObj->LocU[nJ];
        sig_inObj->EnU[nJ - nI] = sig_inObj->EnU[nJ];
    }
    sig_inObj->nU -= nI;

    *nextPeak -= hop;
    k = *nextPeak;

    fact = 3;
    if (voiced == 0) { /*Unvoiced*/

        Ti = (picoos_int32) (rounding + (picoos_single) Fs
                / (picoos_single) sig_inObj->Fuv_p); /* round Period*/
        sqrtTi = (picoos_int32) (E * sqrt((double) Fs
                / (hop * sig_inObj->Fuv_p)) * fact * PICODSP_GETEXC_K1);
        while (k < winlen) {
            if (k < winlen) {
                sig_inObj->LocU[sig_inObj->nU] = k;
                sig_inObj->EnU[sig_inObj->nU] = sqrtTi;
                sig_inObj->nU++;
                k += (picoos_int16) Ti;
            }
        }
    } else { /*Voiced*/
        Ti
                = (picoos_int32) (rounding + (picoos_single) Fs
                        / (picoos_single) F0); /*Period*/
        sqrtTi = (picoos_int32) (E
                * sqrt((double) Fs / (hop * sig_inObj->F0_p)) * fact
                * PICODSP_GETEXC_K1);
        while (k < winlen) {
            sig_inObj->LocV[sig_inObj->nV] = k;
            sig_inObj->EnV[sig_inObj->nV] = sqrtTi;
            sig_inObj->nV++;
            k += (picoos_int16) Ti;
        }
    }
    *nextPeak = k;

}/*get_simple_excitation*/

#ifdef __cplusplus
}
#endif

/* end picosig2.c */