diff --git a/src/interleaver.rs b/src/interleaver.rs
index 3e5fd9724179027aa819b3f36546e376f94bd2e6..e6386968ca7868cc31b24fe4b018dd427b1db715 100644
--- a/src/interleaver.rs
+++ b/src/interleaver.rs
@@ -61,24 +61,6 @@ pub(crate) fn uninterleave<const N: usize>(
     Ok(())
 }
 
-pub(crate) fn interleave_soft<const N: usize, T: DecodeFrom>(
-    data: &[T],
-    out: &mut Buffer<N, T>,
-) -> Result<(), EncodeError> {
-    for i in 0..32 {
-        for j in (0..data.len()).step_by(32) {
-            if i + j >= data.len() {
-                continue;
-            }
-
-            out.try_push(data[i + j])
-                .map_err(|_| EncodeError::CatsOverflow)?;
-        }
-    }
-
-    Ok(())
-}
-
 pub(crate) fn uninterleave_soft<const N: usize, T: DecodeFrom>(
     data: &[T],
     out: &mut Buffer<N, T>,
@@ -130,43 +112,6 @@ mod tests {
         assert_eq!(*orig, *uninterleaved);
     }
 
-    #[test]
-    fn soft_interleaver_works() {
-        let mut data = [
-            57i16, 90, -103, -127, 85, -86, -43, -84, -116, -110, -36, -126, -74, 42, -28, -16, 93,
-            -22, -4, -110, -84, 84, -100, -109, 74, -86, 73, -64, -117, -93, 118, -26, 9, 69, -100,
-            80, -4, 26, -85, -118, 40, 64, -97, -7, 84, 118, 84, 127, -96, -18, 77, 1, 27, -20,
-            -95, -105, -120, 14, 119, -117, -103, 67, 58, -4, -98, 12, -5, -59, 74, -112, -9, 17,
-            -17, 67, -116, 12, -59, -118, 6, 99, 56, -27, -64, -87, -36, -51, 47, 19, -97, -63, 4,
-            5, 23, -38, -14, 16, -52, 54, -27, -90,
-        ];
-        let orig = Buffer::new_full(&mut data);
-
-        let mut interleaved = [0; 101];
-        let mut interleaved = Buffer::new(&mut interleaved, 0);
-
-        // check that existing data isn't mangled
-        interleaved.push(-1);
-
-        interleave_soft(&orig, &mut interleaved).unwrap();
-
-        let expected = [
-            -1, 57, 9, -98, -52, 90, 69, 12, 54, -103, -100, -5, -27, -127, 80, -59, -90, 85, -4,
-            74, -86, 26, -112, -43, -85, -9, -84, -118, 17, -116, 40, -17, -110, 64, 67, -36, -97,
-            -116, -126, -7, 12, -74, 84, -59, 42, 118, -118, -28, 84, 6, -16, 127, 99, 93, -96, 56,
-            -22, -18, -27, -4, 77, -64, -110, 1, -87, -84, 27, -36, 84, -20, -51, -100, -95, 47,
-            -109, -105, 19, 74, -120, -97, -86, 14, -63, 73, 119, 4, -64, -117, 5, -117, -103, 23,
-            -93, 67, -38, 118, 58, -14, -26, -4, 16,
-        ];
-        assert_eq!(expected, interleaved[..]);
-
-        let mut uninterleaved = [0; 101];
-        let mut uninterleaved = Buffer::new(&mut uninterleaved, 0);
-        uninterleave_soft(&interleaved[1..], &mut uninterleaved).unwrap();
-
-        assert_eq!(*orig, *uninterleaved);
-    }
-
     #[test]
     fn hard_interleave_soft_uninterleave() {
         let mut data = [0x84, 0x73, 0x12, 0xA3, 0xFF, 0x00, 0xC2, 0x1B, 0x77];
diff --git a/src/ldpc.rs b/src/ldpc.rs
index 71e5cc7e2fe9af85fbdf8e6d88a301a41782ed4f..99e8f997dc78d7ad70cf6ce5263a6d51c061c244 100644
--- a/src/ldpc.rs
+++ b/src/ldpc.rs
@@ -232,7 +232,7 @@ pub(crate) fn decode_soft<const N: usize, const M: usize, T: DecodeFrom>(
                     1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                     1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
                 ]
-                .map(|x| T::from_hard_bit(x > 0)); // TODO !!
+                .map(|x| if x > 0 { -T::maxval() } else { T::maxval() });
                 code_data[..data.len()].copy_from_slice(data);
                 let code_parity = &parity.get_mut(..64)?;
 
diff --git a/src/whitener.rs b/src/whitener.rs
index 9744959ac51e4f93e0375281acd9ec0649c94155..3b10ca0ac7de1067e994bafd9acd255174b8349f 100644
--- a/src/whitener.rs
+++ b/src/whitener.rs
@@ -1,5 +1,3 @@
-use labrador_ldpc::decoder::DecodeFrom;
-
 const START_STATE: u16 = 0xE9CF;
 
 pub(crate) fn whiten(data: &mut [u8]) {
@@ -12,20 +10,6 @@ pub(crate) fn whiten(data: &mut [u8]) {
     }
 }
 
-// One bit per element
-pub(crate) fn whiten_soft<T: DecodeFrom>(data: &mut [T]) {
-    let mut state = START_STATE;
-
-    for d in data.iter_mut() {
-        let b = state & 1;
-        if b > 0 {
-            // flip the soft bit. In LLR speak, this just means flip the sign
-            *d = -*d;
-        }
-        state = lfsr(state);
-    }
-}
-
 // (byte, state)
 fn lfsr_byte(mut state: u16) -> (u8, u16) {
     let mut out = 0;
@@ -51,7 +35,6 @@ fn lfsr(mut state: u16) -> u16 {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::soft_bit::SoftBit;
 
     #[test]
     fn basic() {
@@ -67,44 +50,6 @@ mod tests {
         assert_eq!(orig, data);
     }
 
-    #[test]
-    fn basic_soft() {
-        let mut data = [-2.3, 4.7, 0.0, 2.7, 7.8, 45.2, -0.1, -0.82];
-        let orig = data;
-
-        whiten_soft(&mut data);
-        assert_eq!([2.3, -4.7, -0.0, -2.7, 7.8, 45.2, 0.1, 0.82], data);
-
-        whiten_soft(&mut data);
-        assert_eq!(orig, data);
-    }
-
-    #[test]
-    fn compare_soft_and_hard() {
-        let mut data = [0; 64];
-        data[0..57]
-            .clone_from_slice(&b"Hello world! The quick brown fox jumped over the lazy dog"[..]);
-        let orig = data;
-
-        whiten(&mut data);
-
-        let mut soft = [0.0; 64 * 8];
-        for (i, b) in data.iter().enumerate() {
-            for j in 0..8 {
-                soft[8 * i + j] = f32::from_hard_bit(b & (1 << (7 - j)) > 0);
-            }
-        }
-
-        whiten_soft(&mut soft);
-
-        assert_eq!(orig.len() * 8, soft.len());
-        for (i, b) in orig.iter().enumerate() {
-            for j in 0..8 {
-                assert_eq!(soft[8 * i + j].hard_bit(), *b & (1 << (7 - j)) > 0);
-            }
-        }
-    }
-
     #[test]
     fn test_lfsr() {
         let start = 0xACE1;