Commit 034fa68a authored by Jouni Paulus's avatar Jouni Paulus
Browse files

first working parambin-based split renderer. still needs optimization of unnecessary computations.

parent 01b7db38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1317,8 +1317,8 @@ ivas_error ivas_init_decoder(
    /* ParamISM is handled separately from other common config */
    else if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) )
    {
        /* TODO jpaulus: paramBin modes needed? */
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        /* TODO jpaulus: paramBin modes needed? */
        if ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ||
             ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) )
        {
+5 −4
Original line number Diff line number Diff line
@@ -336,8 +336,9 @@ ivas_error ivas_sba_dec_reconfigure(
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    if ( st_ivas->hDiracDecBin[0] != NULL )
    {
        /* TODO jpaulus: is this reached at all? */
        int16_t pos_idx;
        for ( pos_idx = 0; pos_idx < st_ivas->splitBinRend.splitrend.multiBinPoseData.num_poses; pos_idx++ )  /* TODO jpaulus: max number of poses or the active one? */
        for ( pos_idx = 0; pos_idx < st_ivas->splitBinRend.splitrend.multiBinPoseData.num_poses; pos_idx++ )  /* TODO jpaulus: max number of poses or the active one? ideally only 1 decorr pass is done */
        {
            if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[pos_idx]->hTdDecorr ), &( st_ivas->hDiracDecBin[pos_idx]->useTdDecorr ) ) ) != IVAS_ERR_OK )
            {
@@ -440,7 +441,7 @@ ivas_error ivas_sba_dec_digest_tc(
    }

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    if ( st_ivas->hDiracDecBin[0] != NULL && ( st_ivas->hDiracDecBin[0]->useTdDecorr ) )  /* TODO jpaulus: use correct pos_idx */
    if ( st_ivas->hDiracDecBin[0] != NULL && ( st_ivas->hDiracDecBin[0]->useTdDecorr ) )
#else
    if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) )
#endif
@@ -462,13 +463,13 @@ ivas_error ivas_sba_dec_digest_tc(
        {
            int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame );
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
            if ( st_ivas->hDiracDecBin[0]->hTdDecorr )  /* TODO jpaulus: use correct pos_idx */
            if ( st_ivas->hDiracDecBin[0]->hTdDecorr )
#else
            if ( st_ivas->hDiracDecBin->hTdDecorr )
#endif
            {
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
                ivas_td_decorr_process( st_ivas->hDiracDecBin[0]->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr );  /* TODO jpaulus: use correct pos_idx */
                ivas_td_decorr_process( st_ivas->hDiracDecBin[0]->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr );
#else
                ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr );
#endif
+116 −28
Original line number Diff line number Diff line
@@ -91,11 +91,7 @@ typedef struct parambin_rend_config_data
 * Local function prototypes
 *------------------------------------------------------------------------*/

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, DIRAC_DEC_BIN_HANDLE hDiracDecBin, float *output_f[], const int16_t nchan_transport, const int16_t subframe );
#else
static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, float *output_f[], const int16_t nchan_transport, const int16_t subframe );
#endif

static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const int16_t num_freq_bands, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] );

@@ -103,7 +99,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric

static void ivas_dirac_dec_binaural_determine_processing_matrices( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, const int16_t max_band_decorr, float Rmat[3][3], const int16_t isHeadtracked );

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
static void ivas_dirac_dec_binaural_process_output( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t processReverb, const int16_t subframe, float outRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float outIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]  );
#else
static void ivas_dirac_dec_binaural_process_output( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t processReverb, const int16_t subframe );
#endif

static void adaptTransportSignalsHeadtracked( COMBINED_ORIENTATION_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] );

@@ -459,11 +459,8 @@ void ivas_dirac_dec_binaural_render(
    for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ )
    {
        int16_t n_samples_sf = slot_size * hSpatParamRendCom->subframe_nbslots[subframe_idx];
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, st_ivas->hDiracDecBin[0], output_f_local, nchan_transport, subframe_idx );  /* TODO jpaulus: use corres pos_idx */
#else
        ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, output_f_local, nchan_transport, subframe_idx );
#endif

        for ( ch = 0; ch < nchan_out; ch++ )
        {
            output_f_local[ch] += n_samples_sf;
@@ -577,7 +574,7 @@ void ivas_dirac_dec_binaural(
        output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC );

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        ivas_td_decorr_process( st_ivas->hDiracDecBin[0]->hTdDecorr, p_output, decorr_signal, output_frame );  /* TODO jpaulus: use correct pos_idx */
        ivas_td_decorr_process( st_ivas->hDiracDecBin[0]->hTdDecorr, p_output, decorr_signal, output_frame );
#else
        ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame );
