¡Pasando datos AudioQueueBufferRef a la función FFT!

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

He leído toda la publicación sobre FFT (incluidos todos los ejemplos de código de Apple, por ejemplo, aurioTouch, SpeakHere), pero no la solución a este problema.

Estoy usando AudioQueue, pero ¿cómo puedo pasar los datos sin procesar "AudioQueueBufferRef" de la función de devolución de llamada AudioQueue (MyInputBufferHandler) inBuffer-> mAudioData. Al tipo de datos "DSPSplitComplex" de FFT real, para que pueda calcularlo. Todo esto usando el marco Accelerate.

// 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 encontrado ningún lugar sobre cómo hacer esto. ¡Por favor ayuda!

preguntado el 16 de mayo de 11 a las 18:05

2 Respuestas

Debe conocer el tipo de datos C de los datos en el búfer de audio y los tipos de datos que admite la FFT. Si no son iguales (comúnmente int con signo de 16 bits versus float corto), entonces tendrá que convertir mientras desempaqueta y copia las matrices de datos PCM (en un bucle for). Dados los datos reales, puede poner a cero la matriz imaginaria de la entrada a la FFT.

Además, la longitud del búfer de la cola de audio puede no ser la misma que la longitud de la FFT, por lo que es posible que deba guardar los datos de la devolución de llamada de la cola de audio en otra cola interna de su aplicación y hacer que otro hilo de trabajo pase esos datos a su rutinas de análisis / FFT a medida que se llena la cola.

contestado el 16 de mayo de 11 a las 23:05

Los valores de amplitud son:

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

Imprímelo después de usarlo vdsp_fft_zrip......

respondido 12 nov., 12:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.