code wiki / (root) / nx_sound_test.nx

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}