2011-09-13 124 views
0

我無法找出如何形成一個三角形(未鋸齒)從一個正弦波波的三角波。創建從在C++中的正弦波

我知道如何去創造一個方波:

if(sineValue >= 0) 
     value = amp; 
    else 
     value = -amp; 

但我不知道如何改變這種以適應三角波。

+1

我們可能需要更多關於你如何產生這一波的信息。它是如何表示的?你如何建立它?最終,這比C++更像是一個數學問題。 [這是它的數學描述。](http://en.wikipedia.org/wiki/Triangle_wave) –

+1

似乎他希望能夠將正弦波Y值轉換爲三角波Y值。更多的是一個數學問題,而不是編程。 – tenfour

+0

雖然有趣! –

回答

4

的三角波爲方波的積分。所以,你需要整合(和)你方波隨着時間的推移:

if (sineValue >= 0) 
{ 
    value += delta; 
} 
else 
{ 
    value -= delta; 
} 

注意,這可以更簡潔地寫爲:

value += (sineValue >= 0) ? delta : -delta; 
+0

這是否需要正常化? –

+0

@Tomalak:是的。但是,這是一個不同的問題(這取決於正弦波的頻率。如果你知道正弦波的頻率,那麼你可以生成三角波*先天*!) –

+0

這將帶來嚴重的和DC雖然偏移.. 。 – tdammers

1

您可以使用正弦波的導數的符號產生一個三角波這樣的:

if (sineValue - oldSineValue >= 0) 
{ 
    value += delta; 
} 
else 
{ 
    value -= delta; 
} 
oldSineValue = sineValue; 

您需要選擇三角形給你的三角波所需的幅度,而這當然會取決於正弦波的頻率波和採樣率。

這種方法的優點是,三角波和正弦波具有相同的相位,即,峯值和過零點重合。

+0

爲什麼正弦波的導數? –

+0

@Oli:如果沒有圖表就不容易解釋,但是如果您想要零交叉點和峯值重合,那麼使用導數就是實現此目的的一種方法。在正弦波導數爲正數的任何地方,您都希望三角波導數爲正值且爲常數,反之亦然*爲負值。 –

+0

哦,我知道它會強制執行90度相移,而不是直接使用'sineValue'。確實。 –

1

我錯過了這個問題,這裏是一個非常酷的數學技巧:

asin(cos(x))/1.5708

的devider的精確值是kidn的東西,1.5708 ....