产生平滑的正弦波

Generating a smooth sinusoidal wave

我正在创建一个程序来在很长一段时间内生成正弦波。

目前每次更新都是这样。使用这些时间的起始值 0.0f;

    time += 0.025f;
    if(time > 1.0f)
    {
        time -= 2.0f;
    }

这种方法的问题在于,如您所见,我有一些价值,如果时间超过这个价值,我的计算就会开始中断。所以我需要将其重置为小于该值的值。

以这种方式进行操作,一旦超过该阈值,我的波浪就会明显跳跃。

没有这个限制的平滑正弦波的方法是什么?

您可以使用三角定理对正弦值序列进行迭代。

sin(A+B) + sin(A-B) = 2*sin(A)*cos(B)

因此,如果你想生成值序列 sin(w*k*dt) 那么你只需要计算

s[0] = 0, s[1] = sin(w*dt), cc = 2*cos(w*dt)

然后迭代

s[k+1] = cc*s[k] - s[k-1]

此线性递归在单位圆上具有特征值,因此会累积浮点误差,这可能会导致相移和幅度在很长的时间跨度内发生变化。然而,在本地它总是看起来像一个正弦波。

第二种效果可以通过同时迭代余弦序列c[k]=cos(w*k*dt)来避免,

s[k+1] = c[1]*s[k] + s[1]*c[k]
c[k+1] = c[1]*c[k] - s[1]*s[k]

并定期重新调整 c[k],s[k] 对以使其具有欧氏长度 1。