Commit d0ae972c authored by lefort's avatar lefort
Browse files

Aligned on branch 947-issues_with_stereo_dmx_evs.

parent c5f5823d
Loading
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -209,7 +209,13 @@
#define BE_FIX_567_DOUBLE_STEREO_DMX                          /* NTT: Fix formal issues */   
#define NONBE_FIX_567_DOUBLE_STEREO_DMX                       /* Orange: Double-precision replaced by single-precision */  
#define NONBE_FIX_947_STEREO_DMX_EVS_POC                      /* Orange: Fix clicks on POC */
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
#define NONBE_FIX_947_STEREO_DMX_ROMOPT                       /* Orange: ROM optimisation for POC*/  
#endif
#define NONBE_FIX_947_STEREO_DMX_EVS_PHA                      /* Orange: Fix issues on PHA */
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA
#define NONBE_FIX_947_STEREO_DMX_FADOPT                       /* Orange: Fading optimisation */  
#endif 

/* #################### End BASOP porting switches ############################ */

+63 −4
Original line number Diff line number Diff line
@@ -536,6 +536,64 @@ const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] =

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 2] = {
    0.00009518625f, 0.00038070876f, 0.00085645882f, 0.00152225529f, 0.00237784467f, 0.00342290120f, 0.00465702698f, 0.00607975212f, 0.00769053493f, 0.00948876211f, 
    0.01147374899f, 0.01364473980f, 0.01600090794f, 0.01854135633f, 0.02126511768f, 0.02417115495f, 0.02725836167f, 0.03052556242f, 0.03397151320f, 0.03759490201f, 
    0.04139434925f, 0.04536840829f, 0.04951556605f, 0.05383424350f, 0.05832279634f, 0.06297951556f, 0.06780262815f, 0.07279029773f, 0.07794062527f, 0.08325164980f, 
    0.08872134919f, 0.09434764087f, 0.10012838266f, 0.10606137357f, 0.11214435465f, 0.11837500982f, 0.12475096680f, 0.13126979798f, 0.13792902134f, 0.14472610141f, 
    0.15165845025f, 0.15872342839f, 0.16591834588f, 0.17324046329f, 0.18068699277f, 0.18825509907f, 0.19594190069f, 0.20374447091f, 0.21165983894f, 0.21968499105f, 
    0.22781687170f, 0.23605238471f, 0.24438839446f, 0.25282172706f, 0.26134917154f, 0.26996748113f, 0.27867337446f, 0.28746353680f, 0.29633462133f, 0.30528325043f, 
    0.31430601697f, 0.32339948556f, 0.33256019391f, 0.34178465414f, 0.35106935407f, 0.36041075859f, 0.36980531103f, 0.37924943444f, 0.38873953302f, 0.39827199347f, 
    0.40784318636f, 0.41744946748f, 0.42708717932f, 0.43675265234f, 0.44644220647f, 0.45615215247f, 0.46587879332f, 0.47561842564f, 0.48536734113f, 0.49512182793f, 
};

