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


static void s16_to_float_neon(const int16_t* src, float* dst) {
    // Загружаем 8 значений int16
    int16x8_t in_s16 = vld1q_s16(src);

    // Создаем константу для масштабирования (1/32768)
    float32x4_t scale = vdupq_n_f32(1.0f / 32768.0f);

    // Расширяем int16x8 до двух int32x4 (нижняя и верхняя части)
    int32x4_t low_i32 = vmovl_s16(vget_low_s16(in_s16));
    int32x4_t high_i32 = vmovl_high_s16(in_s16);

    // Конвертируем в float и умножаем на scale
    float32x4_t low_f32 = vmulq_f32(vcvtq_f32_s32(low_i32), scale);
    float32x4_t high_f32 = vmulq_f32(vcvtq_f32_s32(high_i32), scale);

    // Сохраняем результат (8 float значений)
    vst1q_f32(dst, low_f32);
    vst1q_f32(dst + 4, high_f32);
}