Commit 5c74348a authored by Arthur Tritthart's avatar Arthur Tritthart
Browse files

initial version for issue 1966, macros to be enabled to get debug prints and 16/32 bit variables

parent 8ff889f8
Loading
Loading
Loading
Loading
Loading
+107 −1
Original line number Diff line number Diff line
@@ -12,21 +12,47 @@
#include "prot_fx.h"
#include "ivas_prot_fx.h"

//#define FIX_ISSUE_1966
//#define DEBUG_ISSUE_1966

#ifdef DEBUG_ISSUE_1966
extern int32_t frame;
#endif

/*---------------------------------------------------------------------*
 * Local function prototypes
 *---------------------------------------------------------------------*/

static void calcPseudoSpec( const Word32 *mdctSpec, const Word16 mdctSpec_exp, const Word16 nSamples, Word16 floorPowerSpectrum, Word32 *powerSpec, Word16 *powerSpec_exp );
#ifdef FIX_ISSUE_1966
static void getEnvelope( const Word16 nSamples, const Word32 *powerSpec, Word16 F0, Word32 F0_32, Word32 *envelope, Word32 *smoothedSpectrum );
#else
static void getEnvelope( const Word16 nSamples, const Word32 *powerSpec, Word16 F0, Word32 *envelope, Word32 *smoothedSpectrum );
#endif
static void GetF0( Word16 const nSamples, Word16 const nSamplesCore, Word32 const *const powerSpectrum, Word32 const pitchLag, Word16 *const pOrigF0, Word16 *const pF0 );
static void findStrongestHarmonics( const Word16 nSamples, const Word32 *powerSpectrum, const Word16 F0, const Word16 nTotalHarmonics, Word16 *pHarmonicIndexes, Word16 *pnHarmonics );
static void CorrectF0( const Word16 *pHarmonicIndexes, const Word16 nHarmonics, Word16 *pF0 );
#ifdef FIX_ISSUE_1966
static void findCandidates( const Word16 nSamples, const Word32 *MDCTSpectrum, const Word16 MDCTSpectrum_exp, 
                                  Word16 *thresholdModificationNew, Word32 *thresholdModificationNew32, Word16 floorPowerSpectrum );
#else
static void findCandidates( const Word16 nSamples, const Word32 *MDCTSpectrum, const Word16 MDCTSpectrum_exp, Word16 *thresholdModificationNew, Word16 floorPowerSpectrum );
#endif
static void modifyThreshold( Word16 i, Word16 F0, Word16 threshold, Word16 *thresholdModification );
static void modifyThresholds( Word16 F0, Word16 origF0, Word16 *thresholdModification );
#ifdef FIX_ISSUE_1966
static void RefineThresholdsUsingPitch_fx( const Word16 nSamples, const Word16 nSamplesCore, const Word32 powerSpectrum[], const Word32 lastPitchLag, const Word32 currentPitchLag, 
                                           Word16 *pF0, Word32 *pF0_32, Word16 *thresholdModification, Word32 *thresholdModification32 );
#else
static void RefineThresholdsUsingPitch_fx( const Word16 nSamples, const Word16 nSamplesCore, const Word32 powerSpectrum[], const Word32 lastPitchLag, const Word32 currentPitchLag, Word16 *pF0, Word16 *thresholdModification );
#endif

#ifdef FIX_ISSUE_1966
static void findTonalComponents_fx( Word16 *indexOfTonalPeak, Word16 *lowerIndex, Word16 *upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 *powerSpectrum, const Word16 powerSpectrum_e, 
            Word16 F0, Word32 F0_32, Word16 *thresholdModification, Word32 *thresholdModification32, Word16 element_mode );
#else
static void findTonalComponents_fx( Word16 *indexOfTonalPeak, Word16 *lowerIndex, Word16 *upperIndex, Word16 *numIndexes, Word16 nSamples, const Word32 *powerSpectrum, const Word16 powerSpectrum_e, Word16 F0, Word16 *thresholdModification, Word16 element_mode );
#endif


