Skip to content

Commit 9d3bb4a

Browse files
committed
Added option to better control mixing of filter output fragment in firfft processing
1 parent c2d3bfe commit 9d3bb4a

5 files changed

Lines changed: 137 additions & 91 deletions

File tree

sources/jvxApplications/mex/jvxFirFft/target/entryMex.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ void mexFunction( int nlhs, mxArray *plhs[],
161161
jvxData** outSigBuf = nullptr;
162162
JVX_SAFE_ALLOCATE_2DFIELD_CPP_Z(outSigBuf, jvxData, filteredOut, init.init.bsize);
163163

164+
jvxCBool* addOut = nullptr;
165+
JVX_DSP_SAFE_ALLOCATE_FIELD_CPP_Z(addOut, jvxCBool, filteredOut);
166+
for (i = 0; i < filteredOut; i++)
167+
{
168+
addOut[i] = c_false;
169+
}
170+
164171
jvxSize cntStart = 0;
165172
jvxSize cntStop = JVX_MIN(cntStart + init.init.bsize, lenSig);
166173
while (1)
@@ -185,13 +192,13 @@ void mexFunction( int nlhs, mxArray *plhs[],
185192
{
186193
jvx_firfft_cf_cvrt_compute_weights_and_copy(irft_update, firsIn[i], filterOrder, inFirCplx[i], init.derived.szFftValue / 2 + 1, c_false);
187194
}
188-
jvx_firfft_cf_nout_process_update_weights(&init, inSigBuf, outSigBuf, inFirCplx, false);
195+
jvx_firfft_cf_nin_nout_process_update_weights(&init, &inSigBuf, outSigBuf, inFirCplx, addOut);
189196
}
190197
weightsUpdated = true;
191198
}
192199
else
193200
{
194-
jvx_firfft_cf_nout_process(&init, &inSigBuf, outSigBuf, false);
201+
jvx_firfft_cf_nin_nout_process(&init, &inSigBuf, outSigBuf, addOut);
195202
}
196203
for (i = 0; i < filteredOut; i++)
197204
{
@@ -214,6 +221,7 @@ void mexFunction( int nlhs, mxArray *plhs[],
214221
}
215222

216223
// Clear data
224+
JVX_DSP_SAFE_DELETE_FIELD(addOut);
217225
JVX_DSP_SAFE_DELETE_FIELD(outSig);
218226
JVX_DSP_SAFE_DELETE_FIELD(inSigBuf);
219227
JVX_DSP_SAFE_DELETE_FIELD(outSigBuf);

sources/jvxComponents/jvxAudioNodes/jvxAuNBinauralRender/src/CjvxAuNBinauralRender.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ CjvxAuNBinauralRender::process_buffers_icon(jvxSize mt_mask, jvxSize idx_stage)
234234
#ifdef AYF_CTC_EFFICIENT_FILTER
235235
jvxData* outLeftRight[2] = { out_left , out_right };
236236
jvxDataCplx* firHLeftRight[2] = { render_pri->updatedWeightsLeft , render_pri->updatedWeightsRight };
237+
jvxCBool addLeft[2] = { false, false };
237238
#endif
238239

239240
const jvxSize num_channels_in = _common_set_icon.theData_in->con_params.number_channels;
@@ -266,7 +267,7 @@ CjvxAuNBinauralRender::process_buffers_icon(jvxSize mt_mask, jvxSize idx_stage)
266267

267268
#ifdef AYF_CTC_EFFICIENT_FILTER
268269

269-
jvx_firfft_cf_nout_process_update_weights(&render_pri->firfftcf_left_right, in, outLeftRight, firHLeftRight, false);
270+
jvx_firfft_cf_nin_nout_process_update_weights(&render_pri->firfftcf_left_right, &in, outLeftRight, firHLeftRight, addLeft);
270271
#else
271272
jvx_firfft_cf_process_update_weights(&render_pri->firfftcf_left, in, out_left, render_pri->updatedWeightsLeft, false);
272273
jvx_firfft_cf_process_update_weights(&render_pri->firfftcf_right, in, out_right, render_pri->updatedWeightsRight, false);
@@ -280,8 +281,8 @@ CjvxAuNBinauralRender::process_buffers_icon(jvxSize mt_mask, jvxSize idx_stage)
280281
{
281282

282283
#ifdef AYF_CTC_EFFICIENT_FILTER
283-
284-
jvx_firfft_cf_nout_process(&render_pri->firfftcf_left_right, &in, outLeftRight, false);
284+
285+
jvx_firfft_cf_nin_nout_process(&render_pri->firfftcf_left_right, &in, outLeftRight, addLeft);
285286

286287
#else
287288
jvx_firfft_cf_process(&render_pri->firfftcf_left, in, out_left, false);
Binary file not shown.

sources/jvxLibraries/jvx-dsp-base/include/jvx_fft_tools/jvx_firfft_cf_nout.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,20 @@ typedef struct
4242
jvxSize stride;
4343
} jvx_firfft_cf_nout_prmSync;
4444

45-
jvxDspBaseErrorType jvx_firfft_cf_nout_init(jvx_firfft* hdl, jvxHandle* fftCfgHdl, jvxSize nChannels, jvxSize nChannelsIn);
45+
jvxDspBaseErrorType jvx_firfft_cf_nout_init(jvx_firfft* hdl, jvxHandle* fftCfgHdl, jvxSize nStride, jvxSize nChannelsIn);
4646
jvxDspBaseErrorType jvx_firfft_cf_nout_terminate(jvx_firfft* hdl);
4747

4848
//void jvx_firfft_cf_nout_compute_weights(jvx_firfft* hdl, jvxData* fir, jvxSize lFir);
4949
//void jvx_firfft_cf_nout_copy_weights(jvx_firfft* hdl, jvxDataCplx* firW, jvxSize lFirW);
5050

51-
jvxDspBaseErrorType jvx_firfft_cf_nout_process(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxCBool addOnOut);
52-
jvxDspBaseErrorType jvx_firfft_cf_nout_process_update_weights(jvx_firfft* hdl, jvxData* inArg, jvxData** outArg, jvxDataCplx** newWeights, jvxCBool addOnOut);
51+
/**
52+
* Referring to the init arguments:
53+
* - number input buffers: nChannelsIn
54+
* - number output buffers: nChanelsOut = nStride * nChannelsIn
55+
* inArg -> nChannelsIn ----- outArg, addOnOut -> nChanelsOut
56+
*/
57+
jvxDspBaseErrorType jvx_firfft_cf_nin_nout_process(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxCBool* addOnOut_nout);
58+
jvxDspBaseErrorType jvx_firfft_cf_nin_nout_process_update_weights(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxDataCplx** newWeights, jvxCBool* addOnOut_nout);
5359

5460
JVX_DSP_LIB_END
5561

sources/jvxLibraries/jvx-dsp-base/src/jvx_fft_tools/jvx_firfft_cf_nout.c

Lines changed: 114 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ jvx_firfft_cf_nout_terminate(jvx_firfft* hdl)
207207
}
208208

