Commit bf675ce2 authored by Dominik Weckbecker's avatar Dominik Weckbecker 💬
Browse files

implement sector-based higher-order DirAC processing

parent c1229fde
Loading
Loading
Loading
Loading

lib_com/ivas_cnst.h

100644 → 100755
+13 −0
Original line number Diff line number Diff line
@@ -903,7 +903,11 @@ typedef enum
 * DirAC Constants 
 *----------------------------------------------------------------------------------*/

#ifdef HODIRAC
#define DIRAC_MAX_ANA_CHANS                     16                          /* Maximum number of channels for DirAC analysis */
#else
#define DIRAC_MAX_ANA_CHANS                     FOA_CHANNELS                /* Maximum number of channels for DirAC analysis */
#endif

#define DIRAC_NUM_DIMS                          3                           /* number of directions to estimate (X,Y,Z) */
#define DIRAC_MAX_NBANDS                        12                          /* Maximum number of frequency bands for the DirAC Side Parameter decoding */
@@ -917,6 +921,11 @@ typedef enum
#define DIRAC_NO_FB_BANDS_MAX                   MDFT_FB_BANDS_240
#define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM        ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */

#ifdef HODIRAC
#define DIRAC_HO_NUMSECTORS                     2
#define NUM_ANA_SECTORS 2
#endif


/* DirAC renderer setup */
typedef enum
@@ -1179,7 +1188,11 @@ enum
#define MASA_ANGLE_TOLERANCE                    0.5f
#define MASA_LIMIT_NO_BANDS_SUR_COH             8
#define MINIMUM_BIT_BUDGET_NORMAL_META          100
#ifdef HODIRAC
#define DIFF_DFRATIO_2BIT_LIMIT_IDX             4
#else
#define DIFF_DFRATIO_2BIT_LIMIT_IDX             3
#endif
#define DIFF_DFRATIO_1BIT_LIMIT_IDX             6
#define DIFF_EC_HUFF_BAND_LIMIT                 8
#define DIFF_EC_HUFF_GR0_LIMIT                  8
+249 −9
Original line number Diff line number Diff line
@@ -71,8 +71,10 @@ ivas_error ivas_dirac_config(
    int16_t spar_dirac_split_band;
    IVAS_FB_MIXER_HANDLE hFbMdft;
    SBA_MODE sba_mode;

    int16_t *dirac_to_spar_md_bands;


    error = IVAS_ERR_OK;

    if ( enc_dec == ENC )
@@ -127,8 +129,19 @@ ivas_error ivas_dirac_config(

    if ( sba_mode == SBA_MODE_SPAR )
    {
#ifdef HODIRAC_FAT_BANDS
        hConfig->nbands = 6;
#else
        hConfig->nbands = IVAS_MAX_NUM_BANDS;
#endif

        spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND );
#ifdef HODIRAC
        if ( sba_order > 1 )
        {
            spar_dirac_split_band = 0;
        }
#endif
    }
    else
    {
@@ -162,6 +175,16 @@ ivas_error ivas_dirac_config(
            {
                hConfig->enc_param_start_band = spar_dirac_split_band;
            }
#ifdef HODIRAC
            if ( sba_order > 1 )
            {
                hConfig->dec_param_estim = FALSE;
                hConfig->enc_param_start_band = 0;

                set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands );
                hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands;
            }
#endif
        }
        else
        {
@@ -174,7 +197,13 @@ ivas_error ivas_dirac_config(

    if ( sba_mode == SBA_MODE_SPAR )
    {
        ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
        ivas_dirac_config_bands( band_grouping,
#ifdef HODIRAC_FAT_BANDS
                                 hConfig->nbands,
#else
                                 IVAS_MAX_NUM_BANDS,
#endif
                                 (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ),
                                 dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft );
    }
    else
@@ -351,13 +380,28 @@ ivas_error ivas_dirac_sba_config(
        else
        {
            hQMetaData->useLowerBandRes = 0;
#ifdef HODIRAC
            if ( !( sba_order > 1 ) )
#endif
            {
                nbands_coded = nbands - 1; /* always combine the last two bands */
            }
        }

        {
            int16_t no_dirs = 1;
#ifdef HODIRAC
            if ( sba_order > 1 )
            {
                no_dirs = 2;
            }
#endif

        if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK )
            if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK )
            {
                return error;
            }
        }

        if ( sba_total_brate <= IVAS_13k2 )
        {
@@ -410,7 +454,12 @@ ivas_error ivas_dirac_sba_config(
            hQMetaData->metadata_max_bits = MAX16B; /* no limit */
        }

#ifdef HODIRAC_FAT_BANDS
        if ( sba_total_brate <= IVAS_128k )
#endif
        {
            hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 );
        }
        hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;

        return error;
@@ -449,11 +498,19 @@ ivas_error ivas_dirac_sba_config(
        }
        if ( sba_total_brate >= IVAS_96k )
        {
            if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK )
            {
                int16_t no_dirs = 1;
#ifdef HODIRAC
                if ( sba_order > 1 )
                {
                    no_dirs = 2;
                }
#endif
                if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK )
                {
                    return error;
                }

            }
            nbands_wb = 4;
        }
        else
