生成正弦波:输出不正确

Posted

技术标签:

【中文标题】生成正弦波:输出不正确【英文标题】:Generating a sine wave: incorrect output 【发布时间】:2017-10-04 00:55:42 【问题描述】:

我正在尝试在 rtaudio 中生成一个简单的正弦波,以验证我是否了解正在发生的事情。但是,结果是错误的。

我有一个全局 float timec,以及一个使用 openStream 调用的回调,它应该用样本填充缓冲区。

float freq = 440; // center frequency
int SAMPLE_RATE = 44100;
for (int i = 0; i < numFrames; i++) 
    float v = sin(2 * M_PI * freq * (timec / SAMPLE_RATE));
    outputbuffer[i] = v;
    timec++;

我做错了什么?我听到的不是正弦波,而是低沉的研磨声。

【问题讨论】:

使用你的调试器,让你的调试器显示timec / SAMPLE_RATE的值。例如,timec 为 1 时,1 / 44100 为 0。并且该除法的结果将为零,直到timec 达到 44100 的值。Sp,前 44100 个样本将被计算为sin(0)。这就是 C++ 的工作原理。 @SamVarshavchik 既然 timec 是一个浮点数,它不应该自动提升结果吗? 你从哪里得知timec 是一个浮点数? timec 的声明未在所示代码中给出,并被假定为 int 【参考方案1】:

回答我自己的问题。

Rtaudio 以一种棘手的方式处理输出缓冲区。浮点数组不是针对单个单声道的,它包含代表每个通道一帧的插槽,然后是下一帧的多个插槽,等等。由于此输出有 2 个通道,因此关键校正是:

outputbuffer[2 * i] = v;

仅在一个通道上输出。

【讨论】:

以上是关于生成正弦波:输出不正确的主要内容,如果未能解决你的问题,请参考以下文章

用FPGA产生正弦波

Proteus仿真TLC5615输出1024点正弦波(振幅可调)

如何讲正弦波转化为方波?频率不变。

在 MATLAB 中生成要保存在 .mif 文件中的正弦波

生成正弦波并在浏览器中播放[关闭]

LabVIEW软件中,正弦信号与正弦波的区别