0

ピッチ検出には、マイクでキャプチャしたデータを処理するために 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 フレームワークのサンプル レートには影響しません。

新しいオーディオ セッションを作成せずにサンプル レートを変更する可能性はありますか? 問題は、出力ブロックが現在実行中のセッションに属していることです。

4

1 に答える 1

0

を呼び出すsetPreferredSampleRate:error:と、システムはサンプル レートの変更にすぐに (またはそれ以降) 応答しない場合があります。ドキュメントから:

リクエストした変更がすぐに有効にならない場合があります。たとえばsetPreferredDataSource:error:、内蔵マイク ポートのメソッドを使用して、ヘッドセットが接続されているときにフロント マイクを選択できます。この設定は、ヘッドセットが取り外され、オーディオ ルートが変更されるまで有効になりません。

Technical Q&A QA1631 AVAudioSession - Requesting Audio Session Preferencesには、パラメーターの変更に関するガイダンスもあります。

優先値を設定すると、アクティブなオーディオ セッションで何らかのオーディオ システムの再構成が発生するほとんどの場合、オーディオ データ I/O は停止されてから再開されます。したがって、アプリケーションで複数の優先値を設定する予定がある場合は、通常、最初にセッションを非アクティブ化し、設定を設定し、セッションを再アクティブ化してから、実際の値を確認することをお勧めします。

また、Apple Developer Forum のこの投稿によると、iPhone 6S および 6S+ は内蔵スピーカーで 48KHz のみをサポートしています。要求する優先サンプル レートが、ハードウェアで使用されるサンプル レートであると想定しないでください。


これとは別に、11025Hz のサンプル レートで 500Hz で「偏差」が見られる理由がわかりません。それを正確にキャプチャできるはずです。また、44100Hz のサンプル レートで 20 ~ 100Hz をキャプチャできるはずです。バッファ サイズを 4 倍に増やすだけで済みます。

于 2016-06-13T03:09:51.630 に答える