initial commit of cursed encoder project
This commit is contained in:
commit
c72c5aee87
5 changed files with 69 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dpcm-encoder-decoder"
|
||||||
|
version = "0.1.0"
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "dpcm-encoder-decoder"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
4
README.md
Normal file
4
README.md
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# DPCM ENCODER / DECODER
|
||||||
|
|
||||||
|
goal:
|
||||||
|
- [ ] CLI application to encode PCM_u8 audio to DPCM audo with a given step size
|
||||||
51
src/main.rs
Normal file
51
src/main.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
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();
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue