pub fn forward_cqt(
samples: &[f32],
sample_rate: f32,
f_min: f32,
bins_per_octave: usize,
n_bins: usize,
) -> Vec<f32>Expand description
Real forward constant-Q transform over actual audio samples — direct
constant-Q (one complex inner product per log-spaced bin; CPU is fine, this
is a cold-path ingest transform).
Geometric bin centres f_k = f_min · 2^(k/bins_per_octave), constant quality
factor Q = 1 / (2^(1/bins_per_octave) − 1). Each bin uses a Hann-windowed
kernel of length n_k = round(Q · sample_rate / f_k) (clamped to
[1, samples.len()]):
X_k = (1/n_k) · Σ_{j<n_k} samples[j] · hann(j, n_k) · exp(−2πi · f_k · j / sample_rate)
and the returned vector holds |X_k| for k ∈ [0, n_bins).