4 ms·
If you want sinusoidal oscillation over time, then you can integrate the second-order differential equation x'' = -ω² x instead. This only costs a few arithmeti
by blt 5y ago
If you want sinusoidal oscillation over time, then you can integrate the second-order differential equation x'' = -ω² x instead. This only costs a few arithmetic instructions per time step. On the other hand, it adds dependency on a state other than the current time, and you must be careful to use energy-conserving integration.
- duped 5y agoHere's a quick way of doing it with one matrix multiplication, you just need to precompute cos(ω) and sin(ω) with a bit of intuition: [ x(n + 1) ] = [cos(ω), -sin(ω)] [ x(n) ] [ y(n + 1) ] [sin(ω), cos(ω)] [ y(n) ] where x(n) = cos(ω n) y(n) = sin(ω n) x(0) = 1 y(0) = 0 ω = frequency (radians) * time_step There are two ways to look at this, from the systems perspective this is computing the impulse response of a critically stable filter with poles at e^(+/-jω). Geometrically, it's equivalent to starting at (1, 0) and rotating around the unit circle by ω radians each time step. You can offset to arbitrary phases. It's not suitable for numerous cases (notably if the frequency needs to change in real time) but provided that the sum of the coefficients sum to `1.0` it's guaranteed stable and will not alias.