use crate::engine::interleave::{deinterleave_bitrev, interleave_bitrev};
const FRAME: usize = 206;
pub fn interleave(bits: &mut [u8; FRAME]) {
interleave_bitrev(bits);
}
pub fn deinterleave(bits: &mut [u8; FRAME]) {
deinterleave_bitrev(bits);
}
pub fn deinterleave_llrs(llrs: &mut [f32; FRAME]) {
deinterleave_bitrev(llrs);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip() {
let mut bits = [0u8; FRAME];
for i in 0..FRAME {
bits[i] = ((i * 7 + 3) & 1) as u8;
}
let original = bits;
interleave(&mut bits);
assert_ne!(bits, original, "permutation must change content");
deinterleave(&mut bits);
assert_eq!(bits, original, "deinterleave must invert interleave");
}
#[test]
fn llr_round_trip_matches_bits() {
let mut bits = [0u8; FRAME];
for i in 0..FRAME {
bits[i] = ((i * 11 + 5) & 1) as u8;
}
let mut llrs = [0f32; FRAME];
for i in 0..FRAME {
llrs[i] = if bits[i] == 0 { 4.0 } else { -4.0 };
}
interleave(&mut bits);
let mut interleaved_llrs = [0f32; FRAME];
for i in 0..FRAME {
interleaved_llrs[i] = if bits[i] == 0 { 4.0 } else { -4.0 };
}
deinterleave_llrs(&mut interleaved_llrs);
for i in 0..FRAME {
let expected = if (((i * 11 + 5) & 1) as u8) == 0 {
4.0
} else {
-4.0
};
assert_eq!(interleaved_llrs[i], expected, "pos {i}");
}
}
}