Skip to main content

Resampler

Struct Resampler 

Source
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>

Source

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.

Source

pub fn input_rate(&self) -> usize

Source

pub fn output_rate(&self) -> usize

Source

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.

Source

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.

Source

pub fn resample(&mut self, input: &[Sample]) -> PcmBuf

Convenience wrapper that allocates a Vec and calls resample_into.

Source

pub fn reset(&mut self)

Auto Trait Implementations§

§

impl<'a> !UnwindSafe for Resampler<'a>

§

impl<'a> Freeze for Resampler<'a>

§

impl<'a> RefUnwindSafe for Resampler<'a>

§

impl<'a> Send for Resampler<'a>

§

impl<'a> Sync for Resampler<'a>

§

impl<'a> Unpin for Resampler<'a>

§

impl<'a> UnsafeUnpin for Resampler<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.