Adalm Pluto as interferometer, phase measurement problem

Hello.

For our project I would like to use Adalm Pluto to make a device that works in a similar way to an interferometer.

In other words, we transmit a single purely real tone at a certain carrier frequency, for example a 100 kHz tone transmitted with a carrier of 1.6 GHz.

At the same time we receive the reflected signal from an object that is close to the antenna, say within about 10/15 cm, that Pluto shows us in its IQ components.

Since we don't really need them, to avoid anomalies we have disabled both the quadrature correction function and the removal of DC component in the baseband and radio frequency.

What we obtain is a baseband signal that is constant in amplitude and phase within a 0.5% tolerance, very good!

Until here, everything works fine.

The problem arises when we want to use more carrier frequencies, for example two. We used the fastlock function to quickly select the two frequencies and what happens is that: we read the IQ samples of the first frequency and calculate the amplitude and phase of the signal, then we switch to the second frequency and do the reading and calculation.

When the cycle returns to the first frequency we should obtain the same value obtained previously (the antenna is not moving nor the environment is changing, all is steady) but instead the value changes, both in module and in phase.

We know that at each frequency change of the local oscillator a random initial phase is put into the reference signal, thus we expect that between two successive switches the baseband signal should have constant amplitude and variable phase.

Instead what we get is a phase rotation and a change in amplitude, about 5% of the maximum value. The variation in amplitude is unexpected and makes the measurement not useful.

Can you help with this problem?
What we MUST have is to avoid the variability in amplitude, this is a game changer. Actually we don't know how to face this problem.

What we WOULD have is to avoid the variability in phase, this is a highly desirable. We are thinking of two different solutions for this problem, 1) external oscillator and 2) analog loopback to get actual phase but these are just ideas.

Attached is the BASH code we use to control the PLUTO at single frequency or multi frequency. The code has a prolog for the setup of device configuration and a cycle that acquires one measure at each step.

# Dry run switch: when true show IIO commands without executing them
DRY="false"

# The address of SDR device
URI="ip:192.168.1.166"

# Input and Output hardware gain [dB]
IHGAIN="9"
OHGAIN="0"

# Carrier radiofrequencies [Hz]
MULTIFREQ="1660000000 1890000000"

# Sine wave modulant frequency (baseband signal) [Hz]
MODFREQ=100000

# Sampling frequency for baseband signal ]Hz]
RADIOFS=2100000

# Low pass filter for input signal [Hz]
RFB=250000

# Number of sin cycles to send from DDS to DAC
NCYCLES=64

# Quiet switch for IIO library: -q ==> no output
QUIET=""
#!/bin/bash

# 
# Version 0.8.4
#


function MY_readdev() {
    local FREQ="$1"
    local D=$(gdate +"%Y/%m/%d-%H:%M:%S.%6N")
    go iio_readdev -u $URI -b $NSAMP -s $NSAMP cf-ad9361-lpc | hexdump -ve '2/2 "%d " "\n"' | awk -v FREQ="$FREQ" -v T_STAMP="$D" -v FREQ_SIN="$MODFREQ" -v FREQ_SAMP="$RADIOFS" '
    BEGIN {
        II=0;
        IQ=0;
        QI=0;
        QQ=0;
        PI=atan2(0,-1);
        M=FREQ_SIN/FREQ_SAMP;
    } 
    
    {
        II+=$1*sin(2*PI*(FNR-1)*M); 
        IQ+=$1*cos(2*PI*(FNR-1)*M); 
        QI+=$2*sin(2*PI*(FNR-1)*M); 
        QQ+=$2*cos(2*PI*(FNR-1)*M); 
    } 
    
    END {
        II/=(NR/2);
        IQ/=(NR/2);
        QI/=(NR/2);
        QQ/=(NR/2);
        AI=sqrt(II^2 + IQ^2);
	    AQ=sqrt(QI^2 + QQ^2);
        printf("%s %d %.0f %.0f\n",T_STAMP,FREQ,AI,AQ);
    }'

}


function MY_readdev2() {
    local FREQ="$1"
    local D=$(gdate +"%Y/%m/%d-%H:%M:%S.%6N")
    printf "$D $FREQ "
    go iio_readdev -u $URI -b $NSAMP -s $NSAMP cf-ad9361-lpc | hexdump -ve '2/2 "%d " " "'
    printf "\n"
}


# Execute commands and exit in case of failure. In DRY run mode just echo the command.
function go() {
	if $DRY
	then
		echo $@
		sleep 0.1
	else
		if ! "$@" 2>> plutoScan.out
		then
		    echo "Error at line ${BASH_LINENO[0]}: $@" 2>> plutoScan.out
		    exit 1
		fi
	fi
}

function stopScan() {
	REDO=false
}


# Just a unique key to search for the process pid (see stop function)
KEYSTONE="ALANV93GCLWBCY494NDJU2870XNDS"

# Parse command line
case "$1" in 
	"$KEYSTONE")
    	> plutoScan.out
    	> plutoScan.log

		;;
	"start")
		pgrep "$KEYSTONE" || $0 $KEYSTONE &
		exit 0
		;;
	"stop")
		pkill -SIGHUP -f "$KEYSTONE"
		exit 0
		;;
	"set")
		F1=$(mktemp)
		FC="$(dirname $0)/$(basename $0 | cut -d"." -f1).cfg"
		cat $FC | sed "s/^[[:blank:]]*$2=.*$/$2=\"$3\"/" > $F1
		cat $F1 > $FC
		rm $F1
		exit 0
		;;

	"view")
		FC="$(dirname $0)/$(basename $0 | cut -d"." -f1).cfg"
		cat $FC
		exit 0
		;;
	*)
		echo "Usage: $(basename $0) [start|stop|view|set NAME VALUE]"
		exit 0
		;;
esac


