Commit 6e94fe43 authored by vasilache's avatar vasilache
Browse files

printing

parent 7fec61c2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -159,4 +159,6 @@
#define FIX_MINOR_SVD_WMOPS_MR1010X             /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */
#define SVD_WMOPS_OPT                           /* Ittiam : SVD related optimizations */
#define NONBE_FIX_1087_OOB_SBA_DTX_RS                   /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */

#define GROUP_BANDS_NEW                         /* Nok: alternative implementation for subbands grouping in MASA metadata */
#endif
+204 −1
Original line number Diff line number Diff line
@@ -1330,6 +1330,10 @@ static void combine_freqbands_and_subframes_fx(
    Word32 L_tmp;
    Word64 W_tmp;
    Word16 q_shift;
#ifdef GROUP_BANDS_NEW
    Word32 L_sum_azi_ele, L_diff_azi_ele;
    Word16 sum_azi_ele, diff_azi_ele;
#endif

    numCodingBands = hMasa->config.numCodingBands;
    move16();
@@ -1376,6 +1380,205 @@ static void combine_freqbands_and_subframes_fx(
        }
    }

#ifdef GROUP_BANDS_NEW
    IF( LE_16( numCodingBands, MAX_REDUCED_NBANDS ) )
    {
        /* reduce metadata *frequency* resolution. time resolution is not touched */
        FOR( i = 0; i < numDirections; i++ )
        {
            FOR( j = 0; j < numSf; j++ ) /* NB: for numSf==1, operates only on first sub-frame */
            {
                FOR( k = 0; k < MASA_FREQUENCY_BANDS; k++ )
                {
                    aziRad = extract_l( Mpy_32_32( hMeta->directional_meta[i].azimuth_fx[j][k], PI_OVER_180_FX / 512 ) );   /*Q22+Q22-Q31 = Q13*/
                    eleRad = extract_l( Mpy_32_32( hMeta->directional_meta[i].elevation_fx[j][k], PI_OVER_180_FX / 512 ) ); /*Q22+Q22-Q31 = Q13*/

                    vecLen = Mpy_32_32( hMeta->directional_meta[i].energy_ratio_fx[j][k], hMasa->data.energy_fx[j][k] ); // Q30 + (31-hMasa->data.energy_e[j][k]) -Q31  = (31-hMasa->data.energy_e[j][k]) - Q1

                    /* cos() is in Q14 */
                    L_sum_azi_ele = L_add( aziRad, eleRad );
                    if ( L_sum_azi_ele >= 25736 ) /* PI_Q13*/
                    {
                        L_sum_azi_ele = L_sum_azi_ele - 51472; /* 2*PI_Q13 */
                    }
                    else if ( L_sum_azi_ele < -25736 )
                    {
                        L_sum_azi_ele = L_sum_azi_ele + 51472;
                    }
                    L_diff_azi_ele = L_sub( aziRad, eleRad );
                    if ( L_diff_azi_ele >= 25736 ) /* PI_Q13*/
                    {
                        L_diff_azi_ele = L_diff_azi_ele - 51472; /* 2*PI_Q13 */
                    }
                    else if ( L_diff_azi_ele < -25736 )
                    {
                        L_diff_azi_ele = L_diff_azi_ele + 51472;
                    }

                    sum_azi_ele = extract_l( L_sum_azi_ele );
                    diff_azi_ele = extract_l( L_diff_azi_ele );
                    /* cos is Q14 */
                    W_tmp = W_mult0_32_32( vecLen, L_shl( L_add( (Word32) getCosWord16( sum_azi_ele ), (Word32) getCosWord16( diff_azi_ele) ), 15 ) );  // (31-1-hMasa->data.energy_e[j][k]) + Q14 + Q15 + 1  (+1 is from the trigonometric expression)
                    q_shift = W_norm( W_tmp );
                    x[i][j][k] = W_extract_h( W_shl( W_tmp, q_shift ) ); /* */
                    move32();
                    x_e[i][j][k] = sub( Q31, add( sub( 60, hMasa->data.energy_e[j][k] ), sub( q_shift, 32 ) ) );
                    move16();
                           
                    /* sin is Q15*/
                    W_tmp = W_mult0_32_32( vecLen, L_shl( L_add( (Word32) getSinWord16( sum_azi_ele ), (Word32) getSinWord16( diff_azi_ele ) ), 14 ) ); // (31 -1 -hMasa->data.energy_e[j][k]) + Q15 + Q14 + 1   (+1 is from the trigonometric expression)
                    q_shift = W_norm( W_tmp );
                    y[i][j][k] = W_extract_h( W_shl( W_tmp, q_shift ) );
                    move32();
                    y_e[i][j][k] = sub( Q31, add( sub( 60, hMasa->data.energy_e[j][k] ), sub( q_shift, 32 ) ) );
                    move16();
 
                    
                    //W_tmp = W_mult0_32_32( L_mult0( getSinWord16( eleRad ), ONE_IN_Q14 ), vecLen ); // (Q29, (31-hMasa->data.energy_e[j][k]) - Q1) -> (Q59 - hMasa->data.energy_e[j][k])
                    W_tmp = W_mult0_32_32( vecLen, L_shl( getSinWord16( eleRad ), 15 ) ); // (31 - 1 -hMasa->data.energy_e[j][k]) + Q15 + Q15 --> (Q60 - hMasa->data.energy_e[j][k])
                    q_shift = W_norm( W_tmp );
                    z[i][j][k] = W_extract_h( W_shl( W_tmp, q_shift ) );
                    move32();
                    z_e[i][j][k] = sub( Q31, add( sub( 60, hMasa->data.energy_e[j][k] ), sub( q_shift, 32 ) ) );
                    move16();

                }
            }
        }

        FOR( i = 0; i < numDirections; i++ )
        {
            FOR( j = 0; j < numSf; j++ )
            {
                FOR( k = 0; k < numCodingBands; k++ )
                {
                    brange[0] = hMasa->data.band_mapping[k];
                    move16();
                    brange[1] = hMasa->data.band_mapping[k + 1];
                    move16();

                    xSum = 0;
                    ySum = 0;
                    zSum = 0;
                    energySum = 0;
                    spreadCohSum = 0;
                    xSum_e = 0;
                    ySum_e = 0;
                    zSum_e = 0;
                    energySum_e = 0;
                    spreadCohSum_e = 0;
                    move32();
                    move32();
                    move32();
                    move32();
                    move32();
                    move16();
                    move16();
                    move16();
                    move16();
                    move16();

                    FOR( m = brange[0]; m < brange[1]; m++ )
                    {
                        xSum = BASOP_Util_Add_Mant32Exp( xSum, xSum_e, x[i][j][m], x_e[i][j][m], &xSum_e );                                                    // xSum_e
                        ySum = BASOP_Util_Add_Mant32Exp( ySum, ySum_e, y[i][j][m], y_e[i][j][m], &ySum_e );                                                    // ySum_e
                        zSum = BASOP_Util_Add_Mant32Exp( zSum, zSum_e, z[i][j][m], z_e[i][j][m], &zSum_e );                                                    // zSum_e
                        energySum = BASOP_Util_Add_Mant32Exp( energySum, energySum_e, hMasa->data.energy_fx[j][m], hMasa->data.energy_e[j][m], &energySum_e ); // energySum_e
                    }
                    common_e = add( s_max( xSum_e, s_max( ySum_e, zSum_e ) ), 2 ); /*2 is guard bit for addition operations*/
                    xSum = L_shr( xSum, sub( common_e, xSum_e ) );                 /*common_e*/
                    ySum = L_shr( ySum, sub( common_e, ySum_e ) );                 /*common_e*/
                    zSum = L_shr( zSum, sub( common_e, zSum_e ) );                 /*common_e*/
                    aziRad = BASOP_util_atan2( ySum, xSum, 0 );                    // Q13
                    xSum_sq = W_mult0_32_32( xSum, xSum );                         // 2 * (31-common_e)
                    ySum_sq = W_mult0_32_32( ySum, ySum );                         // 2 *  (31-common_e)
                    zSum_sq = W_mult0_32_32( zSum, zSum );                         // 2 * (31-common_e)
                    W_tmp = W_add( xSum_sq, ySum_sq );                             // 2 *  (31-common_e)
                    q_shift = W_norm( W_tmp );
                    L_tmp = W_extract_h( W_shl( W_tmp, q_shift ) ); // 2 *  (31-common_e) + (q_shift -32)
                    exp_diff = sub( Q31, add( imult1616( 2, sub( 31, common_e ) ), sub( q_shift, 32 ) ) );
                    L_tmp = Sqrt32( L_tmp, &exp_diff );
                    eleRad = BASOP_util_atan2( zSum, L_tmp, sub( common_e, exp_diff ) ); // Q13

                    hMeta->directional_meta[i].azimuth_fx[j][k] = L_shr( Mpy_32_16_1( _180_OVER_PI_Q25, aziRad ), Q1 ); // ((Q25, Q13) -> Q23) >> Q1 -> Q22
                    move32();
                    hMeta->directional_meta[i].elevation_fx[j][k] = L_shr( Mpy_32_16_1( _180_OVER_PI_Q25, eleRad ), Q1 ); // ((Q25, Q13) -> Q23) >> Q1 -> Q22
                    move32();

                    W_tmp = W_add( xSum_sq, ySum_sq ); // 2 *  (31-common_e)
                    W_tmp = W_add( W_tmp, zSum_sq );   // 2 *  (31-common_e)
                    q_shift = W_norm( W_tmp );
                    vecLen = W_extract_h( W_shl( W_tmp, q_shift ) ); // 2 *  (31-common_e) + (q_shift -32)
                    exp_diff = sub( Q31, add( imult1616( 2, sub( 31, common_e ) ), sub( q_shift, 32 ) ) );
                    vecLen = Sqrt32( vecLen, &exp_diff );
                    vecLen_e = exp_diff;
                    move16();

                    hMeta->directional_meta[i].energy_ratio_fx[j][k] =
                        BASOP_Util_Divide3232_Scale_cadence( vecLen, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+vecLen_e-energySum_e*/
                    move32();
                    exp_diff = add( exp_diff, sub( vecLen_e, energySum_e ) );
                    hMeta->directional_meta[i].energy_ratio_fx[j][k] =
                        L_shl( hMeta->directional_meta[i].energy_ratio_fx[j][k], sub( exp_diff, Q1 ) ); // (Q31 - exp_diff ) -> Q30
                    move32();

                    IF( computeCoherence )
                    {
                        FOR( m = brange[0]; m < brange[1]; m++ )
                        {
                            spreadCohSum = BASOP_Util_Add_Mant32Exp( spreadCohSum, spreadCohSum_e, Mpy_32_16_1( hMasa->data.energy_fx[j][m], hMeta->directional_meta[i].spread_coherence_fx[j][m] ), hMasa->data.energy_e[j][m], &spreadCohSum_e ); // 31-spreadCohSum_e
                        }
                        hMeta->directional_meta[i].spread_coherence_fx[j][k] = BASOP_Util_Divide3232_Scale( spreadCohSum, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+spreadCohSum_e-energySum_e*/
                        exp_diff = add( exp_diff, sub( spreadCohSum_e, energySum_e ) );
                        move16();
                        /* Saturation - LTV fix for values close to 1.0f+ */
                        hMeta->directional_meta[i].spread_coherence_fx[j][k] = shl_sat( hMeta->directional_meta[i].spread_coherence_fx[j][k], exp_diff ); // Q15
                        move16();

                        IF( i == 0 )
                        {
                            surrCohSum = 0;
                            surrCohSum_e = 0;
                            move32();
                            move16();
                            FOR( m = brange[0]; m < brange[1]; m++ )
                            {
                                surrCohSum = BASOP_Util_Add_Mant32Exp( surrCohSum, surrCohSum_e, Mpy_32_16_1( hMasa->data.energy_fx[j][m], hMeta->common_meta.surround_coherence_fx[j][m] ), hMasa->data.energy_e[j][m], &surrCohSum_e ); // 31-surrCohSum_e
                            }
                            hMeta->common_meta.surround_coherence_fx[j][k] = BASOP_Util_Divide3232_Scale( surrCohSum, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+surrCohSum_e-energySum_e*/
                            move16();
                            exp_diff = add( exp_diff, sub( surrCohSum_e, energySum_e ) );
                            /* Saturation - LTV fix for values close to 1.0f+ */
                            hMeta->common_meta.surround_coherence_fx[j][k] = shl_sat( hMeta->common_meta.surround_coherence_fx[j][k], exp_diff ); // Q15
                            move16();
                        }
                    }

                    IF( i == 0 )
                    {
                        energy[j][k] = energySum; // 31-energySum_e
                        energy_e[j][k] = energySum_e;
                        move32();
                        move16();
                    }
                }
            }
        }
    }
    ELSE IF( mergeRatiosOverSubframes ) /* keep frequency resolution */
    {
        FOR( j = 0; j < numSf; j++ )
        {
            FOR( k = 0; k < numCodingBands; k++ )
            {
                energy[j][k] = hMasa->data.energy_fx[j][k]; // 31-hMasa->data.energy_e[j][k]
                energy_e[j][k] = hMasa->data.energy_e[j][k];
                move32();
                move16();
            }
        }
    }
#else
    IF( LE_16( numCodingBands, MAX_REDUCED_NBANDS ) )
    {
        /* reduce metadata *frequency* resolution. time resolution is not touched */
@@ -1546,7 +1749,7 @@ static void combine_freqbands_and_subframes_fx(
            }
        }
    }

#endif
    IF( mergeRatiosOverSubframes )
    {
        FOR( k = 0; k < numCodingBands; k++ )
+79 −3
Original line number Diff line number Diff line
@@ -246,7 +246,33 @@ ivas_error ivas_qmetadata_enc_encode_fx(
    Word16 ind_order[MASA_MAXIMUM_CODING_SUBBANDS];
    Word16 reduce_bits;
    ivas_error error;

#ifdef DEBUG_MODE_QMETADATA
    int16_t ec_flag = 0;
    int16_t tmp;

    static FILE *pF = NULL;
    static FILE *pF_azi = NULL;
    static FILE *pF_ele = NULL;
    static FILE *pF_ratio = NULL;
    static FILE *pF_spcoh = NULL;
    static FILE *pF_spcoh_orig = NULL;
    static FILE *pF_surcoh = NULL;

    if ( pF == NULL )
        pF = fopen( "./res/qmetadata_enc.txt", "w" );
    if ( pF_azi == NULL )
        pF_azi = fopen( "./res/qmetadata_azi_enc.txt", "w" );
    if ( pF_ele == NULL )
        pF_ele = fopen( "./res/qmetadata_ele_enc.txt", "w" );
    if ( pF_ratio == NULL )
        pF_ratio = fopen( "./res/qmetadata_ratio_enc.txt", "w" );
    if ( pF_spcoh == NULL )
        pF_spcoh = fopen( "./res/qmetadata_spcoh_enc.txt", "w" );
    if ( pF_spcoh_orig == NULL )
        pF_spcoh_orig = fopen( "./res/qmetadata_spcoh_orig.txt", "w" );
    if ( pF_surcoh == NULL )
        pF_surcoh = fopen( "./res/qmetadata_surcoh_enc.txt", "w" );
#endif
    error = IVAS_ERR_OK;
    move32();

@@ -522,9 +548,14 @@ ivas_error ivas_qmetadata_enc_encode_fx(
            bits_ec = ivas_qmetadata_raw_encode_dir_fx( hMetaData, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band );
        }
        bits_dir[d] = add( bits_ec, 1 );
#ifdef DEBUG_MODE_QMETADATA
        tmp = bits_dir[d] - ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) );
#endif
        move16();
        extra_bits = sub( hQMetaData->metadata_max_bits, sub( hMetaData->nb_bits_tot, bit_pos_0 ) );

#ifdef DEBUG_MODE_QMETADATA
        ec_flag = 0;
#endif
        /* Encode quantized directions with EC band-wise */
        test();
        test();
@@ -591,7 +622,9 @@ ivas_error ivas_qmetadata_enc_encode_fx(

            extra_bits = sub( hQMetaData->metadata_max_bits, sub( hMetaData->nb_bits_tot, bit_pos_0 ) );
        }

#ifdef DEBUG_MODE_QMETADATA
        ec_flag = 1;
#endif
        /* Requantized directions */
        test();
        IF( LE_16( add( total_bits_1dir, bits_surround_coh ), hQMetaData->qmetadata_max_bit_req ) && GT_16( add( add( add( bits_dir[d], bits_diff[d] ), bits_coherence[d] ), bits_signaling[d] ), total_bits_1dir ) )
@@ -641,6 +674,9 @@ ivas_error ivas_qmetadata_enc_encode_fx(
            requantize_direction_EC_3_fx( &extra_bits, q_direction, nbands, hMetaData, elevation_orig, azimuth_orig, ind_order );
            bits_dir[d] = sub( hMetaData->nb_bits_tot, bits_dir[d] );
            move16();
#ifdef DEBUG_MODE_QMETADATA
            ec_flag = 2;
#endif
        }

        /* finalize writing coherence */
@@ -661,7 +697,47 @@ ivas_error ivas_qmetadata_enc_encode_fx(
        {
            total_bits_1dir = sub( hQMetaData->metadata_max_bits, sub( hMetaData->nb_bits_tot, bit_pos_0 ) );
        }
#ifdef DEBUG_MODE_QMETADATA
        int m, b;
        FOR( d = 0; d < hQMetaData->no_directions; d++ )
        {
            fprintf( pF, "diff %d ", bits_diff_sum);

            /* fprintf( pF_azi, "/dir/ec %d: ", d ); */

            fprintf( pF_azi, "%d ", 1000*(d+1));
            fprintf( pF_ele, "/dir/ec %d: ", d );
            fprintf( pF_spcoh, "/dir %d: ", d );
            fprintf( pF_ratio, "/dir %d: ", d );

            for ( b = hQMetaData->q_direction[d].cfg.start_band; b < hQMetaData->q_direction[d].cfg.nbands; b++ )
            {
                for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ )
                {
                   // fprintf( pF_azi, " %+5.0f ", (int16_t) ( 100.f * hQMetaData->q_direction[d].band_data[b].azimuth_fx[m] / ( (float) 4194304.0f ) ) / 100.f );
                    fprintf( pF_azi, " %+5.0f ", (int16_t) ( 100.f * azimuth_orig[b][m] / ( (float) 4194304.0f ) ) / 100.f );
                    fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * hQMetaData->q_direction[d].band_data[b].elevation_fx[m] / ( (float) 4194304.0f ) ) / 100.f );
                    fprintf( pF_ratio, " %1.3f ", hQMetaData->q_direction[d].band_data[b].energy_ratio_fx[m] / ( (float) 1073741824.0f ) );
                    if ( hQMetaData->q_direction[d].coherence_band_data != NULL )
                    {
                        fprintf( pF_spcoh, " %d ", hQMetaData->q_direction[d].coherence_band_data[b].spread_coherence[m] );
                    }
                    if ( d == 0 && hQMetaData->surcoh_band_data != NULL )
                    {
                        fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] );
                    }
                }
            }
            
            if ( d > 0 || hQMetaData->no_directions ==1)
                fprintf( pF_azi, "\n" );
            
            fprintf( pF_ele, "\n" );
            fprintf( pF_ratio, "\n" );
            fprintf( pF_spcoh, "\n" );
        }

#endif
        /* Save quantized DOAs */
        FOR( i = start_band; i < nbands; i++ )
        {