Skip to main content

Decimator

Struct Decimator 

Source
pub struct Decimator<P>(pub P);
Expand description

Adapt a scalar optional-output stage to chunk input mode.

Synchronizes to the inner tick by discarding samples after tick. Panics if tick does not match N.

This is the chunked counterpart to Interpolator.

The inner processor must tick exactly once per input chunk. Decimator processes the whole chunk and panics if the contract is violated. Use TryDecimator when violating that contract should be reported instead of panicking.

Unlike crate::Rate, this adapter still runs the inner processor on every sample in the chunk before choosing the output. That is the right semantics for recursive stages such as CIC decimators.

Conceptually, this is the chunk-level companion to crate::Downsample: Downsample gates a scalar stream into Option<Y>, while Decimator turns that exact-one-tick-per-chunk protocol into [X; N] -> Y. Unlike crate::ChunkIn, this still executes the inner stage on every sample in the chunk and is therefore the right adapter for recursive decimators.

§Examples

use dsp_process::{Decimator, FnSplitProcess, SplitProcess};

let proc = Decimator(FnSplitProcess(|state: &mut bool, x: i32| {
    let y = if *state { Some(x) } else { None };
    *state = !*state;
    y
}));

let mut tick = false;
assert_eq!(proc.process(&mut tick, [1, 2]), 2);

Tuple Fields§

§0: P

Trait Implementations§

Source§

impl<P: Clone> Clone for Decimator<P>

Source§

fn clone(&self) -> Decimator<P>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<P: Debug> Debug for Decimator<P>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<P: Default> Default for Decimator<P>

Source§

fn default() -> Decimator<P>

Returns the “default value” for a type. Read more
Source§

impl<X: Copy, C, S> SplitInplace<X, S> for Decimator<C>
where Self: SplitProcess<X, X, S>,

Source§

fn inplace(&self, state: &mut S, xy: &mut [X])

Source§

impl<X: Copy, Y, C: SplitProcess<X, Option<Y>, S>, S, const N: usize> SplitProcess<[X; N], Y, S> for Decimator<C>

Source§

fn process(&self, state: &mut S, x: [X; N]) -> Y

Process an input into an output Read more
Source§

fn block(&self, state: &mut S, x: &[X], y: &mut [Y])

Process a block of inputs Read more

Auto Trait Implementations§

§

impl<P> Freeze for Decimator<P>
where P: Freeze,

§

impl<P> RefUnwindSafe for Decimator<P>
where P: RefUnwindSafe,

§

impl<P> Send for Decimator<P>
where P: Send,

§

impl<P> Sync for Decimator<P>
where P: Sync,

§

impl<P> Unpin for Decimator<P>
where P: Unpin,

§

impl<P> UnsafeUnpin for Decimator<P>
where P: UnsafeUnpin,

§

impl<P> UnwindSafe for Decimator<P>
where P: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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<'a, X, S, T, const L: usize> SplitViewInplace<ViewMut<'a, X, FrameMajor, L>, S> for T
where X: Copy, T: SplitInplace<X, S>, S: ?Sized,

Source§

fn inplace_view(&self, state: &mut S, xy: ViewMut<'a, X, FrameMajor, L>)

Process one typed view in place.
Source§

impl<'a, 'b, X, Y, S, T, const L: usize> SplitViewProcess<View<'a, X, FrameMajor, L>, ViewMut<'b, Y, FrameMajor, L>, S> for T
where X: Copy, T: SplitProcess<X, Y, S>, S: ?Sized,

Source§

fn process_view( &self, state: &mut S, x: View<'a, X, FrameMajor, L>, y: ViewMut<'b, Y, FrameMajor, L>, )

Process one typed input view into one typed output view.
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.