diff options
Diffstat (limited to 'dhwt-codec/src/transform.rs')
-rw-r--r-- | dhwt-codec/src/transform.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/dhwt-codec/src/transform.rs b/dhwt-codec/src/transform.rs new file mode 100644 index 0000000..82bccd1 --- /dev/null +++ b/dhwt-codec/src/transform.rs @@ -0,0 +1,42 @@ +use crate::io::{Value, TWO}; +use std::ops::{Index, IndexMut}; + +pub fn encode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>( + size: usize, + a: &mut X, + b: &mut X, +) { + let mut k = size; + while k != 1 { + k /= 2; + for i in 0..k { + let x = a[i * 2]; + let y = a[i * 2 + 1]; + b[i] = x + y; + b[k + i] = x - y; + } + for i in 0..k { + a[i] = b[i] + } + } +} + +pub fn decode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>( + size: usize, + a: &mut X, + b: &mut X, +) { + let mut k = 1; + while k != size { + for i in 0..k { + let avr = a[i] / TWO; + let spread = a[i + k] / TWO; + b[i * 2] = avr + spread; + b[i * 2 + 1] = avr - spread; + } + k *= 2; + for i in 0..k { + a[i] = b[i] + } + } +} |