pub struct DcHighPassFilter { /* private fields */ }Expand description
DC offset removal and high-pass filtering with streaming state.
Implements the DC offset removal specification:
- Removes DC offset using exponential moving average (EMA)
- Applies cascaded Butterworth high-pass filtering (defaults to 4th order @ 80 Hz)
- Maintains filter state across chunks for streaming continuity
- Achieves <2ms latency target per 500ms chunk (8000 samples @ 16kHz)
§Performance
- Target: <2ms per 500ms chunk
- Expected: ~0.16ms (10x headroom)
- Optimization: Precomputed coefficients, preallocated buffers
§Example
use speech_prep::preprocessing::{DcHighPassFilter, PreprocessingConfig};
let mut filter = DcHighPassFilter::new(PreprocessingConfig::default())?;
let audio_stream = vec![vec![0.0; 8000], vec![0.1; 8000]];
// Process streaming chunks with state continuity
for chunk in audio_stream {
let clean = filter.process(&chunk, None)?;
// No discontinuities at boundaries!
}Implementations§
Source§impl DcHighPassFilter
impl DcHighPassFilter
Sourcepub fn new(config: PreprocessingConfig) -> Result<Self>
pub fn new(config: PreprocessingConfig) -> Result<Self>
Create a new DC offset removal and high-pass filter.
§Arguments
config- Configuration parameters (cutoff frequency, sample rate, EMA alpha)
§Errors
Returns Error::Configuration if configuration is invalid.
§Example
use speech_prep::preprocessing::{DcHighPassFilter, PreprocessingConfig};
let config = PreprocessingConfig {
highpass_cutoff_hz: 100.0, // More aggressive
..Default::default()
};
let filter = DcHighPassFilter::new(config)?;Sourcepub fn process(
&mut self,
samples: &[f32],
vad_context: Option<&VadContext>,
) -> Result<Vec<f32>>
pub fn process( &mut self, samples: &[f32], vad_context: Option<&VadContext>, ) -> Result<Vec<f32>>
Process audio samples with DC removal and high-pass filtering.
§Arguments
samples- Input audio samples (typically 500ms chunk = 8000 samples @ 16kHz)vad_context- Optional VAD state for intelligent DC bias updates
§Returns
Processed audio with DC removed and low frequencies attenuated.
§Performance
- Expected: ~0.16ms for 8000 samples (10x better than <2ms target)
- Complexity: O(n) where n =
samples.len()
§Example
use speech_prep::preprocessing::{DcHighPassFilter, PreprocessingConfig, VadContext};
let mut filter = DcHighPassFilter::new(PreprocessingConfig::default())?;
// Chunk 1
let chunk1 = vec![0.1, 0.2, -0.1, 0.15];
let output1 = filter.process(&chunk1, None)?;
// Chunk 2 (state preserved from chunk1 - no discontinuity!)
let chunk2 = vec![0.2, 0.1, 0.3, 0.0];
let output2 = filter.process(&chunk2, None)?;Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Reset filter state for new audio stream.
Clears filter history (x1, x2, y1, y2) and DC bias estimate. Use this when starting a new, independent audio stream.
§Example
use speech_prep::preprocessing::{DcHighPassFilter, PreprocessingConfig};
let mut filter = DcHighPassFilter::new(PreprocessingConfig::default())?;
let audio_stream_1 = vec![0.0; 8000];
let audio_stream_2 = vec![0.2; 8000];
// Process stream 1
filter.process(&audio_stream_1, None)?;
// Switch to unrelated stream 2 - reset state
filter.reset();
filter.process(&audio_stream_2, None)?;Sourcepub fn dc_bias(&self) -> f32
pub fn dc_bias(&self) -> f32
Get current DC bias estimate.
Useful for debugging or observability.
Sourcepub fn config(&self) -> &PreprocessingConfig
pub fn config(&self) -> &PreprocessingConfig
Get current configuration.
Trait Implementations§
Source§impl Clone for DcHighPassFilter
impl Clone for DcHighPassFilter
Source§fn clone(&self) -> DcHighPassFilter
fn clone(&self) -> DcHighPassFilter
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl Freeze for DcHighPassFilter
impl RefUnwindSafe for DcHighPassFilter
impl Send for DcHighPassFilter
impl Sync for DcHighPassFilter
impl Unpin for DcHighPassFilter
impl UnsafeUnpin for DcHighPassFilter
impl UnwindSafe for DcHighPassFilter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more