Fast sine wave calculation¶
- Author or source: James McCartney in Computer Music Journal, also the Julius O. Smith paper
- Type: waveform generation
- Created: 2002-01-17 00:52:33
(posted by Niels Gorisse) If you change the frequency, the amplitude rises (pitch lower) or lowers (pitch rise) a LOT I fixed the first problem by thinking about what actually goes wrong. The answer was to recalculate the phase for that frequency and the last value, and then continue normally.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Variables: ip = phase of the first output sample in radians w = freq*pi / samplerate b1 = 2.0 * cos(w) Init: y1=sin(ip-w) y2=sin(ip-2*w) Loop: y0 = b1*y1 - y2 y2 = y1 y1 = y0 output is in y0 (y0 = sin(ip + n*freq*pi / samplerate), n= 0, 1, 2, ... I *think*) Later note by James McCartney: if you unroll such a loop by 3 you can even eliminate the assigns!! y0 = b1*y1 - y2 y2 = b1*y0 - y1 y1 = b1*y2 - y0