Domanda

Sto cercando di calcolare la frequenza di un determinato processo audio attraverso il microfono su iPhone.

Ho letto tutto il post su FFT (compresi tutti gli esempi di Codice Apple E.G Auriotauch, Balkhere), ma non la soluzione a questo problema.

Sto usando Audioqueue, ma come posso passare i dati grezzi "AudioqueBufferref" dalla funzione di richiamata AudioQueue (MyInputBufferHandler) inBuffer-> Maudiodata.Per il tipo di dati "DSPSPLITComplex" FFT effettivo, quindi posso calcolarlo.Tutto questo usando il quadro accelerato.

// 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 funzione 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);
}
.

Non ho trovato ovunque su come farlo.Per favore aiuto!

È stato utile?

Soluzione

È necessario conoscere il tipo di dati C dei dati nel buffer audio e nei tipi di dati che il FFT supporta.Se non sono uguali (comunemente firmati in modo firmato a 16 bit contro float corto), dovrai convertire mentre si disimballa e copiare gli array dei dati PCM (in A per loop).Dato dati reali, è possibile azzerare l'array immaginario dell'ingresso all'FFT.

Inoltre, la lunghezza del buffer della coda audio potrebbe non essere la stessa della lunghezza FFT, quindi è possibile salvare i dati dalla callback della coda audio a un'altra coda interna alla tua app e avere un altro thread del lavoratoreDati alle tue routine di analisi / FFT come riempimento della coda.

Altri suggerimenti

I valori di ampiezza sono:

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

Stampalo dopo aver usato vdsp_fft_zrip ......

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top