A HF DDS as an UHF weak signal source
Marko Cebokli S57UUU
How does this work?
Thinking about how a DDS (Direct Digital Synthesizer) produces its
output, it is clear that it will be an "staircase" approximation of
the desired sine wave.
Besides the desired frequency, its spectrum will contain many
aliases (NOT harmonics - the "stairs" do not have a fixed phase relationship with the output frequency). In "normal" applications, people will use anti-aliasing lowpass filters to smooth out the stairs and get rid of the aliases.
But sometimes, these normally undesired alias frequencies can be actually used as the desired signal! DDS chips have to be built with very fast transistors, so the aliases will extend way beyond the
"official" nyquist range of the DDS.
For example, the spectrum up to 2 GHz of the unfiltered output of an AD9850 FS demo board, with 100MHz clock, and programmed for 36 MHz looks like this:
At 2GHz, the aliases are still around cca -60dBm, which is plenty for (radio astronomy) receiver testing - and if you need a -140 dBm signal, it is much easier to get there from -60 than from +10!!
If the programmed frequency is Fp and the DDS's clock frequency is Fc,
the aliases will be at
Fa = N*Fc +- Fp
where for N=0 and plus sign, we get the "official" output Fp.
The amplitude envelope of the aliases has a funny frequency
dependence, but in the majority of cases, we can get an useful signal.
Because the output staircase waveform is a series of 1/Fc wide rectangles, not Dirac pulses, the amplitude envelope is shaped with an cos(x)/x
shape, with zeros at the clock multiples.
To see this, we can put the spectrum analyzer in peak hold mode, and sweep the DDS from zero to Nyquist, getting this picture (up to 2GHz):
Again, this is the same AD9850 demo board with 100MHz clock.
Both the dips at n*Fc and peaks at (0.5+n)*Fc can clearly be seen.
In practice we should avoid both the peaks and the dips, because there
the neighboring aliases will come very close together, and in the dips, the amplitude of the generated signal will be poor, too.
To avoid the dips, the clock should not be a sub-multiple (Fd/n) of the desired
output frequency Fd. For example, if I want to produce 1GHz, I should not use 100MHz, or 111.1111111MHz (1000/9) or 90.909090MHz (1000/11)
or 50MHz (1000/20) and so on...
To avoid the peaks, the clock should not be close to Fd/(n+0.5).
For example, if I want to produce 1GHz, I should not use 117.65MHz (1000/8.5), or 105.26MHz (1000/9.5) or 95.24MHz (1000/10.5)
or 51.28MHz (1000/19.5) and so on...
A good choice for 1GHz output would be for example Fc = 110MHz.
Put another way, the problems will be at n*Fc and (0.5+n)*Fc - for example if the clock is 100 MHz, problems will be at 100,200,300,400... MHz (dips) and 150,250,350,450... MHz (peaks).
What frequency must I program, to get an alias at the desired frequency?
Let's call the desired frequency Fd, the clock frequency Fc, and the
frequency that we must program into the DDS, Fp.
Calculate the spacing between the desired frequency and the first
clock multiple below it:
Fs = Fd-Fc*int(Fd/Fc)
where int() means the integer part.
Before calculating the frequency that has to be programmed into the DDS, we must find out whether we will use an "+" or an "-" alias.
If the Fs calculated above is less than half the clock frequency,
we must use an "plus" alias:
Fp = Fs
otherwise, we must use an "minus" alias:
Fp = Fc - Fs
Fp is now the frequency to program into the DDS to get the desired output at Fd.
Next, check that we are not too close to a dip at n*Fc, or a peak at (0.5+n)*Fc.
This is very simple:
if Fp is close to zero, we are close to a dip, and if Fp is close to Nyquist (Fc/2), we are close to a peak. In these cases, a different clock frequency should be considered.
But what does "close" mean?
First, it depends how much signal loss, caused by a close dip, you can tolerate. For this, I suggest avoiding cca 10% around clock multiples, meaning that your Fp should be more than 10% of the Nyquist frequency Fc/2.
Second, it depends on how far away you want the nearest undesired alias to be. If your Fp is less that Fc/4, then the nearest alias will be 2*Fp away, and if your Fp is more than Fc/4, the nearest alias will be Fc-2*Fp away.
Additionally, the clock harmonic, which lies in the center of the dip, will be Fp away.
One nice property of the alias technique is that, since there is no frequency multiplication, the frequency step does not increase - if I change Fp by one Hz, the desired output Fd will also change by one Hz - there is no loss in frequency resolution. (When using an "minus" alias, Fd will change in the opposite direction, but still by the same amount.)
A small QBASIC (DOS) program, to do the above calculations is here:
ddsali.bas It does not care about units (Hz, MHz...) - just use the same units for clock and desired frequency, and it will print the results in the same units.
To use the aliases, there must be no "anti aliasing" lowpass filter after the DDS. Either the output of the DDS chip must be used unfiltered, or a bandpass for the desired frequency can be used.
When using an unfiltered alias, all of the other aliases, including the
"fundamental" frequency are present in the spectrum. This could theoretically lead to problems with overloading with out of band signals - especially the ones lower in frequency than the desired alias, which are stronger than the desired signal.
The strongest and possibly the most problematic is the "fundamental" frequency Fp.
In practice, I haven't encountered such problems.
The fundamental is usually far away, and the neighboring aliases are of approximately same level as the desired signal, so they wail not cause problems, especially when operating at "radio astronomy" levels.
In most cases the unfiltered output can be used, using a small value coupling capacitor (say, 10...47pF) to attenuate the fundamental.
Most of the narrowband UHF amps and receivers will have such a cap (and often a more sophisticated filter, too) already present at their input.
One case, where trouble could arise, are broadband high-gain circuits, for example if you have a chain of DC-to-X GHz MMICs in cascade, with interstage coupling that does not attenuate the fundamental, it could drive the MMICs into nonlinearity.
When trying to receive the 70cm beacon from an Mars probe, I needed
to know my frequency exactly. I decided to inject a weak reference signal via a directional coupler into the input of the receiver, so that it could be observed on the same FFT plot as the desired signal.
It was an SSB receiver, so the signal had
to be within the same 2kHz as the signal from Mars.
For good frequency accuracy, I have used an GPS locked 10MHz standard.
I simply connected its 10MHz output into the clock input of the AD9850
The expected frequency of the probe at one of the passes (including all Dopplers) was
437102894 Hz, and I decided to put the reference 500 Hz higher at 437103394 Hz.
so, taking Fd = 437103394 and Fc = 10000000 I got
Fs = 437103394-10000000*int(437103394/10000000) = 7103394
This is more than 5 MHz (Fc/2), therefore I had to use a "minus" alias and
Fp = 10000000 - 7103395 = 2896606 Hz
which is the frequency, that had to be programmed into the DDS.
It was far enough from both zero and Fc/2, so there was no need to use a different clock frequency.
And how close was the nearest undesired alias?
Since Fp was more than 2500000 (Fc/4), the closest alias was
Fc - 2*Fp = 10000000 - 2*2896606 = 4206788 Hz
It might seem strange to use such a low clock to produce an UHF signal, but it worked very well. The amplitude was cca 20dB lower than it would have been with 100 MHz clock (because the cos(x)/x envelope falls off faster with a lower clock), but I still needed to attenuate it further...
The aliases were closer together (spaced at a few MHz), but that was of course no problem for the SSB receiver.
Up to SIDI debug page