Electronics > RF, Microwave, Ham Radio

Idea for improving LTDZ Spectrum Analyzer & Tracking Generator 35MHz-4.4GHz

<< < (35/35)

Kalvin:
gf, You asked whether the LTDZ board could be used for measuring narrow band crystal filters. I read the ADF4351 datasheet and wrote the following script for testing the register configurations. It seems that it is possible in theory to generate frequency steps in 10Hz resolution (or even better), but I have not tested this in practice. Hopefully I didn't miss something.

--- Code: ---# Reference oscillator frequency
global REF_Hz = 25000000;

# Reference doubler: 0|1
global D = 0;

# Refecence divide by 2: 0|1
global T = 1;

# Preset divide ratio in range [1, 1023]
global R = 100;

# Modulus in range [2, 4095]
global MOD = 4095;

# PFD frequency
global pfd_Hz = REF_Hz * ((1 + D)/(R * (1 + T)));

# Compute ADF4351 INT and FRAC register values for the given frequency.
#
# f       Desired frequency 35MHz <= f < 4400MHz.
# INT     INT-register value.
# FRAC    FRAC-register value.
# rf_Hz   Actual output frequency.
# err_Hz  Frequency error.
#
function [INT, FRAC, rf_Hz, err_Hz] = adf4351_reg(f)
global REF_Hz;
global MOD;
global D;
global T;
global R;
global pfd_Hz;

if f <= 68750000
RFDIV = 64;
elseif f <= 137500000
RFDIV = 32;
elseif f <= 275000000
RFDIV = 16;
elseif f <= 550000000
RFDIV = 8;
elseif f <= 1100000000
RFDIV = 4;
elseif f <= 2200000000
RFDIV = 2;
else
RFDIV = 1;
endif

VCO = f * RFDIV;
assert(2200000000 <= VCO && VCO <= 4400000000);

INT  = fix(VCO / pfd_Hz);
assert(75<= INT && INT <= 65535);

FRAC = round(((VCO / pfd_Hz) - INT) * MOD);
assert(0 <= FRAC && FRAC <= (MOD-1));

rf_Hz = round(REF_Hz * ((1 + D)/(R * (1 + T))) * (INT + FRAC / MOD) / RFDIV);

err_Hz = f - rf_Hz;
endfunction

--- End code ---

For example:

--- Code: --->> [INT, FRAC, f, err] = adf4351_reg(35000000)
INT =  17920
FRAC = 0
f =  35000000
err = 0
>> [INT, FRAC, f, err] = adf4351_reg(35000001)
INT =  17920
FRAC =  2
f =  35000001
err = 0
>> [INT, FRAC, f, err] = adf4351_reg(35000002)
INT =  17920
FRAC =  4
f =  35000002
err = 0

--- End code ---

gf:
R=100 is quite much. I wonder what's the phase noise then. My understanding is: Lower fPFD -> larger INT -> more phase noise. To mitigate phase noise then, I also wonder whether the loop filter bandwidth would need to be reduced (significantly), at the expense of a larger lock time.

Kalvin:

--- Quote from: gf on July 04, 2021, 03:23:58 pm ---R=100 is quite much. I wonder what's the phase noise then. My understanding is: Lower fPFD -> larger INT -> more phase noise. To mitigate phase noise then, I also wonder whether the loop filter bandwidth would need to be reduced (significantly), at the expense of a larger lock time.

--- End quote ---

Good points! I did not consider the performance at this point, so I overlooked that issue. It is possible to experiment with some other R values in range [10, 150] as well. The point here is that it is quite possible to perform sweeps with smaller steps. For limited frequency range(s), the R can be hand-selected so that the performance will be optimized in that regard.

Kalvin:
Added a simple Python/Tkinter-utility for reading and plotting LTDZ ADC sample buffer data. This is a development tool for the project development purposes, not intended to be used as a general purpose spectrum analyzer or network analyzer tool. The sweep data can be exported to MATLAB and GNU/Octave for later analysis.

Project page:
https://github.com/kalvin2021/ltdz-dsp

Edit: Changed Matplotlib style/theme.

Kalvin:
Added the firmware build instructions in the project page at Github:
https://github.com/kalvin2021/ltdz-dsp