Transform is unavoidably signed

Center our input in the signed range, so it adds about 3 bits per
pass instead of 4.
This commit is contained in:
Pyrex 2024-04-07 16:08:47 -07:00
parent 5c70367116
commit 7de68f03bf

View File

@ -4,19 +4,19 @@ use crate::constants::TILE_SZ;
// Ported from: // Ported from:
// - https://colab.research.google.com/drive/1WjtKwUcqxWafAumFO9ET74RsckZSsw6n#scrollTo=e3r9-RBpcgwH // - https://colab.research.google.com/drive/1WjtKwUcqxWafAumFO9ET74RsckZSsw6n#scrollTo=e3r9-RBpcgwH
pub fn encode(data: &mut [i32], zero: usize, stride: usize) { pub fn encode(data: &mut [i32], zero: usize, stride: usize) {
transform(data, zero, stride, 1) transform(data, zero, stride, -128, 0, 1)
} }
pub fn decode(data: &mut [i32], zero: usize, stride: usize) { pub fn decode(data: &mut [i32], zero: usize, stride: usize) {
transform(data, zero, stride, 8) transform(data, zero, stride, 0, 128, 8)
} }
fn transform(data: &mut [i32], zero: usize, stride: usize, divisor: i32) { fn transform(data: &mut [i32], zero: usize, stride: usize, offset_in: i32, offset_out: i32, divisor: i32) {
let ix = |t| zero + t * stride; let ix = |t| zero + t * stride;
let mut row = [0; TILE_SZ]; let mut row = [0; TILE_SZ];
for i in 0..TILE_SZ { for i in 0..TILE_SZ {
row[i] = data[ix(i)]; row[i] = data[ix(i)] + offset_in;
} }
for bit in [4, 2, 1] { for bit in [4, 2, 1] {
@ -35,7 +35,7 @@ fn transform(data: &mut [i32], zero: usize, stride: usize, divisor: i32) {
// basically, this moves important stuff towards the left // basically, this moves important stuff towards the left
const GRAY: [usize; TILE_SZ] = [0, 4, 6, 2, 3, 7, 5, 1]; const GRAY: [usize; TILE_SZ] = [0, 4, 6, 2, 3, 7, 5, 1];
for i in 0..TILE_SZ { for i in 0..TILE_SZ {
data[ix(GRAY[i])] = row[i] / divisor; data[ix(GRAY[i])] = row[i] / divisor + offset_out;
} }
} }