Загрузка данных


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);
}