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}