 |
Fast sine wave calculation
Type : waveform generation References : James McCartney in Computer Music Journal, also the Julius O. Smith paper
Notes : (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.
Code : 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 |
Comments
Added on : 22/04/03 by kainhart[at]hotmail[ DOT ]com Comment : try using this to make sine waves with frequency less that 1. I did and it gives very rough half triangle-like waves. Is there any way to fix this? I want to use a sine generated for LFO so I need one that works for low frequencies.
Added on : 24/10/06 by asynth[ AT ]io[ DOT ]com Comment : looks like the formula has gotten munged.
w = freq * twopi / samplerate
|
Add your own comment
Comments are displayed in fixed width, no HTML code allowed! |
|
|
 |
|