static void float_to_s16_neon(const float* src, int16_t* dst) {
// Загружаем 8 значений float (двумя порциями по 4)
float32x4_t in_f32_low = vld1q_f32(src);
float32x4_t in_f32_high = vld1q_f32(src + 4);
// Создаем константу 32768.0
float32x4_t scale = vdupq_n_f32(32768.0f);
// Умножаем на масштаб и конвертируем в int32 с округлением (Nearest)
// vcvtnq — использует округление к ближайшему целому
int32x4_t low_i32 = vcvtnq_s32_f32(vmulq_f32(in_f32_low, scale));
int32x4_t high_i32 = vcvtnq_s32_f32(vmulq_f32(in_f32_high, scale));
// Сужаем int32 до int16 с НАСЫЩЕНИЕМ (Saturating Narrow)
// vqmovn_s32 превращает 32-бит в 16-бит, ограничивая значения в [-32768, 32767]
int16x4_t res_low = vqmovn_s32(low_i32);
int16x8_t res_combined = vqmovn_high_s32(res_low, high_i32);
// Сохраняем 8 значений int16
vst1q_s16(dst, res_combined);
}