Передача данных AudioQueueBufferRef в функцию FFT! - PullRequest
1 голос
/ 16 мая 2011

Я пытаюсь вычислить частоту данного звукового процесса через микрофон на iphone.

Я прочитал весь пост о FFT (включая все примеры кода Apple, например, aurioTouch, SpeakHere), но не решил эту проблему.

Я использую AudioQueue, но как мне передать необработанные данные «AudioQueueBufferRef» из функции обратного вызова AudioQueue (MyInputBufferHandler) inBuffer-> mAudioData. К фактическому типу данных FFT "DSPSplitComplex", так что я могу его вычислить. Все это с помощью фреймворка 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]);  
 }      
}

Функция БПФ.

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

Я нигде не нашел, как это сделать. Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Вы должны знать тип данных C для данных в аудиобуфере и типы данных, которые поддерживает FFT.Если они не одинаковы (обычно 16-разрядное целое число со знаком и короткое число с плавающей запятой), то вам придется конвертировать при распаковке и копировании массивов данных PCM (в цикле for).Учитывая реальные данные, вы можете обнулить воображаемый массив входных данных для БПФ.

Кроме того, длина буфера аудио-очереди может не совпадать с длиной FFT, поэтому вам может потребоваться сохранить данные из обратного вызова аудио-очереди в другую внутреннюю очередь вашего приложения и иметь другого работникапоток передает эти данные в ваши процедуры анализа / БПФ по мере заполнения очереди.

0 голосов
/ 10 сентября 2011

Значения амплитуды:

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

Распечатайте его после использования vdsp_fft_zrip ......

...