Expand description
§AudioSamples
A high-performance audio processing library for Rust that provides type-safe sample format conversions, statistical analysis, and various audio processing operations.
§Overview
§Installation
Add this to your Cargo.toml:
[dependencies]
audio_samples = "0.10.0"or more easily with:
cargo add audio_samplesFor specific features, enable only what you need:
[dependencies]
audio_samples = { version = "*", features = ["fft", "plotting"] }Or enable everything:
[dependencies]
audio_samples = { version = "*", features = ["full"] }§Features
The library uses a modular feature system to keep dependencies minimal:
statistics: statistics utilities (peak, RMS, variance, etc.)processing: processing operations (normalize, scale, clip, etc.)editing: time-domain editing operations (trim, pad, reverse, etc.)channels: channel operations (mono/stereo conversion)fft: FFT-backed transforms (adds FFT dependencies)plotting: plotting utilities (adds signal plotting dependencies)resampling: resampling utilities (usingrubatocrate)serialization: serialization utilities (usingserdecrate)
See Cargo.toml for the complete feature list and feature groups.
§Error Handling
The library uses a hierarchical error system designed for precise error handling:
use audio_samples::{AudioSampleError, AudioSampleResult, ParameterError};
let audio_result: AudioSampleResult<()> = Err(AudioSampleError::Parameter(
ParameterError::invalid_value("window_size", "must be > 0"),
));
match audio_result {
Ok(()) => {}
Err(AudioSampleError::Conversion(err)) => eprintln!("Conversion failed: {err}"),
Err(AudioSampleError::Parameter(err)) => eprintln!("Invalid parameter: {err}"),
Err(other_err) => eprintln!("Other error: {other_err}"),
}§Full Examples
Examples live in the repository (see examples/) and in the crate-level docs on
https://docs.rs/audio_samples.
§Quick Start
§Creating Audio Data
use audio_samples::AudioSamples;
use ndarray::array;
// Create mono audio
let data = array![0.1f32, 0.5, -0.3, 0.8, -0.2];
let audio = AudioSamples::new_mono(data, 44100);
// Create stereo audio
let stereo_data = array![
[0.1f32, 0.5, -0.3], // Left channel
[0.8f32, -0.2, 0.4] // Right channel
];
let stereo_audio = AudioSamples::new_multi_channel(stereo_data, 44100);§Basic Statistics
use audio_samples::{AudioStatistics, sine_wave};
use std::time::Duration;
// frequency, sample rate, duration, amplitude
// <f32, f32> indicates the sine wave will be
// generated using single float precision and
// the resulting samples will also be f32
let audio = sine_wave::<f32, f32>(440.0, Duration::from_secs_f32(1.0), 44100, 1.0);
// Simple statistics
let peak = audio.peak();
let min = audio.min_sample();
let max = audio.max_sample();
let mean = audio.mean();
// More complex statistics (return Result)
let rms = audio.rms().unwrap();
let variance = audio.variance().unwrap();
let zero_crossings = audio.zero_crossings();§Processing Operations
use audio_samples::{AudioProcessing, NormalizationMethod};
use ndarray::array;
let data = array![0.1f32, 0.5, -0.3, 0.8, -0.2];
let mut audio = audio_samples::AudioSamples::new_mono(data, 44100);
// Basic processing (in-place)
audio
.normalize(-1.0, 1.0, NormalizationMethod::Peak)
.unwrap();
audio.scale(0.5); // Reduce volume by half
audio.remove_dc_offset();§Type Conversions
use audio_samples::AudioSamples;
use ndarray::array;
// Convert between sample types
let audio_f32 = AudioSamples::new_mono(array![1.0f32, 2.0, 3.0], 44100);
let audio_i16 = audio_f32.as_type::<i16>().unwrap();
let audio_f64 = audio_f32.as_type::<f64>().unwrap();§Iterating Over Audio Data
use audio_samples::AudioSampleIterators;
use ndarray::array;
let audio = audio_samples::AudioSamples::new_mono(array![1.0f32, 2.0, 3.0, 4.0], 44100);
// Iterate by frames (one sample from each channel)
for frame in audio.frames() {
println!("Frame: {:?}", frame);
}
// Iterate by channels
for channel in audio.channels() {
println!("Channel: {:?}", channel);
}
// Windowed iteration for analysis
for window in audio.windows(1024, 512) {
// Process 1024-sample windows with 50% overlap
let window_rms = window.rms().unwrap();
println!("Window RMS: {:.3}", window_rms);
}§Builder Pattern for Complex Processing
For more complex operations, use the fluent builder API:
use audio_samples::{AudioSamples, NormalizationMethod};
use ndarray::array;
let data = array![0.1f32, 0.5, -0.3, 0.8, -0.2];
let mut audio = AudioSamples::new_mono(data, 44100);
// Chain multiple operations
audio.processing()
.normalize(-1.0, 1.0, NormalizationMethod::Peak)
.scale(0.8)
.remove_dc_offset()
.apply()
.unwrap();§Core Type System
§Supported Sample Types
i16- 16-bit signed integerI24- 24-bit signed integer (fromi24crate)i32- 32-bit signed integerf32- 32-bit floating pointf64- 64-bit floating point
§Type System Traits
The library provides a rich trait system for working with different audio sample types:
§AudioSample Trait
Core trait that all audio sample types implement. Provides common operations and constraints needed for audio processing.
§Conversion Traits
-
ConvertTo<T>- Type-safe conversions between audio sample types with proper scalingi16 -> f32: Normalized to -1.0 to 1.0 rangef32 -> i16: Scaled and clamped to integer range- Handles bit depth differences automatically
-
CastFrom<T>/CastInto<T>- Direct type casting without audio-specific scaling- For computational operations where you need the raw numeric value
- Example:
i16sample1334casts tof32as1334.0(not normalized) - Use when you need to work with samples as regular numbers, not audio values
§Utility Functions
The utils module provides convenient functions for common audio tasks:
§Signal Generation (utils::generation)
- Test Signals:
generate_sine(),generate_white_noise(),generate_chirp() - Complex Signals:
generate_multi_tone()for multiple frequencies - Calibration: Known reference signals for testing
use audio_samples::{comparison, sine_wave};
use std::time::Duration;
let a = sine_wave::<f32, f32>(440.0, Duration::from_secs(1), 44100, 1.0);
let b = sine_wave::<f32, f32>(440.0, Duration::from_secs(1), 44100, 1.0);
let corr: f32 = comparison::correlation::<f32, f32>(&a, &b).unwrap();
assert!(corr > 0.99);§Documentation
Full API documentation is available at docs.rs/audio_samples.
§License
MIT License
§Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Re-exports§
pub use crate::iterators::AudioSampleIterators;pub use crate::iterators::ChannelIterator;pub use crate::iterators::ChannelIteratorMut;pub use crate::iterators::FrameIterator;pub use crate::iterators::FrameIteratorMut;pub use crate::iterators::FrameMut;pub use crate::iterators::PaddingMode;pub use crate::iterators::WindowIterator;pub use crate::iterators::WindowIteratorMut;pub use crate::iterators::WindowMut;pub use crate::operations::AudioStatistics;pub use crate::operations::AudioProcessing;pub use crate::operations::NormalizationMethod;pub use crate::operations::AudioEditing;pub use crate::operations::AudioChannelOps;pub use crate::traits::AudioSample;pub use crate::traits::AudioTypeConversion;pub use crate::traits::CastFrom;pub use crate::traits::CastInto;pub use crate::traits::Castable;pub use crate::traits::ConvertTo;pub use crate::utils::audio_math::amplitude_to_db;pub use crate::utils::audio_math::db_to_amplitude;pub use crate::utils::audio_math::fft_frequencies;pub use crate::utils::audio_math::frames_to_time;pub use crate::utils::audio_math::hz_to_mel;pub use crate::utils::audio_math::hz_to_midi;pub use crate::utils::audio_math::mel_scale;pub use crate::utils::audio_math::mel_to_hz;pub use crate::utils::audio_math::midi_to_hz;pub use crate::utils::audio_math::midi_to_note;pub use crate::utils::audio_math::note_to_midi;pub use crate::utils::audio_math::power_to_db;pub use crate::utils::audio_math::time_to_frames;pub use crate::utils::comparison;pub use crate::utils::detection;pub use crate::utils::generation::ToneComponent;pub use crate::utils::generation::chirp;pub use crate::utils::generation::compound_tone;pub use crate::utils::generation::cosine_wave;pub use crate::utils::generation::impulse;pub use crate::utils::generation::multichannel_compound_tone;pub use crate::utils::generation::sawtooth_wave;pub use crate::utils::generation::silence;pub use crate::utils::generation::sine_wave;pub use crate::utils::generation::square_wave;pub use crate::utils::generation::stereo_chirp;pub use crate::utils::generation::stereo_silence;pub use crate::utils::generation::stereo_sine_wave;pub use crate::utils::generation::triangle_wave;pub use crate::utils::samples_to_seconds;pub use crate::utils::seconds_to_samples;pub use crate::utils::generation::brown_noise;pub use crate::utils::generation::pink_noise;pub use crate::utils::generation::white_noise;
Modules§
- conversions
- Audio Sample Type Conversions
- iterators
- Iterators and iterator-like helpers over audio samples.
- operations
- Audio processing operations and transformations.
- simd_
conversions - SIMD-optimized audio sample conversions.
- traits
- Core traits for audio processing.
- utils
- Utility functions and helpers for audio processing.
Macros§
- sample_
rate - Creates a
NonZeroU32sample rate from a compile-time constant.
Structs§
- Audio
Samples - Represents homogeneous audio samples with associated metadata.
- I24
- A signed 24-bit integer type.
- Stereo
Audio Samples - A wrapper for AudioSamples that guarantees exactly 2 channels (stereo).
Enums§
- Audio
Bytes - Borrowed-or-owned byte view returned by
AudioData::bytes. - Audio
Data - Storage container for audio sample data.
- Audio
Sample Error - Main error type for audio sample operations.
- Channel
Layout - Describes how multi-channel audio data is organized in memory
- Conversion
Error - Errors that occur during type conversion and casting operations.
- Feature
Error - Errors related to missing or disabled cargo features.
- Layout
Error - Errors related to memory layout, array structure, and data organization.
- Parameter
Error - Errors related to invalid parameters, ranges, or configuration values.
- Processing
Error - Errors that occur during audio processing operations.
- Sample
Type - Audio sample data types
Constants§
- LEFT
- Left channel index.
- RIGHT
- Right channel index.
- SUPPORTED_
DTYPES - Array of supported audio sample data types as string identifiers
Traits§
- Packed
Struct - A trait for types that can be read from and written to packed byte representations.
- Real
Float - Marker trait for real floating-point types (f32, f64)
Functions§
- to_
precision - Casts a numeric value into the target floating-point type
F.
Type Aliases§
- Audio
Sample Result - Convenience type alias for results that may contain AudioSampleError
- NonZero
U32 - A
u32that is known not to equal zero. - NonZero
Usize - A
usizethat is known not to equal zero.