const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 2] = {
    0.00002394563f, 0.00009578022f, 0.00021549689f, 0.00038308417f, 0.00059852602f, 0.00086180179f, 0.00117288627f, 0.00153174967f, 0.00193835760f, 0.00239267114f, 
    0.00289464674f, 0.00344423635f, 0.00404138732f, 0.00468604244f, 0.00537813998f, 0.00611761365f, 0.00690439261f, 0.00773840150f, 0.00861956044f, 0.00954778504f, 
    0.01052298638f, 0.01154507106f, 0.01261394118f, 0.01372949435f, 0.01489162374f, 0.01610021802f, 0.01735516144f, 0.01865633380f, 0.02000361046f, 0.02139686238f, 
    0.02283595610f, 0.02432075380f, 0.02585111325f, 0.02742688787f, 0.02904792673f, 0.03071407456f, 0.03242517178f, 0.03418105448f, 0.03598155450f, 0.03782649936f, 
    0.03971571237f, 0.04164901255f, 0.04362621475f, 0.04564712957f, 0.04771156345f, 0.04981931865f, 0.05197019329f, 0.05416398135f, 0.05640047270f, 0.05867945313f, 
    0.06100070434f, 0.06336400401f, 0.06576912578f, 0.06821583926f, 0.07070391012f, 0.07323310003f, 0.07580316675f, 0.07841386411f, 0.08106494204f, 0.08375614663f, 
    0.08648722009f, 0.08925790085f, 0.09206792352f, 0.09491701895f, 0.09780491424f, 0.10073133278f, 0.10369599428f, 0.10669861478f, 0.10973890666f, 0.11281657874f, 
    0.11593133621f, 0.11908288075f, 0.12227091048f, 0.12549512005f, 0.12875520064f, 0.13205083999f, 0.13538172244f, 0.13874752893f, 0.14214793710f, 0.14558262123f, 
    0.14905125235f, 0.15255349823f, 0.15608902340f, 0.15965748923f, 0.16325855391f, 0.16689187254f, 0.17055709710f, 0.17425387653f, 0.17798185674f, 0.18174068066f, 
    0.18552998825f, 0.18934941657f, 0.19319859978f, 0.19707716920f, 0.20098475333f, 0.20492097790f, 0.20888546587f, 0.21287783752f, 0.21689771045f, 0.22094469963f, 
    0.22501841743f, 0.22911847365f, 0.23324447559f, 0.23739602804f, 0.24157273335f, 0.24577419148f, 0.25000000000f, 0.25424975414f, 0.25852304686f, 0.26281946885f, 
    0.26713860858f, 0.27148005237f, 0.27584338436f, 0.28022818664f, 0.28463403922f, 0.28906052009f, 0.29350720527f, 0.29797366885f, 0.30245948302f, 0.30696421811f, 
    0.31148744266f, 0.31602872341f, 0.32058762540f, 0.32516371195f, 0.32975654476f, 0.33436568391f, 0.33899068794f, 0.34363111384f, 0.34828651715f, 0.35295645195f, 
    0.35764047095f, 0.36233812551f, 0.36704896567f, 0.37177254021f, 0.37650839670f, 0.38125608152f, 0.38601513994f, 0.39078511611f, 0.39556555316f, 0.40035599320f, 
    0.40515597739f, 0.40996504598f, 0.41478273835f, 0.41960859304f, 0.42444214782f, 0.42928293972f, 0.43413050508f, 0.43898437958f, 0.44384409832f, 0.44870919580f, 
    0.45357920605f, 0.45845366260f, 0.46333209856f, 0.46821404667f, 0.47309903931f, 0.47798660859f, 0.48287628638f, 0.48776760431f, 0.49266009390f, 0.49755328651f,
};