@@ -481,8 +538,17 @@ ivas_error ivas_dirac_sba_config(
            for ( i = 0; i < hQMetaData->no_directions; i++ )
            {
                hQMetaData->q_direction[i].cfg.search_effort = 1;
#ifdef HODIRAC
                if ( sba_order > 1 )
                {
                    hQMetaData->q_direction[i].cfg.start_band = 0;
                }
                else
#endif
                {
                    hQMetaData->q_direction[i].cfg.start_band = nbands_wb;
                }
            }

            *element_mode = IVAS_CPE_MDCT;
        }
@@ -784,6 +850,180 @@ void deindex_spherical_component(
    return;
}

#ifdef HODIRAC
void calculate_hodirac_sector_parameters(
    float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector (L+1)^2 x N_bins, real part */
    float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i: signal vector, imaginary part*/
    const int16_t N_bins,                                         /* i: number of bins */
    const float beta,                                             /* i: forgetting factor for average filtering */
    const int16_t *band_grouping,                                 /* i: indices of band groups */
    const int16_t N_bands,                                        /* i: number of bands (groups) */
    const int16_t enc_param_start_band,                           /* i: first band to process */
    float *azi,                                                   /* o: array of sector azimuth angles, flat */
    float *ele,                                                   /* o: array of sector elevation angles, flat */
    float *diff,                                                  /* o: array of sector diffuseness values, flat*/
    float *ene                                                    /* o: array of sector energy values, flat*/
)
{
    int16_t i_sec, i_bin, i_band;

    float p_real, p_imag, normI, energy, theta, phi, tmp_diff;
    float sec_w_real[NUM_ANA_SECTORS];
    float sec_x_real[NUM_ANA_SECTORS];
    float sec_y_real[NUM_ANA_SECTORS];
    float sec_z_real[NUM_ANA_SECTORS];
    float sec_w_imag[NUM_ANA_SECTORS];
    float sec_x_imag[NUM_ANA_SECTORS];
    float sec_y_imag[NUM_ANA_SECTORS];
    float sec_z_imag[NUM_ANA_SECTORS];

    float sec_I_vec_x[NUM_ANA_SECTORS];
    float sec_I_vec_y[NUM_ANA_SECTORS];
    float sec_I_vec_z[NUM_ANA_SECTORS];

    static int16_t firstrun_sector_params = 1;

    static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];

    static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS];
    static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];
    static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS];

#ifdef DEBUGGING
    assert( N_bins <= DIRAC_NO_FB_BANDS_MAX );
