Commit 23094e13 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_789_fix' into 'main'

Fix for issue 789: Fluttering noise in SBA binaural room reverb output

See merge request !384
parents 7faf183c 48a8e623
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -7718,7 +7718,7 @@ void tcx_noise_filling_flt(
    const int16_t L_frame,
    const float tiltCompFactor,
    float fac_ns,
    uint8_t *infoTCXNoise,
    Word16 *infoTCXNoise,
    const int16_t element_mode /* i  : IVAS element mode                         */
);
+1 −1
Original line number Diff line number Diff line
@@ -840,7 +840,7 @@ void tcx_noise_filling_flt(
    const int16_t L_frame,
    const float tiltCompFactor,
    float fac_ns,
    uint8_t *infoTCXNoise,
    Word16 *infoTCXNoise,
    const int16_t element_mode /* i  : IVAS element mode                         */
)
{
+1 −1
Original line number Diff line number Diff line
@@ -1178,7 +1178,7 @@ void decoder_tcx_noisefilling(
                nf_seed += (int16_t) ( abs( prm_sqQ[i] ) * i * 2 );
            }
        }
        tcx_noise_filling_flt( x, nf_seed, firstLine, noiseFillingSize, noiseTransWidth, L_frame, noiseTiltFactor, fac_ns, st->igf ? st->hIGFDec->infoTCXNoise : NULL, st->element_mode );
        tcx_noise_filling_flt( x, nf_seed, firstLine, noiseFillingSize, noiseTransWidth, L_frame, noiseTiltFactor, fac_ns, st->igf ? st->hIGFDec->infoTCXNoise_ptr : NULL, st->element_mode );

        st->seed_tcx_plc = nf_seed;
    }
