对于基音检测,我使用Novocaine框架来处理麦克风捕获的数据。
最初-我重写了原来的Novocaine类,以便设置我自己的(降低的)采样率:
_inputFormat.mSampleRate =首选抽样率;//我自己的值_outputFormat.mSampleRate = PREFERRED_SAMPLING_RATE;//我自己的值
我将采样率降低到44100.0 / 4.0,以便捕获低频信号(s.th )。在20赫兹至100赫兹之间)这个很好用!
当我试图获得更高的频率(s.th )。从500 Hz开始,由于采样率低,我得到了偏差。因此,为了达到更高的精度,我需要将采样率提高到44100.0。
我的问题是:由于诺沃卡因是一个单例,有没有一种方法可以动态地改变输出块内的采样率?
由于诺沃卡因依赖AVAudioSession,我试图做以下工作,但没有成功:
[audioManager setOutputBlock:^(float *data, UInt32 numFrames, UInt32 numChannels) {
self->ringBuffer->FetchInterleavedData(data, numFrames, numChannels);
[[AVAudioSession sharedInstance] setPreferredSampleRate:NEW_SAMPLING_RATE error:nil];
… }但这对诺沃卡因框架的采样率没有影响。
是否有可能在不创建新的音频会话的情况下更改采样率?问题是,输出块属于当前正在运行的会话。
发布于 2016-06-13 03:09:51
当您调用setPreferredSampleRate:error:时,系统可能不会立即(或永远)响应采样速率的变化。从医生那里:
所请求的更改可能不会立即生效。例如,您可以使用内置麦克风端口上的
setPreferredDataSource:error:方法在耳机插入时选择前端麦克风--直到耳机拔出和音频路由更改时,此首选项才会生效。
还有关于在技术Q&A QA1631 AVAudioSession -请求音频会话首选项中更改参数的指导
在大多数情况下,设置一个首选值会导致某种类型的音频系统与活动音频会话重新配置,音频数据I/O将被停止,然后重新启动。因此,如果应用程序计划设置多个首选值,通常建议先禁用会话、设置首选项、重新激活会话,然后检查实际值。
在苹果开发者论坛( Apple )上,每一个这个职位,iPhone 6S和6S+只通过内置扬声器支持48 the。永远不要假设您请求的首选采样率是硬件使用的采样率。
另外,我不知道你为什么会看到500赫兹的偏差,采样频率为110~25赫兹--你应该能够准确地捕捉到这一点。你也应该能够捕获20-100赫兹的采样率为44100赫兹-你将只需要增加你的缓冲区大小的4倍。
https://stackoverflow.com/questions/31591686
复制相似问题