在程序代码中实现三角形,锯齿形和反向锯齿形公式

时间:2012-08-16 22:49:50

标签: math sine

我已经看过这些波的公式,但我无法弄清楚如何实现它们。我能够找到SINE和SQUARE波浪:

float x = note.frequency / AppSettings::sampleRate;
float theta_increment = 2.0f * M_PI * x;
float value = 0;

if(waveType == SINE){
    value = sin(theta_increment);
}
else if (waveType == SQUARE){
    value = sin(note.theta);
    value = (value > 0) - (value < 0);
}

我尝试的公式是based on this example以及维基的解释:

square(t) = sgn(sin(2πt))

// this is how I tried to implement it
theta_increment - floor(theta_increment - 0.5f);

但这会产生非常低的发声音调,频率变化似乎没有任何影响(不管怎样我都听不到)。那么有人可以帮我实现锯齿和三角形吗?一些解释会非常有用,因为与正弦和方形不同,我不太了解这些公式。

1 个答案:

答案 0 :(得分:3)

Delphi代码。我希望公式很清楚。频率和幅度是一致的。

  w := 1.0;   // angular frequency
  for i := 0 to 999 do begin
    t := i * 2 * Pi / 400 - 3/2 * Pi; // just X-axis scale
    wt := w * t;
    f := wt / (2.0 * Pi); //frequency

    sn := sin(wt);                      // sine wave

    saw := 2.0 * (f - Floor(f)) - 1.0;  //sawtooth

    f := f + 0.25;
    tr := Abs(4 * (f - Floor(f + 0.5))) - 1.0;  //triangle

    Series1.AddXY(t, sn);
    Series2.AddXY(t, saw);
    Series3.AddXY(t, tr);
  end;

结果:

enter image description here