+23 −23
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@
#ifndef IVAS_FLOAT_FIXED
static int16_t IGF_replaceTCXNoise_1_flr(
    const float *in,         /* i  :  MDCT spectrum              */
    const uint8_t *TCXNoise, /* i  :  tcx noise indicator vector */
    const int16_t *TCXNoise, /* i  :  tcx noise indicator vector */
    const int16_t start,     /* i  :  start MDCT subband index   */
    const int16_t stop,      /* i  :  stop MDCT subband index    */
    float *totalNoiseNrg     /* o  :  measured noise energy      */
@@ -95,7 +95,7 @@ static int16_t IGF_replaceTCXNoise_1_flr(
#ifndef IVAS_FLOAT_FIXED
static void IGF_replaceTCXNoise_2_flt(
    float *in,               /* i/o: MDCT spectrum                */
    const uint8_t *TCXNoise, /* i  : tcx noise indicator vector   */
    const int16_t *TCXNoise, /* i  : tcx noise indicator vector   */
    const int16_t start,     /* i  : start MDCT subband index     */
    const int16_t stop,      /* i  : stop MDCT subband index      */
    float totalNoiseNrg,     /* i  : measured noise energy        */
@@ -141,7 +141,7 @@ static void IGF_replaceTCXNoise_2_flt(
#ifndef IVAS_FLOAT_FIXED
static void IGF_replaceTCXNoise_2_new_flt(
    float *in,               /* i/o: MDCT spectrum                */
    const uint8_t *TCXNoise, /* i  : tcx noise indicator vector   */
    const int16_t *TCXNoise, /* i  : tcx noise indicator vector   */
    const int16_t start,     /* i  : start MDCT subband index     */
    const int16_t stop,      /* i  : stop MDCT subband index      */
    float totalNoiseNrg,     /* i  : measured noise energy        */
@@ -326,7 +326,7 @@ static void IGF_setLinesToZero_flt(
static void IGF_prep_flt(
    IGF_DEC_PRIVATE_DATA_HANDLE hPrivateData, /* i  : IGF private data handle                              */
    const int16_t igfGridIdx,                 /* i  : in case of CELP->TCX switching, use 1.25 framelength */
    const uint8_t *TCXNoise,                  /* i  : TCX noise vector                                     */
    const int16_t *TCXNoise,                  /* i  : TCX noise vector                                     */
    float *igf_spec,                          /* o  : prepared IGF spectrum                                */
    float *src_spec,                          /* i  : source spectrum                                      */
    const int16_t element_mode                /* i  : IVAS element mode                                    */
@@ -450,8 +450,8 @@ static void IGF_prepStereo_flt(
    IGF_DEC_PRIVATE_DATA_HANDLE hPrivateDataL, /* i  : IGF private data handle                              */
    IGF_DEC_PRIVATE_DATA_HANDLE hPrivateDataR, /* i  : IGF private data handle                              */
    const int16_t igfGridIdx,                  /* i  : in case of CELP->TCX switching, use 1.25 framelength */
    const uint8_t *TCXNoiseL,                  /* i  : TCX noise vector                                     */
    const uint8_t *TCXNoiseR,                  /* i  : TCX noise vector                                     */
    const int16_t *TCXNoiseL,                  /* i  : TCX noise vector                                     */
    const int16_t *TCXNoiseR,                  /* i  : TCX noise vector                                     */
    float *igf_specL,                          /* o  : prepared IGF spectrum                                */
    float *igf_specR,                          /* o  : prepared IGF spectrum                                */
    float *src_specL,                          /* i  : source spectrum                                      */
@@ -1214,7 +1214,7 @@ void IGFDecApplyMono_flt(
                    mvr2r( hPrivateData->pSpecFlat_float, igf_spec, hGrid->startLine );
                }

                hPrivateData->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_spec, hIGFDec->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_float );
                hPrivateData->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_spec, hIGFDec->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_float );
                break;
            }
        }
@@ -1223,13 +1223,13 @@ void IGFDecApplyMono_flt(
        {
            if ( hPrivateData->currWhiteningLevel[i] == IGF_WHITENING_OFF )
            {
                hPrivateData->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateData->pSpecFlat_float, hIGFDec->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_off_float );
                hPrivateData->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateData->pSpecFlat_float, hIGFDec->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateData->totalNoiseNrg_off_float );
                break;
            }
        }

        /* apply IGF in three steps: */
        IGF_prep_flt( hPrivateData, igfGridIdx, hIGFDec->infoTCXNoise, igf_spec, hPrivateData->pSpecFlat_float, element_mode );
        IGF_prep_flt( hPrivateData, igfGridIdx, hIGFDec->infoTCXNoise_ptr, igf_spec, hPrivateData->pSpecFlat_float, element_mode );
        IGF_calc_flt( hPrivateData, igfGridIdx, spectrum, igf_spec );
        IGF_appl_flt( hPrivateData, igfGridIdx, spectrum, igf_spec, hIGFDec->virtualSpec_float, hIGFDec->flag_sparse, 1 );
    }
@@ -1237,7 +1237,7 @@ void IGFDecApplyMono_flt(
    /* reset TCX noise indicator vector */
    nLinesToReset = igfGridIdx == IGF_GRID_LB_SHORT ? 2 : 1;
    nLinesToReset = IGF_START_MX / nLinesToReset;
    set_c( (int8_t *) ( hIGFDec->infoTCXNoise ), 0, nLinesToReset );
    set_s( (int16_t *) ( hIGFDec->infoTCXNoise_ptr ), 0, nLinesToReset );

    return;
}
@@ -1327,7 +1327,7 @@ void IGFDecApplyStereo_flt(
                    mvr2r( hPrivateDataL->pSpecFlat_float, igf_specL, hGrid->startLine );
                }

                hPrivateDataL->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_specL, hIGFDecL->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_float );
                hPrivateDataL->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_specL, hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_float );

                if ( !bfi )
                {
@@ -1338,7 +1338,7 @@ void IGFDecApplyStereo_flt(
                    mvr2r( hPrivateDataR->pSpecFlat_float, igf_specR, hGrid->startLine );
                }

                hPrivateDataR->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_specR, hIGFDecR->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_float );
                hPrivateDataR->n_noise_bands = IGF_replaceTCXNoise_1_flr( igf_specR, hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_float );

                break;
            }
