Loading lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -162,6 +162,8 @@ #define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ #define NTT_LOW_RATE_STEREO /* NTT switches */ //#define ALL_MONO /* NTT switches */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ Loading lib_enc/ivas_init_enc.c +10 −0 Original line number Diff line number Diff line Loading @@ -402,6 +402,16 @@ ivas_error ivas_init_encoder( /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); #ifdef NTT_LOW_RATE_STEREO /*combine with stereo_dmx_evs() */ if (hEncoderConfig->ivas_total_brate <= 24400) { if ((error = stereo_dmx_evs_init_encoder(&(st_ivas->hStereoDmxEVS), input_Fs)) != IVAS_ERR_OK) { return error; } } #endif } else if ( ivas_format == ISM_FORMAT ) { Loading lib_enc/lib_enc.c +119 −0 Original line number Diff line number Diff line Loading @@ -1021,6 +1021,33 @@ ivas_error IVAS_ENC_GetInputBufferSize( return IVAS_ERR_OK; } #ifdef NTT_LOW_RATE_STEREO float sum2_i_step( const int16_t *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ int16_t step /* i : skip sample by step */ ); float sum2_i_step( const int16_t *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ int16_t step) { int16_t i; float tmp; tmp = 0.0f; for (i = 0; i < lvec; i += step) { tmp += (float)(vec[i] * vec[i]); } return tmp; } #endif /*---------------------------------------------------------------------* * IVAS_ENC_EncodeFrameToSerial() Loading Loading @@ -1141,6 +1168,98 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } else /* IVAS */ { #ifdef NTT_LOW_RATE_STEREO /* combine downmix with IVAS */ if (hEncoderConfig->ivas_total_brate <= 24400) { int16_t ititd; int16_t mixBuffer[2000], it; float stereo_w, w, stereo_wwL, stereo_wwR, stereo_ww, ratioLR /*, inv_ratioLR*/; float bias, range, mag0; /*mix weight depending on corr*/ float energy_R, energy_L; const int16_t overlap_len = 160; const float nom_slope = 1.f / (float)overlap_len; static int16_t count; static float prev_w = 0.0f; static float prevL = 0.0f, prevR = 0.0f; count++; for (it = 0; it < inputBufferSize; it++) { mixBuffer[it] = inputBuffer[it]; } stereo_dmx_evs_enc(st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, mixBuffer, inputBufferSize / 2); //fprintf( stderr, "itd %f %f %f\n", st_ivas->hStereoDmxEVS->itd, st_ivas->hStereoDmxEVS->dmx_weight[0], st_ivas->hStereoDmxEVS->dmx_weight[1] ); ititd = (int16_t)(st_ivas->hStereoDmxEVS->itd); //fprintf( stderr, "itd %d %d ---", count, itit ); if (hEncoderConfig->ivas_total_brate == 24400) { bias = 0.6f; range = 0.4f; } else if (hEncoderConfig->ivas_total_brate == 16400) { bias = 0.3f;//20230211 range = 0.5f; //20230211 } else /*total_brate=13200*/ { bias = 0.0f; range = 0.7f; } mag0 = min(1.0f, fabsf(ititd) * 0.003f) * 0.5f; mag0 = cosf(mag0 * EVS_PI); mag0 *= mag0 * 0.4f; /* mag0= mag0*mag0*0.2*//*mag0=cos(itd/300*PI)*cos(itd/300*PI)*0.5*/ mag0 += 0.6f; w = st_ivas->hStereoDmxEVS->dmx_weight[0]; #ifdef ALL_MONO for (it = 0; it < inputBufferSize / 2; it++) { inputBuffer[2 * it] = mixBuffer[it]; inputBuffer[2 * it + 1] = mixBuffer[it]; } #else stereo_w = 0.95f *prev_w + 0.05f *mag0 * min(1.0f, max(0.0f, (bias + range * 0.5f * (1.f + cosf(2.f * w * EVS_PI))))); energy_L = sum2_i_step(inputBuffer, inputBufferSize, 2) *0.2f + prevL * 0.8f + 1.0f; energy_R = sum2_i_step(inputBuffer + 1, inputBufferSize, 2)*0.2f + prevR * 0.8f + 1.0f; //fprintf( stderr, "L/R %5.3f,w, %5.3f,itd,%4d, bi,%3.1f,ra,%3.1f,mag0,%3.1f,stereo_w %4.2f\n", // energy_L/energy_R, w, ititd, bias, range, mag0, stereo_w ); if (energy_L > energy_R) { ratioLR = 0.6f + 0.4f * (energy_R / energy_L); } else { ratioLR = 0.6f + 0.4f * (energy_L / energy_R); } stereo_ww = 1.0f - ((1.0f - stereo_w) * ratioLR); for (it = 0; it < overlap_len / 2; it++) { stereo_wwL = stereo_ww * (it * nom_slope) + prev_w * (1.f - it * nom_slope); stereo_wwR = 1.f - stereo_wwL; inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR); inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR); } stereo_wwL = stereo_ww; stereo_wwR = 1.f - stereo_wwL; for (; it < inputBufferSize / 2; it++) { inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR); inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR); } prev_w = stereo_w; prevL = energy_L; prevR = energy_R; #endif } #endif if ( ( error = ivas_enc( st_ivas, inputBuffer, inputBufferSize ) ) != IVAS_ERR_OK ) { return error; Loading Loading
lib_com/options.h +2 −0 Original line number Diff line number Diff line Loading @@ -162,6 +162,8 @@ #define BINAURALIZATION_DELAY_REPORT /* VA: Issue 255 - Changes the way the decoder delay is reported */ #define NTT_LOW_RATE_STEREO /* NTT switches */ //#define ALL_MONO /* NTT switches */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ Loading
lib_enc/ivas_init_enc.c +10 −0 Original line number Diff line number Diff line Loading @@ -402,6 +402,16 @@ ivas_error ivas_init_encoder( /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); #ifdef NTT_LOW_RATE_STEREO /*combine with stereo_dmx_evs() */ if (hEncoderConfig->ivas_total_brate <= 24400) { if ((error = stereo_dmx_evs_init_encoder(&(st_ivas->hStereoDmxEVS), input_Fs)) != IVAS_ERR_OK) { return error; } } #endif } else if ( ivas_format == ISM_FORMAT ) { Loading
lib_enc/lib_enc.c +119 −0 Original line number Diff line number Diff line Loading @@ -1021,6 +1021,33 @@ ivas_error IVAS_ENC_GetInputBufferSize( return IVAS_ERR_OK; } #ifdef NTT_LOW_RATE_STEREO float sum2_i_step( const int16_t *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ int16_t step /* i : skip sample by step */ ); float sum2_i_step( const int16_t *vec, /* i : input vector */ const int16_t lvec, /* i : length of input vector */ int16_t step) { int16_t i; float tmp; tmp = 0.0f; for (i = 0; i < lvec; i += step) { tmp += (float)(vec[i] * vec[i]); } return tmp; } #endif /*---------------------------------------------------------------------* * IVAS_ENC_EncodeFrameToSerial() Loading Loading @@ -1141,6 +1168,98 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } else /* IVAS */ { #ifdef NTT_LOW_RATE_STEREO /* combine downmix with IVAS */ if (hEncoderConfig->ivas_total_brate <= 24400) { int16_t ititd; int16_t mixBuffer[2000], it; float stereo_w, w, stereo_wwL, stereo_wwR, stereo_ww, ratioLR /*, inv_ratioLR*/; float bias, range, mag0; /*mix weight depending on corr*/ float energy_R, energy_L; const int16_t overlap_len = 160; const float nom_slope = 1.f / (float)overlap_len; static int16_t count; static float prev_w = 0.0f; static float prevL = 0.0f, prevR = 0.0f; count++; for (it = 0; it < inputBufferSize; it++) { mixBuffer[it] = inputBuffer[it]; } stereo_dmx_evs_enc(st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, mixBuffer, inputBufferSize / 2); //fprintf( stderr, "itd %f %f %f\n", st_ivas->hStereoDmxEVS->itd, st_ivas->hStereoDmxEVS->dmx_weight[0], st_ivas->hStereoDmxEVS->dmx_weight[1] ); ititd = (int16_t)(st_ivas->hStereoDmxEVS->itd); //fprintf( stderr, "itd %d %d ---", count, itit ); if (hEncoderConfig->ivas_total_brate == 24400) { bias = 0.6f; range = 0.4f; } else if (hEncoderConfig->ivas_total_brate == 16400) { bias = 0.3f;//20230211 range = 0.5f; //20230211 } else /*total_brate=13200*/ { bias = 0.0f; range = 0.7f; } mag0 = min(1.0f, fabsf(ititd) * 0.003f) * 0.5f; mag0 = cosf(mag0 * EVS_PI); mag0 *= mag0 * 0.4f; /* mag0= mag0*mag0*0.2*//*mag0=cos(itd/300*PI)*cos(itd/300*PI)*0.5*/ mag0 += 0.6f; w = st_ivas->hStereoDmxEVS->dmx_weight[0]; #ifdef ALL_MONO for (it = 0; it < inputBufferSize / 2; it++) { inputBuffer[2 * it] = mixBuffer[it]; inputBuffer[2 * it + 1] = mixBuffer[it]; } #else stereo_w = 0.95f *prev_w + 0.05f *mag0 * min(1.0f, max(0.0f, (bias + range * 0.5f * (1.f + cosf(2.f * w * EVS_PI))))); energy_L = sum2_i_step(inputBuffer, inputBufferSize, 2) *0.2f + prevL * 0.8f + 1.0f; energy_R = sum2_i_step(inputBuffer + 1, inputBufferSize, 2)*0.2f + prevR * 0.8f + 1.0f; //fprintf( stderr, "L/R %5.3f,w, %5.3f,itd,%4d, bi,%3.1f,ra,%3.1f,mag0,%3.1f,stereo_w %4.2f\n", // energy_L/energy_R, w, ititd, bias, range, mag0, stereo_w ); if (energy_L > energy_R) { ratioLR = 0.6f + 0.4f * (energy_R / energy_L); } else { ratioLR = 0.6f + 0.4f * (energy_L / energy_R); } stereo_ww = 1.0f - ((1.0f - stereo_w) * ratioLR); for (it = 0; it < overlap_len / 2; it++) { stereo_wwL = stereo_ww * (it * nom_slope) + prev_w * (1.f - it * nom_slope); stereo_wwR = 1.f - stereo_wwL; inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR); inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR); } stereo_wwL = stereo_ww; stereo_wwR = 1.f - stereo_wwL; for (; it < inputBufferSize / 2; it++) { inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR); inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR); } prev_w = stereo_w; prevL = energy_L; prevR = energy_R; #endif } #endif if ( ( error = ivas_enc( st_ivas, inputBuffer, inputBufferSize ) ) != IVAS_ERR_OK ) { return error; Loading