Detección de una palmada en IOS

Estoy intentando crear una aplicación IOS que count aplausos. He estado viendo los videos de WWDC en CoreAudio, y el tema parece tan vasto que no estoy seguro de dónde mirar.

He encontrado problemas similares aquí en stackoverflow. Aquí hay uno en C # para detectar un golpe de puerta: dado un flujo de audio, encuentre cuándo se cierra una puerta (¿cálculo del nivel de presión de sonido?)

Parece que necesito hacer esto:

  1. Divida las muestras en secciones
  2. Calcule la energía de cada sección
  3. Tome la relación de las energías entre la window anterior y la window actual
  4. Si la relación excede algún umbral, determine que hubo un fuerte ruido repentino.

No estoy seguro de cómo lograr esto en Objective-C. He podido averiguar cómo muestrear el audio con SCListener. Aquí está mi bash:

- (void)levelTimerCallback:(NSTimer *)timer { [recorder updateMeters]; const double ALPHA = 0.05; double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; if ([recorder peakPowerForChannel:0] == 0) totalClapsLabel.text = [NSString stringWithFormat:@"%d", total++]; SCListener *listener = [SCListener shanetworkingListener]; if (![listener isListening]) return; AudioQueueLevelMeterState *levels = [listener levels]; Float32 peak = levels[0].mPeakPower; Float32 average = levels[0].mAveragePower; lowPassResultsLabel.text = [NSString stringWithFormat:@"%f", lowPassResults]; peakInputLabel.text = [NSString stringWithFormat:@"%f", peak]; averageInputLabel.text = [NSString stringWithFormat:@"%f", average]; } 

introduzca la descripción de la imagen aquí

Aunque veo el algorithm sugerido, no estoy claro en cuanto a cómo implementarlo en Objective-C.

¿No mencionaste qué class de fidelidad de detección estás buscando? Solo para verificar algún tipo de cambio de "presión" de sonido puede ser totalmente adecuado para sus necesidades, sinceramente.

Sin embargo, tenga en count que los golpes en el teléfono pueden terminar siendo una muy baja frecuencia y un impulso de gran potencia tal que activará su detector, aunque no sea una verdadera palmada. Lo mismo ocurre con fonts de sonido de muy alta frecuencia que tampoco son aplaudibles.

¿Esto está bien para sus necesidades?

Si no es así y está esperando algo de mayor fidelidad, creo que sería mejor hacer un análisis espectral (FFT) de la señal de input y luego search en una banda de frecuencia mucho más estrecha para get un pico agudo de señal, similar a la parte que usted ya tengo.

No he mirado atentamente esta fuente, pero aquí hay un código FFT de código abierto que posiblemente podría usar como está para su aplicación para iPhone:

Editar: https://github.com/alexbw/iPhoneFFT

Lo bueno de graficar el resultado espectral es que debería hacer que sea bastante fácil sintonizar qué range de frecuencia realmente te importa. En mis propias testings con algún software portátil que tengo, mis palmadas tienen un pico muy fuerte en torno a 1kHz – 2kHz.

Posiblemente exagerado por lo que necesite, pero si necesita algo de mayor fidelidad, entonces sospecho que no estará satisfecho con simplemente rastrear un pico de señal sin saber qué range de frecuencia condujo a la señal de pico en el primer lugar.

Aclamaciones

Utilicé FFT para mi aplicación https://itunes.apple.com/us/app/clapmera/id519363613?mt=8 . Clap en el dominio de frecuencia se ve como una constante (no perfecta).

Saludos