c++ - 将 24 位有符号整数信号转换为 16 位有符号整数信号

标签 c++ audio casting signal-processing

尽可能简单地说。

  1. 我从设备接收数据,信号是 24 位有符号整数。
  2. 我想创建 16 位 WAV 文件。
  3. 为此,我想继续将包含 256 个样本的即将到来的音频缓冲区写入 *.wav 文件流。
  4. 如何将缓冲区值(用指向 256 元素数组的简单指针写入的井值)从 [24 位带符号整数] 转换为 [16 位带符号整数]。

有缩放值吗?例如,当我想将 [24 bit signed int] 转换为 [24 bit signed double] 时,我是这样做的:

for (int i=0; i<256; i++) {
   bufferInDouble = *((int*)bufferRawData[currentPan]+i) / (double)0x7fffffff;
}

有没有类似的方法?

最佳答案

方法会有所不同,具体取决于您是将 24 位数据打包还是仅将 24 位存储在 32 位字中。我将假设它没有打包并且在整数内左对齐,因为这是最常见的。

技术是简单地将数据向下移动为 16 位数据类型

ABCDEFxx => ABCD 

这里我展示了一个 32 位整数的半字节,其中 ABCDEF 包含 24 位音频数据,而 xx 字节不包含任何值。右移 16 将丢弃 EFxx

short outBuffer[256]
int* inBuffer = ((int*)bufferRawData);
for (int i = 0 ; i < 256 ; ++i)
{
    outBuffer[i] = (short)(inBuffer[i] >> 16);
}

附带说明一下,在降低位深度时通常需要在 LSB 中添加一些低电平噪声以减少量化失真。这称为抖动。有关信息,请参阅维基百科上的这篇文章 Dither

关于c++ - 将 24 位有符号整数信号转换为 16 位有符号整数信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28291509/

相关文章:

c++ - C++03 和 C++11 之间的未定义行为有什么区别?

c++ - Win32 消息泵与 MFC 消息映射,哪个更快? C++

c++ - 使用非阻塞套接字。 errno 在调用 recvfrom 后总是 EAGAIN

audio - FFMPEG-音频文件的持续时间不准确

c++ - 是否可以在 C++ 中编写自定义转换运算符(如 `static_cast` )?

c++ - 删除空指针是否安全?

c# - 将 IList<T1> 转换为 ILIst<T2>

c++ - C/C++ 预处理错误

user-interface - 商业游戏软件中使用的库(SDL的替代品)

python - 如何从Jupyter Notebook下载音频?