Я разрабатываю приложение для определения высоты звука бас-гитары на iphone 3GS.Я обнаружил, что не могу получить звуковые данные ниже 150 Гц с RemoteIO.Однако бас-гитара может генерировать тоны ниже 50 Гц.Согласно отчету «Частотный отклик гарнитуры 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.
Спектр выходных данных показан на рисунке ниже.![enter image description here](https://i.stack.imgur.com/2icS3.png)
Вы можете увидеть резкое падение на частоте 150 Гц.
Чтобы определить, является ли проблема на стороне ввода или вывода, я изменил функцию обратного вызова, чтобы игнорировать входные данные и выводить белый шум.Вот результат.
Совершенно ясно, что при 150 Гц падение НЕТ.Поэтому проблема должна быть на стороне ввода.
Я думал, что это аппаратное ограничение.ОДНАКО я попробовал приложение «Amplitube» на одном устройстве, отключил все эффекты, ввел белый шум и проанализировал вывод.Он не имеет падения на 150 Гц.Вот результат.
Это означает, что проблема выпадения НЕ является аппаратным ограничением.Должен быть какой-то способ, которым программное обеспечение может помочь избежать этой проблемы.
Кто-нибудь знает секрет?
Спасибо.