Calibration of ADC in RFSoC 4x2

PYNQ version : v3.0.1

Vivado Version : 2020.2

How do I calibrate the ADCs in RFSoC 4x2 to reduce the spurs.I tried setting the calibration mode to AUTOCAL on rfdc ip and generated bitstream and it hardly made any difference. I tried doing something like this in Jupyter notebook but it didn’t help either.

ADC_TILE = 0
ADC_BLOCK = 0
adc = base.radio.rfdc.adc_tiles[ADC_TILE].blocks[ADC_BLOCK] 
base.radio.rfdc.adc_tiles[ADC_TILE].Reset()
base.radio.rfdc.adc_tiles[ADC_TILE].StartUp()
cal_blocks = ['OCB1', 'OCB2', 'GCB', 'TSCB']

for cal_block in range(len(cal_blocks)):
    coeff_struct = xrfdc._ffi.new("XRFdc_Calibration_Coefficients*")
    adc.GetCalCoefficients(cal_block, coeff_struct)
    coeffs = xrfdc._unpack_value(coeff_struct)
    print(f"{cal_blocks[cal_block]}: {coeffs}")

print(adc.CalFreeze)
adc.CalFreeze['FreezeCalibration']=1
print(adc.CalFreeze)


I tried plotting the average FFT of multiple acquisitions of raw ADC data (128 iterations of 32768 samples) for 128 Mhz input (1.024 GSPS , decimation by 2) Also why does the FFT have a typical shape,I terminated the input and plotted FFT and the shape is seen there as well

Is it because of the Balun ? It has a phase imbalance of 8 degrees.