@@ -610,14 +610,16 @@ End
610610/// 2. WaveStats reports V_numNaNs = 0 and V_numInfs = 0.
611611/// 3. SEM(filtered) ≤ SEM(original).
612612///
613- /// @retval curOrder filter order that finally succeeded (0 if every order failed)
613+ /// @retval realOrder filter order that finally succeeded (NaN if every order failed)
614614/// @retval filtered filtered data
615- Function [variable curOrder , WAVE filtered] BandPassWithRingingDetection ( WAVE src, variable fHigh, variable fLow, variable maxOrder)
615+ Function [variable realOrder , WAVE filtered] BandPassWithRingingDetection ( WAVE src, variable fHigh, variable fLow, variable maxOrder)
616616
617- variable err, samp, semOrig, offset
617+ variable err, samp, semOrig, offset, i
618+ string msg
619+
620+ ASSERT ( IsInteger ( maxOrder) && maxOrder > 0 && isEven ( maxOrder) , "maxOrder must be a positive and even integer" )
618621
619- ASSERT ( maxOrder > 0, "maxOrder must be positive" )
620- // Igor band‑pass expects fLow > fHigh
622+ // Igor band-pass expects fLow > fHigh
621623 [ fHigh, fLow] = MinMax ( fLow, fHigh)
622624
623625 // Sampling rate (Hz) – assumes X scaling is in milliseconds
@@ -627,47 +629,46 @@ Function [variable curOrder, WAVE filtered] BandPassWithRingingDetection(WAVE sr
627629 WaveStats / Q src
628630 semOrig = V_sem
629631 offset = v_avg
632+ ASSERT ( V_numNaNs == 0 && V_numInfs == 0, "Expected only finite value in input data" )
630633
631634 // Prepare destination wave
632- duplicate / FREE src, filtered
635+ Duplicate / FREE src, filtered
633636
634- curOrder = maxOrder
635- do
636- // -------- copy fresh data into filtered ------------------------------
637- filtered = src - offset
637+ for ( i = maxOrder; i > 0; i -= 2 )
638+ Multithread filtered = src - offset
638639
639- // -------- attempt current order --------------------------------------
640- FilterIIR / LO= ( fLow / samp) / HI= ( fHigh / samp) / DIM= ( ROWS) / ORD= ( curOrder) filtered
641- err = GetRTError ( 1 )
640+ FilterIIR / LO= ( fLow / samp) / HI= ( fHigh / samp) / DIM= ( ROWS) / ORD= ( i ) filtered; err = GetRTError ( 1 )
642641 if ( err)
643- Print "FilterIIR failed (order=" + num2str ( curOrder) + "): " + GetErrMessage ( err)
644- curOrder -= 1
645642 continue
646643 endif
647644
648- // -------- WaveStats: NaN/Inf + SEM in one call ------------------------
649645 WaveStats / Q filtered
650646 if ( V_numNaNs > 0 || V_numInfs > 0 )
651- curOrder -= 1
652- continue // bad numerical output → lower order
647+ sprintf msg, "V_numNaNs: %g, V_numInfs: %g" , V_numNaNs, V_numInfs
648+ DEBUGPRINT ( msg)
649+
650+ // bad numerical output → lower order
651+ continue
653652 endif
654653
655- if ( V_sem > semOrig) // noisier than original → ringing
656- curOrder -= 1
654+ if ( V_sem > semOrig)
655+ sprintf msg, "V_sem: %g,semOrig: %g" , V_sem, semOrig
656+ DEBUGPRINT ( msg)
657+
658+ // noisier than original → ringing
657659 continue
658660 endif
659661
660- // -------- success -----------------------------------------------------
662+ Multithread filtered += offset
661663
662- break
663- while ( curOrder > 0 )
664+ sprintf msg , "maxOrder: %g, realOrder: %g" , maxOrder , i
665+ DEBUGPRINT ( msg )
664666
665- if ( curOrder <= 0 )
666- Print "bandpass_with_RingingDetection(): all orders down to 1 produced NaNs/Infs or increased SEM."
667- endif
667+ return [ i , filtered]
668+ endfor
668669
669- // add offset back to filtered wave
670- filtered += offset
670+ sprintf msg , "maxOrder: %g, realOrder: NaN" , maxOrder
671+ DEBUGPRINT ( msg )
671672
672- return [ curOrder , filtered ]
673+ return [ NaN , $ "" ]
673674End
0 commit comments