产生平滑的正弦波
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。
我正在创建一个程序来在很长一段时间内生成正弦波。
目前每次更新都是这样。使用这些时间的起始值 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。