use std::f32::consts::PI;
pub fn generate_sine_wave_cu8(frequency: f32, sample_rate: u32, num_samples: usize) -> Vec<u8> {
let mut buffer = Vec::with_capacity(num_samples * 2);
let angular_freq = 2.0 * PI * frequency / sample_rate as f32;
for n in 0..num_samples {
let phase = angular_freq * n as f32;
let i = phase.cos();
let q = phase.sin();
let i_byte = ((i + 1.0) * 127.5) as u8;
let q_byte = ((q + 1.0) * 127.5) as u8;
buffer.push(i_byte);
buffer.push(q_byte);
}
buffer
}
pub fn generate_sine_wave_cs16(frequency: f32, sample_rate: u32, num_samples: usize) -> Vec<u8> {
let mut buffer = Vec::with_capacity(num_samples * 4);
let angular_freq = 2.0 * PI * frequency / sample_rate as f32;
for n in 0..num_samples {
let phase = angular_freq * n as f32;
let i = phase.cos();
let q = phase.sin();
let i_sample = (i * 32767.0) as i16;
let q_sample = (q * 32767.0) as i16;
buffer.extend_from_slice(&i_sample.to_le_bytes());
buffer.extend_from_slice(&q_sample.to_le_bytes());
}
buffer
}
pub fn generate_dc_signal_cu8(num_samples: usize, i_value: f32, q_value: f32) -> Vec<u8> {
let mut buffer = Vec::with_capacity(num_samples * 2);
let i_byte = ((i_value + 1.0) * 127.5).clamp(0.0, 255.0) as u8;
let q_byte = ((q_value + 1.0) * 127.5).clamp(0.0, 255.0) as u8;
for _ in 0..num_samples {
buffer.push(i_byte);
buffer.push(q_byte);
}
buffer
}
pub fn generate_sine_wave_cf32(frequency: f32, sample_rate: u32, num_samples: usize) -> Vec<u8> {
let mut buffer = Vec::with_capacity(num_samples * 8);
let angular_freq = 2.0 * PI * frequency / sample_rate as f32;
for n in 0..num_samples {
let phase = angular_freq * n as f32;
let i = phase.cos();
let q = phase.sin();
buffer.extend_from_slice(&i.to_le_bytes());
buffer.extend_from_slice(&q.to_le_bytes());
}
buffer
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generate_sine_wave_cu8_length() {
let samples = generate_sine_wave_cu8(1000.0, 96000, 100);
assert_eq!(samples.len(), 200); }
#[test]
fn test_generate_sine_wave_cu8_center() {
let samples = generate_sine_wave_cu8(0.0, 96000, 10);
for i in (0..samples.len()).step_by(2) {
assert_eq!(samples[i], 255, "I component should be 255 for DC signal");
assert!(
(samples[i + 1] as i16 - 127).abs() <= 1,
"Q component should be ~127 for DC signal"
);
}
}
#[test]
fn test_generate_sine_wave_cs16_length() {
let samples = generate_sine_wave_cs16(1000.0, 96000, 100);
assert_eq!(samples.len(), 400); }
#[test]
fn test_generate_dc_signal_cu8() {
let samples = generate_dc_signal_cu8(50, 0.0, 0.0);
assert_eq!(samples.len(), 100);
for &byte in &samples {
assert_eq!(byte, 127);
}
}
#[test]
fn test_generate_dc_signal_cu8_max() {
let samples = generate_dc_signal_cu8(10, 1.0, 1.0);
for &byte in &samples {
assert_eq!(byte, 255);
}
}
#[test]
fn test_generate_sine_wave_cf32_length() {
let samples = generate_sine_wave_cf32(1000.0, 96000, 100);
assert_eq!(samples.len(), 800); }
}