对于音高检测,我使用Novocaine框架来处理麦克风捕获的数据。
最初 - 我覆盖了原始的Novocaine类,以便设置我自己的(降低的)采样率:
_inputFormat.mSampleRate = PREFERRED_SAMPLING_RATE;// my own value _outputFormat.mSampleRate = PREFERRED_SAMPLING_RATE; // my own value
我将采样率降低到44100.0 / 4.0,以便捕获低频率(s.th。介于20 Hz和100 Hz之间)。这非常好!
当我尝试获得更高的频率(从500 Hz开始的s.th.)时,由于采样率低,我得到偏差。因此,我需要将采样率提高到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框架的采样率没有影响。
是否有可能在不创建新的音频会话的情况下更改采样率?问题是,输出块属于当前运行的会话。
答案 0 :(得分:0)
当您致电setPreferredSampleRate:error:
时,系统可能不会立即(或永远)响应采样率变化。来自文档:
您要求的更改可能不会立即生效。例如,您可以使用内置麦克风端口上的
setPreferredDataSource:error:
方法在插入耳机时选择前置麦克风 - 在拔下耳机并更改音频路径之前,此首选项不会生效。< / p>
还有关于在Technical Q&A QA1631 AVAudioSession - Requesting Audio Session Preferences中更改参数的指导:
在大多数情况下,设置首选值会导致某种音频系统重新配置并激活音频会话,音频数据I / O将停止然后重新启动。因此,如果应用程序计划设置多个首选值,通常建议先停用会话,设置首选项,重新激活会话,然后检查实际值。
根据Apple开发者论坛中的this post,iPhone 6S和6S +仅通过内置扬声器支持48KHz。您永远不应该假设您请求的首选采样率将是硬件使用的采样率。
另外,我不确定为什么你会看到&#39;偏差&#39;在500Hz,采样率为11025Hz - 你应该能够准确地捕获它。您还应该能够以44100Hz的采样率捕获20-100Hz - 您只需要将缓冲区大小增加4倍。