@@ -207,7 +207,7 @@ jvx_firfft_cf_nout_terminate(jvx_firfft* hdl)
207207}
208208
209209jvxDspBaseErrorType 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
415416void
@@ -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