OK, all the discussion about sin/cos oscillators and a vector voltmeter for amplitude determination was interesting, but it's not what I actually implemented. (It does come back to answer a different question I posed in the past year about starting two oscillators with a known difference in phase, though.)
Here's what I actually did. I may have cheated by actually using some elements of DDS but not actually using a numerically controlled oscillator.
VCO from an HC4046 running at 8 times the output frequency. Output frequency range was 40-80Hz so the VCO runs at 320-640 Hz.
A divide-by-eight ring counter in HC CMOS.
Ring counter decoded outputs scaled with precision resistors.
Output of ring counter run through 8 poles of VCVS Butterworth low-pass filtering with breakpoint at 100Hz. In retrospect I could've set the breakpoint higher I think (but see below about actual THD measurement).
Result looks really good on a scope. One gotcha: passband ripple in the low-pass filter shows up as variations in output amplitude at the few percent level as I sweep/step the oscillator frequency.
Has the advantage that a digital phase output is available without discriminating on the analog level. Whjen I use this with the phase comparator on the HC4046 to phase-lock to a crystal, I see phase errors in the 10's of nanoseconds, which is not too shabby for an oscillator in the low audio frequency range. To get phase noise that low I had to regulate +5V right at the HC4046. Have not tried a "low-noise" regulator, it's just a 78L05 at this point.
Of course the digital phase taken off the ring counter is not easily related to filtered (analog) phase.
I don't know much about discriminating on analog phase in a good way. The slew rate as the analog signal (say 60Hz at a few volts amplitude) goes through zero is about 100V/sec, which means 100uV/usec. I'm guessing that to get 100nsec phase on the the analog signal that I'm sensitive to noise at the 10 uV level? Is that hard? It doesn't SOUND easy.
I have NOT officially measured the distortion yet.
Tim.