リモート 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つの要因があると思います:
- マイク ストリームから出力ストリームを生成する際のレイテンシ
- 原音と生成音の振幅差
AudioUnit でこれらの問題をどのように処理できますか?
どうもありがとう!