use cute_dsp::filters::{Biquad, BiquadDesign, FilterType, StereoBiquad};
fn main() {
println!("Filter Example");
println!("==============");
basic_filter_example();
filter_sweep_example();
stereo_filter_example();
fir_filter_example();
}
fn basic_filter_example() {
println!("\nBasic Filter Example:");
let mut filter = Biquad::<f32>::new(true);
const SAMPLE_RATE: f32 = 44100.0;
const BUFFER_SIZE: usize = 100;
filter.lowpass(1000.0 / SAMPLE_RATE, 0.7, BiquadDesign::Cookbook);
let mut audio_buffer = vec![0.0; BUFFER_SIZE];
audio_buffer[0] = 1.0;
filter.process_buffer(&mut audio_buffer);
println!("Lowpass filter impulse response (first 10 samples):");
for i in 0..10 {
println!("Sample {}: {:.6}", i, audio_buffer[i]);
}
}
fn filter_sweep_example() {
println!("\nFilter Sweep Example:");
let mut lowpass = Biquad::<f32>::new(true);
let mut highpass = Biquad::<f32>::new(true);
let mut bandpass = Biquad::<f32>::new(true);
let mut notch = Biquad::<f32>::new(true);
let mut peak = Biquad::<f32>::new(true);
lowpass.lowpass(0.1, 0.7, BiquadDesign::Cookbook);
highpass.highpass(0.1, 0.7, BiquadDesign::Cookbook);
bandpass.bandpass(0.1, 1.0); notch.notch(0.1, 1.0); peak.peak(0.1, 1.0, 6.0);
let mut input = vec![0.0; 100];
for i in 0..100 {
input[i] = (i as f32 * 0.1).sin(); }
let mut lowpass_output = input.clone();
let mut highpass_output = input.clone();
let mut bandpass_output = input.clone();
let mut notch_output = input.clone();
let mut peak_output = input.clone();
lowpass.process_buffer(&mut lowpass_output);
highpass.process_buffer(&mut highpass_output);
bandpass.process_buffer(&mut bandpass_output);
notch.process_buffer(&mut notch_output);
peak.process_buffer(&mut peak_output);
println!("Filter comparison (first 5 samples):");
for i in 0..5 {
println!("Sample {}: Input={:.4}, LP={:.4}, HP={:.4}, BP={:.4}, Notch={:.4}, Peak={:.4}",
i, input[i], lowpass_output[i], highpass_output[i],
bandpass_output[i], notch_output[i], peak_output[i]);
}
}
fn stereo_filter_example() {
println!("\nStereo Filter Example:");
let mut stereo_filter = StereoBiquad::<f32>::new(true);
stereo_filter.lowpass(0.2, 0.7, BiquadDesign::Cookbook);
let mut left = vec![0.0; 10];
let mut right = vec![0.0; 10];
left[0] = 1.0;
right[5] = 0.8;
stereo_filter.process_buffer(&mut left, &mut right);
println!("Stereo filter output:");
println!(" Left Right");
for i in 0..10 {
println!("{}: {:.4} {:.4}", i, left[i], right[i]);
}
}
fn fir_filter_example() {
use cute_dsp::filters::FIR;
println!("\nFIR/IR Filter Example:");
let kernel = vec![1.0/3.0; 3];
let mut fir = FIR::new(kernel.clone());
let mut buffer = vec![0.0; 10];
buffer[0] = 1.0; fir.process_buffer(&mut buffer);
println!("Moving average FIR impulse response (first 10 samples):");
for i in 0..10 {
println!("Sample {}: {:.6}", i, buffer[i]);
}
let kernel = vec![0.5, 0.3, 0.2];
let mut fir = FIR::new(kernel.clone());
let mut buffer = vec![0.0; 10];
buffer[0] = 1.0;
fir.process_buffer(&mut buffer);
println!("\nCustom FIR impulse response (first 10 samples):");
for i in 0..10 {
println!("Sample {}: {:.6}", i, buffer[i]);
}
}