#endif

    for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ )
    {
        float *p_sec_w_real = &sec_w_real[i_sec];
        float *p_sec_x_real = &sec_x_real[i_sec];
        float *p_sec_y_real = &sec_y_real[i_sec];
        float *p_sec_z_real = &sec_z_real[i_sec];

        float *p_sec_w_imag = &sec_w_imag[i_sec];
        float *p_sec_x_imag = &sec_x_imag[i_sec];
        float *p_sec_y_imag = &sec_y_imag[i_sec];
        float *p_sec_z_imag = &sec_z_imag[i_sec];

        for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ )
        {
            sec_I_vec_x[i_sec] = 0.f;
            sec_I_vec_y[i_sec] = 0.f;
            sec_I_vec_z[i_sec] = 0.f;
            energy = 0.f;

            for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ )
            {
                if ( i_sec == 0 )
                {
                    *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin];
                    *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin];
                    *p_sec_y_imag = 5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin];
                    *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin];

                    *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin];
                    *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin];
                    *p_sec_y_real = 5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] - 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin];
                    *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin];
                }
                else
                {
                    *p_sec_w_imag = 1.772454e+00f * ImagBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin];
                    *p_sec_x_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[4][i_bin];
                    *p_sec_y_imag = -5.908180e-01f * ImagBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * ImagBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * ImagBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * ImagBuffer[8][i_bin];
                    *p_sec_z_imag = 1.023327e+00f * 1.732050776481628f * ImagBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * ImagBuffer[5][i_bin];

                    *p_sec_w_real = 1.772454e+00f * RealBuffer[0][i_bin] - 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin];
                    *p_sec_x_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[3][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[4][i_bin];
                    *p_sec_y_real = -5.908180e-01f * RealBuffer[0][i_bin] + 1.023327e+00f * 1.732050776481628f * RealBuffer[1][i_bin] + 2.642218e-01f * 2.236068010330200f * RealBuffer[6][i_bin] + 4.576456e-01f * 2.236068010330200f * RealBuffer[8][i_bin];
                    *p_sec_z_real = 1.023327e+00f * 1.732050776481628f * RealBuffer[2][i_bin] - 4.576456e-01f * 2.236068010330200f * RealBuffer[5][i_bin];
                }

                // active intensity
                p_real = *p_sec_w_real;
                p_imag = *p_sec_w_imag;
                // freq weighting
                p_real *= c_weights[i_bin];
                p_imag *= c_weights[i_bin];
                sec_I_vec_x[i_sec] += p_real * *p_sec_x_real + p_imag * *p_sec_x_imag;
                sec_I_vec_y[i_sec] += p_real * *p_sec_y_real + p_imag * *p_sec_y_imag;
                sec_I_vec_z[i_sec] += p_real * *p_sec_z_real + p_imag * *p_sec_z_imag;

                energy += 0.5f * ( p_real * p_real + p_imag * p_imag + *p_sec_x_real * *p_sec_x_real + *p_sec_x_imag * *p_sec_x_imag +
                                   *p_sec_y_real * *p_sec_y_real + *p_sec_y_imag * *p_sec_y_imag +
                                   *p_sec_z_real * *p_sec_z_real + *p_sec_z_imag * *p_sec_z_imag );
            }

            // time-smoothing
            if ( firstrun_sector_params )
            {
                sec_I_vec_smth_x[i_sec][i_band] = sec_I_vec_x[i_sec];
                sec_I_vec_smth_y[i_sec][i_band] = sec_I_vec_y[i_sec];
                sec_I_vec_smth_z[i_sec][i_band] = sec_I_vec_z[i_sec];
                energy_smth[i_sec][i_band] = energy;
            }
            else
            {
                sec_I_vec_smth_x[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_x[i_sec] + beta * sec_I_vec_smth_x[i_sec][i_band];
                sec_I_vec_smth_y[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_y[i_sec] + beta * sec_I_vec_smth_y[i_sec][i_band];
                sec_I_vec_smth_z[i_sec][i_band] = ( 1.0f - beta ) * sec_I_vec_z[i_sec] + beta * sec_I_vec_smth_z[i_sec][i_band];
                energy_smth[i_sec][i_band] = ( 1.0f - beta ) * energy + beta * energy_smth[i_sec][i_band];
            }

            if ( energy < EPSILON )
            {
                azi[i_sec * N_bands + i_band] = 0.f;
                ele[i_sec * N_bands + i_band] = 0.f;
                ene[i_sec * N_bands + i_band] = 0.f;
                diff[i_sec * N_bands + i_band] = 1.f;
            }
            else
            {
                normI = sqrtf( sec_I_vec_smth_x[i_sec][i_band] * sec_I_vec_smth_x[i_sec][i_band] +
                               sec_I_vec_smth_y[i_sec][i_band] * sec_I_vec_smth_y[i_sec][i_band] +
                               sec_I_vec_smth_z[i_sec][i_band] * sec_I_vec_smth_z[i_sec][i_band] );
                theta = asinf( sec_I_vec_smth_z[i_sec][i_band] / ( normI + EPSILON ) );
                phi = atan2f( sec_I_vec_smth_y[i_sec][i_band], sec_I_vec_smth_x[i_sec][i_band] );
                azi[i_sec * N_bands + i_band] = phi * _180_OVER_PI;
                ele[i_sec * N_bands + i_band] = theta * _180_OVER_PI;
                ene[i_sec * N_bands + i_band] = energy_smth[i_sec][i_band];
                diff[i_sec * N_bands + i_band] = 1.f - normI / ( energy_smth[i_sec][i_band] + EPSILON );
            }

            // post
            tmp_diff = diff[i_sec * N_bands + i_band];
            assert( tmp_diff < 1.0001f && tmp_diff > -0.0001f );
            if ( tmp_diff < 0.0f )
            {
                diff[i_sec * N_bands + i_band] = 0.f;
            }
            if ( tmp_diff > 0.5f )
            {
                if ( firstrun_sector_params )
                {
                    azi[i_sec * N_bands + i_band] = 0.f;
                    ele[i_sec * N_bands + i_band] = 0.f;
                }
                else
                {
                    azi[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * azi[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * azi_prev[i_sec * N_bands + i_band];
                    ele[i_sec * N_bands + i_band] = 2.f * ( 1.f - tmp_diff ) * ele[i_sec * N_bands + i_band] + ( 2.f * tmp_diff - 1.f ) * ele_prev[i_sec * N_bands + i_band];
                }
            }
            else
            {
                azi_prev[i_sec * N_bands + i_band] = azi[i_sec * N_bands + i_band];
                ele_prev[i_sec * N_bands + i_band] = ele[i_sec * N_bands + i_band];
            }
        } // i_band
    }     // i_sec

    firstrun_sector_params = 0;
}
#endif


/*-----------------------------------------------------------------------*
 * Local functions
+77 −4
Original line number Diff line number Diff line
@@ -106,6 +106,10 @@ ivas_error ivas_fb_set_cfg(
    const int16_t num_out_chans,   /* i  : number of FB output channels*/
    const int16_t active_w_mixing, /* i  : active_w_mixing flag        */
    const int32_t sampling_rate    /* i  : sampling rate               */
#ifdef HODIRAC
    ,
    const int16_t nchan_dirac_ana /* i: number of dirac analysis channels */
#endif
)
{
    IVAS_FB_CFG *pFb_cfg;
@@ -117,6 +121,9 @@ ivas_error ivas_fb_set_cfg(

    pFb_cfg->num_in_chans = num_in_chans;
    pFb_cfg->num_out_chans = num_out_chans;
#ifdef HODIRAC
    pFb_cfg->nchan_dirac_ana = nchan_dirac_ana;
#endif

    pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */
    pFb_cfg->active_w_mixing = active_w_mixing;
@@ -215,11 +222,19 @@ ivas_error ivas_FB_mixer_open(
    }
    else if ( fb_cfg->active_w_mixing )
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }
    else
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana );
#else
        num_chs_alloc = fb_cfg->num_out_chans;