@@ -1348,15 +1348,15 @@ void IGFDecApplyStereo_flt(
        {
            if ( hPrivateDataL->currWhiteningLevel[i] == IGF_WHITENING_OFF || hPrivateDataR->currWhiteningLevel[i] == IGF_WHITENING_OFF )
            {
                hPrivateDataL->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateDataL->pSpecFlat_float, hIGFDecL->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_off_float );
                hPrivateDataL->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateDataL->pSpecFlat_float, hIGFDecL->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataL->totalNoiseNrg_off_float );

                hPrivateDataR->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateDataR->pSpecFlat_float, hIGFDecR->infoTCXNoise, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_off_float );
                hPrivateDataR->n_noise_bands_off = IGF_replaceTCXNoise_1_flr( hPrivateDataR->pSpecFlat_float, hIGFDecR->infoTCXNoise_ptr, hGrid->minSrcSubband, hGrid->startLine, &hPrivateDataR->totalNoiseNrg_off_float );
                break;
            }
        }

        /* apply IGF in three steps: */
        IGF_prepStereo_flt( hPrivateDataL, hPrivateDataR, igfGridIdx, hIGFDecL->infoTCXNoise, hIGFDecR->infoTCXNoise, igf_specL, igf_specR, hPrivateDataL->pSpecFlat_float, hPrivateDataR->pSpecFlat_float, coreMsMask );
        IGF_prepStereo_flt( hPrivateDataL, hPrivateDataR, igfGridIdx, hIGFDecL->infoTCXNoise_ptr, hIGFDecR->infoTCXNoise_ptr, igf_specL, igf_specR, hPrivateDataL->pSpecFlat_float, hPrivateDataR->pSpecFlat_float, coreMsMask );

        IGF_calc_flt( hPrivateDataL, igfGridIdx, spectrumL, igf_specL );
        IGF_calc_flt( hPrivateDataR, igfGridIdx, spectrumR, igf_specR );
@@ -1367,8 +1367,8 @@ void IGFDecApplyStereo_flt(
    /* reset TCX noise indicator vector */
    nLinesToReset = ( igfGridIdx == IGF_GRID_LB_SHORT ) ? 2 : 1;
    nLinesToReset = IGF_START_MX / nLinesToReset;
    set_c( (int8_t *) ( hIGFDecL->infoTCXNoise ), 0, nLinesToReset );
    set_c( (int8_t *) ( hIGFDecR->infoTCXNoise ), 0, nLinesToReset );
    set_s( (int16_t *) ( hIGFDecL->infoTCXNoise_ptr ), 0, nLinesToReset );
    set_s( (int16_t *) ( hIGFDecR->infoTCXNoise_ptr ), 0, nLinesToReset );

    return;
}
@@ -1426,7 +1426,7 @@ void IGFDecSetMode_flt(
    }

    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];
    hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0];
#ifdef IVAS_FLOAT_FIXED
    hIGFDec->virtualSpec_fx = &hIGFDec->virtualSpec[0];
@@ -1457,7 +1457,7 @@ void IGFDecUpdateInfo_flt(
    H_IGF_GRID hGrid;

    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];
    hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0];
    hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0];
    hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0];
@@ -1493,7 +1493,7 @@ void IGFDecReplicateTCX10State_flt(
)
{
    mvs2s( &hIGFDec->flag_sparseBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->flag_sparseBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 );
    mvc2c( &hIGFDec->infoTCXNoiseBuf[( IGF_START_MX ) / 2], &hIGFDec->infoTCXNoiseBuf[0], ( IGF_START_MX ) / 2 );
    mvs2s( &hIGFDec->infoTCXNoise_evs[( IGF_START_MX ) / 2], &hIGFDec->infoTCXNoise_evs[0], ( IGF_START_MX ) / 2 );
    mvr2r( &hIGFDec->virtualSpecBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->virtualSpecBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 );
    mvr2r( &hIGFDec->igfData.pSpecFlatBuf[IGF_START_MX / 2], &hIGFDec->igfData.pSpecFlatBuf[0], IGF_START_MX / 2 );
#ifdef IVAS_FLOAT_FIXED
@@ -1594,7 +1594,7 @@ void IGFDecRestoreTCX10SubFrameData_flt(
    /* restore flattening trigger for current subframe */
    hIGFDec->flatteningTrigger = hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx];
    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[subFrameIdx * ( IGF_START_MX ) / 2];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[subFrameIdx * ( IGF_START_MX ) / 2];
    hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2];
    hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[subFrameIdx * IGF_START_MX / 2];
    hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[subFrameIdx];
