Pregunta

Estoy tratando de calcular la frecuencia de un determinado proceso de sonido a través del micrófono del iphone.

He leído todos los post sobre FFT (incluyendo todos los apple ejemplos de código e.g aurioTouch,SpeakHere), pero no la solución a este problema.

Estoy usando AudioQueue, pero ¿cómo hago para pasar los datos en bruto "AudioQueueBufferRef" de la AudioQueue función de devolución de llamada (MyInputBufferHandler) inBuffer->mAudioData .A la Real FFT "DSPSplitComplex" tipo de datos, por lo que puedo cómputo.Todo esto usando el Acelerar el marco.

// AudioQueue callback function, called when an input buffers has been filled.
void AQRecorder::MyInputBufferHandler(  void      *                             inUserData,
                                     AudioQueueRef                      inAQ,
                                    AudioQueueBufferRef                 inBuffer,
                                    const AudioTimeStamp *              inStartTime,
                                    UInt32                              inNumPackets,
                                    const AudioStreamPacketDescription* inPacketDesc)
{

 for(int i=0; i<inNumPackets; i++) {
            printf("%d ",((int*)inBuffer->mAudioData)[i]);  
 }      
}

La función FFT.

RealFFTUsageAndTiming(){

COMPLEX_SPLIT   A; //DSPSplitComplex datatype 
FFTSetup        setupReal;  
uint32_t        log2n;  
uint32_t        n, nOver2;  
int32_t         stride; 
uint32_t        i;  
float          *originalReal, *obtainedReal;    
float           scale;

/* Set the size of FFT. */  
log2n = N;  
n = 1 << log2n; 
stride = 1; 
nOver2 = n / 2;     

/* Allocate memory for the input operands and check its availability,    
 * use the vector version to get 16-byte alignment. */

A.realp = (float *) malloc(nOver2 * sizeof(float)); 
A.imagp = (float *) malloc(nOver2 * sizeof(float)); 
originalReal = (float *) malloc(n * sizeof(float)); 
obtainedReal = (float *) malloc(n * sizeof(float));

//How do I pass the data from AudioQueue callback to function?
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);

vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);
}

No he de encontrar en cualquier lugar sobre cómo hacer esto.Por favor, ayuda!

¿Fue útil?

Solución

Tiene que conocer el tipo de datos de datos de los datos en el búfer de audio y los tipos de datos que admite el FFT.Si no son las mismas (en comúnmente, firmado en forma de 16 bits en forma de flotador corta), deberá convertirlo al desempacar y copiar las matrices de los datos de PCM (en A para el bucle).Dados datos reales, puede cero la matriz imaginaria de la entrada a la FFT.

, también, la longitud del búfer de la cola de audio puede no ser la misma que la longitud de FFT, por lo que es posible que tenga que guardar los datos de la devolución de llamada de la cola de audio a otra cola interna a su aplicación, y haga que otro subproceso del trabajador paseDatos a sus rutinas de análisis / FFT a medida que se llena la cola.

Otros consejos

La amplitud de los valores son:

for(i=0;i<nover2;i++) {
    print log10(A.realp[i])
}

Impresión después de usar vdsp_fft_zrip......

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top