]> code.octet-stream.net Git - m17rt/blobdiff - tools/m17rt-fastdemod/src/main.rs
fast demod bin
[m17rt] / tools / m17rt-fastdemod / src / main.rs
diff --git a/tools/m17rt-fastdemod/src/main.rs b/tools/m17rt-fastdemod/src/main.rs
new file mode 100644 (file)
index 0000000..bc14f71
--- /dev/null
@@ -0,0 +1,44 @@
+use std::{error::Error, fs::File, io::Read, path::PathBuf};
+
+use clap::Parser;
+use m17core::{
+    modem::{Demodulator, SoftDemodulator},
+    protocol::Frame,
+};
+
+#[derive(Parser)]
+struct Args {
+    #[arg(short = 'i', help = "Input RRC file")]
+    input: PathBuf,
+}
+
+fn main() -> Result<(), Box<dyn Error>> {
+    env_logger::init();
+    let args = Args::parse();
+
+    let mut file = File::open(&args.input)?;
+    let mut baseband = vec![];
+    file.read_to_end(&mut baseband)?;
+
+    let mut total = 0;
+    let mut demod = SoftDemodulator::new();
+    for (idx, sample) in baseband
+        .chunks(2)
+        .map(|pair| i16::from_le_bytes([pair[0], pair[1]]))
+        .enumerate()
+    {
+        if let Some((frame, errors)) = demod.demod(sample) {
+            total += 1;
+            let frame_desc = match frame {
+                Frame::Lsf(_) => "lsf",
+                Frame::Stream(_) => "stream",
+                Frame::Packet(_) => "packet",
+            };
+            println!("sample {}: {} with {} errors", idx, frame_desc, errors);
+        }
+    }
+
+    println!("\ntotal successful decodes: {}", total);
+
+    Ok(())
+}