在iOS的音调生成器示例中:http://www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html
我正在尝试转换短数组Float32在iOS。
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];
}
由于某些原因,当扬声器播放时,我听到了额外的噪音。我认为有从短到Float32转换的问题?
是的,有。
考虑浮点样本的取值范围为-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,为什么您不自始至终使用它们?
这是一个简短的版本。
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 }
}