209209
jvxDspBaseErrorType jvx_firfft_cf_nout_process_core(jvx_firfft_cf_nout_prv* nHdl, jvx_firfft_cf_nout_prmSync* nChannels,
210-
jvxData* inArg, jvxData** outArg, jvxCBool addOnOut, jvxData* fftin,
210+
jvxData* inArg, jvxData** outArg, jvxCBool* addOnOut_nout, jvxData* fftin,
211211
jvxSize ll1, jvxSize ll2, jvxFFT*corefft, jvxSize outOffs, jvxSize outSz)
212212
{
213213
jvxSize i;
@@ -297,7 +297,7 @@ jvxDspBaseErrorType jvx_firfft_cf_nout_process_core(jvx_firfft_cf_nout_prv* nHdl
297297

298298
if (nHdl->firfft.ram.normOut)
299299
{
300-
if (addOnOut)
300+
if (addOnOut_nout[iC])
301301
{
302302
for (i = 0; i < ll1; i++)
303303
{
@@ -327,7 +327,7 @@ jvxDspBaseErrorType jvx_firfft_cf_nout_process_core(jvx_firfft_cf_nout_prv* nHdl
327327
}
328328
else
329329
{
330-
if (addOnOut)
330+
if (addOnOut_nout[iC])
331331
{
332332
for (i = 0; i < ll1; i++)
333333
{
@@ -367,7 +367,7 @@ jvxDspBaseErrorType jvx_firfft_cf_nout_process_core(jvx_firfft_cf_nout_prv* nHdl
367367
return JVX_DSP_NO_ERROR;
368368
}
369369

370-
jvxDspBaseErrorType jvx_firfft_cf_nout_process(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxCBool addOnOut)
370+
jvxDspBaseErrorType jvx_firfft_cf_nin_nout_process(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxCBool* addOnOut_nout)
371371
{
372372
jvxSize i;
373373
jvxDspBaseErrorType resL = JVX_DSP_NO_ERROR;
@@ -392,14 +392,14 @@ jvxDspBaseErrorType jvx_firfft_cf_nout_process(jvx_firfft* hdl, jvxData** inArg,
392392
jvxSize cntOut = 0;
393393
for (i = 0; i < nHdl->ram_cf_nout.multiInChannels.nChannelsIn; i++)
394394
{
395-
jvx_firfft_cf_nout_process_core(nHdl, nChannels, inArg[i], outArg, addOnOut, nHdl->ram_cf_nout.multiInChannels.in_bufs[i],
395+
jvx_firfft_cf_nout_process_core(nHdl, nChannels, inArg[i], outArg, addOnOut_nout, nHdl->ram_cf_nout.multiInChannels.in_bufs[i],
396396
ll1, ll2, nHdl->ram_cf_nout.multiInChannels.in_ffts[i], cntOut, cntOut + nChannels->stride);
397397
cntOut += nChannels->stride;
398398
}
399399
}
400400
else
401401
{
402-
jvx_firfft_cf_nout_process_core(nHdl, nChannels, inArg[0], outArg, addOnOut, nHdl->firfft.ram.in, ll1, ll2, nHdl->firfft.ram.corefft, 0, nChannels->N);
402+
jvx_firfft_cf_nout_process_core(nHdl, nChannels, inArg[0], outArg, addOnOut_nout, nHdl->firfft.ram.in, ll1, ll2, nHdl->firfft.ram.corefft, 0, nChannels->N);
403403
}
404404

405405
// Forward phase
@@ -410,6 +410,7 @@ jvxDspBaseErrorType jvx_firfft_cf_nout_process(jvx_firfft* hdl, jvxData** inArg,
410410
return JVX_DSP_ERROR_WRONG_STATE;
411411
}
412412

413+
// ==========================================================================================================================
413414
// ==========================================================================================================================
414415

415416
void
@@ -463,114 +464,144 @@ jvx_local_out_old_new(jvxData weightInit, jvxData weightInc, jvxData* ptrSpecInT
463464
}
464465
}
465466

466-
jvxDspBaseErrorType jvx_firfft_cf_nout_process_update_weights(jvx_firfft* hdl, jvxData* inArg, jvxData** outArg, jvxDataCplx** newWeights, jvxCBool addOnOut)
467+
jvxDspBaseErrorType jvx_firfft_cf_nout_process_update_weights_core(jvx_firfft_cf_nout_prv* nHdl, jvx_firfft_cf_nout_prmSync* nChannels,
468+
jvxData* inArg, jvxData** outArg, jvxDataCplx** newWeights, jvxCBool* addOnOut_nout, jvxData* fftin,
469+
jvxSize ll1, jvxSize ll2, jvxFFT* corefft, jvxSize outOffs, jvxSize outSz)
467470
{
468471
jvxSize i;
469472
jvxDspBaseErrorType resL = JVX_DSP_NO_ERROR;
470-
jvxSize ll1 = 0;
471-
jvxSize ll2 = 0;
472473
jvxData* ptrIn = NULL;
473474
jvxSize outphase = 0;
474475
jvxData* in = inArg;
475476

476477
jvxSize idxNew = 0;
477-
478-
if (hdl->prv)
478+
479+
ptrIn = fftin;
480+
ptrIn += nHdl->firfft.ram.phase;
481+
482+
for (i = 0; i < ll1; i++)
479483
{
480-
jvx_firfft_cf_nout_prv* nHdl = (jvx_firfft_cf_nout_prv*)hdl->prv;
481-
assert(nHdl->firfft.tp == JVX_FIRFFT_PRV_TYPE_CF_NOUT);
484+
*ptrIn++ = *in++;
485+
}
486+
ptrIn = nHdl->firfft.ram.in;
487+
for (i = 0; i < ll2; i++)
488+
{
489+
*ptrIn++ = *in++;
490+
}
482491

483-
jvx_firfft_cf_nout_prmSync* nChannels = hdl->sync.ext;
492+
jvx_execute_fft(corefft);
484493

485-
ll1 = JVX_MIN(nHdl->firfft.derived_cpy.szFftValue - nHdl->firfft.ram.phase, nHdl->firfft.init_cpy.bsize);
486-
ll2 = nHdl->firfft.init_cpy.bsize - ll1;
494+
// jvxDataCplx* spec_out_copy = nHdl->ram_cf.spec_ifft_in[0];
495+
assert(nChannels);
496+
497+
jvxSize iC = 0;
498+
for (iC = outOffs; iC < outSz; iC++)
499+
{
500+
jvxData* out = outArg[iC];
487501

488-
ptrIn = nHdl->firfft.ram.in;
489-
ptrIn += nHdl->firfft.ram.phase;
502+
jvxDataCplx* firW_new = newWeights[iC];
503+
jvxDataCplx* firW_old = nChannels->firWN[iC];
490504

491-
for (i = 0; i < ll1; i++)
492-
{
493-
*ptrIn++ = *in++;
494-
}
495-
ptrIn = nHdl->firfft.ram.in;
496-
for (i = 0; i < ll2; i++)
505+
outphase = (nHdl->firfft.ram.phase + nHdl->firfft.derived_cpy.szFftValue - nHdl->firfft.ram.outoffset) %
506+
nHdl->firfft.derived_cpy.szFftValue;
507+
508+
// Process "old" filtering
509+
switch (nHdl->firfft.init_cpy.type)
497510
{
498-
*ptrIn++ = *in++;
511+
case JVX_FIRFFT_SYMMETRIC_FIR:
512+
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
513+
{
514+
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_old[i].re;
515+
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].im * firW_old[i].re;
516+
}
517+
518+
// Modify read-out phase
519+
ll1 = JVX_MIN(nHdl->firfft.derived_cpy.szFftValue - outphase, nHdl->firfft.init_cpy.bsize);
520+
ll2 = nHdl->firfft.init_cpy.bsize - ll1;
521+
break;
522+
default:
523+
524+
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
525+
{
526+
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].re * firW_old[i].im + nHdl->firfft.ram.spec[i].im * firW_old[i].re;
527+
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_old[i].re - nHdl->firfft.ram.spec[i].im * firW_old[i].im;
528+
}
529+
break;
499530
}
500531

501-
jvx_execute_fft(nHdl->firfft.ram.corefft);
532+
jvx_execute_ifft(nHdl->firfft.ram.coreifft);
533+
jvx_local_out_old_new(1.0, -nHdl->ram_cf_nout.cf_inc, nHdl->firfft.ram.out, outphase, out, addOnOut_nout[iC], ll1, ll2, nHdl->firfft.ram.normFactor);
502534

503-
// jvxDataCplx* spec_out_copy = nHdl->ram_cf.spec_ifft_in[0];
504-
assert(nChannels);
505535

506-
jvxSize iC = 0;
507-
for (iC = 0; iC < nChannels->N; iC++)
536+
// Process "new" filtering
537+
switch (nHdl->firfft.init_cpy.type)
508538
{
509-
jvxData* out = outArg[iC];
539+
case JVX_FIRFFT_SYMMETRIC_FIR:
540+
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
541+
{
542+
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_new[i].re;
543+
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].im * firW_new[i].re;
544+
}
545+
break;
546+
default:
510547

511-
jvxDataCplx* firW_new = newWeights[iC];
512-
jvxDataCplx* firW_old = nChannels->firWN[iC];
548+
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
549+
{
550+
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].re * firW_new[i].im + nHdl->firfft.ram.spec[i].im * firW_new[i].re;
551+
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_new[i].re - nHdl->firfft.ram.spec[i].im * firW_new[i].im;
552+
}
553+
break;
554+
}
555+
jvx_execute_ifft(nHdl->firfft.ram.coreifft);
556+
jvx_local_out_old_new(0.0, nHdl->ram_cf_nout.cf_inc, nHdl->firfft.ram.out, outphase, out, true, ll1, ll2, nHdl->firfft.ram.normFactor);
513557

514-
outphase = (nHdl->firfft.ram.phase + nHdl->firfft.derived_cpy.szFftValue - nHdl->firfft.ram.outoffset) %
515-
nHdl->firfft.derived_cpy.szFftValue;
558+
// Take over the new weights
559+
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
560+
{
561+
firW_old[i].re = firW_new[i].re;
562+
firW_old[i].im = firW_new[i].im;
563+
}
564+
}
516565

517-
// Process "old" filtering
518-
switch (nHdl->firfft.init_cpy.type)
519-
{
520-
case JVX_FIRFFT_SYMMETRIC_FIR:
521-
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
522-
{
523-
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_old[i].re;
524-
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].im * firW_old[i].re;
525-
}
566+
return JVX_DSP_NO_ERROR;
567+
}
526568

527-
// Modify read-out phase
528-
ll1 = JVX_MIN(nHdl->firfft.derived_cpy.szFftValue - outphase, nHdl->firfft.init_cpy.bsize);
529-
ll2 = nHdl->firfft.init_cpy.bsize - ll1;
530-
break;
531-
default:
569+
jvxDspBaseErrorType jvx_firfft_cf_nin_nout_process_update_weights(jvx_firfft* hdl, jvxData** inArg, jvxData** outArg, jvxDataCplx** newWeights, jvxCBool* addOnOut_nout)
570+
{
571+
jvxSize i;
572+
jvxDspBaseErrorType resL = JVX_DSP_NO_ERROR;
573+
jvxSize ll1 = 0;
574+
jvxSize ll2 = 0;
532575

533-
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
534-
{
535-
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].re * firW_old[i].im + nHdl->firfft.ram.spec[i].im * firW_old[i].re;
536-
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_old[i].re - nHdl->firfft.ram.spec[i].im * firW_old[i].im;
537-
}
538-
break;
539-
}
576+
jvxDataCplx* firW = NULL;
577+
// jvxData* out_src = NULL;
540578

541-
jvx_execute_ifft(nHdl->firfft.ram.coreifft);
542-
jvx_local_out_old_new(1.0, -nHdl->ram_cf_nout.cf_inc, nHdl->firfft.ram.out, outphase, out, addOnOut, ll1, ll2, nHdl->firfft.ram.normFactor);
579+
if (hdl->prv)
580+
{
581+
jvx_firfft_cf_nout_prv* nHdl = (jvx_firfft_cf_nout_prv*)hdl->prv;
582+
assert(nHdl->firfft.tp == JVX_FIRFFT_PRV_TYPE_CF_NOUT);
543583

584+
jvx_firfft_cf_nout_prmSync* nChannels = hdl->sync.ext;
544585

545-
// Process "new" filtering
546-
switch (nHdl->firfft.init_cpy.type)
547-
{
548-
case JVX_FIRFFT_SYMMETRIC_FIR:
549-
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
550-
{
551-
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_new[i].re;
552-
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].im * firW_new[i].re;
553-
}
554-
break;
555-
default:
586+
ll1 = JVX_MIN(nHdl->firfft.derived_cpy.szFftValue - nHdl->firfft.ram.phase, nHdl->firfft.init_cpy.bsize);
587+
ll2 = nHdl->firfft.init_cpy.bsize - ll1;
556588

557-
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
558-
{
559-
nHdl->ram_cf_nout.spec_ifft_in[i].im = nHdl->firfft.ram.spec[i].re * firW_new[i].im + nHdl->firfft.ram.spec[i].im * firW_new[i].re;
560-
nHdl->ram_cf_nout.spec_ifft_in[i].re = nHdl->firfft.ram.spec[i].re * firW_new[i].re - nHdl->firfft.ram.spec[i].im * firW_new[i].im;
561-
}
562-
break;
563-
}
564-
jvx_execute_ifft(nHdl->firfft.ram.coreifft);
565-
jvx_local_out_old_new(0.0, nHdl->ram_cf_nout.cf_inc, nHdl->firfft.ram.out, outphase, out, true, ll1, ll2, nHdl->firfft.ram.normFactor);
566-
567-
// Take over the new weights
568-
for (i = 0; i < nHdl->firfft.derived_cpy.szFftValue / 2 + 1; i++)
589+
if (nHdl->ram_cf_nout.multiInChannels.nChannelsIn > 1)
590+
{
591+
jvxSize cntOut = 0;
592+
for (i = 0; i < nHdl->ram_cf_nout.multiInChannels.nChannelsIn; i++)
569593
{
570-
firW_old[i].re = firW_new[i].re;
571-
firW_old[i].im = firW_new[i].im;
594+
jvx_firfft_cf_nout_process_update_weights_core(nHdl, nChannels, inArg[i], outArg, newWeights, addOnOut_nout, nHdl->ram_cf_nout.multiInChannels.in_bufs[i],
595+
ll1, ll2, nHdl->ram_cf_nout.multiInChannels.in_ffts[i], cntOut, cntOut + nChannels->stride);
596+
cntOut += nChannels->stride;
572597
}
573598
}
599+
else
600+
{
601+
jvx_firfft_cf_nout_process_update_weights_core(nHdl, nChannels, inArg[0], outArg, newWeights, addOnOut_nout, nHdl->firfft.ram.in, ll1, ll2, nHdl->firfft.ram.corefft, 0, nChannels->N);
602+
}
603+
604+
// Forward phase
574605
nHdl->firfft.ram.phase = (nHdl->firfft.ram.phase + nHdl->firfft.init_cpy.bsize) % nHdl->firfft.derived_cpy.szFftValue;
575606

576607
return JVX_DSP_NO_ERROR;

0 commit comments

Comments
 (0)