2011-09-13 55 views
0

正弦波から三角形(鋸歯状ではない)の波を形成する方法を見つけるのが難しいです。 C++の正弦波から三角波を作成する

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

しかし、私は三角波に対処するために、これを変更する方法を確認していない:

私は、方形波のためにそれを作成する方法を理解しています。

+1

である私たちはより多くを必要とするかもしれませんこの波をどのように生成しているかについての情報それはどのように表現されますか?どのようにそれを構築しますか?そして、最終的に、これはC++の問題よりも数学的な問題のほうが多いです。 [ここにその数学的な説明があります] –

+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:ダイアグラムなしで説明するのは簡単ではありませんが、ゼロ交差とピークが一致するようにするには、微分を使用することがこれを達成する1つの方法です。正弦波微係数が正の場合は常に、三角波微係数は正で一定になります。逆の場合は負の場合になります。 –

+0

ああ、私はそれが 'sineValue'を直接使用するのに対して90度の位相シフトを強制することを理解します。確かに。 –

1

私はここに、この質問を逃したが非常にクールな数学のトリックです:

asin(cos(x))/1.5708

デバイダの正確な値がそのkidnの何か、1.5708 ....

関連する問題