首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用端口音频的多音频音频到声卡

使用端口音频的多音频音频到声卡
EN

Stack Overflow用户
提问于 2012-09-27 01:48:06
回答 1查看 1.1K关注 0票数 0

我正在尝试产生声卡的音调(频率: 1950赫兹,持续时间: 40毫秒,电平:-30分贝,右声道(立体声),蒸汽1)。最后,我想播放其中的两个音调(一个去频道1,一个去频道2)。

任何帮助或指导都是非常感谢的。

谢谢你,DW

嗨,比约恩,我试过这个,但我没有得到我期望的频率(加上声音似乎不干净)。有什么好主意吗?我非常感谢任何帮助。

代码语言:javascript
复制
#define SAMPLE_RATE   (44100)
#define TABLE_SIZE   (200)
float FREQUENCY = 422;

...
for(int i=0; i<TABLE_SIZE; i++ )
{
    data.sine[i] = (float) sin( (double)i * ((2.0 * M_PI)/(double)SAMPLE_RATE) * FREQUENCY );
}

data.left_phase = 0;
data.right_phase = 0;
...

... in callback function ...
for(unsigned long i = 0; i < framesPerBuffer; i++ )
{   

  // fill output buffer with sin wave
  *out++ = data->amp * data->sine[data->left_phase];  // left     
  *out++ = data->amp * data->sine[data->right_phase]; // right                  

  data->left_phase += 1;    

  if( data->left_phase >= TABLE_SIZE ) 
    data->left_phase -= TABLE_SIZE;           

  data->right_phase += 1; 

  if( data->right_phase >= TABLE_SIZE ) 
    data->right_phase -= TABLE_SIZE;
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-28 02:20:41

PortAudio有生成音调的示例代码,您只需要计算出频率。例如,见以下答案:

[portaudio]Transmit and Detect frequency - Windows

更新:

与其试图存储正弦数据表,不如使用以下公式计算回调中的正弦值:

振幅= sin( n* desiredFreq *2* pi /样品)

所以(未经测试的)代码如下所示:

代码语言:javascript
复制
typedef struct
{
    long n;
} MyData;

float FREQUENCY = 422;

static int MyCallback(  
                    const void *inputBuffer, 
                    void *outputBuffer,
                    unsigned long framesPerBuffer,
                    const PaStreamCallbackTimeInfo* timeInfo,
                    PaStreamCallbackFlags statusFlags,
                    void *userData 
                  )
{   
    MyData *data = (MyData*)userData;
    float *out = (float*)outputBuffer;    

    (void) timeInfo; /* Prevent unused variable warnings. */
    (void) statusFlags;
    (void) inputBuffer;     

    for(unsigned long i = 0; i < framesPerBuffer; i++ )
    {               
        // fill output buffer with sin wave
        float v = sin( data->n * FREQUENCY * 2 * PI / (float) SAMPLERATE )
        *out++ = v; // left         
        *out++ = v; // right
    }   

    return paContinue;
}

这段代码并非没有问题。最终,n将“包围”,我不确定当输入变得更大时,sin是否保持准确和有效。尽管如此,这是一个很好的起点,如果你只需要在现代硬件上产生几秒钟的音调,这就是你所需要的。如果你需要一些更时尚的东西,首先让它发挥作用,那么你可以担心使用LUT会使它更高效、更健壮。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12612951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档