我正在创建一个程序来长时间生成正弦波。
目前我这样做,每次更新。这些起始值为时间0.0f;
time += 0.025f;
if(time > 1.0f)
{
time -= 2.0f;
}
这种方法的问题在于,你可以看到我有一些价值,如果时间超过我的计算开始打破。所以我需要将它重置为低于该值的东西。
这样做,一旦它通过了这个阈值,我的波浪就会出现明显的跳跃。
在没有这种限制的情况下制作平滑正弦波的方法是什么?
答案 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。