【发布时间】:2026-01-06 00:55:01
【问题描述】:
我想知道是否有任何快速方法可以对音频样本数组进行 24 位到 16 位量化(使用内在函数或 asm)。
源格式是 24 le 签名的。
更新: 设法完成了描述的转换:
static void __cdecl Convert24bitToStereo16_SSE2(uint8_t* src, uint8_t* dst, int len)
{
__m128i shuffleMask = _mm_setr_epi8(-1,0,1,2,-1,3,4,5,-1,6,7,8,-1,9,10,11);
__asm
{
mov eax, [src] // src
mov edi, [dst] // dst
mov ecx, [len] // len
movdqu xmm0,xmmword ptr [shuffleMask]
convertloop:
movdqu xmm1, [eax] // read 4 samples
lea eax, [eax + 12] // inc pointer
pshufb xmm1,xmm0 // shuffle using mask
psrldq xmm1, 2 // shift right
movdqu xmm2, [eax] // read next 4 samples
lea eax, [eax + 12] // inc pointer
pshufb xmm2, xmm0 // shuffle
psrldq xmm2, 2 // shift right
packusdw xmm1, xmm2 // pack upper and lower samples
movdqu [edi], xmm1 // write 8 samples
lea edi, [edi + 16]
sub ecx, 24
jg convertloop
}
}
现在是抖动 - 如何避免量化效应?
欢迎任何提示。谢谢
【问题讨论】:
-
24 到 16 位非常简单 - 您加载三个 128 位值,然后随机播放 (
_mm_shuffle_epi8) 字节以删除每个第三个字节,并最终存储两个 128 位值作为结果。如果您需要精确舍入,则稍微复杂一些。 -
@RomanR。我认为这不会解决抖动问题。
-
您要应用哪种抖动?
标签: audio simd sse2 quantization sse3