对于音高检测,我使用 Novocaine 框架来处理麦克风捕获的数据。
最初 - 我覆盖了原来的 Novocaine 类,以便设置我自己的(降低的)采样率:
_inputFormat.mSampleRate = PREFERRED_SAMPLING_RATE;// my own value _outputFormat.mSampleRate = PREFERRED_SAMPLING_RATE; // my own value
我将采样率降低到 44100.0 / 4.0,以便同时捕获低频(20 Hz 和 100 Hz 之间的某个值)。这很好用!
当我尝试获得更高的频率(从 500 Hz 开始)时,由于采样率低,我会出现偏差。因此,我需要将采样率提高到 44100.0 以达到更高的精度。
我的问题:由于 Novocaine 是单例,有没有办法在输出块内动态更改采样率?
由于 Novocaine 依赖于 AVAudioSession,因此我徒劳地尝试执行以下操作:
[audioManager setOutputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels) {
self->ringBuffer->FetchInterleavedData(data, numFrames, numChannels);
[[AVAudioSession sharedInstance] setPreferredSampleRate:NEW_SAMPLING_RATE error:nil];
… }
但这对 Novocaine 框架的采样率没有影响。
是否有可能在不创建新音频会话的情况下更改采样率?问题是,输出块属于当前正在运行的会话。