I have been building an adaptive noise-cancellation toolkit in Julia and wanted to share it + get eyes on a couple of numerics questions.
What it is: five adaptive-filter families (NLMS, Leaky NLMS, VSS-NLMS, VSS Leaky NLMS, scalar RLS) plus a block-RLS contender with adaptive forgetting and Cholesky-based covariance updates. Benchmarked against a set of synthetic audio scenarios generated in Python; Julia does the filtering.
The part I’m actually proud of: the NLMS-class inner loop is zero-allocation and SIMD-friendly. Preallocated process_audio! runs with no allocations in the hot path:
I had benchmarked against synthetic audio scenarios (generated in Python and will prolly shift the generation to julia also pardon me for that, filtered in Julia). Full results, mathematical derivations, and API reference are in the docs:
- Results & interpretation: docs/RESULTS.md
- Derivations: docs/ALGORITHMS.md
- Architecture (Python/Julia boundary, memory model): docs/ARCHITECTURE.md
Repo: [TheMaskedSignal/NLMSFiltering: Adaptive noise cancellation filters in Julia with Python-generated benchmarks - Codeberg.org]
Feedback especially welcome on the RLS conditioning question above, and on the NLMS-vs-RLS tradeoff on continuous path drift (the one scenario where leaky NLMS beats Block RLS). And if y’all liked it do drop a follow, Highly Appreciated!!
Have a Great Day
-JB