New filter_ccma(): Curvature-Corrected Moving Average for 2D/3D Cartesian trajectories (Steinecker & Wuensche, 2023). Hanning and uniform kernels; padding boundary mode (#11).
New filter_na_excursion(): flags multi-frame tracking excursions using the criterion from Todd, Kain & de Bivort (2017) — a jump that eventually returns counts as an outlier; a sustained shift does not (#13).
New filter_gaussian(): Gaussian kernel smoother with NA-aware weight renormalisation (#1).
filter_lowpass_fft() / filter_highpass_fft(): fixed an asymmetric frequency-domain mask that halved the passband amplitude. Lowpass + highpass at the same cutoff now reconstruct the input exactly.
filter_na_speed() now flags single-frame outliers correctly (the outlier itself is blanked, not its neighbours), and a single NA in the input no longer contaminates adjacent rows (#14).
filter_aniframe() works on aniframes without an individual column. Identity columns now come from variables_what, spatial columns from variables_where (#16).
find_peaks() / find_troughs(): prominence now matches the documented topographic definition (saddle = max of left/right valley min). Previously could overestimate prominence and let peaks slip past min_prominence.