Commit 5a6e3ab3 authored by multrus's avatar multrus
Browse files

[cleanup] accept FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

parent 6e0539df
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@
#define HARMONIZE_TBE2                                  /* VA: basop issue 2399: Remove duplicated code: TBE, step 2 */
#define HARMONIZE_2427_GETPLC                           /* FhG: basop issue : 2427 Harmonizing getPLCDecision functions:*/
#define HARM_FD_BWE                                     /* VA: harmonize core-coder FD BWE function duplications */
#define FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT    /* FhG: basop issue 2411: harmonize TNSAnalysis*_fx(), DetectTnsFilt*_fx()*/
#define HARMONIZE_READ_DECODE_TNS                       /* FhG basop 2389: Harm between two pairs of functions. */
#define FIX_FLOAT_1526_DIRAC_MEM_LEAK                   /* FhG: float issue 1526: potential memory leak in DirAC handles in case of format switching */
#define FIX_2437_HARMONIZE_ENCODERINDEX                 /* FhG: basop issue 2437 EncoderIndex_ivas_fx() and EncoderIndex_fx()*/
+0 −98
Original line number Diff line number Diff line
@@ -135,96 +135,7 @@ void HBAutocorrelation_fx(
    }
}

#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

void TNSAnalysis_fx(
    TCX_CONFIG_HANDLE hTcxCfg, /* i  : configuration of TCX               */
    Word16 L_frame,            /* input: frame length */
    Word16 L_spec,
    Word16 tcxMode,        /* input: TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */
    Word8 isAfterACELP,    /* input: Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0  */
    Word32 spectrum[],     /* input: MDCT spectrum  Qx*/
    STnsData *pTnsData,    /* output: Tns data */
    Word8 *pfUseTns,       /* output: Flag indicating if TNS is used */
    Word16 *predictionGain /*Q7*/
)
{
    Word32 buff[8];
    Word16 tmp = 0;  /* initialization only to avoid compiler warning, not counted */
    Word16 tmp2 = 0; /* initialization only to avoid compiler warning, not counted */
    move16();
    move16();

    /* Init TNS */
    *pfUseTns = 0;
    move16();

    IF( hTcxCfg->fIsTNSAllowed != 0 )
    {
        hTcxCfg->pCurrentTnsConfig = &hTcxCfg->tnsConfig[( tcxMode - TCX_20 ) == 0][isAfterACELP];
        L_spec = hTcxCfg->pCurrentTnsConfig->iFilterBorders[0];
        move16();

        /*-----------------------------------------------------------*
         * Temporal Noise Shaping analysis                           *
         *-----------------------------------------------------------*/

        IF( EQ_16( tcxMode, TCX_5 ) )
        {
            tmp = shr( L_frame, 2 );

            /* rearrange LF sub-window lines prior to TNS analysis & filtering */
            tmp2 = shr( L_spec, 1 );

            IF( LT_16( tmp2, tmp ) )
            {
                Copy32( spectrum + 8, spectrum + 16, sub( tmp2, 8 ) );
                Copy32( spectrum + tmp, spectrum + 8, 8 );
                Copy32( spectrum + tmp + 8, spectrum + tmp2 + 8, sub( tmp2, 8 ) );
            }
            ELSE
            {
                Copy32( spectrum + tmp, buff, 8 );
                Copy32( spectrum + 8, spectrum + 16, sub( tmp, 8 ) );
                Copy32( buff, spectrum + 8, 8 );
            }
        }

        move16();
        *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, predictionGain );

        /* If TNS should be used then get the residual after applying it inplace in spectrum */
        IF( *pfUseTns != 0 )
        {
            ApplyTnsFilter( hTcxCfg->pCurrentTnsConfig, pTnsData, spectrum, 1 );
        }

        IF( EQ_16( tcxMode, TCX_5 ) )
        {
            /* undo rearrangement of LF sub-window lines prior to TNS analysis */
            IF( LT_16( tmp2, tmp ) )
            {
                Copy32( spectrum + tmp2 + 8, spectrum + tmp + 8, sub( tmp2, 8 ) );
                Copy32( spectrum + 8, spectrum + tmp, 8 );
                Copy32( spectrum + 16, spectrum + 8, sub( tmp2, 8 ) );
                set32_fx( spectrum + tmp2, 0, sub( tmp, tmp2 ) );
                set32_fx( spectrum + tmp + tmp2, 0, sub( tmp, tmp2 ) );
            }
            ELSE
            {
                Copy32( spectrum + 8, buff, 8 );
                Copy32( spectrum + 16, spectrum + 8, sub( tmp, 8 ) );
                Copy32( buff, spectrum + tmp, 8 );
            }
        }
    }
}
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
void TNSAnalysis_ivas_fx(
#else
void TNSAnalysis_fx(
#endif                         // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    TCX_CONFIG_HANDLE hTcxCfg, /* i  : configuration of TCX               */
    Word16 L_frame,            /* i  : frame length */
    Word16 L_spec,             /* i  : length of the spectrum                                                                  */
@@ -280,13 +191,8 @@ void TNSAnalysis_fx(
        }

        move16();
#ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
        *pfUseTns = (Word8) DetectTnsFilt_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain );

#else
        *pfUseTns = (Word8) DetectTnsFilt_ivas_fx( hTcxCfg->pCurrentTnsConfig, spectrum, pTnsData, hTranDet, (Word8) NE_16( transform_type, TCX_20 ), ltp_gain, predictionGain );

#endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

        /* If TNS should be used then get the residual after applying it inplace in spectrum */
        IF( *pfUseTns != 0 )
@@ -3859,11 +3765,7 @@ void coder_tcx_fx(
    {

        SetTnsConfig( hTcxCfg, sub( L_frame_glob, st->L_frame ) == 0, st->last_core == 0 );
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
        TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain );
#else
        TNSAnalysis_fx( hTcxCfg, L_frame, L_spec, TCX_20, st->last_core == 0, spectrum, st->hTranDet, -32768, hTcxEnc->tnsData, hTcxEnc->fUseTns, &st->hIGFEnc->tns_predictionGain );
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    }
    ELSE
    {
+0 −16
Original line number Diff line number Diff line
@@ -406,18 +406,10 @@ void core_signal_analysis_high_bitrate_fx(
        {
            test();
            test();
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

            TNSAnalysis_fx( st->hTcxCfg, L_frameTCX,
                            st->hTcxCfg->tcx_coded_lines,
                            transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ),
                            spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#else
            TNSAnalysis_fx( st->hTcxCfg, L_frameTCX,
                            st->hTcxCfg->tcx_coded_lines,
                            transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ),
                            spectrum[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

            {
                EncodeTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno],
@@ -1207,19 +1199,11 @@ void core_signal_analysis_high_bitrate_ivas_fx(
            test();
            IF( ( frameno == 0 ) && ( st->last_core == ACELP_CORE ) )
            {
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
                TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#else
                TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 1, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
            }
            ELSE
            {
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
                TNSAnalysis_ivas_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#else
                TNSAnalysis_fx( st->hTcxCfg, L_frameTCX, st->hTcxCfg->tcx_coded_lines, transform_type[frameno], 0, hTcxEnc->spectrum_fx[frameno], st->hTranDet, -32768, &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL );
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
            }

            IF( st->hTcxCfg->fIsTNSAllowed )
+0 −29
Original line number Diff line number Diff line
@@ -1463,20 +1463,8 @@ void CalculateTnsFilt_fx(
    const Word16 pSpectrum_e,
    STnsData *pTnsData /* o  : TNS data struct                   */
);
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

Word16 DetectTnsFilt_fx(
    STnsConfig const *pTnsConfig,
    Word32 const pSpectrum[],
    STnsData *pTnsData,
    Word16 *predictionGain );
#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
#ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

Word16 DetectTnsFilt_fx(
#else
Word16 DetectTnsFilt_ivas_fx(
#endif                            // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    STnsConfig const *pTnsConfig, /* i  : TNS Configuration struct          */
    Word32 const pSpectrum[],     /* i  : MDCT spectrum                Q=Qx */
    STnsData *pTnsData,           /* o  : TNS data struct                   */
@@ -2676,25 +2664,8 @@ void IGFEncResetTCX10BitCounter_fx(
    const IGF_ENC_INSTANCE_HANDLE hInstance /**< in:     | instance handle of IGF Encoder */
);

#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
void TNSAnalysis_fx(
    TCX_CONFIG_HANDLE hTcxCfg, /* i  : configuration of TCX               */
    Word16 L_frame,            /* i  : frame length */
    Word16 L_spec,
    Word16 tcxMode,     /* i  : TCX mode for the frame/subframe - TCX20 | TCX10 | TCX 5 (meaning 2 x TCX 5) */
    Word8 isAfterACELP, /* i  : Flag indicating if the last frame was ACELP. For the second TCX subframe it should be 0  */
    Word32 spectrum[],  /* i  : MDCT spectrum */
    STnsData *pTnsData, /* o  : Tns data */
    Word8 *pfUseTns,    /* o  : Flag indicating if TNS is used */
    Word16 *predictionGain );

#endif // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
void TNSAnalysis_ivas_fx(
#else
void TNSAnalysis_fx(
#endif                         // !FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    TCX_CONFIG_HANDLE hTcxCfg, /* i  : configuration of TCX               */
    Word16 L_frame,            /* i  : frame length */
    Word16 L_spec,             /* i  : length of the spectrum                                                                  */
+0 −261
Original line number Diff line number Diff line
@@ -50,259 +50,6 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff
/********************************/

#define MAX_SUBDIVISIONS 3
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

Word16 DetectTnsFilt_fx( STnsConfig const *pTnsConfig,
                         Word32 const pSpectrum[],
                         STnsData *pTnsData,
                         Word16 *predictionGain )
{
    Word16 facs[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS];
    Word16 facs_e[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS]; /* exponents of facs[][] */
    Word16 shifts[TNS_MAX_NUM_OF_FILTERS][MAX_SUBDIVISIONS];
    Word16 iFilter = 0;
    move16();

    ResetTnsData( pTnsData );

    IF( pTnsConfig->maxOrder <= 0 )
    {
        return 0;
    }

    /* Calculate norms for each spectrum part */
    FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ )
    {
        Word16 idx0;
        Word16 idx1;
        Word16 nSubdivisions;
        Word16 iSubdivisions;

        move16();
        move16();
        move16();
        idx0 = pTnsConfig->iFilterBorders[iFilter + 1];
        idx1 = pTnsConfig->iFilterBorders[iFilter];
        nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions;

        assert( pTnsConfig->pTnsParameters[iFilter].nSubdivisions <= MAX_SUBDIVISIONS );

        FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ )
        {
            Word16 iStartLine;
            Word16 iEndLine;
            Word16 tmp, headroom, shift;
            Word32 L_tmp, tmp32;

            /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions;
               iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */
            assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) );

            tmp = sub( idx1, idx0 );
            iStartLine = imult1616( tmp, iSubdivisions );
            iEndLine = add( iStartLine, tmp );

            IF( EQ_16( nSubdivisions, 3 ) )
            {
                iStartLine = mult( iStartLine, 0x2AAB );
            }
            iStartLine = add( iStartLine, idx0 );

            IF( EQ_16( nSubdivisions, 3 ) )
            {
                iEndLine = mult( iEndLine, 0x2AAB );
            }
            iEndLine = add( iEndLine, idx0 );

            /*norms[iFilter][iSubdivisions] = norm2FLOAT(pSpectrum+iStartLine, iEndLine-iStartLine);*/
            headroom = getScaleFactor32( &pSpectrum[iStartLine], sub( iEndLine, iStartLine ) );

            /* Calculate norm of spectrum band */
            L_tmp = Norm32Norm( pSpectrum + iStartLine, headroom, sub( iEndLine, iStartLine ), &shift );

            /* Check threshold HLM_MIN_NRG */
            BASOP_SATURATE_WARNING_OFF_EVS;
            tmp32 = L_sub( L_shl_sat( L_tmp, s_min( 31, sub( shift, 24 - 31 * 2 ) ) ), 3277l /*HLM_MIN_NRG Q7*/ );
            BASOP_SATURATE_WARNING_ON_EVS;

            /* get pre-shift for autocorrelation */
            tmp = sub( shift, norm_l( L_tmp ) ); /* exponent for normalized L_tmp */
            tmp = shr( sub( 1, tmp ), 1 );       /* pre-shift to apply before autocorrelation */
            shifts[iFilter][iSubdivisions] = s_min( tmp, headroom );
            move16();

            /* calc normalization factor */
            facs[iFilter][iSubdivisions] = 0;
            move16();
            facs_e[iFilter][iSubdivisions] = 0;
            move16();

            if ( tmp32 > 0 )
            {
                facs[iFilter][iSubdivisions] = 0x7FFF;
                move16(); /* normalization not needed for one subdivision */
            }

            test();
            IF( ( tmp32 > 0 ) && ( GT_16( nSubdivisions, 1 ) ) )
            {
                move16();
                facs_e[iFilter][iSubdivisions] = shl( sub( tmp, shifts[iFilter][iSubdivisions] ), 1 );

                tmp = sub( 1, shl( tmp, 1 ) );                 /* exponent of autocorrelation */
                L_tmp = L_shl_sat( L_tmp, sub( shift, tmp ) ); /* shift L_tmp to that exponent */

                /* calc factor (with 2 bits headroom for sum of 3 subdivisions) */
                move16();
                facs[iFilter][iSubdivisions] = div_s( 0x2000, round_fx_sat( L_tmp ) ); /* L_tmp is >= 0x2000000 */
            }
        }
    }
    /* Calculate normalized autocorrelation for spectrum subdivision and get TNS filter parameters based on it */
    FOR( iFilter = 0; iFilter < pTnsConfig->nMaxFilters; iFilter++ )
    {
#define RXX_E ( 3 )
        Word32 rxx[TNS_MAX_FILTER_ORDER + 1];
        Word16 idx0;
        Word16 idx1;
        Word16 spectrumLength;
        STnsFilter *pFilter;
        Word16 nSubdivisions;
        Word16 iSubdivisions;
        Word16 tmpbuf[325];

        set32_fx( rxx, 0, TNS_MAX_FILTER_ORDER + 1 );

        move16();
        move16();
        move16();
        idx0 = pTnsConfig->iFilterBorders[iFilter + 1];
        idx1 = pTnsConfig->iFilterBorders[iFilter];
        spectrumLength = sub( idx1, idx0 );
        pFilter = pTnsData->filter + iFilter;
        nSubdivisions = pTnsConfig->pTnsParameters[iFilter].nSubdivisions;

        FOR( iSubdivisions = 0; iSubdivisions < nSubdivisions; iSubdivisions++ )
        {
            Word16 iStartLine, n, i;
            Word16 iEndLine;
            const Word16 *pWindow;
            Word16 lag, shift;
            Word32 L_tmp;

            IF( facs[iFilter][iSubdivisions] == 0 )
            {
                BREAK;
            }


            /* iStartLine = idx0 + (idx1-idx0)*iSubdivisions/nSubdivisions;
               iEndLine = idx0 + (idx1-idx0)*(iSubdivisions+1)/nSubdivisions; */
            assert( ( nSubdivisions == 1 ) || ( nSubdivisions == 3 ) );

            iStartLine = imult1616( spectrumLength, iSubdivisions );
            iEndLine = add( iStartLine, spectrumLength );

            IF( EQ_16( nSubdivisions, 3 ) )
            {
                iStartLine = mult( iStartLine, 0x2AAB );
            }
            iStartLine = add( iStartLine, idx0 );

            IF( EQ_16( nSubdivisions, 3 ) )
            {
                iEndLine = mult( iEndLine, 0x2AAB );
            }
            iEndLine = add( iEndLine, idx0 );


            move16();
            shift = shifts[iFilter][iSubdivisions];

            move16();
            pWindow = tnsAcfWindow_fx;

            n = sub( iEndLine, iStartLine );
            assert( n < (Word16) ( sizeof( tmpbuf ) / sizeof( Word16 ) ) );
            FOR( i = 0; i < n; i++ )
            {
                tmpbuf[i] = round_fx_sat( L_shl( pSpectrum[iStartLine + i], shift ) );
                move16();
            }

            FOR( lag = 0; lag <= pTnsConfig->maxOrder; lag++ )
            {
                n = sub( sub( iEndLine, lag ), iStartLine );

                L_tmp = L_deposit_l( 0 );
                FOR( i = 0; i < n; i++ )
                {
                    L_tmp = L_mac0_sat( L_tmp, tmpbuf[i], tmpbuf[i + lag] );
                }

                IF( lag != 0 )
                L_tmp = Mpy_32_16_1( L_tmp, *pWindow++ );

                L_tmp = Mpy_32_16_1( L_tmp, facs[iFilter][iSubdivisions] );
                L_tmp = L_shl( L_tmp, facs_e[iFilter][iSubdivisions] );

                rxx[lag] = L_add( rxx[lag], L_tmp );
                move32();
            }
        }

        IF( EQ_16( iSubdivisions, nSubdivisions ) ) /* meaning there is no subdivision with low energy */
        {
            pFilter->spectrumLength = spectrumLength;
            move16();
            /* Limit the maximum order to spectrum length/4 */
            GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter );
        }
    }

    if ( predictionGain )
    {
        assert( pTnsConfig->nMaxFilters == 1 );
        move16();
        *predictionGain = pTnsData->filter->predictionGain;
    }

    /* We check the filter's decisions in the opposite direction */
    FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- )
    {
        STnsFilter *pFilter;
        struct TnsParameters const *pTnsParameters;

        move16();
        move16();
        pFilter = pTnsData->filter + iFilter;
        pTnsParameters = pTnsConfig->pTnsParameters + iFilter;

        IF( s_or( (Word16) GT_16( pFilter->predictionGain, pTnsParameters->minPredictionGain ),
                  sub( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) > 0 ) )
        {
            move16();
            pTnsData->nFilters = add( pTnsData->nFilters, 1 );
        }
        ELSE IF( pTnsData->nFilters > 0 ) /* If a previous filter is turned on */
        {
            /* Since TNS filter of order 0 is not allowed we haved to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */
            ClearTnsFilterCoefficients( pFilter );
            move16();
            move16();
            pFilter->order = 1;
            pTnsData->nFilters = add( pTnsData->nFilters, 1 );
        }
        ELSE
        {
            ClearTnsFilterCoefficients( pFilter );
        }
    }


    return ( pTnsData->nFilters > 0 );
}
#endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
void CalculateTnsFilt_fx(
    STnsConfig const *pTnsConfig, /* i  : TNS Configuration struct          */
    const Word32 pSpectrum[],     /* i  : MDCT spectrum                     */
@@ -410,11 +157,7 @@ void CalculateTnsFilt_fx(
    return;
}

#ifdef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
Word16 DetectTnsFilt_fx(
#else
Word16 DetectTnsFilt_ivas_fx(
#endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT

    STnsConfig const *pTnsConfig, /* i  : TNS Configuration struct          */
    Word32 const pSpectrum[],     /* i  : MDCT spectrum                Q=Qx */
@@ -637,11 +380,7 @@ Word16 DetectTnsFilt_ivas_fx(
    }

    /* We check the filter's decisions in the opposite direction */
#ifndef FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    FOR( iFilter = ( pTnsConfig->nMaxFilters - 1 ); iFilter >= 0; iFilter-- )
#else
    FOR( iFilter = sub( pTnsConfig->nMaxFilters, 1 ); iFilter >= 0; iFilter-- )
#endif // FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT
    {
        STnsFilter *pFilter;
        struct TnsParameters const *pTnsParameters;