Question

J'essaie de calculer la fréquence d'un processus sonore donné via le microphone sur l'iPhone.

J'ai lu tout le post sur FFT (y compris tous les exemples de code Apple, par exemple Auriotouch, Speakhere), mais pas une solution à ce problème.

J'utilise AudioQueue, mais comment passer les données brutes "AudioIeUeBufferRef" de la fonction de rappel audioeue (MyInputBufferHandler) inbuffer-> Maudiodata. Aux type de données FFT "DSPSPLITCOMPLEX", afin que je puisse le calculer. Tout cela en utilisant le cadre 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 fonction 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);
}

Je n'ai trouvé nulle part sur la façon de faire cela. Aidez-vous!

Était-ce utile?

La solution

Vous devez connaître le type de données C des données dans le tampon audio et les types de données pris en charge. S'ils ne sont pas les mêmes (communément 16 bits signés INT contre flottant court), vous devrez convertir tout en déballant et en copie les tableaux de données PCM (en boucle pour une boucle). Compte tenu des données réelles, vous pouvez à zéro le tableau imaginaire de l'entrée à la FFT.

De plus, la longueur du tampon de file d'attente audio peut ne pas être la même que la longueur FFT, vous devrez donc peut-être enregistrer les données du rappel de file d'attente audio à une autre file d'attente interne à votre application, et demander à un autre thread de travailleur transmettez ces données à votre Routines d'analyse / FFT au fur et à mesure que la file d'attente remplit.

Autres conseils

Les valeurs d'amplitude sont:

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

Imprimez-le après avoir utilisé vdsp_fft_zrip......

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top