生成平滑的正弦波

时间:2015-09-02 08:35:51

标签: math waveform sin

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

目前我这样做,每次更新。这些起始值为时间0.0f;

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

这种方法的问题在于,你可以看到我有一些价值,如果时间超过我的计算开始打破。所以我需要将它重置为低于该值的东西。

这样做,一旦它通过了这个阈值,我的波浪就会出现明显的跳跃。

在没有这种限制的情况下制作平滑正弦波的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用三角定理来获得正弦值序列的迭代。

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。