[time-nuts] Broadband synthesizer

John Miles jmiles at pop.net
Thu Jul 14 07:39:51 UTC 2011


> Ok, I have a dds receiver locked to a gpsdo, the radio can only be tuned
in  1
> hz increments but should be dead on. I can feed the passband into speclab
> via VAC and measure a carrier OTA.  No problem there...can get decent
> resolution but there is some uncertainty with regard to the dds (frequent
> dependent).  What I would like do is inject a known frequency to either
> zero-beat the carrier (assuming I can get something with millihertz
> resolution) or provide a non-superimposed carrier that I can reference via
> difference in speclab.  The whole point is to eliminate or measure the dds
> offset at a particular frequency.

Unless I'm misunderstanding your goal, there is no need to measure the
frequency quantization error, as it can be computed to arbitrary precision.
Just multiply the tuning word by the clock frequency and divide by 2^(word
width).   Using double-precision floats should get you about 15-16 digits.

For instance, one of my test platforms uses an AD9954 DDS eval board driven
by an Arduino.  The PC app that sends the tuning word to the Arduino also
displays the 'actual' frequency that can be expected for a given target
frequency, via a calculation like this:

	tuning_word = (int64) ((pow(2.0, 32.0) * desired_freq / clock_freq)
+ 0.5);

	actual_freq = (clock_freq * (double) tuning_word) / pow(2.0, 32.0);

Using the same 10 MHz source to reflock the DDS clock and serve as the
reference to measure the actual_freq, the result agrees all the way out a
nanohertz or so for signals near 5 MHz.  It takes a few hours to get a
clean, repeatable measurement at that precision, but as long as the
temperature is held reasonably constant the numbers come out right.  

-- john, KE5FX





More information about the time-nuts mailing list