#endif
    }

    for ( i = 0; i < num_chs_alloc; i++ )
@@ -251,7 +266,11 @@ ivas_error ivas_FB_mixer_open(
    }
    else
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }

    for ( i = 0; i < num_chs_alloc; i++ )
@@ -267,7 +286,13 @@ ivas_error ivas_FB_mixer_open(
    {
        float *pTemp_mem;

        if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL )
        if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans *
#ifdef HODIRAC
                                             max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana ) *
#else
                                             fb_cfg->num_in_chans *
#endif
                                             IVAS_MAX_NUM_BANDS ) ) == NULL )
        {
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" );
        }
@@ -378,11 +403,19 @@ void ivas_FB_mixer_close(
    }
    else if ( fb_cfg->active_w_mixing )
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana );
#else
        num_chs_alloc = fb_cfg->num_in_chans;
#endif
    }
    else
    {
#ifdef HODIRAC
        num_chs_alloc = max( fb_cfg->num_out_chans, fb_cfg->nchan_dirac_ana );
#else
        num_chs_alloc = fb_cfg->num_out_chans;
#endif
    }

    if ( hFbMixer != NULL )
@@ -405,10 +438,17 @@ void ivas_FB_mixer_close(
        {
            num_chs_alloc = 0;
        }

        else
        {
#ifdef HODIRAC
            num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_dirac_ana );
#else
            num_chs_alloc = fb_cfg->num_in_chans;
#endif
        }


        for ( i = 0; i < num_chs_alloc; i++ )
        {
            free( hFbMixer->ppFilterbank_prior_input[i] );
@@ -504,7 +544,11 @@ void ivas_fb_mixer_pcm_ingest(
    for ( i = 0; i < fb_cfg->num_in_chans; i++ )
    {
        mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len );
#ifdef HODIRAC
        mvr2r( pcm_in[HOA_keep_ind[i]], &ppOut_pcm[i][frame_len], frame_len );
#else
        mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len );
#endif
    }

    for ( i = 0; i < num_chs_ingest; i++ )
