如何使用本机定点类型(8.24)进行iOS音频处理

如何使用本机定点类型(8.24)进行iOS音频处理,ios,core-audio,fixed-point,Ios,Core Audio,Fixed Point,因此,我想适当地将-1到+1范围内的浮动缩放为具有如下设置的流格式的曲线图所期望的格式: size_t bytesPerSample = sizeof (AudioUnitSampleType); // is 4 bytes stereoStreamFormat.mFormatID = kAudioFormatLinearPCM; stereoStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonic

因此,我想适当地将-1到+1范围内的浮动缩放为具有如下设置的流格式的曲线图所期望的格式:

size_t bytesPerSample = sizeof (AudioUnitSampleType); // is 4 bytes

stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;                    
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate        = graphSampleRate; // 44.1k
sampleValueLeft = (Fixed) (floatVal * 32767.0f); 
// there doesn't seem to be any difference whether i cast into 
// SInt16 or SInt32 (which the Fixed type is defined to be)..
帮助我设置图表,但当我像这样投射浮点时:

size_t bytesPerSample = sizeof (AudioUnitSampleType); // is 4 bytes

stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;                    
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate        = graphSampleRate; // 44.1k
sampleValueLeft = (Fixed) (floatVal * 32767.0f); 
// there doesn't seem to be any difference whether i cast into 
// SInt16 or SInt32 (which the Fixed type is defined to be)..
它可以工作,信号听起来不错,但非常安静。所以我做的缩放是错误的? 按更大的数字缩放会弄乱信号。听起来不像剪辑,输出音量也不会变大。我不打算深入学习定点数学,我所需要的只是一行代码,将其转换为正确的格式

谢谢大家!


编辑:之前我一直在使用不同的流格式,我不知道如何正确使用立体声信号。使用这种不同的设置,我对输出音量没有任何问题,因此我认为增益问题一定与缩放有关…

我讨厌8.24,因为我认为没有方便的函数来计算它

反建议:在图形的前面放置一个转换器单元(AUConverter),并将输入设置为对您更方便的值,比如16位整数或其他什么(我总是在iOS上使用整数…浮点数可以进入转换器,但我不会指望它)。不要将转换器的输出设置为BD;它将默认为音频单元规范(8.24)。事实上,看看你是否可以在不使用AUConverter的情况下在第一台设备上设置一个方便的ASBD。

阅读本文,这是一个关于iOS 8.24格式的非常好的解释

结论如下:
基本上,它告诉您前(左)8位仅用于(+/-)符号,其余24位为声音。
因此,如果您想将其转换为Sint16,请将位9向右移位并强制转换。这样(+/-)符号将保留在中作为第一位,声音数据将降低到较低的精度。
如果要将其作为(+/-)1到0范围内的浮点,请将其除以最大可能值32768

代码如下:

    SInt16 sampleInt16 = (SInt16)(samples[i] >> 9);
    float sampleFloat = sampleInt16 / 32768.0;