Zajmuję się tworzeniem aplikacji do wykrywania wysokości gitary basowej w telefonie iPhone 3GS. Zauważyłem, że nie mogę uzyskać danych dźwiękowych poniżej 150 Hz za pomocą RemoteIO. Jednak gitara basowa może generować dźwięki niższe niż 50 Hz. Zgodnie z raportem "Odpowiedź częstotliwości wejściowej zestawu słuchawkowego iPhone 4", http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/ Występuje gwałtowny spadek poniżej 150 Hz.Jak uniemożliwić iPhone 3GS filtrowanie niskich częstotliwości (<150 Hz)?
Tutaj pokazuje, jak skonfigurować 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));
To jest funkcja zwrotna.
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;
}
Aby zidentyfikować przyczynę,
- zmodyfikowałem mój funkcji zwrotnej po prostu ominąć dane wejściowe do wyjścia.
- Używanie komputera Mac do generowania białego szumu
- Użyj iRig, aby przekierować sygnał z zestawu słuchawkowego Maca na iPhone3Gs, na którym działa mój program.
- Użyj iRig, aby przekierować wyjście iPhone'a z powrotem do Maca.
- Zapisuj dane na komputerze Mac.
Spektrum danych wyjściowych przedstawiono na poniższym rysunku.
Widać gwałtowny spadek przy 150 Hz.
Aby zidentyfikować problem po stronie wejścia lub wyjścia, zmieniłem funkcję wywołania zwrotnego, aby ignorować dane wejściowe i generować biały szum. Oto wynik. Bardzo jasne, że NIE ma spadku przy 150 Hz. Dlatego problem powinien być po stronie wejściowej.
Myślałem, że to ograniczenie sprzętowe. JEDNAKŻE próbowałem aplikacji "Amplitube" na tym samym urządzeniu, wyłącz wszystkie efekty, wprowadź biały szum i zanalizuj wynik. Ma wartość NO przy 150 Hz. Oto wynik. Oznacza to, że problem z zrzutem NIE jest ograniczeniem sprzętowym. Musi istnieć sposób, w jaki oprogramowanie może zrobić, aby uniknąć problemu.
Czy ktoś zna sekret?
Dzięki.
znalazłeś problem mimo wszystko?Jestem ciekawy, co się stało. –
Niestety, jeszcze nie. Przypuszczam, że jest to spowodowane ograniczeniem iOS 4.x. Wiem, że iOS 5 ma "tryb pomiaru". Jednak nie testowałem tego. – Albert