Quadrature Direct Fourier Transform
Disclaimer:  I don't know whether this idea is original, I only know that it works.

Normally, doing DFT (direct fourier transform) means multiplying each data point with the sine and cosine coefficients and then summing the totals for all points.  The resultant sums are then 'vector added' by taking the 'square root of the sum of the squares'.

By choosing only 4 data points per cycle, much of this math can be eliminated.  As with DFT, two sums are made, but the coefficients are always +1 or -1.  Hence, add or subtract - something even low level PIC's can do.

The first sum is made by adding together all of the T1 values minus all of the T3 values.  Notice that at 90 and 270 degrees the value of the sine function is 1 or -1.  The cosine sum is made by adding all of the T2 values and subtracting all of the T4 values where the cosine is either 1 or -1.  The resultant sums can then be squared via lookup table, summed, and the square roots taken by similar means or otherwise.

DTMF tones can be decoded using this method by decoding each of the 8 tones (4 low band and 4 high band) one at a time.  It is also possible to decode all 8 at once by 'scheduling' samples for each of the tones to be near their respective quadrature points.

The first step was to create a schedule of sampling times.  A program was written in Borland Turbo-C (fft8.c).  This program runs forward in time looking for appropriate time slots to take samples for 16 quardruture sums of the 8 frequencis.

It outputs a text file that is then read in as a table in (fdt8.src) and compiled to (fdt8.obj).