/*-------------------------------------------------------------------*
@@ -60,11 +86,18 @@ void DetectTonalComponents_fx(
)
{
    Word16 F0;
#ifdef FIX_ISSUE_1966
    Word32 F0_32;
    Word32 thresholdModification32[L_FRAME_MAX];
#endif
    Word16 thresholdModification[L_FRAME_MAX], lastMDCTSpect_exp;
    Word32 pScaledMdctSpectrum[L_FRAME_MAX];
    Word16 nBands;
    Word32 sns_int_scf_fx[FDNS_NPTS]; /*Q16*/
    Word16 q_pScaledMdctSpectrum;
#ifdef DEBUG_ISSUE_1966
    printf("Calling DetectTonalComponents *pNumIndexes=%d\n", *pNumIndexes);
#endif

    set32_fx( pScaledMdctSpectrum, 0, L_FRAME_MAX );

@@ -122,14 +155,27 @@ void DetectTonalComponents_fx(
    }

    /* Find peak candidates in the last frame. */
#ifdef FIX_ISSUE_1966
    findCandidates( nSamples, pScaledMdctSpectrum, lastMDCTSpect_exp, thresholdModification, thresholdModification32, floorPowerSpectrum );
#else
    findCandidates( nSamples, pScaledMdctSpectrum, lastMDCTSpect_exp, thresholdModification, floorPowerSpectrum );
#endif

    /* Refine peak candidates using the pitch information */
#ifdef FIX_ISSUE_1966
    RefineThresholdsUsingPitch_fx( nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, &F0_32, 
                        thresholdModification, thresholdModification32 );
#else
    RefineThresholdsUsingPitch_fx( nSamples, nSamplesCore, secondLastPowerSpectrum, lastPitchLag, currentPitchLag, &F0, thresholdModification );
#endif

    /* Find peaks in the second last frame */
#ifdef FIX_ISSUE_1966
    findTonalComponents_fx( indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, secondLastPowerSpectrum_e, 
                            F0, F0_32, thresholdModification, thresholdModification32, element_mode );
#else
    findTonalComponents_fx( indexOfTonalPeak, lowerIndex, upperIndex, pNumIndexes, nSamples, secondLastPowerSpectrum, secondLastPowerSpectrum_e, F0, thresholdModification, element_mode );

#endif
    return;
}