const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 2] = {
    0.00001066469f, 0.00004265829f, 0.00009597944f, 0.00017062587f, 0.00026659439f, 0.00038388092f, 0.00052248043f, 0.00068238703f, 0.00086359389f, 0.00106609329f, 
    0.00128987657f, 0.00153493420f, 0.00180125573f, 0.00208882979f, 0.00239764411f, 0.00272768552f, 0.00307893994f, 0.00345139239f, 0.00384502699f, 0.00425982692f, 
    0.00469577451f, 0.00515285116f, 0.00563103736f, 0.00613031272f, 0.00665065594f, 0.00719204483f, 0.00775445628f, 0.00833786630f, 0.00894225002f, 0.00956758164f, 
    0.01021383449f, 0.01088098101f, 0.01156899272f, 0.01227784029f, 0.01300749347f, 0.01375792114f, 0.01452909129f, 0.01532097101f, 0.01613352653f, 0.01696672319f, 
    0.01782052544f, 0.01869489686f, 0.01958980015f, 0.02050519713f, 0.02144104876f, 0.02239731512f, 0.02337395540f, 0.02437092795f, 0.02538819024f, 0.02642569887f, 
    0.02748340959f, 0.02856127727f, 0.02965925593f, 0.03077729874f, 0.03191535800f, 0.03307338516f, 0.03425133082f, 0.03544914473f, 0.03666677580f, 0.03790417209f, 
    0.03916128080f, 0.04043804831f, 0.04173442015f, 0.04305034103f, 0.04438575481f, 0.04574060451f, 0.04711483235f, 0.04850837971f, 0.04992118712f, 0.05135319434f, 
    0.05280434026f, 0.05427456299f, 0.05576379980f, 0.05727198717f, 0.05879906076f, 0.06034495543f, 0.06190960523f, 0.06349294342f, 0.06509490245f, 0.06671541398f, 
    0.06835440889f, 0.07001181725f, 0.07168756837f, 0.07338159076f, 0.07509381216f, 0.07682415952f, 0.07857255903f, 0.08033893610f, 0.08212321539f, 0.08392532077f, 
    0.08574517538f, 0.08758270157f, 0.08943782098f, 0.09131045444f, 0.09320052209f, 0.09510794329f, 0.09703263668f, 0.09897452015f, 0.10093351086f, 0.10290952525f, 
    0.10490247902f, 0.10691228715f, 0.10893886391f, 0.11098212284f, 0.11304197679f, 0.11511833788f, 0.11721111754f, 0.11932022649f, 0.12144557476f, 0.12358707169f, 
    0.12574462591f, 0.12791814541f, 0.13010753744f, 0.13231270863f, 0.13453356489f, 0.13677001149f, 0.13902195302f, 0.14128929343f, 0.14357193598f, 0.14586978330f, 
    0.14818273738f, 0.15051069953f, 0.15285357046f, 0.15521125022f, 0.15758363824f, 0.15997063331f, 0.16237213360f, 0.16478803667f, 0.16721823946f, 0.16966263830f, 
    0.17212112893f, 0.17459360645f, 0.17707996539f, 0.17958009971f, 0.18209390273f, 0.18462126722f, 0.18716208538f, 0.18971624880f, 0.19228364855f, 0.19486417508f, 
    0.19745771833f, 0.20006416764f, 0.20268341185f, 0.20531533920f, 0.20795983744f, 0.21061679373f, 0.21328609476f, 0.21596762663f, 0.21866127498f, 0.22136692487f, 
    0.22408446091f, 0.22681376715f, 0.22955472717f, 0.23230722405f, 0.23507114037f, 0.23784635822f, 0.24063275922f, 0.24343022449f, 0.24623863471f, 0.24905787007f, 
    0.25188781030f, 0.25472833469f, 0.25757932206f, 0.26044065079f, 0.26331219882f, 0.26619384366f, 0.26908546237f, 0.27198693160f, 0.27489812759f, 0.27781892614f, 
    0.28074920265f, 0.28368883213f, 0.28663768917f, 0.28959564798f, 0.29256258237f, 0.29553836579f, 0.29852287128f, 0.30151597152f, 0.30451753885f, 0.30752744522f, 
    0.31054556222f, 0.31357176111f, 0.31660591279f, 0.31964788784f, 0.32269755648f, 0.32575478862f, 0.32881945384f, 0.33189142141f, 0.33497056027f, 0.33805673909f, 
    0.34114982620f, 0.34424968966f, 0.34735619724f, 0.35046921640f, 0.35358861436f, 0.35671425805f, 0.35984601412f, 0.36298374899f, 0.36612732880f, 0.36927661945f, 
    0.37243148660f, 0.37559179565f, 0.37875741181f, 0.38192820002f, 0.38510402503f, 0.38828475135f, 0.39147024330f, 0.39466036500f, 0.39785498036f, 0.40105395309f, 
    0.40425714674f, 0.40746442465f, 0.41067565002f, 0.41389068585f, 0.41710939500f, 0.42033164016f, 0.42355728386f, 0.42678618852f, 0.43001821639f, 0.43325322959f, 
    0.43649109013f, 0.43973165987f, 0.44297480059f, 0.44622037393f, 0.44946824144f, 0.45271826458f, 0.45597030469f, 0.45922422305f, 0.46247988086f, 0.46573713923f, 
    0.46899585921f, 0.47225590178f, 0.47551712789f, 0.47877939840f, 0.48204257416f, 0.48530651596f, 0.48857108456f, 0.49183614071f, 0.49510154512f, 0.49836715849f, 
};
#else
 const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 1] = {
     0.00009518625f, 0.00038070876f, 0.00085645882f, 0.00152225529f, 0.00237784467f, 0.00342290120f, 0.00465702698f, 0.00607975212f, 0.00769053493f, 0.00948876211f, 
     0.01147374899f, 0.01364473980f, 0.01600090794f, 0.01854135633f, 0.02126511768f, 0.02417115495f, 0.02725836167f, 0.03052556242f, 0.03397151320f, 0.03759490201f, 
@@ -640,6 +698,7 @@ const float ari_bit_estimate_s17_LC[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] =
     0.99574017308f, 0.99615497301f, 0.99654860761f, 0.99692106006f, 0.99727231448f, 0.99760235589f, 0.99791117021f, 0.99819874427f, 0.99846506580f, 0.99871012343f, 
     0.99893390671f, 0.99913640611f, 0.99931761297f, 0.99947751957f, 0.99961611908f, 0.99973340561f, 0.99982937413f, 0.99990402056f, 0.99995734171f, 0.99998933531f, 
 };
