c - SSE2 饱和算法

标签 c sse simd intrinsics sse2

我正在编写一些音频处理软件,我需要知道如何使用 SSE2 double 指令进行饱和运算。我的值需要在 -1 和 1 之间归一化。是否有一种巧妙的方法可以使用 SSE2 内在函数来执行此操作,或者我是否需要 2 组 if/else 语句(每个值一个)?

最佳答案

要将 double 值限制在 -1.0 到 +1.0 的范围内,您可以使用最大/最小操作。例如。如果你有一个缓冲区 buff,N 个 double 值:

const __m128d kMax = _mm_set1_pd(1.0);
const __m128d kMin = _mm_set1_pd(-1.0);

for (int i = 0; i < N; i += 2)
{
    __m128d v = _mm_loadu_pd(&buff[i]);
    v = _mm_max_pd(v, kMin);
    v = _mm_min_pd(v, kMax);
    _mm_storeu_pd(&buff[i], v);
}

关于c - SSE2 饱和算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241187/

相关文章:

c - 当算术表达式中的所有项都是 uint8_t 时,如何存储算术表达式中的中间步骤的结果?

c函数删除所有二叉树元素

c - 如何从另一个函数内的随机位置调用 C 函数?

c++ - SSE 优化循环,在数组中查找零并切换标志 + 更新另一个数组

c++ - SSE 和 iostream : wrong output for floating point types

c - 将比较例程转换为 Intel SIMD

c++ - 矢量化图像处理

c++ - 将 __m128i 值转换为 std::tuple

c - 使用 fgets 从文件中读取

c++ - 从 __m128i 中查找最小值/最大值