在 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 <= Xn <= 1.0
和 signed short
是-32767 <= Xn <= +32767
.仅仅类型转换将导致几乎所有 sample 上的剪裁。
所以考虑到这一点:
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;
}
[注意:这不是执行此操作的最佳方式]。
但是,你确定你的框架是单声道的吗?如果不是,这也可能是音频损坏的原因,因为您只会复制一个 channel 。
顺便说一句,为什么,如果你的输出缓冲区是 float
你不是一直在使用它们吗?
关于ios - 将 16 位短整型转换为 32 位浮点型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529857/