2

リモート I/O を使用して、iOS でアクティブ ノイズ キャンセリングを実行しようとしています。オーディオ バッファを 8.24 固定小数点形式で取得し、スピーカーにも配置できました。現在、マイクを介して( onlinetonegenerator.comを使用して)正弦波をキャプチャし、コールバックを介して取得している各フレームのマグニチュードを反転しようとしています。ここに私のコードがあります:

static OSStatus PerformThru(
                        void                        *inRefCon, 
                        AudioUnitRenderActionFlags  *ioActionFlags, 
                        const AudioTimeStamp        *inTimeStamp, 
                        UInt32                      inBusNumber,
                        UInt32                      inNumberFrames, 
                        AudioBufferList             *ioData) {

 AppDelegate *THIS = (AppDelegate *)inRefCon;
 OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

 for(int i = 0; i < ioData->mNumberBuffers; ++i) {
     Float32 *flptr = (Float32 *)ioData->mBuffers[i].mData;       
     for(int j = 0; j < inNumberFrames; ++j) {
         *flptr *= -1.;   // inverting the buffer value
         flptr++;
     }
 }

 return err;
}

しかし、出力トーンは破壊的な干渉を引き起こしているようには見えません。アプリを実行しているときに振幅が周期的に変化することを感じていますが、入力音はキャンセルされていません。

さらに2つの要因があると思います:

  1. マイク ストリームから出力ストリームを生成する際のレイテンシ
  2. 原音と生成音の振幅差

AudioUnit でこれらの問題をどのように処理できますか?

どうもありがとう!

4

1 に答える 1

0

を使っているようですkAudioUnitSubType_RemoteIO。使ってみましたkAudioUnitSubType_VoiceProcessingIOか?役立つかもしれません。

このオーディオ ユニットは、着信オーディオの信号処理を行います (着信オーディオから、特定の時間にデバイスから再生されるオーディオを取り出します)。

于 2014-02-16T10:36:36.753 に答える