Found by reading the audio-thread code, not by profiling - no profiler is
set up in this project yet. All four are algorithmic or arithmetic wins,
none change the DSP result; the existing tests still pass.
- oversampler: max_true_peak recomputed its circular-history tap index
(including a % TAPS_PER_PHASE) inside the phase x channel loop, though
the index depends only on pos/k - 8x redundant. Hoisted to a per-sample
precomputed index array. This runs unconditionally every sample (it
feeds the limiter's true-peak detector, not gated by metering), so it
was the highest-value fix.
- limiter: the sliding-window max rescanned the entire look-ahead ring
(~73 samples at 48kHz/1.5ms) every sample - O(window) per sample.
Replaced with an O(1)-amortized monotonic-deque sliding max, backed by
preallocated ring arrays and RT-safe. Covered by a new test against a
naive brute-force reference. Also precomputed the constant true-peak
margin gain in prepare() instead of a powf every sample.
- compressor: replaced per-sample log10/powf(10, x/20) with the
equivalent ln/exp forms, mirroring nih-plug's own gain_to_db_fast /
db_to_gain_fast. Called 4x/sample (3 bands + 'All').
- both: replaced % capacity ring-index math (a real integer division,
since capacity is not a power of two) with a conditional-subtract
wrap_add helper. Left the oversampler's % TAPS_PER_PHASE alone - that
divisor is a compile-time constant LLVM already turns into a multiply.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LU1NRL7fAaZTtFMTTPn2b1
Upgrades the brickwall limiter from sample-peak to true-peak (inter-sample).
- src/dsp/oversampler.rs: 4x polyphase windowed-sinc (4 phases x 12 taps, Blackman,
each phase normalized to unity DC). Detection-only: max_true_peak() returns the
inter-sample max magnitude and discards the upsampled samples; the audio path is
untouched. Built in prepare(), no realtime allocation. Cost ~ one base-rate FIR
per channel; its small group delay is absorbed by the limiter look-ahead, so no
added reported latency.
- src/dsp/limiter.rs: detector peak = max(sample_peak, oversampler.max_true_peak());
targets a 0.3 dB margin under the ceiling to cover the 4x detection residual.
- 16 unit tests (2 new: detects ~3 dB fs/4 inter-sample overshoot; preserves DC
amplitude). README/docs updated: Stage 4 complete.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>