2015-09-02 126 views
0

我正在創建一個程序,以在很長一段時間內生成正弦波。生成平滑的正弦波

目前我正在這樣做,每一次更新。這些起始值的時間爲0.0f;

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

這種方法的問題是,你可以看到我有一些價值,如果時間超出了我的計算開始打破。所以我需要將它重置爲低於該值的值。

這樣做,一旦通過了該閾值,我的波就會有明顯的跳躍。

什麼是沒有這種限制的平滑正弦波的方法?

回答

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] 

這種線性遞歸上有特徵值單位圓並因此累積浮點錯誤,這可能導致相移a以及在很長的時間跨度內的幅度變化。但是,在本地它將總是看起來像一個正弦波。

第二效果可以通過在同一時間迭代所述餘弦序列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.