|
| 1 | +use dasp::{interpolate::sinc::Sinc, ring_buffer, signal, Signal}; |
| 2 | +use hound::{WavSpec, WavWriter}; |
| 3 | + |
| 4 | +fn main() { |
| 5 | + // Scaled version of issue #174: |
| 6 | + // Original: 900 Hz @ 2000 Hz → 1500 Hz (Nyquist 750 Hz, aliases to 600 Hz) |
| 7 | + // Scaled 8x: 7200 Hz @ 16000 Hz → 12000 Hz (Nyquist 6000 Hz, aliases to 4800 Hz) |
| 8 | + let my_signal = signal::rate(16000.0).const_hz(7200.0).sine(); |
| 9 | + |
| 10 | + let spec = WavSpec { |
| 11 | + channels: 1, |
| 12 | + sample_rate: 12000, |
| 13 | + bits_per_sample: 16, |
| 14 | + sample_format: hound::SampleFormat::Int, |
| 15 | + }; |
| 16 | + |
| 17 | + let ring_buffer = ring_buffer::Fixed::from([0.0; 100]); |
| 18 | + let sinc = Sinc::new(ring_buffer); |
| 19 | + let mut my_signal = my_signal.from_hz_to_hz(sinc, 16000.0, 12000.0); |
| 20 | + |
| 21 | + let buffer_size = 100; |
| 22 | + let source_hz = 16000.0; |
| 23 | + let target_hz = 12000.0; |
| 24 | + let samples_to_skip = (buffer_size as f64 / (source_hz / target_hz)).ceil() as usize; |
| 25 | + |
| 26 | + for _ in 0..samples_to_skip { |
| 27 | + my_signal.next(); |
| 28 | + } |
| 29 | + |
| 30 | + // Check first 1000 samples to verify signal |
| 31 | + let check_samples: Vec<f64> = (&mut my_signal).take(1000).collect(); |
| 32 | + let check_rms = (check_samples.iter().map(|s| s * s).sum::<f64>() / check_samples.len() as f64).sqrt(); |
| 33 | + eprintln!("RMS of resampled signal: {:.4}", check_rms); |
| 34 | + eprintln!("Max amplitude: {:.4}", check_samples.iter().map(|s| s.abs()).fold(0.0f64, f64::max)); |
| 35 | + |
| 36 | + let mut writer = WavWriter::create("my_output.wav", spec).unwrap(); |
| 37 | + |
| 38 | + // Write the check samples first |
| 39 | + for &frame in &check_samples { |
| 40 | + let clamped = frame.max(-1.0).min(1.0); |
| 41 | + writer |
| 42 | + .write_sample((clamped * i16::MAX as f64) as i16) |
| 43 | + .unwrap(); |
| 44 | + } |
| 45 | + |
| 46 | + // Then write the rest |
| 47 | + for frame in my_signal.take(12000 * 4 - 1000) { |
| 48 | + let clamped = frame.max(-1.0).min(1.0); |
| 49 | + writer |
| 50 | + .write_sample((clamped * i16::MAX as f64) as i16) |
| 51 | + .unwrap(); |
| 52 | + } |
| 53 | +} |
0 commit comments