将 16 位有符号整数饱和为 12 位有符号

问题描述 投票:0回答:1

我正在使用具有 12 位签名 ADC/DAC 的 SDR,该 ADC/DAC 存储在 16 位 IQ 样本中。我想确保在完成所有 DSP 后,样本饱和在 12 位,而不是被 SDR 截断。

这是等效的 C++ 代码:

        for (int i = 0; i < block_size_with_header; i++) {
            if (floatSamples[i].real() > 2047)
                floatSamples[i].real(2047);
            if (floatSamples[i].imag() > 2047)
                floatSamples[i].imag(2047);
            if (floatSamples[i].real() < -2048)
                floatSamples[i].real(-2048);
            if (floatSamples[i].imag() < -2048)
                floatSamples[i].imag(-2048);
        }

有没有更快的方法使用 SIMD 或汇编来做到这一点?我在这里看到问题在 16 位或 8 位处饱和,但不是 12 位。

谢谢。

optimization signal-processing simd saturation-arithmetic
1个回答
0
投票

钳位的一个有趣的特性,应用两次不会改变输出,即

clamp( clamp( x ) ) == clamp( x )
对于所有
x
。这极大地简化了余数的处理。这是 AVX2 示例,未经测试。

#include <stdint.h>
#include <immintrin.h>

// Clamp 16 int16_t numbers in memory to the specified min/max values
inline void clamp16( int16_t* ptr, __m256i min, __m256i max )
{
    __m256i v = _mm256_loadu_si256( ( const __m256i* )ptr );
    v = _mm256_min_epi16( v, max );
    v = _mm256_max_epi16( v, min );
    _mm256_storeu_si256( ( __m256i* )ptr, v );
}

void saturate12bits_avx2( int16_t* ptr, size_t length )
{
    if( length >= 16 )
    {
        const __m256i max = _mm256_set1_epi16( 2047 );
        const __m256i min = _mm256_set1_epi16( -2048 );

        // We want a remainder of length [ 1 .. 16 ],
        // saves a branch testing for no remainder
        int16_t* const last = ptr + length - 16;
        for( ; ptr < last; ptr += 16 )
            clamp16( ptr, min, max );
        clamp16( last, min, max );
    }
    else
    {
        // Very small input, can't load AVX vectors
        int16_t* const end = ptr + length;
        for( ; ptr < end; ptr++ )
        {
            int16_t i = *ptr;
            i = std::min( i, (int16_t)2047 );
            i = std::max( i, (int16_t)-2048 );
            *ptr = i;
        }
    }
}

输入指针不需要对齐。不过,当它按 32 字节对齐时,该函数的运行速度会稍微快一些。

© www.soinside.com 2019 - 2024. All rights reserved.