# ------------------------------------------------------------------------------
# Setup default values for external parameters
# 
# Dry run switch: when true show IIO commands without executing them
DRY="false"
# The address of SDR device
URI="local:"
# Input and Output hardware gain [dB]
IHGAIN="0"
OHGAIN="0"
# Carrier radiofrequencies [Hz]
MULTIFREQ=""
# Sine wave modulant frequency (baseband signal) [Hz]
MODFREQ=100000
# Sampling frequency for baseband signal ]Hz]
RADIOFS=2100000
# Low pass filter for input signal [Hz]
RFB=250000
# Number of sine wave cycles in each acquisition
NCYCLES=32
# Quiet switch for IIO library: -q ==> no output
QUIET=""
# ------------------------------------------------------------------------------


# Load actual parameters value from configuration file
source plutoScan.cfg

# Set exit function via signal HANGUP
trap stopScan SIGHUP
export REDO=true



# ------------------------------------------------------------------------------
# Prologue connfiguration for device
# 
# Disable loopback of digital values
go iio_attr $QUIET -u $URI -D ad9361-phy loopback 0 

# Setup internal DDS
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage0 frequency $MODFREQ
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage1 frequency 0
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage2 frequency 0
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage3 frequency 0

go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage0 raw 1
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage1 raw 1
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage2 raw 1
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage3 raw 1

go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage0 scale 0.25
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage1 scale 0.0
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage2 scale 0.0
go iio_attr $QUIET -u $URI -c cf-ad9361-dds-core-lpc altvoltage3 scale 0.0


# Set radiofrequency sampling frequency in input
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage0 sampling_frequency $RADIOFS 
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage2 sampling_frequency $RADIOFS 

# Set radiofrequency bandwidth in input/output
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage0 rf_bandwidth $RFB
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage2 rf_bandwidth $RFB
go iio_attr $QUIET -u $URI -o -c ad9361-phy voltage0 rf_bandwidth $RFB
go iio_attr $QUIET -u $URI -o -c ad9361-phy voltage2 rf_bandwidth $RFB

# Set hardware gain in input and output
go iio_attr $QUIET -u $URI -c ad9361-phy voltage0 gain_control_mode manual
go iio_attr $QUIET -u $URI -i -c -- ad9361-phy voltage0 hardwaregain $IHGAIN
go iio_attr $QUIET -u $URI -o -c -- ad9361-phy voltage0 hardwaregain $OHGAIN


# Turn off automatic correction features (tracking, rf_dc and bb_dc)
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage0 quadrature_tracking_en 0
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage2 quadrature_tracking_en 0
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage0 rf_dc_offset_tracking_en 0
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage2 rf_dc_offset_tracking_en 0
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage0 bb_dc_offset_tracking_en 0
go iio_attr $QUIET -u $URI -i -c ad9361-phy voltage2 bb_dc_offset_tracking_en 0
# ------------------------------------------------------------------------------

MULTIFREQ=( $MULTIFREQ )