@@ -296,6 +342,9 @@ static void getEnvelope(
    const Word16 nSamples,   /*i  :               Q0 */
    const Word32 *powerSpec, /*i  : powerSpec_exp    */
    Word16 F0,               /*i  :              5Q10*/
#ifdef FIX_ISSUE_1966
    Word32 F0_32,            /*i  :              5Q10+Q16*/
#endif
    Word32 *envelope,        /*o  : powerSpec_exp + LEVEL_EXP Q28*/
    Word32 *smoothedSpectrum /*o  : powerSpec_exp + LEVEL_EXP Q28*/
)
@@ -711,6 +760,14 @@ static void modifyThreshold(
    thresholdModification[k - 1] = add( threshold /*Q10*/, twoTimesFract /*Q10*/ ); /*Q10*/
    move16();
    thresholdModification[k + 1] = add( threshold /*Q10*/, sub( 2048 /*2 in Q10*/, twoTimesFract /*Q10*/ ) /*Q10*/ ); /*Q10*/
#ifdef DEBUG_ISSUE_1966
    if (frame == 1384)
    printf("modifyThreshold: [%d] %15.15f  %15.15f  %15.15f  F0 %15.15f\n", k - 1,
            (double) thresholdModification[k-1] / (1 << 10), 
            (double) thresholdModification[k+0] / (1 << 10), 
            (double) thresholdModification[k+1] / (1 << 10), 
            (double) F0 / (1 << 10) );
#endif

    return;
}
@@ -763,6 +820,9 @@ static void findCandidates(
    const Word32 *MDCTSpectrum,       /* i  : MDCT spectrum                        */
    const Word16 MDCTSpectrum_exp,    /* i  : exponent of MDCT spectrum            */
    Word16 *thresholdModificationNew, /* o  : threshold modification Q10           */
#ifdef FIX_ISSUE_1966
    Word32 *thresholdModificationNew32, /* o  : threshold modification Q10+Q16     */
#endif
    Word16 floorPowerSpectrum         /* i  : lower limit for power spectrum bins  Q0*/
)
{
@@ -777,9 +837,17 @@ static void findCandidates(

    calcPseudoSpec( MDCTSpectrum, MDCTSpectrum_exp, nSamples, floorPowerSpectrum, powerSpectrum, &powerSpectrum_exp );

#ifdef FIX_ISSUE_1966
    getEnvelope( nSamples, powerSpectrum, 0, (Word32) 0, envelope, smoothedSpectrum );
#else
    getEnvelope( nSamples, powerSpectrum, 0, envelope, smoothedSpectrum );
#endif

    set16_fx( thresholdModificationNew, UNREACHABLE_THRESHOLD, nSamples ); /*Q10*/
#ifdef FIX_ISSUE_1966
    set32_fx( thresholdModificationNew32, (UNREACHABLE_THRESHOLD) << 16, nSamples ); /*Q10+Q16*/

#endif

    k = GROUP_LENGTH / 2;
    move16();
@@ -873,11 +941,19 @@ static void findCandidates(
                {
                    thresholdModificationNew[j] = BIG_THRESHOLD; /*Q10*/
                    move16();
#ifdef FIX_ISSUE_1966
                    thresholdModificationNew32[j] = BIG_THRESHOLD << 16; /* 1.5f in Q10+Q16*/
                    move32();
#endif

                    if ( GT_32( smoothedSpectrum[j], envelope[j] ) )
                    {
                        thresholdModificationNew[j] = SMALL_THRESHOLD; /*Q10*/
                        move16();
#ifdef FIX_ISSUE_1966
                        thresholdModificationNew32[j] = 73819750; /* 1.1f in Q10+Q16*/
                        move32();
#endif
                    }
                }
                /* Jump to the next foot of the peak. */
@@ -901,7 +977,13 @@ static void findTonalComponents_fx(
    const Word32 *powerSpectrum, /* IN Q31-powerSpectrum_e*/
    const Word16 powerSpectrum_e,
    Word16 F0,                     /* IN */
#ifdef FIX_ISSUE_1966
    Word32 F0_32,                  /* IN */
#endif
    Word16 *thresholdModification, /* IN Q10*/
#ifdef FIX_ISSUE_1966
    Word32 *thresholdModification32, /* IN Q10+Q16*/
#endif
    Word16 element_mode )          /* IN */
{
    Word32 envelope[L_FRAME_MAX];         /*powerSpec_exp + LEVEL_EXP*/
@@ -912,7 +994,21 @@ static void findTonalComponents_fx(
    Word32 biggerNeighbor;
    Word16 tmp_loop1, tmp_loop2, tmp_loop3;

#ifdef DEBUG_ISSUE_1966
    if (frame == 1384)
    {
        for (j = 0; j < nSamples; j++)
        {
            printf( "thresholdModification[%3d]=%15.15f\n", j, (double) thresholdModification[j] / (double) (1 << 10) );
        }
    }
#endif

#ifdef FIX_ISSUE_1966
    getEnvelope( nSamples, powerSpectrum, F0, F0_32, envelope, smoothedSpectrum );
#else
    getEnvelope( nSamples, powerSpectrum, F0, envelope, smoothedSpectrum );
#endif

    nrOfFIS = 0;
    move16();
@@ -1047,6 +1143,10 @@ static void findTonalComponents_fx(

                indexOfTonalPeak[nrOfFIS++] = k;
                move16();
#ifdef DEBUG_ISSUE_1966
                if ( frame == 1384 )
                    printf( "nrOfFIS=%d  k=%d\n", nrOfFIS , k);
#endif

                IF( EQ_16( nrOfFIS, MAX_NUMBER_OF_IDX ) )
                {
@@ -1073,7 +1173,13 @@ static void RefineThresholdsUsingPitch_fx(
    const Word32 lastPitchLag,    /*Qx*/
    const Word32 currentPitchLag, /*Qx*/
    Word16 *pF0,                  /*Q10*/
#ifdef FIX_ISSUE_1966
    Word32 *pF0_32,               /*Q10+Q16*/
#endif
    Word16 *thresholdModification /*Q10*/
#ifdef FIX_ISSUE_1966
  , Word32 *thresholdModification32 /*Q10+Q16*/
#endif
)
{
    Word16 pitchIsStable;
+24 −0
Original line number Diff line number Diff line
@@ -11,6 +11,12 @@
#include "ivas_prot_fx.h"


//#define DEBUG_ISSUE_1966

#ifdef DEBUG_ISSUE_1966
extern int32_t frame;
#endif

/*  static void setnoiseLevelMemory_fx()
 *
 *      Helper function - updates buffer for minimumStatistics_fx function
@@ -375,6 +381,9 @@ Word16 GetPLCModeDecision_fx(
    TCX_DEC_HANDLE hTcxDec;

    hTcxDec = st->hTcxDec;
#ifdef DEBUG_ISSUE_1966
    printf("Calling GetPLCModeDecision in frame=%d\n", frame);
#endif

    IF( EQ_16( st->flagGuidedAcelp, 1 ) )
    {
@@ -410,6 +419,9 @@ Word16 GetPLCModeDecision_fx(
        }
        st->tonal_mdct_plc_active = 0;
        move16();
#ifdef DEBUG_ISSUE_1966
        printf( "-->tonal_mdct_plc_active=%d  F1\n", st->tonal_mdct_plc_active );
#endif
    }
    ELSE
    {
@@ -427,6 +439,9 @@ Word16 GetPLCModeDecision_fx(
            test();
            test();
            test();
#ifdef DEBUG_ISSUE_1966
            printf( "-->tonal_mdct_plc_active=%d  F2\n", st->tonal_mdct_plc_active );
#endif
            IF( !( st->rf_flag && st->use_partial_copy && ( EQ_16( st->rf_frame_type, RF_TCXTD1 ) || EQ_16( st->rf_frame_type, RF_TCXTD2 ) ) ) )
            {
                test();
@@ -459,12 +474,18 @@ Word16 GetPLCModeDecision_fx(
                    test();
                    test();
                    test();
#ifdef DEBUG_ISSUE_1966
    printf("-->pitch=%f  numIndices=%2d\n", (double) pitch / (double) (1 << 16), numIndices);
#endif
                    IF( ( GT_16( numIndices, 10 ) ) || ( ( GT_16( numIndices, 5 ) ) && ( LT_32( L_abs( L_sub( hTcxDec->tcxltp_third_last_pitch, hTcxDec->tcxltp_second_last_pitch ) ), 32768l /*0.5f Q16*/ ) ) ) || ( ( numIndices > 0 ) && ( ( LE_16( st->last_good, UNVOICED_TRANSITION ) ) || ( LE_16( hTcxDec->tcxltp_last_gain_unmodified, 13107 /*0.4f Q15*/ ) ) ) && ( LT_32( L_abs( L_sub( hTcxDec->tcxltp_third_last_pitch, hTcxDec->tcxltp_second_last_pitch ) ), 32768l /*0.5f Q16*/ ) ) ) )
                    {
                        core = TCX_20_CORE;
                        move16();
                        st->tonal_mdct_plc_active = 1;
                        move16();
#ifdef DEBUG_ISSUE_1966
                        printf( "-->tonal_mdct_plc_active=%d  F21\n", st->tonal_mdct_plc_active );
#endif
                    }
                    ELSE IF( LE_16( st->last_good, UNVOICED_TRANSITION ) || LE_16( hTcxDec->tcxltp_last_gain_unmodified, 13107 /*0.4f Q15*/ ) )
                    {
@@ -484,6 +505,9 @@ Word16 GetPLCModeDecision_fx(
            }
        }
    }
#ifdef DEBUG_ISSUE_1966
    printf( "X->tonal_mdct_plc_active=%d  F3\n", st->tonal_mdct_plc_active );
#endif

    return core; /*Q0*/
}
+37 −0
Original line number Diff line number Diff line
@@ -40,7 +40,11 @@
#include "basop_proto_func.h"
#include "ivas_prot_fx.h"

//#define DEBUG_ISSUE_1966

#ifdef DEBUG_ISSUE_1966
extern int32_t frame;
#endif
/*-----------------------------------------------------------------*
 * Function mdct_read_IGF_bits()
 *
@@ -1516,6 +1520,10 @@ void ivas_mdct_core_tns_ns_fx(
    Word16 exp, length;
#endif

#ifdef DEBUG_ISSUE_1966
    printf("Calling ivas_mdct_core_tns_ns in frame=%d\n", frame);
#endif

    /* Initializations */
    sts = hCPE->hCoreCoder;
    bfi = sts[0]->bfi;
@@ -1529,6 +1537,9 @@ void ivas_mdct_core_tns_ns_fx(
    FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
    {
        st = sts[ch];
#ifdef DEBUG_ISSUE_1966
        printf( "->ch=%d tonal_mdct_plc_active=%d  F1\n", ch, st->tonal_mdct_plc_active );
#endif
#ifdef FIX_BASOP_2555_FRAMELEN_CALC
        IF( EQ_16( st->core, TCX_20_CORE ) )
        {
@@ -1590,6 +1601,10 @@ void ivas_mdct_core_tns_ns_fx(
            IF( st->hTonalMDCTConc != NULL )
            {
                TonalMDCTConceal_UpdateState_fx( st->hTonalMDCTConc, st->hTcxDec->L_frameTCX, 0, bfi, 0 );
#ifdef DEBUG_ISSUE_1966
                printf( "->ch=%d tonal_mdct_plc_active=%d  F2\n", ch, st->tonal_mdct_plc_active );
#endif

            }

            /* nothing to do for missing LFE */
@@ -1601,6 +1616,10 @@ void ivas_mdct_core_tns_ns_fx(
            init_tcx_info_fx( st, L_frame_global[ch], L_frameTCX_glob[ch], k, bfi, &tcx_offset[ch],
                              &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] );

#ifdef DEBUG_ISSUE_1966
            printf( "->ch=%d tonal_mdct_plc_active=%d  F3 k=%d\n", ch, st->tonal_mdct_plc_active, k );
#endif

            Word16 q_x;
            q_x = sub( 31, x_e );
            IF( bfi == 0 )
@@ -1622,6 +1641,9 @@ void ivas_mdct_core_tns_ns_fx(
                        move16();
                    }
                    TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline_fx( st, L_frame[ch], L_frameTCX[ch] ) );
#ifdef DEBUG_ISSUE_1966
                    printf( "->ch=%d tonal_mdct_plc_active=%d  F4 k=%d\n", ch, st->tonal_mdct_plc_active, k );
#endif
                }
            }
            ELSE
@@ -1680,6 +1702,9 @@ void ivas_mdct_core_tns_ns_fx(
            }
            Scale_sig32( &x_fx[ch][k][0], length, -5 );
            decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x_fx[ch][k], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 1, &length );
#ifdef DEBUG_ISSUE_1966
            printf( "->ch=%d tonal_mdct_plc_active=%d  F5 k=%d\n", ch, st->tonal_mdct_plc_active, k );
#endif
            norm_x = getScaleFactor32( &x_fx[ch][k][0], length );
            Scale_sig32( &x_fx[ch][k][0], length, norm_x );
            q_x = add( q_x, norm_x );
@@ -1738,6 +1763,9 @@ void ivas_mdct_core_tns_ns_fx(
            }
            Scale_sig32( &x_fx[ch][k][0], length, -5 );
            decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x_fx[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0, &length );
#ifdef DEBUG_ISSUE_1966
            printf( "->ch=%d tonal_mdct_plc_active=%d  F6 k=%d\n", ch, st->tonal_mdct_plc_active, k );
#endif
            Scale_sig32( &x_fx[ch][k][0], length, sub( sub( 31, q_x ), x_e ) );
        }

@@ -1750,6 +1778,9 @@ void ivas_mdct_core_tns_ns_fx(
            }

            TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], x_e, st->hTcxCfg->psychParamsCurrent );
