From 2a328dcdabaa4d431cee3e143f3a5160686dbf81 Mon Sep 17 00:00:00 2001 From: Shriram Shastry Date: Mon, 10 Jun 2024 21:08:31 +0530 Subject: [PATCH] This check-in refines the TDFB direction calculation, addressing correctness: Bugfix: - Fix off-by-one error in `line_array_mode_check` ensuring all checks for co-linearity among microphone locations are performed. Signed-off-by: Shriram Shastry --- src/audio/tdfb/tdfb_direction.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/audio/tdfb/tdfb_direction.c b/src/audio/tdfb/tdfb_direction.c index 2c4875bbba4a..85e219ed9edb 100644 --- a/src/audio/tdfb/tdfb_direction.c +++ b/src/audio/tdfb/tdfb_direction.c @@ -125,8 +125,10 @@ static int16_t max_mic_distance(struct tdfb_comp_data *cd) /* Max lag based on largest array dimension. Microphone coordinates are Q4.12 meters */ for (i = 0; i < cd->config->num_mic_locations; i++) { - /* Start from i+1 halves the amount of iteration & to eliminate redundant checks */ - for (j = i + 1; j < cd->config->num_mic_locations; j++) { + for (j = 0; i < cd->config->num_mic_locations; i++) { + if (j == i) + continue; + dx = cd->mic_locations[i].x - cd->mic_locations[j].x; dy = cd->mic_locations[i].y - cd->mic_locations[j].y; dz = cd->mic_locations[i].z - cd->mic_locations[j].z; @@ -157,7 +159,8 @@ static bool line_array_mode_check(struct tdfb_comp_data *cd) * Form vector AB(a,b,c) from x(i+1) - x(i), y(i+1) - y(i), z(i+1) - z(i) * Form vector AC(d,e,f) from x(i+2) - x(i), y(i+2) - y(1), z(i+2) - z(i) */ - for (i = 0; i < num_mic_locations - 3; i++) { + /* Calculates cross product only once */ + for (i = 0; i < num_mic_locations - 2; i++) { a = cd->mic_locations[i + 1].x - cd->mic_locations[i].x; b = cd->mic_locations[i + 1].y - cd->mic_locations[i].y; c = cd->mic_locations[i + 1].z - cd->mic_locations[i].z; @@ -280,10 +283,9 @@ static void level_update(struct tdfb_comp_data *cd, int frames, int ch_count, in /* Calculate mean square level */ for (n = 0; n < frames; n++) { s = *p; - tmp += ((int32_t)s * s); p += ch_count; - /* handle circular buffer */ tdfb_cinc_s16(&p, cd->direction.d_end, cd->direction.d_size); + tmp += ((int64_t)s * s); } /* Calculate mean square power */