0

对于音高检测,我使用 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 框架的采样率没有影响。

是否有可能在不创建新音频会话的情况下更改采样率?问题是,输出块属于当前正在运行的会话。

4

1 回答 1

0

当您调用setPreferredSampleRate:error:时,系统可能不会立即(或永远)响应采样率的变化。从文档:

您请求的更改可能不会立即生效。例如,您可以使用setPreferredDataSource:error:内置麦克风端口上的方法在插入耳机时选择前置麦克风 - 此首选项在拔下耳机并且音频路由更改后才会生效。

在Technical Q&A QA1631 AVAudioSession - Requesting Audio Session Preferences中也有关于更改参数的指导:

在大多数情况下,设置首选值会导致某种音频系统重新配置活动音频会话,音频数据 I/O 将停止然后重新启动。因此,如果应用程序计划设置多个首选值,通常建议先停用会话,设置首选项,重新激活会话,然后检查实际值。

根据苹果开发者论坛的这篇帖子,iPhone 6S 和 6S+ 仅通过内置扬声器支持 48KHz。您永远不应假设您请求的首选采样率将是硬件使用的采样率。


另外,我不确定为什么您会在 11025Hz 的采样率下看到 500Hz 的“偏差”——您应该能够准确地捕捉到它。您还应该能够以 44100Hz 的采样率捕获 20-100Hz - 您只需将缓冲区大小增加 4 倍。

于 2016-06-13T03:09:51.630 回答