#ifdef DEBUG_ISSUE_1966
            printf( "->ch=%d tonal_mdct_plc_active=%d  F7\n", ch, st->tonal_mdct_plc_active );
#endif
        }

        test();
@@ -1759,10 +1790,16 @@ void ivas_mdct_core_tns_ns_fx(
            IF( st->hTcxDec->tcxltp_last_gain_unmodified > 0 )
            {
                TonalMDCTConceal_UpdateState_fx( st->hTonalMDCTConc, L_frameTCX[ch], st->old_fpitch, bfi, (Word8) s_and( bfi, st->tonal_mdct_plc_active ) );
#ifdef DEBUG_ISSUE_1966
                printf( "->ch=%d tonal_mdct_plc_active=%d  bfi=%d  F8-A\n", ch, st->tonal_mdct_plc_active, bfi );
#endif
            }
            ELSE
            {
                TonalMDCTConceal_UpdateState_fx( st->hTonalMDCTConc, L_frameTCX[ch], 0, bfi, (Word8) s_and( bfi, st->tonal_mdct_plc_active ) );
#ifdef DEBUG_ISSUE_1966
                printf( "->ch=%d tonal_mdct_plc_active=%d  bfi=%d  F8-B\n", ch, st->tonal_mdct_plc_active, bfi );
#endif
            }
        }
    }