# ------------------------------------------------------------------------------
# Cycle on multifrequency values to store fastlock profiles
for (( N=0;N<${#MULTIFREQ[@]};N++ ))
do
    FREQ=${MULTIFREQ[$N]}
    
    # Set carrier's frequency and store related profile 
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO frequency $FREQ
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO fastlock_store $N
    
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO frequency $FREQ
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO fastlock_store $N
done
 

# ------------------------------------------------------------------------------
# Cycle on multifrequency values and acquire received signal
echo DATE F I Q
NSAMP=$(( $RADIOFS*$NCYCLES/$MODFREQ ))

if [[ ${#MULTIFREQ[@]} -eq 1 ]]
then
    # Set carrier's frequency 
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO fastlock_recall 0
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO fastlock_recall 0

    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO powerdown 0
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO powerdown 0

    while $REDO
    do
        MY_readdev2 ${MULTIFREQ[0]} >> plutoScan.log
    done
    # Turn off transmission and reception chain
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO powerdown 1
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO powerdown 1
    
elif [[ ${#MULTIFREQ[@]} -gt 1 ]]
then
    # Turn on transmission and reception chain
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO powerdown 0
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO powerdown 0
    while $REDO
    do
        # Cycle on multifrequency values to recall fastlock frequency profiles
	    for (( N=0;N<${#MULTIFREQ[@]};N++ ))
	    do
            # Set carrier's frequency 
            go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO fastlock_recall $N
            go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO fastlock_recall $N

            MY_readdev2 ${MULTIFREQ[$N]} >> plutoScan.log
	    done
    done
    # Turn off transmission and reception chain
    go iio_attr $QUIET -u $URI -c ad9361-phy RX_LO powerdown 1
    go iio_attr $QUIET -u $URI -c ad9361-phy TX_LO powerdown 1
    
fi
# ------------------------------------------------------------------------------

Parents
  • 0
    •  Analog Employees 
    on May 10, 2021 4:11 PM
    We know that at each frequency change of the local oscillator a random initial phase is put into the reference signal, thus we expect that between two successive switches the baseband signal should have constant amplitude and variable phase.

    To be more specific here, it is not that the phase is unique for every frequency, every time the LO or sample rate is changed the phase is randomized. Therefore, when you switch back between frequencies you see different phases each time. There is no mechanism to remove this for Pluto.

    Instead what we get is a phase rotation and a change in amplitude, about 5% of the maximum value. The variation in amplitude is unexpected and makes the measurement not useful.

    The gain change likely comes from re-calibrations that occur. Every time the sample rate or LO moves by 100 MHz it will trigger a quad cal. This can be disabled here: https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361#calibration_mode_controls

    The tracking calibration can adjust gain as well. So you might want to turn those off.

    -Travis

Reply
  • 0
    •  Analog Employees 
    on May 10, 2021 4:11 PM
    We know that at each frequency change of the local oscillator a random initial phase is put into the reference signal, thus we expect that between two successive switches the baseband signal should have constant amplitude and variable phase.

    To be more specific here, it is not that the phase is unique for every frequency, every time the LO or sample rate is changed the phase is randomized. Therefore, when you switch back between frequencies you see different phases each time. There is no mechanism to remove this for Pluto.

    Instead what we get is a phase rotation and a change in amplitude, about 5% of the maximum value. The variation in amplitude is unexpected and makes the measurement not useful.

    The gain change likely comes from re-calibrations that occur. Every time the sample rate or LO moves by 100 MHz it will trigger a quad cal. This can be disabled here: https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361#calibration_mode_controls

    The tracking calibration can adjust gain as well. So you might want to turn those off.

    -Travis

Children
  • Thanks Travis, we tried to turn off the tracking calibration like this:


    >> iio_attr -u ip: 192.168.1.x -d ad9361-phy calib_mode manual_tx_quad


    Despite this, we have not achieved significant improvements. Below I attach the output log file of a few samples where you can see the variability with the antenna left stationary.

    DATE FREQUENCY MOD PHASE
    2021/05/14-11:04:07.934590 1660000000 658 0,902
    2021/05/14-11:04:08.084289 1670000000 692 1,229
    2021/05/14-11:04:08.233561 1660000000 723 1,183
    2021/05/14-11:04:08.402658 1670000000 680 1,038
    2021/05/14-11:04:08.557794 1660000000 718 0,265
    2021/05/14-11:04:08.701859 1670000000 674 0,229
    2021/05/14-11:04:08.852692 1660000000 661 0,560
    2021/05/14-11:04:08.997618 1670000000 674 1,508
    2021/05/14-11:04:09.154328 1660000000 710 1,089
    2021/05/14-11:04:09.305369 1670000000 682 1,062
    2021/05/14-11:04:09.449565 1660000000 716 0,287
    2021/05/14-11:04:09.663197 1670000000 639 0,001
    2021/05/14-11:04:09.880022 1660000000 704 1,045
    2021/05/14-11:04:10.175526 1670000000 692 1,206
    2021/05/14-11:04:10.347576 1660000000 688 0,639
    2021/05/14-11:04:10.494694 1670000000 652 0,844
    2021/05/14-11:04:10.641023 1660000000 686 0,769
    2021/05/14-11:04:10.799057 1670000000 625 0,634


    For further clarity I am also attaching the output of iio_info, in case we have set some wrong value.

    Library version: 0.21 (git tag: v0.21)

    Compiled with backends: xml ip usb serial

    IIO context created with network backend.

    Backend version: 0.21 (git tag: v0.21  )

    Backend description string: 192.168.1.166 Linux (none) 5.4.0-212055-gb05d16429dac #403 SMP PREEMPT Tue Mar 30 12:57:31 CEST 2021 armv7l

    IIO context has 9 attributes:

    hw_model: Analog Devices PlutoSDR Rev.B (Z7010-AD9363A)

    hw_model_variant: 1

    hw_serial: 1044730a1997000bf7ff3700e1207c24c8

    fw_version: v0.33

    ad9361-phy,xo_correction: 39999786

    ad9361-phy,model: ad9363a

    local,kernel: 5.4.0-212055-gb05d16429dac

    uri: ip:192.168.1.166

    ip,ip-addr: 192.168.1.166

    IIO context has 4 devices:

    iio:device0: ad9361-phy

    9 channels found:

    altvoltage1: TX_LO (output)

    8 channel-specific attributes found:

    attr  0: external value: 0

    attr  1: fastlock_load value: 0

    attr  2: fastlock_recall value: 1

    attr  3: fastlock_save value: 0 83,0,141,14,0,114,58,42,204,68,252,187,113,221,66,177

    attr  4: fastlock_store value: 0

    attr  5: frequency value: 1670000000

    attr  6: frequency_available value: [325000000 1 3800000000]

    attr  7: powerdown value: 0

    voltage0:  (input)

    15 channel-specific attributes found:

    attr  0: bb_dc_offset_tracking_en value: 0

    attr  1: filter_fir_en value: 0

    attr  2: gain_control_mode value: manual

    attr  3: gain_control_mode_available value: manual fast_attack slow_attack hybrid

    attr  4: hardwaregain value: 9.000000 dB

    attr  5: hardwaregain_available value: [-3 1 71]

    attr  6: quadrature_tracking_en value: 0

    attr  7: rf_bandwidth value: 250000

    attr  8: rf_bandwidth_available value: [200000 1 56000000]

    attr  9: rf_dc_offset_tracking_en value: 0

    attr 10: rf_port_select value: A_BALANCED

    attr 11: rf_port_select_available value: A_BALANCED B_BALANCED C_BALANCED A_N A_P B_N B_P C_N C_P TX_MONITOR1 TX_MONITOR2 TX_MONITOR1_2

    attr 12: rssi value: 32.50 dB

    attr 13: sampling_frequency value: 2100000

    attr 14: sampling_frequency_available value: [2083333 1 61440000]

    voltage3:  (output)

    8 channel-specific attributes found:

    attr  0: filter_fir_en value: 0

    attr  1: raw value: 306

    attr  2: rf_bandwidth value: 250000

    attr  3: rf_bandwidth_available value: [200000 1 40000000]

    attr  4: rf_port_select_available value: A B

    attr  5: sampling_frequency value: 2100000

    attr  6: sampling_frequency_available value: [2083333 1 61440000]

    attr  7: scale value: 1.000000

    altvoltage0: RX_LO (output)

    8 channel-specific attributes found:

    attr  0: external value: 0

    attr  1: fastlock_load value: 0

    attr  2: fastlock_recall value: 0

    attr  3: fastlock_save value: 0 83,0,141,14,0,114,31,15,238,85,111,221,113,221,67,179

    attr  4: fastlock_store value: 0

    attr  5: frequency value: 1670000000

    attr  6: frequency_available value: [325000000 1 3800000000]

    attr  7: powerdown value: 0

    voltage2:  (output)

    8 channel-specific attributes found:

    attr  0: filter_fir_en value: 0

    attr  1: raw value: 306

    attr  2: rf_bandwidth value: 250000

    attr  3: rf_bandwidth_available value: [200000 1 40000000]

    attr  4: rf_port_select_available value: A B

    attr  5: sampling_frequency value: 2100000

    attr  6: sampling_frequency_available value: [2083333 1 61440000]

    attr  7: scale value: 1.000000

    temp0:  (input)

    1 channel-specific attributes found:

    attr  0: input value: 30702

    voltage0:  (output)

    10 channel-specific attributes found:

    attr  0: filter_fir_en value: 0

    attr  1: hardwaregain value: 0.000000 dB

    attr  2: hardwaregain_available value: [-89.750000 0.250000 0.000000]

    attr  3: rf_bandwidth value: 250000

    attr  4: rf_bandwidth_available value: [200000 1 40000000]

    attr  5: rf_port_select value: A

    attr  6: rf_port_select_available value: A B

    attr  7: rssi value: 0.00 dB

    attr  8: sampling_frequency value: 2100000

    attr  9: sampling_frequency_available value: [2083333 1 61440000]

    voltage2:  (input)

    13 channel-specific attributes found:

    attr  0: bb_dc_offset_tracking_en value: 0

    attr  1: filter_fir_en value: 0

    attr  2: gain_control_mode_available value: manual fast_attack slow_attack hybrid

    attr  3: offset value: 57

    attr  4: quadrature_tracking_en value: 0

    attr  5: raw value: 923

    attr  6: rf_bandwidth value: 250000

    attr  7: rf_bandwidth_available value: [200000 1 56000000]

    attr  8: rf_dc_offset_tracking_en value: 0

    attr  9: rf_port_select_available value: A_BALANCED B_BALANCED C_BALANCED A_N A_P B_N B_P C_N C_P TX_MONITOR1 TX_MONITOR2 TX_MONITOR1_2

    attr 10: sampling_frequency value: 2100000

    attr 11: sampling_frequency_available value: [2083333 1 61440000]

    attr 12: scale value: 0.305250

    out:  (input, WARN:iio_channel_get_type()=UNKNOWN)

    1 channel-specific attributes found:

    attr  0: voltage_filter_fir_en value: 0

    18 device-specific attributes found:

    attr  0: calib_mode value: manual_tx_quad 21

    attr  1: calib_mode_available value: auto manual manual_tx_quad tx_quad rf_dc_offs rssi_gain_step

    attr  2: dcxo_tune_coarse ERROR: Operation not supported by device (-19)

    attr  3: dcxo_tune_coarse_available value: [0 0 0]

    attr  4: dcxo_tune_fine ERROR: Operation not supported by device (-19)

    attr  5: dcxo_tune_fine_available value: [0 0 0]

    attr  6: ensm_mode value: fdd

    attr  7: ensm_mode_available value: sleep wait alert fdd pinctrl pinctrl_fdd_indep

    attr  8: filter_fir_config value: FIR Rx: 0,0 Tx: 0,0

    attr  9: gain_table_config value: <gaintable AD9361 type=FULL dest=3 start=1300000000 end=4000000000>

    -3, 0x00, 0x00, 0x20

    -3, 0x00, 0x00, 0x00

    -3, 0x00, 0x00, 0x00

    -2, 0x00, 0x01, 0x00

    -1, 0x00, 0x02, 0x00

    0, 0x00, 0x03, 0x00

    1, 0x00, 0x04, 0x00

    2, 0x00, 0x05, 0x00

    3, 0x01, 0x03, 0x20

    4, 0x01, 0x04, 0x00

    5, 0x01, 0x05, 0x00

    6, 0x01, 0x06, 0x00

    7, 0x01, 0x07, 0x00

    8, 0x01, 0x08, 0x00

    9, 0x01, 0x09, 0x00

    10, 0x01, 0x0A, 0x00

    11, 0x01, 0x0B, 0x00

    12, 0x01, 0x0C, 0x00

    13, 0x01, 0x0D, 0x00

    14, 0x01, 0x0E, 0x00

    15, 0x02, 0x09, 0x20

    16, 0x02, 0x0A, 0x00

    17, 0x02, 0x0B, 0x00

    18, 0x02, 0x0C, 0x00

    19, 0x02, 0x0D, 0x00

    20, 0x02, 0x0E, 0x00

    21, 0x02, 0x0F, 0x00

    22, 0x02, 0x10, 0x00

    23, 0x02, 0x2B, 0x20

    24, 0x02, 0x2C, 0x00

    25, 0x04, 0x27, 0x20

    26, 0x04, 0x28, 0x00

    27, 0x04, 0x29, 0x00

    28, 0x04, 0x2A, 0x00

    29, 0x04, 0x2B, 0x00

    30, 0x24, 0x21, 0x20

    31, 0x24, 0x22, 0x00

    32, 0x44, 0x20, 0x20

    33, 0x44, 0x21, 0x00

    34, 0x44, 0x22, 0x00

    35, 0x44, 0x23, 0x00

    36, 0x44, 0x24, 0x00

    37, 0x44, 0x25, 0x00

    38, 0x44, 0x26, 0x00

    39, 0x44, 0x27, 0x00

    40, 0x44, 0x28, 0x00

    41, 0x44, 0x29, 0x00

    42, 0x44, 0x2A, 0x00

    43, 0x44, 0x2B, 0x00

    44, 0x44, 0x2C, 0x00

    45, 0x44, 0x2D, 0x00

    46, 0x44, 0x2E, 0x00

    47, 0x44, 0x2F, 0x00

    48, 0x44, 0x30, 0x00

    49, 0x44, 0x31, 0x00

    50, 0x64, 0x2E, 0x20

    51, 0x64, 0x2F, 0x00

    52, 0x64, 0x30, 0x00

    53, 0x64, 0x31, 0x00

    54, 0x64, 0x32, 0x00

    55, 0x64, 0x33, 0x00

    56, 0x64, 0x34, 0x00

    57, 0x64, 0x35, 0x00

    58, 0x64, 0x36, 0x00

    59, 0x64, 0x37, 0x00

    60, 0x64, 0x38, 0x00

    61, 0x65, 0x38, 0x20

    62, 0x66, 0x38, 0x20

    63, 0x67, 0x38, 0x20

    64, 0x68, 0x38, 0x20

    65, 0x69, 0x38, 0x20

    66, 0x6A, 0x38, 0x20

    67, 0x6B, 0x38, 0x20

    68, 0x6C, 0x38, 0x20

    69, 0x6D, 0x38, 0x20

    70, 0x6E, 0x38, 0x20

    71, 0x6F, 0x38, 0x20

    </gaintable>

    attr 10: multichip_sync ERROR: Permission denied (-13)

    attr 11: rssi_gain_step_error value: lna_error: 0 0 0 0

    mixer_error: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    gain_step_calib_reg_val: 0 0 0 0 0

    attr 12: rx_path_rates value: BBPLL:806400001 ADC:25200000 R2:8400000 R1:4200000 RF:2100000 RXSAMP:2100000

    attr 13: trx_rate_governor value: nominal

    attr 14: trx_rate_governor_available value: nominal highest_osr

    attr 15: tx_path_rates value: BBPLL:806400001 DAC:25200000 T2:8400000 T1:4200000 TF:2100000 TXSAMP:2100000

    attr 16: xo_correction value: 39999786

    attr 17: xo_correction_available value: [39991787 1 40007785]

    179 debug attributes found:

    debug attr  0: digital_tune value: 0

    debug attr  1: calibration_switch_control value: 0

    debug attr  2: multichip_sync value: 0

    debug attr  3: gaininfo_rx2 ERROR: Resource deadlock avoided (-11)

    debug attr  4: gaininfo_rx1 value: 9 14 0 0 0 0 0 0

    debug attr  5: bist_timing_analysis value: 0

    debug attr  6: gpo_set value: 0

    debug attr  7: bist_tone value: 0

    debug attr  8: bist_prbs value: 0

    debug attr  9: loopback value: 0

    debug attr 10: initialize value: 0

    debug attr 11: adi,bb-clk-change-dig-tune-enable value: 0

    debug attr 12: adi,axi-half-dac-rate-enable value: 0

    debug attr 13: adi,txmon-2-lo-cm value: 48

    debug attr 14: adi,txmon-1-lo-cm value: 48

    debug attr 15: adi,txmon-2-front-end-gain value: 2

    debug attr 16: adi,txmon-1-front-end-gain value: 2

    debug attr 17: adi,txmon-duration value: 8192

    debug attr 18: adi,txmon-delay value: 511

    debug attr 19: adi,txmon-one-shot-mode-enable value: 0

    debug attr 20: adi,txmon-dc-tracking-enable value: 0

    debug attr 21: adi,txmon-high-gain value: 24

    debug attr 22: adi,txmon-low-gain value: 0

    debug attr 23: adi,txmon-low-high-thresh value: 37000

    debug attr 24: adi,gpo3-tx-delay-us value: 0

    debug attr 25: adi,gpo3-rx-delay-us value: 0

    debug attr 26: adi,gpo2-tx-delay-us value: 0

    debug attr 27: adi,gpo2-rx-delay-us value: 0

    debug attr 28: adi,gpo1-tx-delay-us value: 0

    debug attr 29: adi,gpo1-rx-delay-us value: 0

    debug attr 30: adi,gpo0-tx-delay-us value: 0

    debug attr 31: adi,gpo0-rx-delay-us value: 0

    debug attr 32: adi,gpo3-slave-tx-enable value: 0

    debug attr 33: adi,gpo3-slave-rx-enable value: 0

    debug attr 34: adi,gpo2-slave-tx-enable value: 0

    debug attr 35: adi,gpo2-slave-rx-enable value: 0

    debug attr 36: adi,gpo1-slave-tx-enable value: 0

    debug attr 37: adi,gpo1-slave-rx-enable value: 0

    debug attr 38: adi,gpo0-slave-tx-enable value: 0

    debug attr 39: adi,gpo0-slave-rx-enable value: 0

    debug attr 40: adi,gpo3-inactive-state-high-enable value: 0

    debug attr 41: adi,gpo2-inactive-state-high-enable value: 0

    debug attr 42: adi,gpo1-inactive-state-high-enable value: 0

    debug attr 43: adi,gpo0-inactive-state-high-enable value: 0

    debug attr 44: adi,gpo-manual-mode-enable-mask value: 0

    debug attr 45: adi,gpo-manual-mode-enable value: 0

    debug attr 46: adi,aux-dac2-tx-delay-us value: 0

    debug attr 47: adi,aux-dac2-rx-delay-us value: 0

    debug attr 48: adi,aux-dac2-active-in-alert-enable value: 0

    debug attr 49: adi,aux-dac2-active-in-tx-enable value: 0

    debug attr 50: adi,aux-dac2-active-in-rx-enable value: 0

    debug attr 51: adi,aux-dac2-default-value-mV value: 0

    debug attr 52: adi,aux-dac1-tx-delay-us value: 0

    debug attr 53: adi,aux-dac1-rx-delay-us value: 0

    debug attr 54: adi,aux-dac1-active-in-alert-enable value: 0

    debug attr 55: adi,aux-dac1-active-in-tx-enable value: 0

    debug attr 56: adi,aux-dac1-active-in-rx-enable value: 0

    debug attr 57: adi,aux-dac1-default-value-mV value: 0

    debug attr 58: adi,aux-dac-manual-mode-enable value: 1

    debug attr 59: adi,aux-adc-decimation value: 256

    debug attr 60: adi,aux-adc-rate value: 40000000

    debug attr 61: adi,temp-sense-decimation value: 256

    debug attr 62: adi,temp-sense-periodic-measurement-enable value: 1

    debug attr 63: adi,temp-sense-offset-signed value: 206

    debug attr 64: adi,temp-sense-measurement-interval-ms value: 1000

    debug attr 65: adi,elna-gaintable-all-index-enable value: 0

    debug attr 66: adi,elna-rx2-gpo1-control-enable value: 0

    debug attr 67: adi,elna-rx1-gpo0-control-enable value: 0

    debug attr 68: adi,elna-bypass-loss-mdB value: 0

    debug attr 69: adi,elna-gain-mdB value: 0

    debug attr 70: adi,elna-settling-delay-ns value: 0

    debug attr 71: adi,ctrl-outs-enable-mask value: 255

    debug attr 72: adi,ctrl-outs-index value: 0

    debug attr 73: adi,rssi-duration value: 1000

    debug attr 74: adi,rssi-wait value: 1

    debug attr 75: adi,rssi-delay value: 1

    debug attr 76: adi,rssi-unit-is-rx-samples-enable value: 0

    debug attr 77: adi,rssi-restart-mode value: 3

    debug attr 78: adi,fagc-adc-large-overload-inc-steps value: 2

    debug attr 79: adi,fagc-power-measurement-duration-in-state5 value: 64

    debug attr 80: adi,fagc-rst-gla-if-en-agc-pulled-high-mode value: 0

    debug attr 81: adi,fagc-rst-gla-en-agc-pulled-high-enable value: 0

    debug attr 82: adi,fagc-rst-gla-large-lmt-overload-enable value: 1

    debug attr 83: adi,fagc-rst-gla-large-adc-overload-enable value: 1

    debug attr 84: adi,fagc-energy-lost-stronger-sig-gain-lock-exit-cnt value: 8

    debug attr 85: adi,fagc-rst-gla-engergy-lost-sig-thresh-below-ll value: 10

    debug attr 86: adi,fagc-rst-gla-engergy-lost-goto-optim-gain-enable value: 1

    debug attr 87: adi,fagc-rst-gla-engergy-lost-sig-thresh-exceeded-enable value: 1

    debug attr 88: adi,fagc-rst-gla-stronger-sig-thresh-above-ll value: 10

    debug attr 89: adi,fagc-optimized-gain-offset value: 5

    debug attr 90: adi,fagc-rst-gla-stronger-sig-thresh-exceeded-enable value: 1

    debug attr 91: adi,fagc-use-last-lock-level-for-set-gain-enable value: 1

    debug attr 92: adi,fagc-gain-index-type-after-exit-rx-mode value: 0

    debug attr 93: adi,fagc-gain-increase-after-gain-lock-enable value: 0

    debug attr 94: adi,fagc-final-overrange-count value: 3

    debug attr 95: adi,fagc-lmt-final-settling-steps value: 1

    debug attr 96: adi,fagc-lpf-final-settling-steps value: 1

    debug attr 97: adi,fagc-lock-level-gain-increase-upper-limit value: 5

    debug attr 98: adi,fagc-lock-level-lmt-gain-increase-enable value: 1

    debug attr 99: adi,fagc-lp-thresh-increment-steps value: 1

    debug attr 100: adi,fagc-lp-thresh-increment-time value: 5

    debug attr 101: adi,fagc-allow-agc-gain-increase-enable value: 0

    debug attr 102: adi,fagc-state-wait-time-ns value: 260

    debug attr 103: adi,fagc-dec-pow-measurement-duration value: 64

    debug attr 104: adi,agc-immed-gain-change-if-large-lmt-overload-enable value: 0

    debug attr 105: adi,agc-immed-gain-change-if-large-adc-overload-enable value: 0

    debug attr 106: adi,agc-gain-update-interval-us value: 1000

    debug attr 107: adi,agc-sync-for-gain-counter-enable value: 0

    debug attr 108: adi,agc-dig-gain-step-size value: 4

    debug attr 109: adi,agc-dig-saturation-exceed-counter value: 3

    debug attr 110: adi,agc-lmt-overload-large-inc-steps value: 2

    debug attr 111: adi,agc-lmt-overload-small-exceed-counter value: 10

    debug attr 112: adi,agc-lmt-overload-large-exceed-counter value: 10

    debug attr 113: adi,agc-adc-lmt-small-overload-prevent-gain-inc-enable value: 0

    debug attr 114: adi,agc-adc-large-overload-inc-steps value: 2

    debug attr 115: adi,agc-adc-large-overload-exceed-counter value: 10

    debug attr 116: adi,agc-adc-small-overload-exceed-counter value: 10

    debug attr 117: adi,agc-outer-thresh-low-inc-steps value: 2

    debug attr 118: adi,agc-outer-thresh-low value: 18

    debug attr 119: adi,agc-inner-thresh-low-inc-steps value: 1

    debug attr 120: adi,agc-inner-thresh-low value: 12

    debug attr 121: adi,agc-inner-thresh-high-dec-steps value: 1

    debug attr 122: adi,agc-inner-thresh-high value: 10

    debug attr 123: adi,agc-outer-thresh-high-dec-steps value: 2

    debug attr 124: adi,agc-outer-thresh-high value: 5

    debug attr 125: adi,agc-attack-delay-extra-margin-us value: 1

    debug attr 126: adi,mgc-split-table-ctrl-inp-gain-mode value: 0

    debug attr 127: adi,mgc-dec-gain-step value: 2

    debug attr 128: adi,mgc-inc-gain-step value: 2

    debug attr 129: adi,mgc-rx2-ctrl-inp-enable value: 0

    debug attr 130: adi,mgc-rx1-ctrl-inp-enable value: 0

    debug attr 131: adi,gc-use-rx-fir-out-for-dec-pwr-meas-enable value: 0

    debug attr 132: adi,gc-max-dig-gain value: 15

    debug attr 133: adi,gc-dig-gain-enable value: 0

    debug attr 134: adi,gc-low-power-thresh value: 24

    debug attr 135: adi,gc-dec-pow-measurement-duration value: 8192

    debug attr 136: adi,gc-lmt-overload-low-thresh value: 704

    debug attr 137: adi,gc-lmt-overload-high-thresh value: 800

    debug attr 138: adi,gc-adc-large-overload-thresh value: 58

    debug attr 139: adi,gc-adc-small-overload-thresh value: 47

    debug attr 140: adi,gc-adc-ovr-sample-size value: 4

    debug attr 141: adi,gc-rx2-mode value: 2

    debug attr 142: adi,gc-rx1-mode value: 2

    debug attr 143: adi,update-tx-gain-in-alert-enable value: 0

    debug attr 144: adi,tx-attenuation-mdB value: 10000

    debug attr 145: adi,rf-tx-bandwidth-hz value: 18000000

    debug attr 146: adi,rf-rx-bandwidth-hz value: 18000000

    debug attr 147: adi,qec-tracking-slow-mode-enable value: 0

    debug attr 148: adi,dc-offset-count-low-range value: 50

    debug attr 149: adi,dc-offset-count-high-range value: 40

    debug attr 150: adi,dc-offset-attenuation-low-range value: 5

    debug attr 151: adi,dc-offset-attenuation-high-range value: 6

    debug attr 152: adi,dc-offset-tracking-update-event-mask value: 5

    debug attr 153: adi,clk-output-mode-select value: 0

    debug attr 154: adi,tx-lo-powerdown-managed-enable value: 1

    debug attr 155: adi,trx-synthesizer-target-fref-overwrite-hz value: 80008000

    debug attr 156: adi,rx1-rx2-phase-inversion-enable value: 0

    debug attr 157: adi,tx-rf-port-input-select-lock-enable value: 1

    debug attr 158: adi,rx-rf-port-input-select-lock-enable value: 1

    debug attr 159: adi,tx-rf-port-input-select value: 0

    debug attr 160: adi,rx-rf-port-input-select value: 0

    debug attr 161: adi,split-gain-table-mode-enable value: 0

    debug attr 162: adi,1rx-1tx-mode-use-tx-num value: 1

    debug attr 163: adi,1rx-1tx-mode-use-rx-num value: 1

    debug attr 164: adi,2rx-2tx-mode-enable value: 0

    debug attr 165: adi,digital-interface-tune-fir-disable value: 1

    debug attr 166: adi,digital-interface-tune-skip-mode value: 0

    debug attr 167: adi,tx-fastlock-pincontrol-enable value: 0

    debug attr 168: adi,rx-fastlock-pincontrol-enable value: 0

    debug attr 169: adi,rx-fastlock-delay-ns value: 0

    debug attr 170: adi,tx-fastlock-delay-ns value: 0

    debug attr 171: adi,tdd-skip-vco-cal-enable value: 0

    debug attr 172: adi,tdd-use-dual-synth-mode-enable value: 0

    debug attr 173: adi,debug-mode-enable value: 0

    debug attr 174: adi,ensm-enable-txnrx-control-enable value: 0

    debug attr 175: adi,ensm-enable-pin-pulse-mode-enable value: 0

    debug attr 176: adi,frequency-division-duplex-independent-mode-enable value: 0

    debug attr 177: adi,frequency-division-duplex-mode-enable value: 1

    debug attr 178: direct_reg_access value: 0x0

    No trigger on this device

    iio:device1: xadc

    10 channels found:

    voltage5: vccoddr (input)

    2 channel-specific attributes found:

    attr  0: raw value: 1841

    attr  1: scale value: 0.732421875

    voltage0: vccint (input)

    2 channel-specific attributes found:

    attr  0: raw value: 1381

    attr  1: scale value: 0.732421875

    voltage4: vccpaux (input)

    2 channel-specific attributes found:

    attr  0: raw value: 2459

    attr  1: scale value: 0.732421875

    temp0:  (input)

    3 channel-specific attributes found:

    attr  0: offset value: -2219

    attr  1: raw value: 2628

    attr  2: scale value: 123.040771484

    voltage7: vrefn (input)

    2 channel-specific attributes found:

    attr  0: raw value: 10

    attr  1: scale value: 0.732421875

    voltage1: vccaux (input)

    2 channel-specific attributes found:

    attr  0: raw value: 2458

    attr  1: scale value: 0.732421875

    voltage2: vccbram (input)

    2 channel-specific attributes found:

    attr  0: raw value: 1385

    attr  1: scale value: 0.732421875

    voltage3: vccpint (input)

    2 channel-specific attributes found:

    attr  0: raw value: 1382

    attr  1: scale value: 0.732421875

    voltage8:  (input)

    2 channel-specific attributes found:

    attr  0: raw value: 3698

    attr  1: scale value: 0.244140625

    voltage6: vrefp (input)

    2 channel-specific attributes found:

    attr  0: raw value: 1709

    attr  1: scale value: 0.732421875

    1 device-specific attributes found:

    attr  0: sampling_frequency value: 961538

    No trigger on this device

    iio:device2: cf-ad9361-dds-core-lpc (buffer capable)

    6 channels found:

    voltage0:  (output, index: 0, format: le:S16/16>>0)

    4 channel-specific attributes found:

    attr  0: calibphase value: 0.000000

    attr  1: calibscale value: 1.000000

    attr  2: sampling_frequency value: 2100000

    attr  3: sampling_frequency_available value: 2100000 262500 

    voltage1:  (output, index: 1, format: le:S16/16>>0)

    4 channel-specific attributes found:

    attr  0: calibphase value: 0.000000

    attr  1: calibscale value: 1.000000

    attr  2: sampling_frequency value: 2100000

    attr  3: sampling_frequency_available value: 2100000 262500 

    altvoltage3: TX1_Q_F2 (output)

    5 channel-specific attributes found:

    attr  0: frequency value: 32

    attr  1: phase value: 0

    attr  2: raw value: 1

    attr  3: sampling_frequency value: 2100000

    attr  4: scale value: 0.000000

    altvoltage1: TX1_I_F2 (output)

    5 channel-specific attributes found:

    attr  0: frequency value: 32

    attr  1: phase value: 90000

    attr  2: raw value: 1

    attr  3: sampling_frequency value: 2100000

    attr  4: scale value: 0.000000

    altvoltage0: TX1_I_F1 (output)

    5 channel-specific attributes found:

    attr  0: frequency value: 100009

    attr  1: phase value: 90000

    attr  2: raw value: 1

    attr  3: sampling_frequency value: 2100000

    attr  4: scale value: 0.250000

    altvoltage2: TX1_Q_F1 (output)

    5 channel-specific attributes found:

    attr  0: frequency value: 32

    attr  1: phase value: 0

    attr  2: raw value: 1

    attr  3: sampling_frequency value: 2100000

    attr  4: scale value: 0.000000

    3 buffer-specific attributes found:

    attr  0: data_available value: 0

    attr  1: length_align_bytes value: 8

    attr  2: watermark value: 2048

    1 debug attributes found:

    debug attr  0: direct_reg_access value: 0x90162

    No trigger on this device

    iio:device3: cf-ad9361-lpc (buffer capable)

    2 channels found:

    voltage0:  (input, index: 0, format: le:S12/16>>0)

    6 channel-specific attributes found:

    attr  0: calibbias value: 0

    attr  1: calibphase value: 0.000000

    attr  2: calibscale value: 1.000000

    attr  3: samples_pps ERROR: Operation not supported by device (-19)

    attr  4: sampling_frequency value: 2100000

    attr  5: sampling_frequency_available value: 2100000 262500 

    voltage1:  (input, index: 1, format: le:S12/16>>0)

    6 channel-specific attributes found:

    attr  0: calibbias value: 0

    attr  1: calibphase value: 0.000000

    attr  2: calibscale value: 1.000000

    attr  3: samples_pps ERROR: Operation not supported by device (-19)

    attr  4: sampling_frequency value: 2100000

    attr  5: sampling_frequency_available value: 2100000 262500 

    3 buffer-specific attributes found:

    attr  0: data_available value: 0

    attr  1: length_align_bytes value: 8

    attr  2: watermark value: 1344

    2 debug attributes found:

    debug attr  0: pseudorandom_err_check value: CH0 : PN9 : Out of Sync : PN Error

    CH1 : PN9 : Out of Sync : PN Error

    debug attr  1: direct_reg_access value: 0x0

    No trigger on this device

    Thank you again for your support.

  • We haven't been able to solve our problem yet. We have read the Pluto documentation and tried to understand what can change the gain despite the manual setting. The Baseband Processor (BBP) seems to have the possibility to intervene autonomously on the gain. Could it happen even if we have set the manual gain?
    We have also observed that at each frequency switching (or almost) the RSSI value of the ad9361-phy (voltage0: (output)) changes, (see the attached log file indicating DATE FREQUENCY MOD PHASE RSSI for each acquisition). This also confirms that the receiver does not maintain a constant gain value. Is there any other parameter that we have not considered that we can act on? Thank you.

    DATE FREQUENCY MOD PHASE RSSI
    2021/05/20-20:09:17.248419 1660000000 292 0,487 37.00 dB
    2021/05/20-20:09:17.667147 1890000000 281 0,229 37.25 dB
    2021/05/20-20:09:18.081403 1660000000 314 0,041 36.25 dB
    2021/05/20-20:09:18.390115 1890000000 282 1,306 37.25 dB
    2021/05/20-20:09:18.710331 1660000000 289 0,570 37.00 dB
    2021/05/20-20:09:19.084221 1890000000 286 1,474 37.00 dB
    2021/05/20-20:09:19.448072 1660000000 314 0,002 36.25 dB
    2021/05/20-20:09:19.760705 1890000000 279 0,096 37.25 dB
    2021/05/20-20:09:20.137432 1660000000 286 0,747 37.00 dB
    2021/05/20-20:09:21.637972 1890000000 266 1,016 37.50 dB
    2021/05/20-20:09:22.938623 1660000000 295 1,084 36.75 dB
    2021/05/20-20:09:24.657456 1890000000 266 1,034 37.50 dB
    2021/05/20-20:09:24.980089 1660000000 295 0,413 36.75 dB
    2021/05/20-20:09:25.293589 1890000000 275 1,156 37.25 dB
    2021/05/20-20:09:25.599863 1660000000 305 1,256 36.50 dB
    2021/05/20-20:09:25.919154 1890000000 264 0,560 37.75 dB
    2021/05/20-20:09:26.228754 1660000000 318 1,495 36.25 dB
    2021/05/20-20:09:26.541492 1890000000 268 0,386 37.50 dB
    2021/05/20-20:09:26.885328 1660000000 306 1,251 36.50 dB
    2021/05/20-20:09:27.203129 1890000000 279 0,092 37.25 dB
    2021/05/20-20:09:27.540227 1660000000 291 0,584 37.00 dB
    2021/05/20-20:09:27.872950 1890000000 264 0,831 37.50 dB
    2021/05/20-20:09:28.189904 1660000000 289 0,576 37.00 dB
    2021/05/20-20:09:28.526714 1890000000 278 1,210 37.25 dB
    2021/05/20-20:09:28.867739 1660000000 287 0,841 37.00 dB
    2021/05/20-20:09:29.209211 1890000000 263 0,589 37.75 dB
    2021/05/20-20:09:29.618016 1660000000 291 0,509 37.00 dB
    2021/05/20-20:09:29.921985 1890000000 273 1,099 37.25 dB
    2021/05/20-20:09:30.252963 1660000000 306 1,280 36.50 dB
    2021/05/20-20:09:30.555296 1890000000 270 0,500 37.50 dB
    2021/05/20-20:09:31.591202 1660000000 309 1,327 36.50 dB
    2021/05/20-20:09:32.850681 1890000000 267 0,966 37.50 dB

  • 0
    •  Analog Employees 
    on May 20, 2021 6:59 PM in reply to lubohsr

    Small gain changes can come from the LOs since they require calibration anytime they are changed > 100 MHz. If you load preconfigured calibrations using fastlock: https://wiki.analog.com/resources/tools-software/linux-drivers/iio-transceiver/ad9361#fastlock_mode

    -Travis

  • Unfortunately we haven't solved it yet. Even if the frequency value is changed by less than 100 MHz, the phenomenon manifests itself. We have tried both with and without using the fastlock. Do you have any other suggestions for us? Thank you.