#endif
@@ -594,11 +591,7 @@ void ivas_dirac_dec_binaural(
    {
        int16_t n_samples_sf = slot_size * hSpatParamRendCom->subframe_nbslots[subframe];

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, st_ivas->hDiracDecBin[0], p_output, nchan_transport, subframe );  /* TODO jpaulus: use correct pos_idx */
#else
        ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, p_output, nchan_transport, subframe );
#endif

        for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ )
        {
@@ -624,16 +617,11 @@ void ivas_dirac_dec_binaural(
static void ivas_dirac_dec_binaural_internal(
    Decoder_Struct *st_ivas,
    COMBINED_ORIENTATION_HANDLE hCombinedOrientationData,
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    DIRAC_DEC_BIN_HANDLE hDiracDecBin,
#endif
    float *output_f[],
    const int16_t nchan_transport,
    const int16_t subframe )
{
#ifndef SPLIT_REND_WITH_HEAD_ROT_MASA
    DIRAC_DEC_BIN_HANDLE hDiracDecBin;
#endif
    SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom;
    PARAMBIN_REND_CONFIG config_data;
    int16_t slot, ch, numInChannels;
@@ -645,7 +633,14 @@ static void ivas_dirac_dec_binaural_internal(
    int16_t nBins, offsetSamples;
    int16_t i, j;

#ifndef SPLIT_REND_WITH_HEAD_ROT_MASA
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    int16_t pos_idx;
    MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData;
    float tmp_Cldfb_out_re[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];
    float tmp_Cldfb_out_im[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX];

    hDiracDecBin = st_ivas->hDiracDecBin[0];
#else
    hDiracDecBin = st_ivas->hDiracDecBin;
#endif
    assert( hDiracDecBin );
@@ -653,7 +648,7 @@ static void ivas_dirac_dec_binaural_internal(
    nBins = hSpatParamRendCom->num_freq_bands;
    offsetSamples = hSpatParamRendCom->slots_rendered * nBins;

    /* Setuo internal config */
    /* Setup internal config */
    config_data.separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled;
    config_data.ivas_format = st_ivas->ivas_format;
    config_data.mc_mode = st_ivas->mc_mode;
@@ -784,13 +779,7 @@ static void ivas_dirac_dec_binaural_internal(
    {
        hDiracDecBin->hDiffuseDist = &diffuseDistData;

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        /* TODO jpaulus: these should be refactored not to use st_ivas, but the appropriate fields */
#endif
        ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe );
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
        /* TODO jpaulus: if using this for rendering multiple poses, take care of the indices and update only after the last rendering */
#endif
        ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe );
    }

@@ -806,14 +795,19 @@ static void ivas_dirac_dec_binaural_internal(

        if ( nchan_transport == 2 )
        {
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
            /* in case of split rendering, determine the prototype rotation based on the main direction and use the same prototypes for the offset directions */
#endif
            adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat );

            ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat );
        }
    }

#ifndef SPLIT_REND_WITH_HEAD_ROT_MASA
    ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe,
                                                                            hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 );
#endif

    if ( config_data.ivas_format == ISM_FORMAT )
    {
@@ -828,13 +822,90 @@ static void ivas_dirac_dec_binaural_internal(
        max_band_decorr = hDiracDecBin->h_freq_domain_decorr_ap_params->max_band_decorr;
    }

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe,
                                                                            hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 );
#endif
    ivas_dirac_dec_binaural_determine_processing_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat,
                                                           hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 );
    ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe );

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    pMultiBinPoseData = &st_ivas->splitBinRend.splitrend.multiBinPoseData;

    if ( pMultiBinPoseData != NULL )
    {
        ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe, tmp_Cldfb_out_re, tmp_Cldfb_out_im );
        for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
        {
            for ( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ )
            {
                mvr2r(tmp_Cldfb_out_re[ch][i], st_ivas->splitBinRend.hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX);
                mvr2r(tmp_Cldfb_out_im[ch][i], st_ivas->splitBinRend.hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX);
            }
        }
    }
    else
    {
        ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe, NULL, NULL );
    }