@@ -1612,14 +1612,14 @@ void init_igf_dec_flt(
    IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: IGF decoder handle      */
)
{
    set_c( (int8_t *) ( hIGFDec->infoTCXNoiseBuf ), 0, IGF_START_MX );
    set_s( (int16_t *) ( hIGFDec->infoTCXNoise_evs ), 0, IGF_START_MX );
    set_f( hIGFDec->igfData.pSpecFlatBuf, 0, IGF_START_MX );
    hIGFDec->igfData.igfInfo.nfSeedBuf[0] = 9733;
    hIGFDec->igfData.igfInfo.nfSeedBuf[1] = 9733;
    hIGFDec->igfData.igfInfo.nfSeed = &hIGFDec->igfData.igfInfo.nfSeedBuf[0];
    hIGFDec->igfData.pSpecFlat_float = &hIGFDec->igfData.pSpecFlatBuf[0];
    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];
    hIGFDec->virtualSpec_float = &hIGFDec->virtualSpecBuf[0];

    return;
+5 −14
Original line number Diff line number Diff line
@@ -3987,7 +3987,7 @@ void IGFDecSetMode_ivas_fx(
    }

    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];
    return;
}
/**********************************************************************/ /*
@@ -4032,7 +4032,7 @@ void IGFDecUpdateInfo_ivas_fx(
    H_IGF_GRID hGrid;

    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];

    hIGFDec->virtualSpec_fx = &hIGFDec->virtualSpec[0];
    hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf_fx[0];
@@ -4057,15 +4057,6 @@ void IGFDecUpdateInfo_ivas_fx(
        hIGFDec->infoIGFStopLine = hGrid->stopLine;
        move16();
    }

    /* TODO: this was added to keep the EVS 16-bit noise info in sync. */
    FOR( Word16 l = 0; l < IGF_START_MX; l++ )
    {
        // u8bit to 16bit
        hIGFDec->infoTCXNoise_evs[l] = (Word16) hIGFDec->infoTCXNoise[l];
        move16();
    }

    return;
}

@@ -4074,7 +4065,7 @@ void IGFDecReplicateTCX10State_fx(
)
{
    Copy( &hIGFDec->flag_sparseBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->flag_sparseBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 );
    mvc2c( &hIGFDec->infoTCXNoiseBuf[( IGF_START_MX ) / 2], &hIGFDec->infoTCXNoiseBuf[0], ( IGF_START_MX ) / 2 );
    mvs2s( &hIGFDec->infoTCXNoise_evs[( IGF_START_MX ) / 2], &hIGFDec->infoTCXNoise_evs[0], ( IGF_START_MX ) / 2 );

    /* TODO: remove float dependency */
    // mvr2r( &hIGFDec->virtualSpecBuf[( N_MAX_TCX - IGF_START_MN ) / 2], &hIGFDec->virtualSpecBuf[0], ( N_MAX_TCX - IGF_START_MN ) / 2 );
@@ -4209,7 +4200,7 @@ void IGFDecRestoreTCX10SubFrameData_fx(
    /* restore flattening trigger for current subframe */
    hIGFDec->flatteningTrigger = hPrivateData->igf_flatteningTrigger_subframe[subFrameIdx];
    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[subFrameIdx * ( IGF_START_MX ) / 2];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[subFrameIdx * ( IGF_START_MX ) / 2];

    hIGFDec->virtualSpec_fx = &hIGFDec->virtualSpec[subFrameIdx * ( N_MAX_TCX - IGF_START_MN ) / 2];
    hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf_fx[subFrameIdx * IGF_START_MX / 2];
@@ -4257,7 +4248,7 @@ void init_igf_dec(
    set32_fx( hIGFDec->igfData.pSpecFlatBuf_fx, 0, IGF_START_MX );
    hIGFDec->igfData.pSpecFlat = &hIGFDec->igfData.pSpecFlatBuf_fx[0];
    hIGFDec->flag_sparse = &hIGFDec->flag_sparseBuf[0];
    hIGFDec->infoTCXNoise = &hIGFDec->infoTCXNoiseBuf[0];
    hIGFDec->infoTCXNoise_ptr = &hIGFDec->infoTCXNoise_evs[0];
    hIGFDec->virtualSpec_fx = &hIGFDec->virtualSpec[0];

    return;
Loading