nx_rec_grade_gate.nx source
↩ module page · 122 lines · 4224 B
1// nx_rec_grade_gate.nx -- REFEREE for the recording-quality grader (nx_rec_grade).
2//
3// Synthesizes signals with known defects and checks the grader flags each:
4// GOOD : triangle amp 8000, no offset -> REC_GOOD (trips nothing)
5// CLIPPED: triangle amp 50000 (pins to +-FS) -> REC_CLIPPED
6// QUIET : triangle amp 500 -> REC_TOO_QUIET
7// DC_BIAS: triangle amp 8000 + offset 12000 -> REC_DC_BIAS
8// LOUD : square amp 30000 (hot, no clip) -> REC_TOO_LOUD
9// The GOOD case is the NEG-CONTROL: a clean recording must not trip any defect.
10//
11// Evidence -> stdout + knowledge/status/rec_grade_gate.log. Exit 0 GREEN / 1 RED.
12// Sovereign x86_64 throughout. license_tier: ORIGINAL
13import "nx_syscalls_x86_64.nx"
14import "nx_rec_grade.nx"
15
16const NS: i64 = 2048
17
18func gp(logfd: i64, s: *u8) -> i64 {
19 var n: i64 = 0
20 while s[n] != (0 as u8) { n = n + 1 }
21 sys_write(1, s, n)
22 if logfd > 0 { sys_write(logfd, s, n) }
23 return 0
24}
25func gn(logfd: i64, v: i64) -> i64 {
26 let bb: *u8 = sys_mmap(28)
27 var m: i64 = v
28 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m }
29 let t: *u8 = sys_mmap(28)
30 var k: i64 = 0
31 if m == 0 { t[0] = 48 as u8; k = 1 }
32 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
33 var i: i64 = 0
34 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
35 sys_write(1, bb, k)
36 if logfd > 0 { sys_write(logfd, bb, k) }
37 return 0
38}
39
40func _store_i16(buf: *u8, i: i64, v: i64) -> i64 {
41 var x: i64 = v
42 if x > 32767 { x = 32767 }
43 if x < -32768 { x = -32768 }
44 if x < 0 { x = x + 0x10000 }
45 buf[i * 2] = (x & 0xff) as u8
46 buf[i * 2 + 1] = ((x >> 8) & 0xff) as u8
47 return 0
48}
49
50// triangle wave, period 64, +-amp, plus DC offset
51func gen_tri(buf: *u8, n: i64, amp: i64, dc: i64) -> i64 {
52 var i: i64 = 0
53 while i < n {
54 let ph: i64 = i % 64
55 var v: i64 = 0
56 if ph < 32 { v = (0 - amp) + (2 * amp * ph) / 32 }
57 if ph >= 32 { v = amp - (2 * amp * (ph - 32)) / 32 }
58 _store_i16(buf, i, v + dc)
59 i = i + 1
60 }
61 return 0
62}
63// square wave, period 64, +-amp (hot level, no clipping if amp < clip thresh)
64func gen_sq(buf: *u8, n: i64, amp: i64) -> i64 {
65 var i: i64 = 0
66 while i < n {
67 var v: i64 = amp
68 if (i % 64) >= 32 { v = 0 - amp }
69 _store_i16(buf, i, v)
70 i = i + 1
71 }
72 return 0
73}
74
75func grade1(logfd: i64, label: *u8, pcm: *u8, out: *i64) -> i64 {
76 let verdict: i64 = nx_rec_grade(pcm, NS, out)
77 gp(logfd, label)
78 gp(logfd, " peak=\x00" as *u8); gn(logfd, out[0])
79 gp(logfd, " rms=\x00" as *u8); gn(logfd, out[1])
80 gp(logfd, " dc=\x00" as *u8); gn(logfd, out[2])
81 gp(logfd, " clip=\x00" as *u8); gn(logfd, out[3])
82 gp(logfd, " verdict=\x00" as *u8); gn(logfd, verdict)
83 gp(logfd, "\n\x00" as *u8)
84 return verdict
85}
86
87func main() -> i64 {
88 let logfd: i64 = sys_openat_append("knowledge/status/rec_grade_gate.log\x00" as *u8, 0x1a4)
89 gp(logfd, "REC-GRADE-GATE recording-quality\n\x00" as *u8)
90
91 let out: *i64 = sys_mmap(32) as *i64
92 let buf: *u8 = sys_mmap(NS * 2)
93
94 gen_tri(buf, NS, 8000, 0)
95 let v_good: i64 = grade1(logfd, " GOOD \x00" as *u8, buf, out)
96 gen_tri(buf, NS, 50000, 0)
97 let v_clip: i64 = grade1(logfd, " CLIPPED\x00" as *u8, buf, out)
98 gen_tri(buf, NS, 500, 0)
99 let v_quiet: i64 = grade1(logfd, " QUIET \x00" as *u8, buf, out)
100 gen_tri(buf, NS, 8000, 12000)
101 let v_dc: i64 = grade1(logfd, " DC_BIAS\x00" as *u8, buf, out)
102 gen_sq(buf, NS, 30000)
103 let v_loud: i64 = grade1(logfd, " LOUD \x00" as *u8, buf, out)
104
105 var ok: i64 = 1
106 if v_good != REC_GOOD { ok = 0 }
107 if v_clip != REC_CLIPPED { ok = 0 }
108 if v_quiet != REC_TOO_QUIET { ok = 0 }
109 if v_dc != REC_DC_BIAS { ok = 0 }
110 if v_loud != REC_TOO_LOUD { ok = 0 }
111
112 if ok == 1 {
113 gp(logfd, "REC-GRADE-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
114 if logfd > 0 { sys_close(logfd) }
115 sys_exit(0)
116 return 0
117 }
118 gp(logfd, "REC-GRADE-GATE result=FAIL verdict=RED\n\x00" as *u8)
119 if logfd > 0 { sys_close(logfd) }
120 sys_exit(1)
121 return 1
122}