+108 −3
Original line number Diff line number Diff line
@@ -13,6 +13,12 @@
#include "stat_com.h"
#include "ivas_prot_fx.h"

//#define DEBUG_ISSUE_1966

#ifdef DEBUG_ISSUE_1966
extern int32_t frame;
#endif

#define CROSSFADE_THRESHOLD ( 32762 ) // close to 1.0f in Q15 such that (x == 1.0f) is true

/************************************************************************************
@@ -517,6 +523,10 @@ void TonalMDCTConceal_UpdateState_fx(
    const Word8 tonalConcealmentActive )
{
    Word8 newBlockIsValid;
#ifdef DEBUG_ISSUE_1966
    printf("Calling TonalMDCTConceal_UpdateState in frame=%d: ns=%d pl=%f bB=%d tCA=%d\n",
         frame, nNewSamples, (double) pitchLag / (double) (1 << 16), badBlock, tonalConcealmentActive);
#endif

    assert( !( !badBlock && tonalConcealmentActive ) );

@@ -606,6 +616,11 @@ static void FindPhaseDifferences(
    Word16 divi, s, j;
    Word32 a, Q, L_tmp, m, n;

#ifdef DEBUG_ISSUE_1966
    int a_way;
    printf( "Calling FindPhaseDifferences: numIndexes=%d  frame=%d\n", hTonalMDCTConc->pTCI->numIndexes, frame );
#endif

    s = SS;
    move16();
    j = J;
@@ -627,11 +642,33 @@ static void FindPhaseDifferences(
        {
            phaseDiff[i] = 0; /*(float)tan(0.0f*EVS_PI/bandwidth);*/
            move16();
