尽可能简单地说。

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

  • 有缩放比例值吗?例如,当我要将[24位有符号的整数]强制转换为[24位有符号的整数]时,我这样做是这样的:
    for (int i=0; i<256; i++) {
       bufferInDouble = *((int*)bufferRawData[currentPan]+i) / (double)0x7fffffff;
    }
    

    有任何类似的方法吗?

    最佳答案

    该方法将根据您是打包24位数据还是存储在32位字中的24位而有所不同。我将假定它没有打包,并且在整数内保持对齐,因为这是最常见的。

    该技术是将数据简单地向下转换为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中添加一些低电平噪声以减少量化失真。这被称为抖动。有关信息,请参阅Wikipedia上的本文Dither

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

    10-11 16:24