code wiki / _hdl_build / _wb_lpc.nx

_wb_lpc.nx source

↩ module page · 45 lines · 1163 B

1// AUTHORED BY THE NISHI BUILDER (pattern: PREDICTOR_CODER) -- lossless predictor/residual coder, no Claude logic 2import "nx_syscalls.nx" 3func _wb_lpc_pred(p1: i64, p2: i64, p3: i64) -> i64 { 4 return 2 * p1 - p2 5} 6func _wb_lpc_residuals(x: *i64, n: i64, u: *i64) -> i64 { 7 if n <= 2 { return 0 - 1 } 8 var i: i64 = 2 9 while i < n { 10 let r: i64 = x[i] - _wb_lpc_pred(x[i - 1], x[i - 2], 0) 11 var z: i64 = 2 * r 12 if r < 0 { z = 0 - z - 1 } 13 u[i - 2] = z 14 i = i + 1 15 } 16 return n - 2 17} 18func _wb_lpc_restore(u: *i64, m: i64, w: *i64, x: *i64) -> i64 { 19 var p1: i64 = 0 20 var p2: i64 = 0 21 var p3: i64 = 0 22 var i: i64 = 0 23 while i < 2 { 24 x[i] = w[i] 25 p3 = p2 26 p2 = p1 27 p1 = w[i] 28 i = i + 1 29 } 30 var j: i64 = 0 31 while j < m { 32 var r: i64 = u[j] / 2 33 if (u[j] & 1) == 1 { r = 0 - ((u[j] + 1) / 2) } 34 let v: i64 = _wb_lpc_pred(p1, p2, p3) + r 35 if v > 32767 { return 0 - 2 } 36 if v < 0 - 32768 { return 0 - 2 } 37 x[i] = v 38 p3 = p2 39 p2 = p1 40 p1 = v 41 i = i + 1 42 j = j + 1 43 } 44 return i 45}