Commit c95d1c0b authored by emerit's avatar emerit
Browse files

merge with fastconv 16 bits binary file format

parent f8e0ac77
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -165,6 +165,7 @@

#define FIX_1099_JBM_MD_HANDLE_ALLOC                    /* VA: issue 1099: Limit the allocation of `hJbmMetadata` handle to MASA and OMASA only */
#define FIX_1111_TDM_LSP_BUFFER                         /* VA: issue 1111: remove unused buffer `tdm_lspQ_PCh[]' */
#define FIX_1123_FASTCONV_16BIT_ROM                     /* FhG: issue 1123: update FastConv ROM tables and scripts to generate 16 bit tables instead of float */
#define FIX_1101_CLEANING_JBM_CALL                      /* VA: issue 1101: remove obsolete call of ivas_jbm_dec_tc_buffer_open() */

/* #################### End BE switches ################################## */
+69 −0
Original line number Diff line number Diff line
@@ -695,7 +695,11 @@ static ivas_error ivas_binaural_hrtf_open(
    const RENDERER_TYPE renderer_type     /* i  : renderer type        */
)
{
#ifdef FIX_1123_FASTCONV_16BIT_ROM
    int16_t i, j, k;
#else
    int16_t i, j;
#endif
    ivas_error error;

    if ( hHrtfFastConv != NULL && *hHrtfFastConv != NULL )
@@ -736,7 +740,11 @@ static ivas_error ivas_binaural_hrtf_open(
            HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s;
        }

#ifdef FIX_1123_FASTCONV_16BIT_ROM
        HrtfFastConv->allocate_init_flag = 0; /* TODO: consider getting rid of this flag entirely? */
#else
        HrtfFastConv->allocate_init_flag = 1;
#endif

        if ( ( error = ivas_allocate_binaural_hrtf( HrtfFastConv, input_config, BINAURAL_INPUT_AUDIO_CONFIG_INVALID, renderer_type, HrtfFastConv->allocate_init_flag ) ) != IVAS_ERR_OK )
        {
@@ -748,55 +756,116 @@ static ivas_error ivas_binaural_hrtf_open(
            {
                for ( j = 0; j < HRTF_LS_CHANNELS; j++ )
                {
#ifdef FIX_1123_FASTCONV_16BIT_ROM
                    for ( k = 0; k < BINAURAL_NTAPS; k++ )
                    {
                        HrtfFastConv->leftHRIRReal[i][j][k] = (float) leftHRIRReal[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_factorQ );
                        HrtfFastConv->leftHRIRImag[i][j][k] = (float) leftHRIRImag[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_factorQ );
                        HrtfFastConv->rightHRIRReal[i][j][k] = (float) rightHRIRReal[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_factorQ );
                        HrtfFastConv->rightHRIRImag[i][j][k] = (float) rightHRIRImag[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_factorQ );
                    }
#else
                    HrtfFastConv->leftHRIRReal[i][j] = leftHRIRReal[i][j];
                    HrtfFastConv->leftHRIRImag[i][j] = leftHRIRImag[i][j];
                    HrtfFastConv->rightHRIRReal[i][j] = rightHRIRReal[i][j];
                    HrtfFastConv->rightHRIRImag[i][j] = rightHRIRImag[i][j];
#endif
                }
            }
            else if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM )
            {
                for ( j = 0; j < HRTF_LS_CHANNELS; j++ )
                {
#ifdef FIX_1123_FASTCONV_16BIT_ROM
                    for ( k = 0; k < BINAURAL_NTAPS_MAX; k++ )
                    {
                        HrtfFastConv->leftBRIRReal[i][j][k] = (float) leftBRIRReal[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_BRIR_factorQ );
                        HrtfFastConv->leftBRIRImag[i][j][k] = (float) leftBRIRImag[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_BRIR_factorQ );
                        HrtfFastConv->rightBRIRReal[i][j][k] = (float) rightBRIRReal[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_BRIR_factorQ );
                        HrtfFastConv->rightBRIRImag[i][j][k] = (float) rightBRIRImag[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_BRIR_factorQ );
                    }
#else
                    HrtfFastConv->leftBRIRReal[i][j] = leftBRIRReal[i][j];
                    HrtfFastConv->leftBRIRImag[i][j] = leftBRIRImag[i][j];
                    HrtfFastConv->rightBRIRReal[i][j] = rightBRIRReal[i][j];
                    HrtfFastConv->rightBRIRImag[i][j] = rightBRIRImag[i][j];
#endif
                }
            }
            if ( input_config == IVAS_AUDIO_CONFIG_HOA3 )
            {
                for ( j = 0; j < HOA3_CHANNELS; j++ )
                {
#ifdef FIX_1123_FASTCONV_16BIT_ROM
                    for ( k = 0; k < BINAURAL_NTAPS; k++ )
                    {
                        HrtfFastConv->leftHRIRReal_HOA3[i][j][k] = (float) leftHRIRReal_HOA3[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA3_factorQ );
                        HrtfFastConv->leftHRIRImag_HOA3[i][j][k] = (float) leftHRIRImag_HOA3[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA3_factorQ );
                        HrtfFastConv->rightHRIRReal_HOA3[i][j][k] = (float) rightHRIRReal_HOA3[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA3_factorQ );
                        HrtfFastConv->rightHRIRImag_HOA3[i][j][k] = (float) rightHRIRImag_HOA3[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA3_factorQ );
                    }
#else
                    HrtfFastConv->leftHRIRReal_HOA3[i][j] = leftHRIRReal_HOA3[i][j];
                    HrtfFastConv->leftHRIRImag_HOA3[i][j] = leftHRIRImag_HOA3[i][j];
                    HrtfFastConv->rightHRIRReal_HOA3[i][j] = rightHRIRReal_HOA3[i][j];
                    HrtfFastConv->rightHRIRImag_HOA3[i][j] = rightHRIRImag_HOA3[i][j];
#endif
                }
            }
            if ( input_config == IVAS_AUDIO_CONFIG_HOA2 )
            {
                for ( j = 0; j < HOA2_CHANNELS; j++ )
                {
#ifdef FIX_1123_FASTCONV_16BIT_ROM
                    for ( k = 0; k < BINAURAL_NTAPS; k++ )
                    {
                        HrtfFastConv->leftHRIRReal_HOA2[i][j][k] = (float) leftHRIRReal_HOA2[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA2_factorQ );
                        HrtfFastConv->leftHRIRImag_HOA2[i][j][k] = (float) leftHRIRImag_HOA2[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA2_factorQ );
                        HrtfFastConv->rightHRIRReal_HOA2[i][j][k] = (float) rightHRIRReal_HOA2[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA2_factorQ );
                        HrtfFastConv->rightHRIRImag_HOA2[i][j][k] = (float) rightHRIRImag_HOA2[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_HOA2_factorQ );
                    }
#else
                    HrtfFastConv->leftHRIRReal_HOA2[i][j] = leftHRIRReal_HOA2[i][j];
                    HrtfFastConv->leftHRIRImag_HOA2[i][j] = leftHRIRImag_HOA2[i][j];
                    HrtfFastConv->rightHRIRReal_HOA2[i][j] = rightHRIRReal_HOA2[i][j];
                    HrtfFastConv->rightHRIRImag_HOA2[i][j] = rightHRIRImag_HOA2[i][j];
#endif
                }
            }
            if ( input_config == IVAS_AUDIO_CONFIG_FOA )
            {
                for ( j = 0; j < FOA_CHANNELS; j++ )
                {
#ifdef FIX_1123_FASTCONV_16BIT_ROM
                    for ( k = 0; k < BINAURAL_NTAPS; k++ )
                    {
                        HrtfFastConv->leftHRIRReal_FOA[i][j][k] = (float) leftHRIRReal_FOA[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_FOA_factorQ );
                        HrtfFastConv->leftHRIRImag_FOA[i][j][k] = (float) leftHRIRImag_FOA[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_FOA_factorQ );
                        HrtfFastConv->rightHRIRReal_FOA[i][j][k] = (float) rightHRIRReal_FOA[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_FOA_factorQ );
                        HrtfFastConv->rightHRIRImag_FOA[i][j][k] = (float) rightHRIRImag_FOA[i][j][k] * powf( 2.f, -1.f * (float) FASTCONV_HRIR_FOA_factorQ );
                    }
#else
                    HrtfFastConv->leftHRIRReal_FOA[i][j] = leftHRIRReal_FOA[i][j];
                    HrtfFastConv->leftHRIRImag_FOA[i][j] = leftHRIRImag_FOA[i][j];
                    HrtfFastConv->rightHRIRReal_FOA[i][j] = rightHRIRReal_FOA[i][j];
                    HrtfFastConv->rightHRIRImag_FOA[i][j] = rightHRIRImag_FOA[i][j];
#endif
                }
            }
        }
#ifdef FIX_1123_FASTCONV_16BIT_ROM
        for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
        {
            HrtfFastConv->fastconvReverberationTimes[i] = (float) fastconvReverberationTimes[i] * powf( 2.f, -1.f * (float) fastconvReverberationTimes_factorQ );
        }
        for ( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ )
        {
            HrtfFastConv->fastconvReverberationEneCorrections[i] = (float) fastconvReverberationEneCorrections[i] * powf( 2.f, -1.f * (float) fastconvReverberationEneCorrections_factorQ );
        }
#else
        mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX );
        mvr2r( fastconvReverberationEneCorrections, HrtfFastConv->fastconvReverberationEneCorrections, CLDFB_NO_CHANNELS_MAX );