#endif

#else
const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4] = {
+6 −0
Original line number Diff line number Diff line
@@ -121,9 +121,15 @@ extern const uint16_t ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE
 *----------------------------------------------------------------------------------*/

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 2];
extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 2];
extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 2];
#else
extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 1];
extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 1];
extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 1];
#endif
#else
extern const float Stereo_dmx_s_wnd_coef_16k[L_FRAME16k >> 4];
extern const float Stereo_dmx_s_wnd_coef_32k[L_FRAME32k >> 4];
+131 −2
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@
#define STEREO_DMX_EVS_CRST_FCTR_48  35.0f

#define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA
#define STEREO_DMX_EVS_FAD_R              3
#define STEREO_DMX_EVS_SGC_EGY_FORGETTING 0.9f
@@ -119,10 +120,10 @@
#define STEREO_DMX_EVS_SGC_LEGY_THRES_48  5.E8
#define STEREO_DMX_EVS_SGC_GMAX           1.4142f
#define STEREO_DMX_EVS_SGC_GMIN           0.7071f
#endif

#define STEREO_DMX_EVS_IPD_ILD_THRES 3.16f // 5dB
#define STEREO_DMX_EVS_IPD_SF_THRES  0.05f
#endif

/*-----------------------------------------------------------------------*
 * Local function prototypes
@@ -1274,6 +1275,32 @@ static void weighted_ave(
{
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT

    int16_t i, len, len2;
    float gain_tmp = 0.f, gain_sub;

    len = input_frame >> 1;
    len2 = input_frame >> 2;
    gain_sub = gain - old_gain;

    for ( i = 0; i < len2; i++ )
    {
        gain_tmp = old_gain + gain_sub * wnd[i];
        dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp );
    }
    for ( ; i < len; i++ )
    {
        gain_tmp = old_gain + gain_sub * ( 1.0f - wnd[len - i - 1] );
        dst[i] = src1[i] * gain_tmp + src2[i] * ( 1.0f - gain_tmp );
    }
    for ( ; i < input_frame; i++ )
    {
        dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp );
    }

#else

    int16_t i, len;
    float gain_tmp = 0.f, gain_sub;

@@ -1290,7 +1317,10 @@ static void weighted_ave(
        dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp );
    }

#endif

#else

    int16_t i, len;
    float gain_tmp = 0.f, gain_sub;

@@ -1306,7 +1336,9 @@ static void weighted_ave(
    {
        dst[i] = src1[i] * gain + src2[i] * ( 1.0f - gain_tmp );
    }

#endif

    return;
}

@@ -1425,6 +1457,28 @@ static void adapt_gain(
{
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT

    int16_t i, len, len2;
    float gain_tmp, gain_sub;

    len = input_frame >> 1;
    len2 = input_frame >> 2;
    gain_sub = gain - old_gain;

    for ( i = 0; i < len2; i++ )
    {
        gain_tmp = old_gain + gain_sub * wnd[i];
        dst[i] = src[i] * gain_tmp;
    }
    for ( ; i < len; i++ )
    {
        gain_tmp = old_gain + gain_sub * ( 1.0f - wnd[len - i - 1] );
        dst[i] = src[i] * gain_tmp;
    }

#else

    int16_t i, len;
    float gain_tmp, gain_sub;

@@ -1436,11 +1490,16 @@ static void adapt_gain(
        gain_tmp = old_gain + gain_sub * wnd[i];
        dst[i] = src[i] * gain_tmp;
    }

#endif

    for ( ; i < input_frame; i++ )
    {
        dst[i] = src[i] * gain;
    }

#else

    int16_t i, len;
    float gain_tmp, gain_sub;

@@ -1456,7 +1515,9 @@ static void adapt_gain(
    {
        dst[i] = src[i] * gain;
    }

#endif

    return;
}

@@ -1576,7 +1637,11 @@ void stereo_dmx_evs_enc(
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA

    float dmx_weight, corr;
#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
    int16_t k, m, n, pha_len, fad_len, input_subframe, input_frame, n_fad_r, n_fad_g, m_fad_g, n_fad_cnt, sbfad_len;
#else
    int16_t k, m, n, pha_len, fad_len, input_subframe, input_frame, n_fad_r, n_fad_g, m_fad_g, n_fad_cnt;
#endif
    float data_f[CPE_CHANNELS][L_FRAME48k];
    float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX];
    float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], subframe_energy[STEREO_DMX_EVS_NB_SBFRM];
@@ -1822,7 +1887,11 @@ void stereo_dmx_evs_enc(
        else
        {
            hPHA->n_fad_g = input_frame - hPHA->n_fad_g - 1;
#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
            hPHA->n_fad_cnt = 0;
#else
            hPHA->n_fad_cnt = is_transient ? 0 : n_fad_r - hPHA->n_fad_cnt;
#endif
        }
    }
    else if ( is_transient )
@@ -1839,6 +1908,59 @@ void stereo_dmx_evs_enc(
        n_fad_cnt = hPHA->n_fad_cnt;
        m_fad_g = input_frame - n_fad_g - 1;

#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
        if ( n_fad_r == 1 )
        {
            n_fad_cnt = 0;
            for ( n = 0; n < fad_len; n++ )
            {
                p_dmx_data[n] *= fad_g[n_fad_g++];
                p_dmx_data[n] += fad_g[m_fad_g--] * p_dmx_data_fo[n];
            }
        }
        else
        {
            n = 0;
            sbfad_len = 0;
            if ( n_fad_cnt != 0 )
            {
                sbfad_len = min( fad_len, n_fad_r - n_fad_cnt );
                for ( ; n < sbfad_len; n++ )
                {
                    p_dmx_data[n] *= fad_g[n_fad_g];
                    p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
                }
                n_fad_cnt = 0;
                n_fad_g++;
                m_fad_g--;
            }

            sbfad_len = (int16_t) ( ( fad_len - sbfad_len ) / n_fad_r );
            for ( k = 0; k < sbfad_len; k++ )
            {
                for ( m = 0; m < n_fad_r; m++ )
                {
                    p_dmx_data[n] *= fad_g[n_fad_g];
                    p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
                    n++;
                }
                n_fad_g++;
                m_fad_g--;
            }

            for ( ; n < fad_len; n++ )
            {
                p_dmx_data[n] *= fad_g[n_fad_g];
                p_dmx_data[n] += fad_g[m_fad_g] * p_dmx_data_fo[n];
                if ( ++n_fad_cnt >= n_fad_r )
                {
                    n_fad_cnt = 0;
                    n_fad_g++;
                    m_fad_g--;
                }
            }
        }
#else
        for ( n = 0; n < fad_len; n++ )
        {
            p_dmx_data[n] *= fad_g[n_fad_g];
@@ -1851,6 +1973,7 @@ void stereo_dmx_evs_enc(
                m_fad_g--;
            }
        }
#endif

        hPHA->n_fad_g = n_fad_g;
        hPHA->n_fad_cnt = n_fad_cnt;
@@ -2312,6 +2435,7 @@ ivas_error stereo_dmx_evs_init_encoder(
    hStereoDmxEVS->hPHA->pha_hys_cnt = 0;

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA

    hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0;
    hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10;
    hStereoDmxEVS->hPHA->pha_ipd_ild_thresh = STEREO_DMX_EVS_IPD_ILD_THRES;
@@ -2342,6 +2466,7 @@ ivas_error stereo_dmx_evs_init_encoder(
        ipd_ff[n] = STEREO_DMX_EVS_IFF_AMIN;
    }
#else

    /* Compute the forgetting factor */
    a_min = 0.8576958985908941f;
    a_max = 0.9440608762859234f;
@@ -2361,6 +2486,7 @@ ivas_error stereo_dmx_evs_init_encoder(
    {
        ipd_ff[n] = a_min;
    }

#endif
    set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX );
    set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX );
@@ -2403,8 +2529,11 @@ ivas_error stereo_dmx_evs_init_encoder(

#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA
    hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f );
#endif
    fad_len = hStereoDmxEVS->hPHA->fad_len_prc;
#else
    fad_len = input_frame;
#endif

    fad_g = hStereoDmxEVS->hPHA->fad_g_prc;
    fad_r = 1.0f / (float) ( fad_len + 1 );
    fad_len2 = fad_len / 2;