iPhone 3GSでベースギターのピッチ検出アプリを開発しています。RemoteIO で 150Hz より低いサウンド データを取得できないことがわかりました。ただし、ベースギターは 50hz よりも低いトーンを生成する場合があります。レポート「iPhone 4 ヘッドセットの入力周波数応答」によると、http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/ 150 を下回ると急激に低下します。ヘルツ。
ここでは、AudioUnit のセットアップ方法を示します。
// set audio unit
{
// create AudioUnit
{
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
AudioComponent comp = AudioComponentFindNext(NULL, &desc);
OSAssert(AudioComponentInstanceNew(comp, &m_AudioUnit));
}
//enable input on the remote I/O unit (output is default enabled, but input is not)
{
UInt32 one = 1;
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input, 1, &one, sizeof(one)));
}
//set render callback function
{
AURenderCallbackStruct callbackInfo;
callbackInfo.inputProc=staticPerformThru;
callbackInfo.inputProcRefCon=this;
OSAssert(AudioUnitSetProperty(m_AudioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0, &callbackInfo, sizeof(callbackInfo)));
}
//set in/output format
{
CAStreamBasicDescription outFormat;
outFormat.SetAUCanonical(channels, false);
outFormat.mSampleRate = sampleRate;
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outFormat, sizeof(outFormat)));
OSAssert(AudioUnitSetProperty(m_AudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &outFormat, sizeof(outFormat)));
}
//Initialize remote I/O unit
OSStatus r=AudioUnitInitialize(m_AudioUnit);
OSAssert(r);
}
//start audio output
OSAssert(AudioOutputUnitStart(m_AudioUnit));
これがコールバック関数です。
OSStatus AudioThruWorker::staticPerformThru(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioUnitRender(((AudioThruWorker*)inRefCon)->m_AudioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
//Detect pitch here...
return 0;
}
根本原因を特定するには、
- 入力データをバイパスして出力するようにコールバック関数を変更しました。
- Mac を使用してホワイト ノイズを生成する
- iRig を使用して、Mac のヘッドセットから私のプログラムを実行している iPhone3G に信号をリダイレクトします。
- iRig を使用して、iPhone の出力を Mac にリダイレクトします。
- Macでデータを記録します。
出力データのスペクトルを下図に示します。

150Hzで急激な落ち込みが見られます。
問題が入力側か出力側かを特定するために、コールバック関数を変更して入力データを無視し、ホワイト ノイズを出力しました。これが結果です。
150 Hz でドロップがないことは非常に明確です。したがって、問題は入力側にあるはずです。
これはハードウェアの制限だと思いました。ただし、同じデバイスでアプリ「Amplitube」を試し、すべてのエフェクトをオフにし、ホワイトノイズを入力して出力を分析しました。150Hzでのドロップはありません。これが結果です。
これは、ドロップオフの問題がハードウェアの制限ではないことを意味します。問題を回避するためにソフトウェアができる何らかの方法があるはずです。
その秘密を知っている人はいますか?
ありがとう。