Skip to content

Commit f315194

Browse files
committed
BandPassWithRingingDetection: Reorganize the code
1 parent 12106f7 commit f315194

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

Packages/MIES/MIES_MiesUtilities_Algorithm.ipf

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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, $""]
673674
End

0 commit comments

Comments
 (0)