ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

Commit: 6ec7908d14402bbfa240372c5ee79f8eb2be67f2
Parent: 0e5c533b5dedfafec57b5f8016e1b98abaa4ce01
Author: Randy Palamar
Date:   Fri, 20 Jun 2025 15:03:57 -0600

core: support hadamard dims 20, 40, 80, 160

Diffstat:
Mutil.c | 44+++++++++++++++++++++++++++++++++-----------
1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/util.c b/util.c @@ -840,6 +840,29 @@ make_hadamard_transpose(Arena *a, u32 dim) 1, -1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, }; + read_only local_persist i32 hadamard_20_20_transpose[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, + 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, + 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, + 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, + 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, + 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, + 1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, + 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, + 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, + 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, + 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, + 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, + 1, 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, + 1, 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, + 1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, + 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, + 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, + 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, + 1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, -1, -1, + }; + i32 *result = 0; b32 power_of_2 = ISPOWEROF2(dim); @@ -850,11 +873,10 @@ make_hadamard_transpose(Arena *a, u32 dim) u32 base_dim = 0; if (power_of_2) { base_dim = dim; - } else if (multiple_of_20) { - /* TODO(rnp): hadamard 20 */ - //base_dim = 20; - //dim /= 20; - } else if (multiple_of_12 && dim != 36) { + } else if (multiple_of_20 && ISPOWEROF2(dim / 20)) { + base_dim = 20; + dim /= 20; + } else if (multiple_of_12 && ISPOWEROF2(dim / 12)) { base_dim = 12; dim /= 12; } @@ -879,13 +901,13 @@ make_hadamard_transpose(Arena *a, u32 dim) } #undef IND - if (dim != base_dim) { - ASSERT(base_dim == 12); - i32 *m2 = hadamard_12_12_transpose; - kronecker_product(result, - m, (uv2){.x = dim, .y = dim}, - m2, (uv2){.x = base_dim, .y = base_dim}); + i32 *m2 = 0; + uv2 m2_dim; + switch (base_dim) { + case 12:{ m2 = hadamard_12_12_transpose; m2_dim = (uv2){{12, 12}}; }break; + case 20:{ m2 = hadamard_20_20_transpose; m2_dim = (uv2){{20, 20}}; }break; } + if (m2) kronecker_product(result, m, (uv2){{dim, dim}}, m2, m2_dim); } return result;