On 6/24/18 2:05 PM, Hal Murray wrote:
Poul-Henning Kamp said:
That's one of the reason I went with Bo's DDS (32bit0 instead of the eBay
modules (20-24 bit). Higher resolution mitigates the spur problem at least a
little bit.
I think it also moves the spurs closer in. But maybe if they are small enough
they get lost in the normal noise.
Does anybody have a handy formula for the spurs given the parameters for a DDS?
There isn't one.. <grin>
The spur size and location is more determined by "how many loops through
the cosine table til you wind up back at zero" which gets down to the
phase quantization - or the cosine table size
Think of a cosine table that's 16 elements long (i.e. a 4 bit phase).
If the output frequency is fclk*8/16, your DDS puts out entry 0 and
entry 8, and repeats
If the output frequency is fclk*2/16, your DDS puts out entry
0,2,4,6,8,10,12,14,0,2,4,6
If the output frequency is fclk*3/16, your DDS puts out 0,
3,6,9,12,15,2,5,... and it takes a few cycles to repeat around
If the output frequency is fclk*2.5/16, your DDS puts out
0,2,5,7,10,12,15,1,4,6,9,11,14,0,3, etc.
these all have very different spur patterns.
I've occasionally thought of writing code to generate the output of a DDS and
run it through a FFT. I haven't figured out how much memory that would need,
or rather how wide a DDS I could simulate with the memory I have. A 20 bit
accumulator repeats after a million cycles. At 8 bytes/sample that's 8
megabytes which I can do. (Round down if FFT needs another copy.)
That is, in fact how people do it.
We are only interested in the close-in area, so old brute-force calculations
maybe fast enough.
_______________________________________________
time-nuts mailing list -- [email protected]
To unsubscribe, go to https://lists.febo.com/cgi-bin/mailman/listinfo/time-nuts
and follow the instructions there.