@@ -530,7 +574,13 @@ void ivas_fb_mixer_update_prior_input(
{
    int16_t i;

    for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ )
    for ( i = 0; i <
#ifdef HODIRAC
                 max( hFbMixer->fb_cfg->num_in_chans, hFbMixer->fb_cfg->nchan_dirac_ana );
#else
                 hFbMixer->fb_cfg->num_in_chans;
#endif
          i++ )
    {
        mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length );
        mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length );
@@ -553,6 +603,10 @@ void ivas_fb_mixer_get_windowed_fr(
    float *frame_f_imag[],         /* o  : imag freq domain values            */
    const int16_t length,          /* i  : number of new samples in time slot */
    const int16_t mdft_len         /* i  : MDFT frame length                  */
#ifdef HODIRAC
    ,
    const int16_t hodirac /* i: flag for skipping non-planar 3rd-order ambisonic channels*/
#endif
)
{
    int16_t ch_idx, j, offset, rev_offset;
@@ -561,14 +615,32 @@ void ivas_fb_mixer_get_windowed_fr(
    float fr_in_block[L_FRAME48k * 2];
    const float *win_ptr;

#ifdef HODIRAC
    int16_t nchan_ana = max( hFbMixer->fb_cfg->nchan_dirac_ana, hFbMixer->fb_cfg->num_in_chans );
#endif

    n_old_samples = min( ( hFbMixer->fb_cfg->prior_input_length - hFbMixer->fb_cfg->windowed_fr_offset ), ( 2 * mdft_len ) );
    n_new_samples = max( 0, 2 * length - n_old_samples );
    offset = (int16_t) ( 2 * mdft_len - length - hFbMixer->ana_window_offset );
    rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset );
    set_zero( fr_in_block, offset );

    for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ )
    for ( ch_idx = 0; ch_idx <
#ifdef HODIRAC
                      nchan_ana
#else
                      hFbMixer->fb_cfg->num_in_chans
#endif
          ;
          ch_idx++ )
    {
#ifdef HODIRAC
        if ( hodirac && ch_idx >= 10 && ch_idx <= 14 )
        {
            continue;
        }
#endif

        mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset );
        mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples );
        win_ptr = hFbMixer->pAna_window;
@@ -692,6 +764,7 @@ void ivas_fb_mixer_process(
                    {
                        int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i];
                        int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i];

                        float mixer_const = hFbMixer->prior_mixer[ch][j][i];

                        pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i];
+64 −1

File changed.

Preview size limit exceeded, changes collapsed.

+27 −10
Original line number Diff line number Diff line
@@ -508,13 +508,28 @@ void masa_compensate_two_dir_energy_ratio_index(
    const int16_t ratio_index_2, /* i  : Input ratio for direction 2           */
    int16_t *ratio_index_mod1,   /* o  : Output modified ratio for direction 1 */
    int16_t *ratio_index_mod2    /* o  : Output modified ratio for direction 2 */
#ifdef HODIRAC
    ,
    int16_t hodirac /* i: flag to indicate sector processing */
#endif
)
{
    float ratio1, ratio2, ratioSum;
    float ratio1, ratio2;
#ifndef HODIRAC
    float ratioSum;
#endif

    ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1];
    ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2];

#ifdef HODIRAC
    if ( !hodirac )
#endif
    {
#ifdef HODIRAC
        float ratioSum;
#endif
        
        ratioSum = ratio1 + ratio2;
        if ( ratio1 >= ratio2 )
        {
@@ -526,6 +541,8 @@ void masa_compensate_two_dir_energy_ratio_index(
            ratio1 = ratio1 / ratio2 * ratioSum;
            ratio2 = ratioSum;
        }
    }

    *ratio_index_mod1 = masa_sq( 1.0f - ratio1, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );
    *ratio_index_mod2 = masa_sq( 1.0f - ratio2, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS );

Loading