生成正弦波:输出不正确
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;
仅在一个通道上输出。
【讨论】:
以上是关于生成正弦波:输出不正确的主要内容,如果未能解决你的问题,请参考以下文章