2013-09-30 24 views
0

我想知道如何知道端口音頻測試例子的關係以及如何獲取頻率。我想知道如何發送特定頻率到聲卡? 1.如何知道代碼發送到聲卡的具體頻率 2.我怎樣才能發送sin(2 * pi * f * t)和sin((2 * pi * f * t)-3.14)是一個延遲版本。這是代碼。任何幫助高度讚賞如何知道端口音頻採樣測試正弦波代碼的頻率

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

#define NUM_SECONDS (20) 
#define SAMPLE_RATE (44100) 
#define AMPLITUDE  (0.9) 
#define FRAMES_PER_BUFFER (64) 
#define OUTPUT_DEVICE Pa_GetDefaultOutputDeviceID() 
//#define OUTPUT_DEVICE (2) 

#ifndef M_PI 
#define M_PI (3.14159265) 
#endif 

#define TABLE_SIZE (200) 
typedef struct 
{ 
    float sine[TABLE_SIZE]; 
    int left_phase; 
    int right_phase; 
} 
paTestData; 
static int patestCallback( void *inputBuffer, void *outputBuffer, 
          unsigned long framesPerBuffer, 
          PaTimestamp outTime, void *userData) 
{ 
    paTestData *data = (paTestData*)userData; 
    float *out = (float*)outputBuffer; 
    unsigned long i; 
    int finished = 0; 
    (void) outTime; /* Prevent unused variable warnings. */ 
    (void) inputBuffer; 
    for(i=0; i<framesPerBuffer; i++) 
    { 
     *out++ = data->sine[data->left_phase]; /* left */ 
     *out++ = data->sine[data->right_phase]; /* right */ 
     data->left_phase += 1; 
    if(data->left_phase >= TABLE_SIZE) data->left_phase -= TABLE_SIZE; 
    data->right_phase +=2.57; /* higher pitch so we can distinguish left and right. */ 
    if(data->right_phase >= TABLE_SIZE) data->right_phase -= TABLE_SIZE; 
} 
return finished; 

}

/*******************************************************************/ 
int main(void); 
int main(void) 
{ 
PortAudioStream *stream; 
PaError err; 
paTestData data; 
int i; 
printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d, devID = %d\n", 
    SAMPLE_RATE, FRAMES_PER_BUFFER, OUTPUT_DEVICE); 
/* initialise sinusoidal wavetable */ 
for(i=0; i<TABLE_SIZE; i++) 
{ 
    data.sine[i] = (float) (AMPLITUDE * sin(((double)i/(double)TABLE_SIZE) * M_PI * 2.)); 
} 
data.left_phase = data.right_phase = 0; 
err = Pa_Initialize(); 
if(err != paNoError) goto error; 
err = Pa_OpenStream(
      &stream, 
      paNoDevice,/* default input device */ 
      0,    /* no input */ 
      paFloat32, /* 32 bit floating point input */ 
      NULL, 
      OUTPUT_DEVICE, 
      2,   /* stereo output */ 
      paFloat32,  /* 32 bit floating point output */ 
      NULL, 
      SAMPLE_RATE, 
      FRAMES_PER_BUFFER, 
      0,    /* number of buffers, if zero then use default minimum */ 
      paClipOff,  /* we won't output out of range samples so don't bother clipping them */ 
      patestCallback, 
      &data); 
if(err != paNoError) goto error; 
err = Pa_StartStream(stream); 
if(err != paNoError) goto error; 
printf("Play for %d seconds.\n", NUM_SECONDS); fflush(stdout); 
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; 

錯誤: Pa_Terminate(); fprintf(stderr,「使用portaudio流時發生錯誤\ n」); fprintf(stderr,「錯誤號碼:%d \ n」,err); (stderr,「錯誤消息:%s \ n」,Pa_GetErrorText(err)); return err; }

回答

1

快速查看建議SAMPLE_RATE/TABLE_SIZE會爲您提供正弦波的每秒週期數,看起來似乎是〜220Hz,這是一個A3音符。雖然從代碼中我可以看到左聲道正在獲得這個波形,右聲道以2.75倍的基礎速率在基礎頻率上跳躍,我猜這個頻率大約是606Hz,並沒有發出音符,我期望這個例子聽起來很有意思可怕!

要發送Sine和延遲版本,只需使用相位參數的偏移量查找延遲版本,注意正確環繞並將波形添加到一起。您可能需要降低AMPLITUDE以避免削波。

+0

謝謝!我打破了我的想法,試圖理解採樣率,表格大小和相位增量之間的關係,現在一切都清楚了! =) – rcorreia