pub struct Resampler<'a> { /* private fields */ }Expand description
Polyphase resampler.
The filter runs entirely in fixed point (Q15 i16 coefficients, i16
history, integer accumulator, integer phase accumulator). This matters on
targets without an FPU (e.g. ESP32-S3 / Xtensa LX7): a soft-float f32
FIR is ~20× slower than the equivalent integer one there. Coefficients are
still designed in f64 at construction time and quantised once.
The coefficient buffer is Q15 i16 (6144 entries, 12 KB) supplied by
the caller so this type stays no_std/allocation-free.
Implementations§
Source§impl<'a> Resampler<'a>
impl<'a> Resampler<'a>
Sourcepub fn new(
input_rate: usize,
output_rate: usize,
coeffs: &'a mut [i16],
) -> Result<Self, CodecError>
pub fn new( input_rate: usize, output_rate: usize, coeffs: &'a mut [i16], ) -> Result<Self, CodecError>
Create a new Resampler, writing Q15 polyphase filter coefficients into
the caller-provided buffer.
coeffs.len() must be at least COEFFS_LEN (= 6144 i16, 12 KB).
The buffer is held by the resampler for its entire lifetime; it is
written once here and read on every subsequent resample_into call.
pub fn input_rate(&self) -> usize
pub fn output_rate(&self) -> usize
Sourcepub fn resample_into(
&mut self,
input: &[Sample],
out: &mut [Sample],
) -> Result<usize, CodecError>
pub fn resample_into( &mut self, input: &[Sample], out: &mut [Sample], ) -> Result<usize, CodecError>
Resample input into the caller-provided out buffer.
Returns the number of samples written. Returns
CodecError::BufferTooSmall if out cannot hold the result; use
Self::max_output_samples to size it.
Sourcepub fn max_output_samples(&self, n_input: usize) -> usize
pub fn max_output_samples(&self, n_input: usize) -> usize
Upper bound on the number of samples resample_into will produce for
an input of n_input samples.
Sourcepub fn resample(&mut self, input: &[Sample]) -> PcmBuf
pub fn resample(&mut self, input: &[Sample]) -> PcmBuf
Convenience wrapper that allocates a Vec and calls resample_into.