将16位短路转换为32位浮点

时间:2013-05-13 19:41:00

标签: ios audio type-conversion tone-generator

在iOS的音调生成器示例中:http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html

我正在尝试将一个短数组转换为iOS中的Float32。

        Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData;
        short* outputShortBuffer = static_cast<short*>(outputBuffer);

        for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2)
        {
            buffer[frame] =  outputShortBuffer[frame];
        }

由于某些原因,我从扬声器播放时听到了额外的噪音。我认为从short转换为Float32有问题吗?

1 个答案:

答案 0 :(得分:2)

是的,有。

考虑浮点样本的值范围为-1.0 <= Xn <= 1.0,而signed short的值范围为-32767 <= Xn <= +32767。仅仅铸造将导致几乎所有样品都被剪切。

所以考虑到这一点:

    Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData;
    short* outputShortBuffer = static_cast<short*>(outputBuffer);

    for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2)
    {
        buffer[frame] =  ((float) outputShortBuffer[frame]) / 32767.0f;
    }

[注意:这不是最佳方式]。

但是,你确定你的相框是单声道吗?如果不是这也可能是音频损坏的原因,因为您只会复制一个频道。

顺便说一句,为什么,如果你的输出缓冲区是float s,你是不是一直在使用它们?