Pergunta

Eu estou tentando calcular a frequência de um determinado processo de som através do microfone do iphone.

Eu li todos os post sobre FFT (incluindo todos os da apple exemplos de código e.g aurioTouch,SpeakHere), mas não a solução para este problema.

Eu estou usando AudioQueue, mas como faço para passar os dados brutos "AudioQueueBufferRef" do AudioQueue função de retorno de chamada (MyInputBufferHandler) inBuffer->mAudioData .Para o Real FFT "DSPSplitComplex" tipo de dados, para que eu possa calcular.Tudo isso usando a Acelerar o quadro.

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

A FFT função.

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);
}

Eu não acho em lugar nenhum sobre como fazer isso.Por favor, ajuda!

Foi útil?

Solução

Você tem que saber o tipo de dados C dos dados no buffer de áudio e os tipos de dados que a FFT oferece suporte.Se eles não são o mesmo (comumente 16-bit inteiro assinado versus curto float), então você terá que converter-se enquanto descompactar e copiar as matrizes de PCM de dados (em um loop for).Dado real de dados, você pode zerar o imaginário da matriz de entrada para a FFT.

Além disso, o comprimento da Fila de Áudio buffer não pode ser o mesmo que o da FFT comprimento, de modo que você pode ter para salvar os dados de Áudio Fila de retorno de chamada para outra fila interna para o seu aplicativo, e tem outra thread de trabalho de passar os dados para a sua análise/FFT rotinas como a fila enche.

Outras dicas

Valores de Amplitude são:

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

Imprimi-lo depois de usar vdsp_fft_zrip......

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top