#endif
    hDiracDecBin->hDiffuseDist = NULL;

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    if ( pMultiBinPoseData != NULL && pMultiBinPoseData->num_poses > 1 )
    {
        /* quaternion-based rotation from ivas_binRenderer_internal.c:ivas_binRenderer() */
        IVAS_QUATERNION Quaternions_rel, Quaternions_abs, *Quaternions_ref;
        float Rmat_local[3][3];

        if ( hCombinedOrientationData )
        {
            Quaternions_ref = &hCombinedOrientationData->Quaternions[0];
            Quaternions_rel.w = -3.0f;                                                                        /*euler*/
            Quaternions_abs.w = -3.0f;                                                                        /*euler*/
            Quat2EulerDegree( *Quaternions_ref, &Quaternions_abs.z, &Quaternions_abs.y, &Quaternions_abs.x ); /*order in Quat2Euler seems to be reversed ?*/

            for ( pos_idx = 1; pos_idx < pMultiBinPoseData->num_poses; pos_idx++ )
            {
                Quaternions_rel.x = pMultiBinPoseData->relative_head_poses[pos_idx][0] - pMultiBinPoseData->relative_head_poses[pos_idx - 1][0];
                Quaternions_rel.y = pMultiBinPoseData->relative_head_poses[pos_idx][1] - pMultiBinPoseData->relative_head_poses[pos_idx - 1][1];
                Quaternions_rel.z = pMultiBinPoseData->relative_head_poses[pos_idx][2] - pMultiBinPoseData->relative_head_poses[pos_idx - 1][2];
                Quaternions_abs.x = Quaternions_abs.x + Quaternions_rel.x;
                Quaternions_abs.y = Quaternions_abs.y + Quaternions_rel.y;
                Quaternions_abs.z = Quaternions_abs.z + Quaternions_rel.z;

                QuatToRotMat( Quaternions_rel, Rmat_local );

                hDiracDecBin = st_ivas->hDiracDecBin[pos_idx];
                assert(hDiracDecBin != NULL && "No DiracDecBin handle for this position");
                if ( config_data.ivas_format == SBA_FORMAT )
                {
                    hDiracDecBin->hDiffuseDist = &diffuseDistData;
                }
                /* TODO jpaulus: re-use input covariance for the side renderings */
                ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat_local, subframe,
                                                                                        hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 );

                ivas_dirac_dec_binaural_determine_processing_matrices( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_local,
                                                                       hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 );

                ivas_dirac_dec_binaural_process_output( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, config_data.processReverb, subframe, tmp_Cldfb_out_re, tmp_Cldfb_out_im );
                for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ )
                {
                    for ( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ )
                    {
                        mvr2r(tmp_Cldfb_out_re[ch][i], st_ivas->splitBinRend.hMultiBinCldfbData->Cldfb_RealBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX);
                        mvr2r(tmp_Cldfb_out_im[ch][i], st_ivas->splitBinRend.hMultiBinCldfbData->Cldfb_ImagBuffer_Binaural[pos_idx * BINAURAL_CHANNELS + ch][subframe * CLDFB_SLOTS_PER_SUBFRAME + i], CLDFB_NO_CHANNELS_MAX);
                    }
                }

                hDiracDecBin->hDiffuseDist = NULL;
            }
        }
    }

    /* update this counter only after the last rendering of split directions */
#endif
    hSpatParamRendCom->slots_rendered += hSpatParamRendCom->subframe_nbslots[subframe];
    hSpatParamRendCom->subframes_rendered++;

@@ -1500,7 +1571,13 @@ static void ivas_dirac_dec_binaural_process_output(
    const int16_t max_band_decorr,
    const int16_t numInChannels,
    const int16_t processReverb,
    const int16_t subframe )
    const int16_t subframe
#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
    ,
    float outRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX],
    float outIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]
#endif
    )
{
    int16_t slot, bin, chA, chB;
    int16_t nBins;
@@ -1518,6 +1595,7 @@ static void ivas_dirac_dec_binaural_process_output(
    offsetSamples = 0;
    nSlots = hSpatParamRendCom->subframe_nbslots[subframe];

    /* TODO jpaulus: run reverb only for the main direction and reuse for sides */
    if ( processReverb )
    {
        /* Process second / room effect part of binaural output when needed */
@@ -1530,6 +1608,7 @@ static void ivas_dirac_dec_binaural_process_output(
        interpVal += 1.0f / (float) nSlots;
        if ( !hDiracDecBin->useTdDecorr && max_band_decorr > 0 )
        {
            /* TODO jpaulus: run decorrelation only for the main direction and reuse for sides */
            ivas_dirac_dec_decorrelate_slot( hDiracDecBin, nBins, slot, inRe, inIm, decSlotRe, decSlotIm );
        }

@@ -1595,7 +1674,16 @@ static void ivas_dirac_dec_binaural_process_output(
            outSlotRePr = &( outSlotRe[0] );
            outSlotImPr = &( outSlotIm[0] );

#ifdef SPLIT_REND_WITH_HEAD_ROT_MASA
            if ( outRe != NULL && outIm != NULL )
            {
                mvr2r(outSlotRePr, outRe[chA][slot], CLDFB_NO_CHANNELS_MAX);
                mvr2r(outSlotImPr, outIm[chA][slot], CLDFB_NO_CHANNELS_MAX);
            }
#endif

            /* Inverse filter bank */
            /* TODO jpaulus: in split rendering omit synthesis, e.g., by accepting output CLDFB buffers from outside  */
            cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, cldfbSynDec[chA] );
        }
    }