ios 将16位短型转换为32位浮点型

ruarlubt  于 2023-06-07  发布在  iOS
关注(0)|答案(2)|浏览(361)

在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的转换有问题。

wvyml7n5

wvyml7n51#

是的,有。
考虑浮点样本的值范围为-1.0 <= Xn <= 1.0signed 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;
    }

[Note:这不是做这件事的最佳方式]。
但是,你确定你的框架是单声道的吗?如果没有,这也可能是音频损坏的原因,因为您将只复制一个通道。
顺便说一句,为什么,如果你的输出缓冲区是float s,你不使用他们在整个?

inb24sb2

inb24sb22#

这是一个Swift版本。

let floatBuffer = UnsafeMutableBufferPointer<Float32>(start: buffer.floatChannelData![0], count: frameLength)
    data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) in
        let int16Buffer = bytes.bindMemory(to: Int16.self)
        let float32Buffer = UnsafeMutableBufferPointer(start: floatBuffer.baseAddress, count: floatBuffer.count)
        (0..<frameLength).forEach { float32Buffer[$0] = Float32(int16Buffer[$0]) / 32767.0 }
    }

相关问题