51 lines
1.4 KiB
Rust
51 lines
1.4 KiB
Rust
fn main() {
|
|
let input = include_bytes!("../sweep_short.raw");
|
|
|
|
let min = input.iter().min().unwrap();
|
|
let max = input.iter().max().unwrap();
|
|
let step_size = 0x3;
|
|
|
|
println!("len:\t\t{} samples", input.len());
|
|
println!("initial:\t0x{:02x}", input[0]);
|
|
println!("min:\t\t0x{:02x}", min);
|
|
println!("max:\t\t0x{:02x}", max);
|
|
println!("step size:\t0x{:02x}", step_size);
|
|
|
|
let mut output: Vec<u8> = Vec::new();
|
|
|
|
// let mut max_diff = 0;
|
|
// let prev = input[0];
|
|
// for byte in input {
|
|
|
|
// }
|
|
|
|
|
|
let mut sample_pair: u8 = 0;
|
|
let mut index = 0;
|
|
let mut prev = input[0];
|
|
for byte in &input[1..] {
|
|
let (diff, dir) = match byte >= &prev {
|
|
true => ({byte - prev}, 0x1),
|
|
false => ({prev - byte}, 0x0),
|
|
};
|
|
let steps = (diff / step_size) & 0x0E;
|
|
sample_pair |= ((steps << 1) | dir) << 4 * (index % 2);
|
|
if (index % 2) == 1 {
|
|
output.push(sample_pair);
|
|
sample_pair = 0;
|
|
}
|
|
// println!("0x{:01x} | {}", steps, dir);
|
|
prev = match dir {
|
|
0x1 => prev + (steps * step_size),
|
|
0x0 => prev - (steps * step_size),
|
|
_ => prev + (steps * step_size),
|
|
};
|
|
index += 1;
|
|
}
|
|
|
|
// for sample in &output {
|
|
// println!("0x{:02x}", sample);
|
|
// }
|
|
|
|
std::fs::write("./sweep_dpcm_u4.raw", &output).unwrap();
|
|
}
|