Skip to main content

ringkernel_audio_fft/
lib.rs

1//! # RingKernel Audio FFT
2//!
3//! GPU-accelerated audio FFT processing with direct/ambience signal separation
4//! using the RingKernel persistent actor model.
5//!
6//! ## Architecture
7//!
8//! This crate implements a novel approach to audio processing where each FFT frequency
9//! bin is represented as an independent GPU actor. These actors communicate with their
10//! neighbors via K2K (kernel-to-kernel) messaging to perform coherence analysis and
11//! separate direct sound from room ambience.
12//!
13//! ```text
14//! Audio Input -> FFT -> [Bin Actors with K2K] -> Separation -> Mixer -> IFFT -> Output
15//!                            |   |   |
16//!                          neighbor links
17//! ```
18//!
19//! ## Signal Separation Algorithm
20//!
21//! The separation is based on inter-bin coherence analysis:
22//! - **Direct signal**: High phase coherence between neighboring bins (transient, localized)
23//! - **Ambience**: Low phase coherence, diffuse energy distribution
24//!
25//! Each bin actor:
26//! 1. Receives its FFT data (magnitude + phase)
27//! 2. Exchanges data with left/right neighbors via K2K
28//! 3. Computes coherence metrics
29//! 4. Separates into direct and ambient components
30//!
31//! ## Example
32//!
33//! ```ignore
34//! use ringkernel_audio_fft::prelude::*;
35//!
36//! #[tokio::main]
37//! async fn main() -> Result<()> {
38//!     // Create the audio FFT processor
39//!     let processor = AudioFftProcessor::builder()
40//!         .fft_size(2048)
41//!         .hop_size(512)
42//!         .sample_rate(44100)
43//!         .build()
44//!         .await?;
45//!
46//!     // Load audio file
47//!     let input = AudioInput::from_file("input.wav")?;
48//!
49//!     // Process with dry/wet control
50//!     let output = processor
51//!         .process(input)
52//!         .dry_wet(0.5)       // 50% wet (ambience)
53//!         .gain_boost(1.2)    // 20% gain boost
54//!         .run()
55//!         .await?;
56//!
57//!     // Write output
58//!     output.direct.write_to_file("direct.wav")?;
59//!     output.ambience.write_to_file("ambience.wav")?;
60//!
61//!     Ok(())
62//! }
63//! ```
64
65#![warn(missing_docs)]
66#![warn(clippy::all)]
67
68pub mod audio_input;
69pub mod bin_actor;
70pub mod error;
71pub mod fft;
72pub mod messages;
73pub mod mixer;
74pub mod processor;
75pub mod separation;
76
77/// Prelude module for convenient imports.
78pub mod prelude {
79    pub use crate::audio_input::{AudioInput, AudioOutput, AudioSource, DeviceStream, FileSource};
80    pub use crate::bin_actor::{BinActor, BinActorHandle, BinNetwork};
81    pub use crate::error::{AudioFftError, Result};
82    pub use crate::fft::{FftProcessor, IfftProcessor, WindowFunction};
83    pub use crate::messages::*;
84    pub use crate::mixer::{DryWetMixer, MixerConfig};
85    pub use crate::processor::{AudioFftProcessor, AudioFftProcessorBuilder, ProcessingOutput};
86    pub use crate::separation::{CoherenceAnalyzer, SeparationConfig, SignalSeparator};
87}
88
89// Re-exports
90pub use error::{AudioFftError, Result};
91pub use processor::{AudioFftProcessor, AudioFftProcessorBuilder, ProcessingOutput};