2012-08-16 112 views
0

我已经看过这些波的公式,但我无法弄清楚如何实现它们。我能够计算你的正弦波和方波:在程序代码中实现三角形,锯齿形和反锯齿形公式

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); 

但是这会产生一个非常低的音色尖锐和频率变化似乎没有任何效果(我无论如何也听不到)。所以有人可以帮我实施锯齿和三角形?一些解释会很有帮助,因为不像正弦和方形,我不太了解这些公式。

回答

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