Math 产生平滑的正弦波

Math 产生平滑的正弦波,math,waveform,trigonometry,Math,Waveform,Trigonometry,我正在创建一个程序,在很长一段时间内生成正弦波 目前我正在这样做,每次更新。时间0.0f的这些起始值 time += 0.025f; if(time > 1.0f) { time -= 2.0f; } 这种方法的问题是,正如你所看到的,我有一些价值,如果时间超过这个价值,我的计算就会开始中断。所以我需要将其重置为小于该值的值 这样做的话,一旦我的波浪超过这个阈值,它就会有明显的跳跃 没有这个限制的平滑正弦波的方法是什么?你可以使用三角定理得

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

目前我正在这样做,每次更新。时间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。

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

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。

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

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。

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

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]、
使其欧几里德长度为1。

在最后一条注释上要明确:计算
l=sqrt(c[k]*c[k]+s[k]*s[k])
然后按
s[k]
c[k]
在最后一条注释上要明确:计算
l=sqrt(c[k]*c[k]+s[k]]
s[k]
c[k]
by
1/l
在最后一条评论上要明确:计算
l=sqrt(c[k]*c[k]+s[k]*s[k])
然后按
s[k]
c[k]
by
1/l
在最后一条评论上要明确:计算
l=sqrt(c[k]+s[k]*s]
然后按
1/l
缩放
s[k]
c[k]