nx_sound_test.nx source
↩ module page · 94 lines · 3294 B
1// nx_sound_test.nx -- smoke for nx_sound primitives.
2
3import "syscalls.nx"
4import "nx_sound.nx"
5
6func main() -> i64 {
7 // === Test 1: Hann window N=16 ===
8 // w[0] = w[15] = 0; w[7] or w[8] is the peak near 16384.
9 let win: *i64 = (sys_mmap(16 * 8)) as *i64
10 nx_sound_hann_window(16, win)
11 if win[0] > 100 { return 1 } // edge approx 0
12 if win[15] > 100 { return 2 }
13 // Peak in middle should be >= 14000 (>85% of full)
14 if win[7] < 14000 { return 3 }
15 if win[8] < 14000 { return 4 }
16
17 // === Test 2: Hamming window N=16 ===
18 // Edges ~ 0.08 * 16384 = 1311
19 let win2: *i64 = (sys_mmap(16 * 8)) as *i64
20 nx_sound_hamming_window(16, win2)
21 if win2[0] < 1000 { return 10 }
22 if win2[0] > 1700 { return 11 }
23 if win2[15] < 1000 { return 12 }
24 if win2[15] > 1700 { return 13 }
25 // Peak in middle near 16384
26 if win2[7] < 14000 { return 14 }
27
28 // === Test 3: Apply window to constant signal ===
29 // Constant signal of 1000 windowed by Hann -> tapered, edges ~ 0,
30 // center peak ~ 1000.
31 let sig: *i64 = (sys_mmap(16 * 8)) as *i64
32 var i: i64 = 0
33 while i < 16 {
34 sig[i] = 1000
35 i = i + 1
36 }
37 nx_sound_apply_window(sig, win, 16)
38 if sig[0] > 50 { return 20 } // edge near 0
39 if sig[7] < 800 { return 21 } // center near 1000
40
41 // === Test 4: frame energy ===
42 // Constant signal of value 100, N=16 -> energy = 100^2 = 10000
43 var i2: i64 = 0
44 while i2 < 16 {
45 sig[i2] = 100
46 i2 = i2 + 1
47 }
48 let e: i64 = nx_sound_frame_energy(sig, 16)
49 if e != 10000 { return 30 }
50 // Zero signal -> zero energy
51 var i3: i64 = 0
52 while i3 < 16 {
53 sig[i3] = 0
54 i3 = i3 + 1
55 }
56 if nx_sound_frame_energy(sig, 16) != 0 { return 31 }
57
58 // === Test 5: STFT of cosine signal ===
59 // 32-sample signal containing cosine at frequency k=2 (within N=16
60 // frame, peak should be at bin 2 or 14 of each frame).
61 let total_len: i64 = 32
62 let big_sig: *i64 = (sys_mmap(32 * 8)) as *i64
63 let cos_v: *i64 = (sys_mmap(16 * 8)) as *i64
64 cos_v[0] = 100; cos_v[1] = 71; cos_v[2] = 0; cos_v[3] = -71
65 cos_v[4] = -100; cos_v[5] = -71; cos_v[6] = 0; cos_v[7] = 71
66 cos_v[8] = 100; cos_v[9] = 71; cos_v[10] = 0; cos_v[11] = -71
67 cos_v[12] = -100; cos_v[13] = -71; cos_v[14] = 0; cos_v[15] = 71
68 var i4: i64 = 0
69 while i4 < 16 {
70 big_sig[i4] = cos_v[i4]
71 big_sig[i4 + 16] = cos_v[i4] // repeat to fill 32
72 i4 = i4 + 1
73 }
74 let spec: *i64 = (sys_mmap(4 * 16 * 8)) as *i64 // up to 4 frames
75 let n_frames: i64 = nx_sound_stft(big_sig, total_len, 16, 8, spec)
76 if n_frames <= 0 { return 40 }
77 // For frame 0, peak should be at bin 2 or 14.
78 var max_bin: i64 = 0
79 var max_v: i64 = spec[0]
80 var b: i64 = 1
81 while b < 16 {
82 if spec[b] > max_v {
83 max_v = spec[b]
84 max_bin = b
85 }
86 b = b + 1
87 }
88 var ok: i64 = 0
89 if max_bin == 2 { ok = 1 }
90 if max_bin == 14 { ok = 1 }
91 if ok != 1 { return 41 }
92
93 return 0
94}