SSE2 饱和算法
SSE2 Saturated Arithmetic
我正在编写一些音频处理软件,我需要知道如何使用 SSE2 双精度指令进行饱和运算。我的值需要在 -1 和 1 之间归一化。是否有一种巧妙的方法可以使用 SSE2 内在函数来执行此操作,或者我是否需要 2 组 if/else 语句(每个值一个)?
要将双精度值限制在 -1.0 到 +1.0 的范围内,您可以使用 max/min 操作。例如。如果你有一个缓冲区,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);
}
我正在编写一些音频处理软件,我需要知道如何使用 SSE2 双精度指令进行饱和运算。我的值需要在 -1 和 1 之间归一化。是否有一种巧妙的方法可以使用 SSE2 内在函数来执行此操作,或者我是否需要 2 组 if/else 语句(每个值一个)?
要将双精度值限制在 -1.0 到 +1.0 的范围内,您可以使用 max/min 操作。例如。如果你有一个缓冲区,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);
}