From c26412856bebad8ef5e9440dcfe6e1d50dcbd5a2 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Thu, 27 Mar 2025 21:39:14 +0100 Subject: [PATCH] optimze uninterleave function --- src/fm95.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/fm95.c b/src/fm95.c index ef9ab2b..d396e6b 100644 --- a/src/fm95.c +++ b/src/fm95.c @@ -47,10 +47,26 @@ static volatile sig_atomic_t to_run = 1; void uninterleave(const float *input, float *left, float *right, size_t num_samples) { +#if USE_NEON + size_t i = 0; + size_t vec_size = num_samples / 2; + + for (; i + 4 <= vec_size; i += 4) { + float32x4x2_t interleaved = vld2q_f32(&input[i * 2]); + vst1q_f32(&left[i], interleaved.val[0]); + vst1q_f32(&right[i], interleaved.val[1]); + } + + for (; i < vec_size; i++) { + left[i] = input[i * 2]; + right[i] = input[i * 2 + 1]; + } +#else for (size_t i = 0; i < num_samples/2; i++) { left[i] = input[i * 2]; right[i] = input[i * 2 + 1]; } +#endif } static void stop(int signum) {