In reply to Tony's question:
"It appears that the narrower the pulses come out of these things, the more rich the harmonics. I would love to hear an explanation for any EE types out there."
Here we go...
[Warning: The dangers and pitfalls of distilling a complex subject apply here, plus I'm working mostly from cobwebs (a.k.a., what's left of my ancient and whiskey-soaked memory.) So go easy on me.]
A pure time domain repeating pulse with 50% duty cycle (a square wave) has a frequency domain spectra that contains only odd harmonics. A pure time domain repeating pulse with something other than 50% duty cycle has a frequency domain spectra that contains both odd and even harmonics. So if you desire a signal that produces more harmonics, avoid a square wave. [Actually a sawtooth wave in the time domain is a better choice that has rich (both odd and even) harmonics in the frequency domain.]
The relationship between the harmonics of a time domain signal (e.g., a pulse of different duty cycles) can be found from the Fourier Transform of the time domain signal, which results in the Fourier Series in the frequency domain.
This page has a simple example of the spectra of some common time domain waveforms (including a pulse of varying duty cycle):
This page goes into a bit more depth and has some interactive examples (enable scripting in your web browser):
For more on the Fourier Transform and the resultant Fourier Series See here:
A basic concept when it comes to the relationship between time domain signals f(t) and their frequency domain spectra F(w) where t is time and w is frequency (in radians) is that you can "transform" any time domain signal to/from any frequency domain spectra via Fourier Transform:
f(t) => F(w)
Here f(t) is the time domain signal and F(w) is its frequency domain Fourier Transform, => denotes the transformation.
The concept is based on this: You can generate ANY time domain waveform by adding together an infinite number harmonic and phase related sinusoids each of the proper amplitude as defined by the Fourier Transform. (In practice you can only approximate the waveforms and spectra because an infinite number of sinusoids results in infinite energy). This is one way Arbitrary Waveform Generators work. This works because (only one of many) of the time and frequency domain Functional Relationships of the Fourier Transform - addition:
a*f(t)+b*g(t) => a*F(w)+b*G(w)
Here a and b are amplitudes, * is multiplication, f(t) and g(t) are time domain signals, and F(w) and G(w) are the frequency domain transforms.
From this comes the (grossly over-simplified) adage: "Give me an infinite number of sine wave generators and I'll give you any waveform you want."
Often you will see time and frequency domain expressions written in sines and/or cosines, other times you'll see them written in complex angular (i.e., Euler) notation, e.g., a*e^(jw). See here for a simple interactive demonstration of how the two are equivalent (Warning: Enable scripting/Flash):