#if 0
            if ( s_and( k, 1 ) != 0 )
            {
                phaseDiff[i] = -12868 /*-EVS_PI 3Q12*/;
                move16();
            }
#else
            if ( EQ_16( s_and( k, 3 ), 1 ) )
            {
                phaseDiff[i] = 12868  /* 1*EVS_PI 3Q12*/; 
                move16();
            }
            if ( EQ_16( s_and( k, 3 ), 2 ) )
            {
                phaseDiff[i] = -25736 /*-2*EVS_PI 3Q12*/;
                move16();
            }
            if ( EQ_16( s_and( k, 3 ), 3 ) )
            {
                phaseDiff[i] = -12868 /*-1*EVS_PI 3Q12*/;
                move16();
            }
#endif
#ifdef DEBUG_ISSUE_1966
            fractional = 0; // only for debug
            a_way = 1;
#endif
        }
        ELSE
        {
@@ -639,11 +676,33 @@ static void FindPhaseDifferences(
            {
                phaseDiff[i] = 12868 /*EVS_PI 3Q12*/; /*(float)tan(2.0f*PI/bandwidth);*/
                move16();
#if 0
                if ( s_and( k, 1 ) != 0 )
                {
                    phaseDiff[i] = 0 /*0 Q13*/; /*2Q13*/
                    move16();
                }
#else
                if ( EQ_16( s_and( k, 3 ), 1 ) )
                {
                    phaseDiff[i] = -25736 /*-2*EVS_PI 3Q12*/;
                    move16();
                }
                if ( EQ_16( s_and( k, 3 ), 2 ) )
                {
                    phaseDiff[i] = -12868 /*-1*EVS_PI 3Q12*/; 
                    move16();
                }
                if ( EQ_16( s_and( k, 3 ), 3 ) )
                {
                    phaseDiff[i] = 0 /* 0*EVS_PI 3Q12*/;
                    move16();
                }
#endif
#ifdef DEBUG_ISSUE_1966
                fractional = 0; // only for debug
                a_way = 2;
#endif
            }
            ELSE
            {
@@ -703,8 +762,20 @@ static void FindPhaseDifferences(
                }
                phaseDiff[i] = round_fx( L_shl( L_tmp, 1 ) ); /*3Q12*/
                move16();
#ifdef DEBUG_ISSUE_1966
                a_way = 3;
#endif
            }
        }
#ifdef DEBUG_ISSUE_1966    
        printf( "phaseDiff[%3d]=%15.15f  frac=%15.15f  a_way=%d\n  l/r=%15.15f  k=%d\n",
                i, 
                (double) phaseDiff[i] / (double) (1 << 12),
                ( a_way == 3 ) ? (double) L_mult(fractional, 28672) / (double) (1 << 27) : 0.f, 
                a_way,
                (double) powerSpectrum[k - 1] / (double) powerSpectrum[k + 1],
                hTonalMDCTConc->pTCI->indexOfTonalPeak[i] );
#endif
    }

    return;
