Loading lib_com/options.h +2 −12 Original line number Diff line number Diff line Loading @@ -150,18 +150,8 @@ #define DIRAC_DRCT_GAIN_TUNING /* issue 64: tuning of DirAC energy-compensation gains */ /* NTT switches */ ///////#define DEBUG_STEREO_DMX //#define STEREO_AVE_DOWNMIX #ifndef STEREO_AVE_DOWNMIX //#define NTT_UPDATE_ITD_SW //#define NTT_REMOVE_EPS_ROM //#define REDUCED_POC //#define DELAYED_SUM2 //#define REDUCED_POC5A ///////////#define REDUCED_POC6 #endif #define NTT_UPDATE_ITD_SW #define NTT_REMOVE_EPS_ROM /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ Loading lib_enc/ivas_stereo_dmx_evs.c +1 −495 Original line number Diff line number Diff line Loading @@ -78,10 +78,6 @@ static void create_M_signal( const float srcL[], const float srcR[], float dmx[] static float find_poc_peak( STEREO_DMX_EVS_POC_HANDLE hPOC, float itd[], const int16_t input_frame, const float ratio ); static void calc_energy( const float src1[], const float src2[], float energy[], const int16_t input_frame, const float ratio ); #ifdef DEBUG_STEREO_DMX FILE *fp; #endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * Loading Loading @@ -159,27 +155,14 @@ static void calc_poc( const float *c, *s; float *P; float tmp1, tmp2, Lr, Li, Rr, Ri, gamma, igamma, iN; #ifdef REDUCED_POC float specPOr[L_FRAME48k / 2 + 1], specPOi[L_FRAME48k / 2]; float aR, aI; #else float specPOr[L_FRAME48k], specPOi[L_FRAME48k]; #endif float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k]; float rfft_buf[L_FRAME48k]; int16_t step, bias; #ifdef REDUCED_POC6 float add_pow, prev_pow = 0.0f; #endif #ifdef NTT_REMOVE_EPS_ROM int16_t i_for; int16_t cos_step, cos_max; float eps_cos, eps_sin, EPS; #endif #ifdef REDUCED_POC #ifdef NTT_REMOVE_EPS_ROM int16_t j; #endif #endif /* Initialization */ Loading @@ -192,10 +175,6 @@ static void calc_poc( itdLR = hPOC->itdLR; igamma = STEREO_DMX_EVS_POC_GAMMA * iN; gamma = 1.0f - igamma; #ifndef REDUCED_POC set_zero( tmpPOC1, L_FRAME48k ); set_zero( tmpPOC2, L_FRAME48k ); #endif if ( input_frame == L_FRAME16k ) { Loading @@ -211,401 +190,8 @@ static void calc_poc( specPOr[0] = sign( specLr[0] ) * sign( specRr[0] ) * wnd[bias]; specPOi[0] = 0.0f; #ifdef REDUCED_POC #ifdef NTT_REMOVE_EPS_ROM EPS = hPOC->eps; if ( input_frame == L_FRAME16k ) { cos_step = 4; cos_max = input_frame; } else // for 32 kHz & 48 kHz { cos_step = 2; cos_max = n0; } for ( i = 1; i < n0 / 2; i++ ) { Lr = specLr[i]; Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; // i_for = i * 4; i_for = i * cos_step; eps_cos = s[cos_max - i_for] * EPS; eps_sin = s[i_for] * EPS; Lr += ( specRr[i] * eps_cos + specRi[i] * eps_sin ); Li += ( -specRr[i] * eps_sin + specRi[i] * eps_cos ); Rr += ( specLr[i] * eps_cos + specLi[i] * eps_sin ); Ri += ( -specLr[i] * eps_sin + specLi[i] * eps_cos ); specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); j = n0 - i; Lr = specLr[j]; Li = specLi[j]; Rr = specRr[j]; Ri = specRi[j]; Lr += ( -specRr[j] * eps_cos + specRi[j] * eps_sin ); Li += ( -specRr[j] * eps_sin - specRi[j] * eps_cos ); Rr += ( -specLr[j] * eps_cos + specLi[j] * eps_sin ); Ri += ( -specLr[j] * eps_sin - specLi[j] * eps_cos ); specPOr[j] = ( Lr * Rr + Li * Ri ); specPOi[j] = ( Lr * Ri - Li * Rr ); } { i = n0 / 2; Lr = specLr[i] + specRi[i] * EPS; Li = specLi[i] - specRr[i] * EPS; Rr = specRr[i] + specLi[i] * EPS; Ri = specRi[i] - specLr[i] * EPS; specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); } #else for ( i = 1; i < n0; i++ ) { Lr = specLr[i]; Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; Lr += ( specRr[i] * c[i] + specRi[i] * s[i] ); Li += ( -specRr[i] * s[i] + specRi[i] * c[i] ); Rr += ( specLr[i] * c[i] + specLi[i] * s[i] ); Ri += ( -specLr[i] * s[i] + specLi[i] * c[i] ); specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); } #endif //end NTT_REMOVE_EPS_ROM for ( i = 1; i < 10; i++ ) { specPOr[i] = sign( specPOr[i] ) * 0.866f; // low angles are more frequent specPOi[i] = sign( specPOi[i] ) * 0.5f; } for ( i = 10; i<n0>> 4; i++ ) { specPOr[i] = sign( specPOr[i] ) * 0.7071f; specPOi[i] = sign( specPOi[i] ) * 0.7071f; } for ( i = n0 >> 4; i<n0>> 3; i++ ) { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); if ( aR > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.92388f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) specPOi[i] = sign( specPOi[i] ) * 0.382683f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) //if (i==2) } else { specPOr[i] = sign( specPOr[i] ) * 0.382683f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) specPOi[i] = sign( specPOi[i] ) * 0.92388f; //(wnd[(n0>>2)*3]+wnd[((n0>>2)*3)-1])*0.5f) //if (i==2) } } //// 4level for ( i = n0 >> 3; i<n0>> 2; i++ ) { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); if ( aR > aI ) { if ( aR * 0.414213f /*tanf(EVS_PI*0.125f)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.980785f; //(wnd[(n0>>3)*7]+wnd[((n0>>3)*7)-1])*0.5f specPOi[i] = sign( specPOi[i] ) * 0.19509f; //(wnd[n0>>3]+wnd[(n0>>3)-1])*0.5f) } else { specPOr[i] = sign( specPOr[i] ) * 0.83147f; //(wnd[(n0>>3)*5]+wnd[((n0>>3)*5)-1])*0.5f specPOi[i] = sign( specPOi[i] ) * 0.55557f; //(wnd[(n0>>3)*3]+wnd[(n0>>3)*3-1])*0.5f } } else { if ( aR /** 2.414213f*/ /*tanf(EVS_PI*6/16)*/ > aI * 0.41421356f /*cot(PI*3/8)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.55557f; specPOi[i] = sign( specPOi[i] ) * 0.83147f; } else { specPOr[i] = sign( specPOr[i] ) * 0.19509f; specPOi[i] = sign( specPOi[i] ) * 0.980785f; } } } //// 8 level for ( i = 1; i<n0>> 2; i++ ) { tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } #ifdef REDUCED_POC5A for ( i = n0 >> 2; i<n0>> 1 /*min((n0>>1), 320)*/; i++ ) #else for ( i = n0 >> 2; i<n0>> 1; i++ ) #endif { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); #ifdef REDUCED_POC6 add_pow = aR + aI; prev_pow = 0.2f * prev_pow + 0.8f * add_pow; if ( prev_pow * 0.2f > add_pow ) { //fprintf(stderr, "%d skip_bin %f %f \n", i, prev_pow, aR+aI); specPOr[i] = 0.f; specPOi[i] = 0.f; gamma -= igamma; continue; } #endif if ( aR > aI ) { if ( aR * 0.4142136f /*tanf(EVS_PI*0.125f)*/ > aI ) { if ( aR * 0.19891f /*tanf(EVS_PI/16)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.995185f; specPOi[i] = sign( specPOi[i] ) * 0.098017f; } else { specPOr[i] = sign( specPOr[i] ) * 0.95694f; specPOi[i] = sign( specPOi[i] ) * 0.290285f; } } else { if ( aR * 0.66818f /*tanf(EVS_PI*3/16)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.881921f; specPOi[i] = sign( specPOi[i] ) * 0.471397f; } else { specPOr[i] = sign( specPOr[i] ) * 0.77301f; specPOi[i] = sign( specPOi[i] ) * 0.634393f; } } } else { if ( aR /** 2.414213f*/ /*tanf(EVS_PI*6/16)*/ > aI * 0.4142136f /*cot(PI*3/8)*/ ) { if ( aR /**1.49661f*/ /*tanf(EVS_PI*5/16)*/ > aI * 0.668179f /*cot(PI*5/16)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.634393f; specPOi[i] = sign( specPOi[i] ) * 0.77301f; } else { specPOr[i] = sign( specPOr[i] ) * 0.471397f; specPOi[i] = sign( specPOi[i] ) * 0.881921f; } } else { if ( aR /**5.027339f*/ /*tanf(EVS_PI*7/16)*/ > aI * 0.198912f /*cot(PI*7/16)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.290285f; specPOi[i] = sign( specPOi[i] ) * 0.95694f; } else { specPOr[i] = sign( specPOr[i] ) * 0.098017f; specPOi[i] = sign( specPOi[i] ) * 0.995158f; } } } tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } #ifdef REDUCED_POC5A for ( i = n0 >> 1; i < min( n0, 320 /*240*/ ); i++ ) #else for ( i = n0 >> 1; i < n0; i++ ) #endif ////// 16 level { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); #ifdef REDUCED_POC6 add_pow = aR + aI; prev_pow = 0.2f * prev_pow + 0.8f * add_pow; if ( prev_pow * 0.2f > add_pow ) { //fprintf(stderr, "%d skip_bin %f %f \n", i, prev_pow, aR+aI); specPOr[i] = 0.f; specPOi[i] = 0.f; gamma -= igamma; continue; } #endif if ( aR > aI ) { if ( aR * 0.414213f /*tanf(EVS_PI*0.125f)*/ > aI ) { if ( aR * 0.19891f /*tanf(EVS_PI/16)*/ > aI ) { if ( aR * 0.0984914f /*tanf(EVS_PI/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.99879f; specPOi[i] = sign( specPOi[i] ) * 0.04907f; } else { specPOr[i] = sign( specPOr[i] ) * 0.98918f; specPOi[i] = sign( specPOi[i] ) * 0.14763f; } } else { if ( aR * 0.303347f /*tanf(EVS_PI*3/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.970031f; specPOi[i] = sign( specPOi[i] ) * 0.24298f; } else { specPOr[i] = sign( specPOr[i] ) * 0.941544f; specPOi[i] = sign( specPOi[i] ) * 0.33689f; } } } else { if ( aR * 0.66818f /*tanf(EVS_PI*3/16)*/ > aI ) { if ( aR * 0.534511f /*tanf(EVS_PI*5/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.903989f; specPOi[i] = sign( specPOi[i] ) * 0.427555f; } else { specPOr[i] = sign( specPOr[i] ) * 0.857729f; specPOi[i] = sign( specPOi[i] ) * 0.514103f; } } else { if ( aR * 0.8206788f /*tanf(EVS_PI*7/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.803208f; specPOi[i] = sign( specPOi[i] ) * 0.595699f; } else { specPOr[i] = sign( specPOr[i] ) * 0.740951f; specPOi[i] = sign( specPOi[i] ) * 0.671559f; } } } } else { if ( aR /** 2.414213*/ /*tanf(EVS_PI*0.375f)*/ > aI * 0.4142136f ) { if ( aR /**1.49661f*/ /*tanf(EVS_PI*5/16)*/ > aI * 0.6681767f ) { if ( aR /**1.21850f*/ /*tanf(EVS_PI*9/32)*/ > aI * 0.820681f ) { specPOr[i] = sign( specPOr[i] ) * 0.671559f; specPOi[i] = sign( specPOi[i] ) * 0.740951f; } else { specPOr[i] = sign( specPOr[i] ) * 0.595699f; specPOi[i] = sign( specPOi[i] ) * 0.803208f; } } else { if ( aR /**1.8708684f*/ /*tanf(EVS_PI*11/32)*/ > aI * 0.5345111f ) { specPOr[i] = sign( specPOr[i] ) * 0.514103f; specPOi[i] = sign( specPOi[i] ) * 0.857729f; } else { specPOr[i] = sign( specPOr[i] ) * 0.427555f; specPOi[i] = sign( specPOi[i] ) * 0.903989f; } } } else { if ( aR /**5.027339f*/ /*tanf(EVS_PI*7/16)*/ > aI * 0.1989124f ) { if ( aR /**3.296558f*/ /*tanf(EVS_PI*13/32)*/ > aI * 0.3033467f ) { specPOr[i] = sign( specPOr[i] ) * 0.33689f; specPOi[i] = sign( specPOi[i] ) * 0.941544f; } else { specPOr[i] = sign( specPOr[i] ) * 0.24298f; specPOi[i] = sign( specPOi[i] ) * 0.970031f; } } else { if ( aR /**10.15317f*/ /*tanf(EVS_PI*15/32)*/ > aI * 0.098491f ) { specPOr[i] = sign( specPOr[i] ) * 0.14673f; specPOi[i] = sign( specPOi[i] ) * 0.989177f; } else { specPOr[i] = sign( specPOr[i] ) * 0.049068f; specPOi[i] = sign( specPOi[i] ) * 0.998795f; } } } } tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } if ( i < n0 ) { gamma -= igamma * ( n0 - 320 ); } for ( /* i = min(n0, 320) */; i < n0; i++ ) { specPOr[i] = 0.f; specPOi[i] = 0.f; } specPOr[n0] = sign( specLr[n0] ) * sign( specRr[n0] ) * wnd[i * step + bias] * gamma; //end REDUCED_POC #else #ifdef NTT_REMOVE_EPS_ROM EPS = hPOC->eps; //EPS=0.009817f; //fprintf(stderr, "%f \n", EPS); if ( input_frame == L_FRAME16k ) { Loading @@ -624,7 +210,6 @@ static void calc_poc( Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; // i_for = i * 4; i_for = i * cos_step; eps_cos = s[cos_max - i_for] * EPS; eps_sin = s[i_for] * EPS; Loading Loading @@ -684,8 +269,8 @@ static void calc_poc( gamma -= igamma; } #endif //end !NTT_REMOVE_EPS_ROM specPOr[n0] = sign( specLr[i] ) * sign( specRr[i] ) * wnd[i * step + bias] * gamma; #endif rfft_buf[0] = specPOr[0]; rfft_buf[1] = specPOr[n0]; Loading Loading @@ -1160,20 +745,7 @@ void stereo_dmx_evs_enc( float data_f[CPE_CHANNELS][L_FRAME48k]; float dmx_data[L_FRAME48k]; int16_t input_frame; #ifdef DEBUG_STEREO_DMX static int16_t tlen = -1; if ( tlen == -1 ) { tlen = NS2SA( input_Fs, get_delay( ENC, input_Fs, MONO_FORMAT, NULL, RENDERER_DISABLE, 0 ) + 0.5f ); } #endif #ifdef DELAYED_SUM2 float wt_delay, wt1, wt2; int16_t itd; itd = min( (int16_t) hStereoDmxEVS->itd, 640 ); #endif input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); for ( n = 0; n < input_frame; n++ ) Loading @@ -1187,55 +759,8 @@ void stereo_dmx_evs_enc( set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); } #ifdef STEREO_AVE_DOWNMIX for ( n = 0; n < input_frame; n++ ) { dmx_data[n] = ( data_f[0][n] + data_f[1][n] ) / 2.f; } #else estimate_itd( &corr, hStereoDmxEVS->hPOC, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); #ifdef DELAYED_SUM2 wt_delay = corr /*max(0.0f, (corr-0.3f)*1.5f)*/; if ( itd > 1 && itd < 200 ) { if ( corr > 0.5f /*0.8f*/ ) { wt1 = wt_delay * 2.0f - 1.0f; wt2 = 1.0f - wt1; for ( n = input_frame - 1; n >= itd; n-- ) { data_f[0][n] = wt2 * data_f[0][n] + wt1 * data_f[0][n - itd]; } } } else if ( itd < -1 && itd > -200 ) { if ( corr > 0.5f /*0.8f*/ ) { wt1 = wt_delay * 2.0f - 1.0f; wt2 = 1.0f - wt1; for ( n = input_frame - 1; n >= -itd; n-- ) { data_f[1][n] = wt2 * data_f[1][n] + wt1 * data_f[1][n + itd]; } } } #endif #ifdef DEBUG_STEREO_DMX ///* itd */ //fp = fopen("itd.csv", "a"); //fprintf(fp, "%f\n", hStereoDmxEVS->itd); //fclose(fp); ///* confidence */ //fp = fopen("conf.csv", "a"); //fprintf(fp, "%f\n", corr); //fclose(fp); #endif if ( hStereoDmxEVS->itd ) { dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; Loading @@ -1245,30 +770,11 @@ void stereo_dmx_evs_enc( dmx_weight = 0.5f; } #ifdef DEBUG_STEREO_DMX //fp = fopen("weight.csv", "a"); //fprintf(fp, "%f\n", dmx_weight); //fclose(fp); #endif create_M_signal( data_f[0], data_f[1], dmx_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); #endif mvr2s( dmx_data, data, n_samples ); #ifdef DEBUG_STEREO_DMX fp = fopen( "debug_mono.pcm", "ab" ); if ( tlen != 0 ) { short buf[L_FRAME48k] = { 0 }; fwrite( buf, sizeof( short ), tlen, fp ); tlen = 0; } fwrite( data, sizeof( short ), n_samples, fp ); fclose( fp ); #endif return; } Loading Loading
lib_com/options.h +2 −12 Original line number Diff line number Diff line Loading @@ -150,18 +150,8 @@ #define DIRAC_DRCT_GAIN_TUNING /* issue 64: tuning of DirAC energy-compensation gains */ /* NTT switches */ ///////#define DEBUG_STEREO_DMX //#define STEREO_AVE_DOWNMIX #ifndef STEREO_AVE_DOWNMIX //#define NTT_UPDATE_ITD_SW //#define NTT_REMOVE_EPS_ROM //#define REDUCED_POC //#define DELAYED_SUM2 //#define REDUCED_POC5A ///////////#define REDUCED_POC6 #endif #define NTT_UPDATE_ITD_SW #define NTT_REMOVE_EPS_ROM /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ Loading
lib_enc/ivas_stereo_dmx_evs.c +1 −495 Original line number Diff line number Diff line Loading @@ -78,10 +78,6 @@ static void create_M_signal( const float srcL[], const float srcR[], float dmx[] static float find_poc_peak( STEREO_DMX_EVS_POC_HANDLE hPOC, float itd[], const int16_t input_frame, const float ratio ); static void calc_energy( const float src1[], const float src2[], float energy[], const int16_t input_frame, const float ratio ); #ifdef DEBUG_STEREO_DMX FILE *fp; #endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * Loading Loading @@ -159,27 +155,14 @@ static void calc_poc( const float *c, *s; float *P; float tmp1, tmp2, Lr, Li, Rr, Ri, gamma, igamma, iN; #ifdef REDUCED_POC float specPOr[L_FRAME48k / 2 + 1], specPOi[L_FRAME48k / 2]; float aR, aI; #else float specPOr[L_FRAME48k], specPOi[L_FRAME48k]; #endif float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k]; float rfft_buf[L_FRAME48k]; int16_t step, bias; #ifdef REDUCED_POC6 float add_pow, prev_pow = 0.0f; #endif #ifdef NTT_REMOVE_EPS_ROM int16_t i_for; int16_t cos_step, cos_max; float eps_cos, eps_sin, EPS; #endif #ifdef REDUCED_POC #ifdef NTT_REMOVE_EPS_ROM int16_t j; #endif #endif /* Initialization */ Loading @@ -192,10 +175,6 @@ static void calc_poc( itdLR = hPOC->itdLR; igamma = STEREO_DMX_EVS_POC_GAMMA * iN; gamma = 1.0f - igamma; #ifndef REDUCED_POC set_zero( tmpPOC1, L_FRAME48k ); set_zero( tmpPOC2, L_FRAME48k ); #endif if ( input_frame == L_FRAME16k ) { Loading @@ -211,401 +190,8 @@ static void calc_poc( specPOr[0] = sign( specLr[0] ) * sign( specRr[0] ) * wnd[bias]; specPOi[0] = 0.0f; #ifdef REDUCED_POC #ifdef NTT_REMOVE_EPS_ROM EPS = hPOC->eps; if ( input_frame == L_FRAME16k ) { cos_step = 4; cos_max = input_frame; } else // for 32 kHz & 48 kHz { cos_step = 2; cos_max = n0; } for ( i = 1; i < n0 / 2; i++ ) { Lr = specLr[i]; Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; // i_for = i * 4; i_for = i * cos_step; eps_cos = s[cos_max - i_for] * EPS; eps_sin = s[i_for] * EPS; Lr += ( specRr[i] * eps_cos + specRi[i] * eps_sin ); Li += ( -specRr[i] * eps_sin + specRi[i] * eps_cos ); Rr += ( specLr[i] * eps_cos + specLi[i] * eps_sin ); Ri += ( -specLr[i] * eps_sin + specLi[i] * eps_cos ); specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); j = n0 - i; Lr = specLr[j]; Li = specLi[j]; Rr = specRr[j]; Ri = specRi[j]; Lr += ( -specRr[j] * eps_cos + specRi[j] * eps_sin ); Li += ( -specRr[j] * eps_sin - specRi[j] * eps_cos ); Rr += ( -specLr[j] * eps_cos + specLi[j] * eps_sin ); Ri += ( -specLr[j] * eps_sin - specLi[j] * eps_cos ); specPOr[j] = ( Lr * Rr + Li * Ri ); specPOi[j] = ( Lr * Ri - Li * Rr ); } { i = n0 / 2; Lr = specLr[i] + specRi[i] * EPS; Li = specLi[i] - specRr[i] * EPS; Rr = specRr[i] + specLi[i] * EPS; Ri = specRi[i] - specLr[i] * EPS; specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); } #else for ( i = 1; i < n0; i++ ) { Lr = specLr[i]; Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; Lr += ( specRr[i] * c[i] + specRi[i] * s[i] ); Li += ( -specRr[i] * s[i] + specRi[i] * c[i] ); Rr += ( specLr[i] * c[i] + specLi[i] * s[i] ); Ri += ( -specLr[i] * s[i] + specLi[i] * c[i] ); specPOr[i] = ( Lr * Rr + Li * Ri ); specPOi[i] = ( Lr * Ri - Li * Rr ); } #endif //end NTT_REMOVE_EPS_ROM for ( i = 1; i < 10; i++ ) { specPOr[i] = sign( specPOr[i] ) * 0.866f; // low angles are more frequent specPOi[i] = sign( specPOi[i] ) * 0.5f; } for ( i = 10; i<n0>> 4; i++ ) { specPOr[i] = sign( specPOr[i] ) * 0.7071f; specPOi[i] = sign( specPOi[i] ) * 0.7071f; } for ( i = n0 >> 4; i<n0>> 3; i++ ) { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); if ( aR > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.92388f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) specPOi[i] = sign( specPOi[i] ) * 0.382683f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) //if (i==2) } else { specPOr[i] = sign( specPOr[i] ) * 0.382683f; //(wnd[n0>>2]+wnd[(n0>>2)-1])*0.5f) specPOi[i] = sign( specPOi[i] ) * 0.92388f; //(wnd[(n0>>2)*3]+wnd[((n0>>2)*3)-1])*0.5f) //if (i==2) } } //// 4level for ( i = n0 >> 3; i<n0>> 2; i++ ) { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); if ( aR > aI ) { if ( aR * 0.414213f /*tanf(EVS_PI*0.125f)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.980785f; //(wnd[(n0>>3)*7]+wnd[((n0>>3)*7)-1])*0.5f specPOi[i] = sign( specPOi[i] ) * 0.19509f; //(wnd[n0>>3]+wnd[(n0>>3)-1])*0.5f) } else { specPOr[i] = sign( specPOr[i] ) * 0.83147f; //(wnd[(n0>>3)*5]+wnd[((n0>>3)*5)-1])*0.5f specPOi[i] = sign( specPOi[i] ) * 0.55557f; //(wnd[(n0>>3)*3]+wnd[(n0>>3)*3-1])*0.5f } } else { if ( aR /** 2.414213f*/ /*tanf(EVS_PI*6/16)*/ > aI * 0.41421356f /*cot(PI*3/8)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.55557f; specPOi[i] = sign( specPOi[i] ) * 0.83147f; } else { specPOr[i] = sign( specPOr[i] ) * 0.19509f; specPOi[i] = sign( specPOi[i] ) * 0.980785f; } } } //// 8 level for ( i = 1; i<n0>> 2; i++ ) { tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } #ifdef REDUCED_POC5A for ( i = n0 >> 2; i<n0>> 1 /*min((n0>>1), 320)*/; i++ ) #else for ( i = n0 >> 2; i<n0>> 1; i++ ) #endif { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); #ifdef REDUCED_POC6 add_pow = aR + aI; prev_pow = 0.2f * prev_pow + 0.8f * add_pow; if ( prev_pow * 0.2f > add_pow ) { //fprintf(stderr, "%d skip_bin %f %f \n", i, prev_pow, aR+aI); specPOr[i] = 0.f; specPOi[i] = 0.f; gamma -= igamma; continue; } #endif if ( aR > aI ) { if ( aR * 0.4142136f /*tanf(EVS_PI*0.125f)*/ > aI ) { if ( aR * 0.19891f /*tanf(EVS_PI/16)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.995185f; specPOi[i] = sign( specPOi[i] ) * 0.098017f; } else { specPOr[i] = sign( specPOr[i] ) * 0.95694f; specPOi[i] = sign( specPOi[i] ) * 0.290285f; } } else { if ( aR * 0.66818f /*tanf(EVS_PI*3/16)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.881921f; specPOi[i] = sign( specPOi[i] ) * 0.471397f; } else { specPOr[i] = sign( specPOr[i] ) * 0.77301f; specPOi[i] = sign( specPOi[i] ) * 0.634393f; } } } else { if ( aR /** 2.414213f*/ /*tanf(EVS_PI*6/16)*/ > aI * 0.4142136f /*cot(PI*3/8)*/ ) { if ( aR /**1.49661f*/ /*tanf(EVS_PI*5/16)*/ > aI * 0.668179f /*cot(PI*5/16)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.634393f; specPOi[i] = sign( specPOi[i] ) * 0.77301f; } else { specPOr[i] = sign( specPOr[i] ) * 0.471397f; specPOi[i] = sign( specPOi[i] ) * 0.881921f; } } else { if ( aR /**5.027339f*/ /*tanf(EVS_PI*7/16)*/ > aI * 0.198912f /*cot(PI*7/16)*/ ) { specPOr[i] = sign( specPOr[i] ) * 0.290285f; specPOi[i] = sign( specPOi[i] ) * 0.95694f; } else { specPOr[i] = sign( specPOr[i] ) * 0.098017f; specPOi[i] = sign( specPOi[i] ) * 0.995158f; } } } tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } #ifdef REDUCED_POC5A for ( i = n0 >> 1; i < min( n0, 320 /*240*/ ); i++ ) #else for ( i = n0 >> 1; i < n0; i++ ) #endif ////// 16 level { aR = fabsf( specPOr[i] ); aI = fabsf( specPOi[i] ); #ifdef REDUCED_POC6 add_pow = aR + aI; prev_pow = 0.2f * prev_pow + 0.8f * add_pow; if ( prev_pow * 0.2f > add_pow ) { //fprintf(stderr, "%d skip_bin %f %f \n", i, prev_pow, aR+aI); specPOr[i] = 0.f; specPOi[i] = 0.f; gamma -= igamma; continue; } #endif if ( aR > aI ) { if ( aR * 0.414213f /*tanf(EVS_PI*0.125f)*/ > aI ) { if ( aR * 0.19891f /*tanf(EVS_PI/16)*/ > aI ) { if ( aR * 0.0984914f /*tanf(EVS_PI/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.99879f; specPOi[i] = sign( specPOi[i] ) * 0.04907f; } else { specPOr[i] = sign( specPOr[i] ) * 0.98918f; specPOi[i] = sign( specPOi[i] ) * 0.14763f; } } else { if ( aR * 0.303347f /*tanf(EVS_PI*3/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.970031f; specPOi[i] = sign( specPOi[i] ) * 0.24298f; } else { specPOr[i] = sign( specPOr[i] ) * 0.941544f; specPOi[i] = sign( specPOi[i] ) * 0.33689f; } } } else { if ( aR * 0.66818f /*tanf(EVS_PI*3/16)*/ > aI ) { if ( aR * 0.534511f /*tanf(EVS_PI*5/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.903989f; specPOi[i] = sign( specPOi[i] ) * 0.427555f; } else { specPOr[i] = sign( specPOr[i] ) * 0.857729f; specPOi[i] = sign( specPOi[i] ) * 0.514103f; } } else { if ( aR * 0.8206788f /*tanf(EVS_PI*7/32)*/ > aI ) { specPOr[i] = sign( specPOr[i] ) * 0.803208f; specPOi[i] = sign( specPOi[i] ) * 0.595699f; } else { specPOr[i] = sign( specPOr[i] ) * 0.740951f; specPOi[i] = sign( specPOi[i] ) * 0.671559f; } } } } else { if ( aR /** 2.414213*/ /*tanf(EVS_PI*0.375f)*/ > aI * 0.4142136f ) { if ( aR /**1.49661f*/ /*tanf(EVS_PI*5/16)*/ > aI * 0.6681767f ) { if ( aR /**1.21850f*/ /*tanf(EVS_PI*9/32)*/ > aI * 0.820681f ) { specPOr[i] = sign( specPOr[i] ) * 0.671559f; specPOi[i] = sign( specPOi[i] ) * 0.740951f; } else { specPOr[i] = sign( specPOr[i] ) * 0.595699f; specPOi[i] = sign( specPOi[i] ) * 0.803208f; } } else { if ( aR /**1.8708684f*/ /*tanf(EVS_PI*11/32)*/ > aI * 0.5345111f ) { specPOr[i] = sign( specPOr[i] ) * 0.514103f; specPOi[i] = sign( specPOi[i] ) * 0.857729f; } else { specPOr[i] = sign( specPOr[i] ) * 0.427555f; specPOi[i] = sign( specPOi[i] ) * 0.903989f; } } } else { if ( aR /**5.027339f*/ /*tanf(EVS_PI*7/16)*/ > aI * 0.1989124f ) { if ( aR /**3.296558f*/ /*tanf(EVS_PI*13/32)*/ > aI * 0.3033467f ) { specPOr[i] = sign( specPOr[i] ) * 0.33689f; specPOi[i] = sign( specPOi[i] ) * 0.941544f; } else { specPOr[i] = sign( specPOr[i] ) * 0.24298f; specPOi[i] = sign( specPOi[i] ) * 0.970031f; } } else { if ( aR /**10.15317f*/ /*tanf(EVS_PI*15/32)*/ > aI * 0.098491f ) { specPOr[i] = sign( specPOr[i] ) * 0.14673f; specPOi[i] = sign( specPOi[i] ) * 0.989177f; } else { specPOr[i] = sign( specPOr[i] ) * 0.049068f; specPOi[i] = sign( specPOi[i] ) * 0.998795f; } } } } tmp1 = wnd[i * step + bias] * gamma; specPOr[i] *= tmp1; specPOi[i] *= tmp1; gamma -= igamma; } if ( i < n0 ) { gamma -= igamma * ( n0 - 320 ); } for ( /* i = min(n0, 320) */; i < n0; i++ ) { specPOr[i] = 0.f; specPOi[i] = 0.f; } specPOr[n0] = sign( specLr[n0] ) * sign( specRr[n0] ) * wnd[i * step + bias] * gamma; //end REDUCED_POC #else #ifdef NTT_REMOVE_EPS_ROM EPS = hPOC->eps; //EPS=0.009817f; //fprintf(stderr, "%f \n", EPS); if ( input_frame == L_FRAME16k ) { Loading @@ -624,7 +210,6 @@ static void calc_poc( Li = specLi[i]; Rr = specRr[i]; Ri = specRi[i]; // i_for = i * 4; i_for = i * cos_step; eps_cos = s[cos_max - i_for] * EPS; eps_sin = s[i_for] * EPS; Loading Loading @@ -684,8 +269,8 @@ static void calc_poc( gamma -= igamma; } #endif //end !NTT_REMOVE_EPS_ROM specPOr[n0] = sign( specLr[i] ) * sign( specRr[i] ) * wnd[i * step + bias] * gamma; #endif rfft_buf[0] = specPOr[0]; rfft_buf[1] = specPOr[n0]; Loading Loading @@ -1160,20 +745,7 @@ void stereo_dmx_evs_enc( float data_f[CPE_CHANNELS][L_FRAME48k]; float dmx_data[L_FRAME48k]; int16_t input_frame; #ifdef DEBUG_STEREO_DMX static int16_t tlen = -1; if ( tlen == -1 ) { tlen = NS2SA( input_Fs, get_delay( ENC, input_Fs, MONO_FORMAT, NULL, RENDERER_DISABLE, 0 ) + 0.5f ); } #endif #ifdef DELAYED_SUM2 float wt_delay, wt1, wt2; int16_t itd; itd = min( (int16_t) hStereoDmxEVS->itd, 640 ); #endif input_frame = ( int16_t )( input_Fs / FRAMES_PER_SEC ); for ( n = 0; n < input_frame; n++ ) Loading @@ -1187,55 +759,8 @@ void stereo_dmx_evs_enc( set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); } #ifdef STEREO_AVE_DOWNMIX for ( n = 0; n < input_frame; n++ ) { dmx_data[n] = ( data_f[0][n] + data_f[1][n] ) / 2.f; } #else estimate_itd( &corr, hStereoDmxEVS->hPOC, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); #ifdef DELAYED_SUM2 wt_delay = corr /*max(0.0f, (corr-0.3f)*1.5f)*/; if ( itd > 1 && itd < 200 ) { if ( corr > 0.5f /*0.8f*/ ) { wt1 = wt_delay * 2.0f - 1.0f; wt2 = 1.0f - wt1; for ( n = input_frame - 1; n >= itd; n-- ) { data_f[0][n] = wt2 * data_f[0][n] + wt1 * data_f[0][n - itd]; } } } else if ( itd < -1 && itd > -200 ) { if ( corr > 0.5f /*0.8f*/ ) { wt1 = wt_delay * 2.0f - 1.0f; wt2 = 1.0f - wt1; for ( n = input_frame - 1; n >= -itd; n-- ) { data_f[1][n] = wt2 * data_f[1][n] + wt1 * data_f[1][n + itd]; } } } #endif #ifdef DEBUG_STEREO_DMX ///* itd */ //fp = fopen("itd.csv", "a"); //fprintf(fp, "%f\n", hStereoDmxEVS->itd); //fclose(fp); ///* confidence */ //fp = fopen("conf.csv", "a"); //fprintf(fp, "%f\n", corr); //fclose(fp); #endif if ( hStereoDmxEVS->itd ) { dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; Loading @@ -1245,30 +770,11 @@ void stereo_dmx_evs_enc( dmx_weight = 0.5f; } #ifdef DEBUG_STEREO_DMX //fp = fopen("weight.csv", "a"); //fprintf(fp, "%f\n", dmx_weight); //fclose(fp); #endif create_M_signal( data_f[0], data_f[1], dmx_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); #endif mvr2s( dmx_data, data, n_samples ); #ifdef DEBUG_STEREO_DMX fp = fopen( "debug_mono.pcm", "ab" ); if ( tlen != 0 ) { short buf[L_FRAME48k] = { 0 }; fwrite( buf, sizeof( short ), tlen, fp ); tlen = 0; } fwrite( data, sizeof( short ), n_samples, fp ); fclose( fp ); #endif return; } Loading