DSP Trick: Sinusoidal Tone Generator

Subject: Trick : Tone Generation
From: Darrell <darrell@havoc.gtf.org>
Date: 1999/04/19
Newsgroups: comp.dsp
THIS WORK IS PLACED IN THE PUBLIC DOMAIN

Name: Sinusoidal tone generator

Category: Algorithm

Application: If they need to generate a continuous tone of specific frequency and amplitude.

Advantages: Fast and accurate.

Introduction:

I've seen this trick in a few different places, although never the (very simple) deriviation. It is based on the z-transform for sin(wn).

The Trick:

                                    -1
                            sin(w)*z
   y(w) = F{sin(wn)} = ----------------------       [1, pg. 159]
                                   -1    -2
                       1 - cos(w)*z   + z
                       -1    -2            -1
   y(w)*[1 - 2*cos(w)*z   + z  ] = sin(w)*z

Taking the inverse z-transform:

   y[n] - 2*cos(w)*y[n-1] + y[n-2] = sin(w)*delta[n-1] = 0
   y[n] = 2*cos(w)*y[n-1] - y[n-2]

Solving for the initial conditions (start at n=1 since y[0] and y[-1] are so trivial to compute):

   y[0]  = sin(0) = 0
                              Ft              Ft
   y[-1] = sin(-w) = sin(-2*pi*--) = -sin(2*pi*--)
                              Fs              Fs

where Ft is the tone frequency and Fs is the sampling frequency. For example, to generate a 1 kHz tone with a sampling frequency of 8 kHz:

   y[0]   = 0
   y[-1]  = 1/sqrt(2) ~= 0.7071
   cos(w) = 1/sqrt(2) ~= 0.7071
   y[n] = 1.414*y[n-1] - y[n-2]
   n |  y[n-2] |  y[n-1] |   y[n]
  ---+---------+---------+---------
   1 |  0.7071 |  0.0000 | -0.7071
   2 |  0.0000 | -0.7071 | -1.0000
   3 | -0.7071 | -1.0000 | -0.7071
   4 | -1.0000 | -0.7071 |  0.0000
   5 | -0.7071 |  0.0000 |  0.7071
   6 |  0.0000 |  0.7071 |  1.0000
   7 |  0.7071 |  1.0000 |  0.7071
   8 |  1.0000 |  0.7071 |  0.0000

Note that all calculations were done with 64-bit floating point and rounded by hand.

The z-transform of this shows two poles on the unit circle at +/- pi/4 radians. I've never encountered stability issues but care should be taken to evaluate quantization effects on the system.

References:

[1] Discrete-Time Signal Processing [Opp89]