Estoy desarrollando una aplicación de detección de tono para guitarra baja en el iPhone 3GS. Encontré que no puedo obtener datos de sonido inferiores a 150Hz con RemoteIO. Sin embargo, la guitarra baja puede generar tonos inferiores a 50 hz. De acuerdo con el informe "Respuesta de frecuencia de entrada de auriculares del iPhone 4", http://blog.faberacoustical.com/2010/iphone/iphone-4-audio-and-frequency-response-limitations/ Hay una caída brusca por debajo de 150 Hz.Cómo evitar que el iPhone 3GS filtre las frecuencias bajas (<150Hz)
Aquí se muestra cómo configuro la 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));
Esta es la función de devolución de llamada.
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;
}
para identificar la causa raíz,
- he modificado mi función de devolución de llamada para simplemente pasar por alto los datos de entrada a salida.
- Utilice Mac para generar ruido blanco
- Utilice iRig para redirigir la señal del auricular de Mac a iPhone3Gs que ejecuta mi programa.
- Use iRig para redireccionar la salida del iPhone a Mac.
- Registra datos en Mac. El espectro de datos de salida se muestra en la figura a continuación.
Puede ver la caída brusca a 150Hz.
Para identificar si el problema está en el lado de entrada o de salida, cambié la función de devolución de llamada para ignorar los datos de entrada y emitir un ruido blanco. Aquí está el resultado. Muy claro que NO hay caída a 150 Hz. Por lo tanto, el problema debería estar en el lado de entrada.
Pensé que esto es una limitación de hardware. SIN EMBARGO, probé la aplicación "Amplitube" en el mismo dispositivo, apagué todos los efectos, ingresé ruido blanco y analicé la salida. No tiene caída a 150Hz. Aquí está el resultado. Esto significa que el problema de la entrega NO es una limitación de hardware. Debe haber alguna forma en que el software pueda hacer para evitar el problema.
¿Alguien sabe el secreto?
Gracias.
¿Encontró el problema después de todo?Tengo curiosidad por lo que sucedió. –
Lo sentimos, no. Supongo que es causado por la limitación de iOS 4.x. Sé que iOS 5 tiene un "modo de medición". Sin embargo, no lo he probado. – Albert