ピッチ検出には、マイクでキャプチャしたデータを処理するために Novocaine フレームワークを使用します。
最初に、独自の (縮小された) サンプルレートを設定するために、元の Novocaine クラスを上書きしました。
_inputFormat.mSampleRate = PREFERRED_SAMPLING_RATE;// my own value _outputFormat.mSampleRate = PREFERRED_SAMPLING_RATE; // my own value
低周波数 (20 Hz ~ 100 Hz の間) もキャプチャするために、サンプルレートを 44100.0 / 4.0 に下げました。これは非常にうまく機能します!
より高い周波数 (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 フレームワークのサンプル レートには影響しません。
新しいオーディオ セッションを作成せずにサンプル レートを変更する可能性はありますか? 問題は、出力ブロックが現在実行中のセッションに属していることです。