2014-11-06 85 views
0

初學者在這裏(OSX 10.9.5,Xcode 6)來自portAudio流的樣本FFT FFT

我有一個portAudio流發出噪聲。現在我想獲得回調中生成的隨機值,並通過fftw計劃運行它們。據我所知,fftw需要在主體中執行。那麼我該如何顯示回調中的數字?我有一種感覺,它與指針有關,但這是一個沒有受過教育的猜測......

我在加入兩個不同的庫時遇到了一些困難。小小的幫助將不勝感激,謝謝!

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include "portaudio.h" 
#include "fftw3.h" 



#define NUM_SECONDS (1) 
#define SAMPLE_RATE (44100) 

typedef struct 
{ 
    float left_phase; 
    float right_phase; 
} 
paTestData; 

static int patestCallback(const void *inputBuffer, void *outputBuffer, 
          unsigned long framesPerBuffer, 
          const PaStreamCallbackTimeInfo* timeInfo, 
          PaStreamCallbackFlags statusFlags, 
          void *userData) 
{ 
    /* Cast data passed through stream to our structure. */ 
    paTestData *data = (paTestData*)userData; 
    float *out = (float*)outputBuffer; 
    unsigned int i; 
    (void) inputBuffer; /* Prevent unused variable warning. */ 

    for(i=0; i<framesPerBuffer; i++) 
    { 
     *out++ = data->left_phase; /* left */ 
     *out++ = data->right_phase; /* right */ 

     /* Generate random value that ranges between -1.0 and 1.0. */ 
     data->left_phase = (((float)rand()/(float)(RAND_MAX)) * 2) - 1 ; 

     data->right_phase = (((float)rand()/(float)(RAND_MAX)) * 2) - 1 ; 


     printf("%f, %f\n", data->left_phase, data->right_phase); 
    } 
    return 0; 
} 

/*******************************************************************/ 
static paTestData data; 
int main(void); 
int main(void) 
{ 


    PaStream *stream; 
    PaError err; 


    printf("PortAudio Test: output noise.\n"); 
    /* Initialize our data for use by callback. */ 
    data.left_phase = data.right_phase = 0.0; 
    /* Initialize library before making any other calls. */ 
    err = Pa_Initialize(); 
    if(err != paNoError) goto error; 

    /* Open an audio I/O stream. */ 
    err = Pa_OpenDefaultStream(&stream, 
           0,   /* no input channels */ 
           2,   /* stereo output */ 
           paFloat32, /* 32 bit floating point output */ 
           SAMPLE_RATE, 
           512,  /* frames per buffer */ 
           patestCallback, 
           &data); 
    if(err != paNoError) goto error; 


    err = Pa_StartStream(stream); 
    if(err != paNoError) goto error; 



    /* Sleep for several seconds. */ 
    Pa_Sleep(NUM_SECONDS*1000); 


    err = Pa_StopStream(stream); 
    if(err != paNoError) goto error; 
    err = Pa_CloseStream(stream); 
    if(err != paNoError) goto error; 
    Pa_Terminate(); 
    printf("Test finished.\n"); 
    return err; 
error: 
    Pa_Terminate(); 
    fprintf(stderr, "An error occured while using the portaudio stream\n"); 
    fprintf(stderr, "Error number: %d\n", err); 
    fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err)); 
    return err; 
} 

回答

0

您可以嘗試在「阻止寫入」模式下運行流而不是使用回調。要使用此模式,請在Pa_OpenDefaultStreamstreamCallback參數中傳遞NULL,然後在循環中不斷調用Pa_WriteStream。通話將根據需要進行阻止。像這樣的僞代碼:

Pa_OpenStream(&stream, 0, 2, paFloat32, SAMPLE_RATE, 512, NULL, NULL); 
Pa_StartStream(stream); 
float interleavedSamples[2*512]; 
for (int i = 0 ; i < SAMPLE_RATE/512 ; i++) // approx 1 second 
{ 
    GenerateNoise(&interleavedSamples, 2, 512, &data); 
    RunFft(interleavedSamples, ...); 
    PaWriteStream(stream, interleavedSamples, 512); 
} 
+0

這有幫助,謝謝! – biduramk 2014-11-10 10:24:10