@@ -777,6 +848,9 @@ static void CalcPowerSpecAndDetectTonalComponents_fx(
        spectralData_exp = add( hTonalMDCTConc->lastBlockData.spectralData_exp, hTonalMDCTConc->lastBlockData.gain_tcx_exp );
    }

#ifdef DEBUG_ISSUE_1966
    printf( "Before DetectTonalComponents_fx: hTonalMDCTConc->pTCI->numIndexes=%d\n", hTonalMDCTConc->pTCI->numIndexes );
#endif
    DetectTonalComponents_fx( (Word16 *) hTonalMDCTConc->pTCI->indexOfTonalPeak,
                              (Word16 *) hTonalMDCTConc->pTCI->lowerIndex,
                              (Word16 *) hTonalMDCTConc->pTCI->upperIndex,
@@ -793,7 +867,9 @@ static void CalcPowerSpecAndDetectTonalComponents_fx(
                              nSamples,
                              hTonalMDCTConc->nSamplesCore,
                              floorPowerSpectrum, psychParamsCurrent, element_mode );

#ifdef DEBUG_ISSUE_1966
    printf( "Behind DetectTonalComponents_fx: hTonalMDCTConc->pTCI->numIndexes=%d\n", hTonalMDCTConc->pTCI->numIndexes );
#endif
    FindPhases( hTonalMDCTConc, secondLastMDCT, secondLastMDST, sub( secondLastMDST_exp, secondLastMDCT_exp ) );

    FindPhaseDifferences( hTonalMDCTConc, powerSpectrum );
@@ -944,9 +1020,12 @@ void TonalMDCTConceal_Detect_fx(
    Word16 i, powerSpectrum_exp, secondLastMDST_exp, s;
    Word16 nSamples;
    Word32 sns_int_scf_fx[FDNS_NPTS];
#ifdef DEBUG_ISSUE_1966
    Word32 det_way = 0;
    printf( "Calling TonalMDCTConceal_Detect in frame=%d  *numIndices=%d ->numIndexes=%d\n", frame, *numIndices, hTonalMDCTConc->pTCI->numIndexes );
#endif
    set32_fx( sns_int_scf_fx, 0, FDNS_NPTS );


    nSamples = hTonalMDCTConc->nSamples;
    move16();

@@ -975,6 +1054,10 @@ void TonalMDCTConceal_Detect_fx(
        {
            IF( hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive == 0 )
            {
#ifdef DEBUG_ISSUE_1966
                det_way = 1;
#endif

                CalcMDXT( hTonalMDCTConc, 0, hTonalMDCTConc->secondLastPcmOut, secondLastMDST, &secondLastMDST_exp );
                CalcMDXT( hTonalMDCTConc, 1, hTonalMDCTConc->secondLastPcmOut, secondLastMDCT, &secondLastMDCT_exp );
                hTonalMDCTConc->nNonZeroSamples = 0;
@@ -1023,6 +1106,9 @@ void TonalMDCTConceal_Detect_fx(
            }
            ELSE
            {
#ifdef DEBUG_ISSUE_1966
                det_way = 2;
#endif
                /* If the second last frame was also lost, it is expected that pastTimeSignal could hold a bit different signal (e.g. including fade-out) from the one stored in TonalMDCTConceal_SaveTimeSignal. */
                /* That is why we reuse the already stored information about the concealed spectrum in the second last frame */
                Word16 temp_power_spectrum_q = 0;
@@ -1035,6 +1121,9 @@ void TonalMDCTConceal_Detect_fx(
                }
                IF( psychParamsCurrent == NULL )
                {
#ifdef DEBUG_ISSUE_1966
                    det_way = 21;
#endif
                    mdct_shaping_16( hTonalMDCTConc->secondLastPowerSpectrum, hTonalMDCTConc->nSamplesCore, nSamples,
                                     hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp,
                                     hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum );
@@ -1054,6 +1143,9 @@ void TonalMDCTConceal_Detect_fx(
                }
                ELSE
                {
#ifdef DEBUG_ISSUE_1966
                    det_way = 22;
#endif
                    FOR( i = 0; i < FDNS_NPTS; i++ )
                    {
                        sns_int_scf_fx[i] = L_shl( hTonalMDCTConc->secondLastBlockData.scaleFactors[i], add( 1, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ) ); // Q16
@@ -1070,7 +1162,9 @@ void TonalMDCTConceal_Detect_fx(
                    }
                    powerSpectrum_exp = sub( 31, sub( shl( sub( Q31 - 3, powerSpectrum_exp ), 1 ), 31 ) );
                }

#ifdef DEBUG_ISSUE_1966
                printf( "Before RefineTonalComponents: hTonalMDCTConc->pTCI->numIndexes=%d\n", hTonalMDCTConc->pTCI->numIndexes );
#endif
                RefineTonalComponents_fx( (Word16 *) hTonalMDCTConc->pTCI->indexOfTonalPeak,
                                          (Word16 *) hTonalMDCTConc->pTCI->lowerIndex,
                                          (Word16 *) hTonalMDCTConc->pTCI->upperIndex,
@@ -1089,15 +1183,26 @@ void TonalMDCTConceal_Detect_fx(
                                          nSamples,
                                          hTonalMDCTConc->nSamplesCore,
                                          extract_l( Mpy_32_16_1( L_mult0( hTonalMDCTConc->nSamples, hTonalMDCTConc->nSamples ), 82 ) ), element_mode, psychParamsCurrent ); /* floorPowerSpectrum */
#ifdef DEBUG_ISSUE_1966
                printf( "After RefineTonalComponents: hTonalMDCTConc->pTCI->numIndexes=%d\n", hTonalMDCTConc->pTCI->numIndexes );
#endif
            }
        }
    }
    ELSE
    {
#ifdef DEBUG_ISSUE_1966
        det_way = 3;
#endif

        hTonalMDCTConc->pTCI->numIndexes = 0;
        move16();
    }

#ifdef DEBUG_ISSUE_1966
    printf( "Using TonalMDCTConceal_Detect in path=%d\n", det_way );
#endif
    
    *numIndices = hTonalMDCTConc->pTCI->numIndexes;
    move16();