2011-07-19 10 views
17

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,

  1. he modificado mi función de devolución de llamada para simplemente pasar por alto los datos de entrada a salida.
  2. Utilice Mac para generar ruido blanco
  3. Utilice iRig para redirigir la señal del auricular de Mac a iPhone3Gs que ejecuta mi programa.
  4. Use iRig para redireccionar la salida del iPhone a Mac.
  5. Registra datos en Mac. enter image description here El espectro de datos de salida se muestra en la figura a continuación. enter image description here

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. enter image description here 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. Amplitube frequency response on iPhone 3gs 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.

+0

¿Encontró el problema después de todo?Tengo curiosidad por lo que sucedió. –

+0

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

Respuesta

0

Interesante pregunta. No conozco ningún filtro de ese tipo ... puede establecer una devolución de llamada de entrada en la unidad IO remota y obtener una secuencia de flotadores.

No he visto ninguna documentación que indique que esta corriente flotante ya se haya procesado de alguna manera.

me han escrito un detector de paso, que recoge con éxito las notas en la parte baja de mi rango de canto (~ 80 Hz)

Quizás Código Postal - ¿qué haces dentro de esta devolución de llamada?

+0

Envío ruido blanco a iPhone 3GS y luego grabo la salida de mi programa y amplitube. Mi programa solo crea una unidad de audio RemoteIO y redirige la entrada a la salida. Aquí está la figura de comparación: [link] (https://picasaweb.google.com/lh/photo/MMXDmA2rpZru9elyoRIg4w?feat=directlink) Parece que mi producción baja de 250 Hz ... amplitube es más plano – Albert

+0

'Vaya ... hay nada que ver aqui.' dice Picasa –

+0

Lo sentimos, se olvidó de hacerlo público. ¿Podría probar este [enlace] (https://picasaweb.google.com/shiaoal/Misc#5634398557996613666) – Albert

0

Puedo recomendarle que vuelva a hacer esta pregunta, con un título apropiado (Tal vez algo como "cómo evitar que el iPhone filtre las frecuencias bajas (< 150Hz)" y que contenga toda la información necesaria, también pegue esa imagen , esa es una parte importante de la pregunta. es muy fácil insertar una imagen.

ni siquiera ha declarado qué es lo que está tratando de lograr.

Parece que eres nuevo en el sitio, y parece una pregunta muy interesante.

Pero no está nada claro.

En primer lugar, este es un problema con la grabación o reproducción, o ambos?

Ahora, ¿qué estás haciendo exactamente en tu experimento? Método científico occidental ... establecerlo.

¿Está generando estática en la devolución de llamada de renderizado deIO? No, parece que estás usando un "passthrough", dices que estás poniendo ruido blanco en el iPhone. ¿Cómo estás configurando tu unidad de audio?

por lo que el ruido blanco entra en el iPhone, directamente, y ... ¿qué representa ese gráfico? FFT/Análisis espectral de la salida del iPhone? como estas haciendo eso? ¿Está introduciendo esto en algún software de gráficos OSX que pueda tomar entrada desde la línea?

también, podría hacer con reducirlo. Si está pasando sonido a través del dispositivo, no tiene idea de dónde se está filtrando. por lo que sabemos, podría haber un filtrado en el dispositivo que genera el ruido blanco, así como el dispositivo que grafica la salida del iPhone.

¿qué hay de la generación de su ruido blanco desde el interior de la devolución de llamada de representación de E/S remotas?

y luego generarlo externamente y analizar los datos que llegan desde esta devolución de llamada; podría realizar una FFT.

de todos modos, para la entrada, ¿no le sería mejor alimentar en ondas sinusoidales de diferentes frecuencias?

+0

si lo hace es una pregunta separada, enlace a través de aquí a través de un comentario –

2

Bueno, es un teléfono, un dispositivo optimizado para el habla supuestamente. Y los dispositivos optimizados para voz generalmente tienen algún tipo de filtro de corte LF para evitar ruido y distorsión.

Este filtro está probablemente en el lado de entrada del teléfono, es por eso que puede generar y generar un rango más amplio de frecuencias, es probable que sea un filtro de hardware/elemento discreto, ya que son simples de crear con solo unos pocos componentes y funcionará en tiempo real sin ninguna tensión en el procesamiento.

No creo que tenga sentido reducir los bajos en el software, sé que no lo haría, bueno, para una aplicación DAW puedes hacerlo, pero para un dispositivo optimizado para filtrar bajos ...

Considerado el hecho de que los desarrolladores de amplitube podrían haber tenido conocimiento de este problema y agregaron un impulso extra bajo para tratar de compensar la limitación de hardware?

Por otro lado, puede ser posible elegir diferentes "rutas de señal" de acuerdo con el escenario de uso, tal vez hay algunas aplicaciones que pueden tocar y decir "hey, no soy voz, no corte" mis puntos bajos "- de ser así, esta característica debería estar en algún lugar de la descripción de la API.

Cuestiones relacionadas