#endif

        *hHrtfFastConv = HrtfFastConv;
    }
+265 −7

File changed.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.5)

project(generate_crend_ivas_tables)

# set(CMAKE_OSX_ARCHITECTURES "x86_64")
set(CMAKE_BUILD_TYPE "Debug")
set(IVAS_TRUNK_PATH "${PROJECT_SOURCE_DIR}/../..")
set(IVAS_TRUNK_UTIL_PATH ${IVAS_TRUNK_PATH}/lib_util)
string(REPLACE "/binauralRenderer_interface" "" IVAS_TRUNK_SCRIPTS_PATH ${PROJECT_SOURCE_DIR})
+7 −5
Original line number Diff line number Diff line
@@ -51,10 +51,10 @@ if isfolder("../matlab_hrir_generation_scripts")
    addpath("../matlab_hrir_generation_scripts");
end
sofaData = hrtf_library_loader();
sofaData.readSOFA(char(sofa_file));
sofaData.readSOFA(char(sofa_file),'Combined');
ls_struct = get_ls_layout_config('Combined');

IR = permute(sofaData.Data.IR(:,:,:), [3 2 1]);
IR = permute(sofaData.Data.IR(:,:,:), [3 2 1]) * sofaData.Gain ;

% match required loudspeaker positions
brirAziRad = sofaData.PosSpherical(1, :).';
@@ -142,7 +142,9 @@ end
% Step 3: Compute EDC (Energy Decay Curve)
in_struct.num_bands = size(IR_cldfb,1);
in_struct.timeSlots = size(IR_cldfb,2);
assert(in_struct.timeSlots > in_struct.max_index)
if in_struct.max_index > in_struct.timeSlots
    in_struct.max_index = in_struct.timeSlots;
end
in_struct.num_channels = size(IR_cldfb,4);
EDC = get_EDC(IR_cldfb,in_struct);

@@ -276,12 +278,12 @@ index = find(EDC==0,1,'last');

i0 = index;
i5 = i0+1;
while EDC(i5) > (EDC(i0)-5)
while (i5 <= length(EDC) && EDC(i5) > (EDC(i0)-5)) 
    i5 = i5+1;
end

i35 = i5+1;
while ((EDC(i35) > (EDC(i0) -35)) && (i35 < end_idx))
while (i35 <= length(i35) &&  (EDC(i35) > (EDC(i0) -35)) && (i35 < end_idx))
    i35 = i35 + 1;
end

Loading