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"

MULTIFREQ="1660000000 1890000000"

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

# Sampling frequency for baseband signal ]Hz]

# 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
#

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);
}'

}

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"
MULTIFREQ=""
# Sine wave modulant frequency (baseband signal) [Hz]
MODFREQ=100000
# Sampling frequency for baseband signal ]Hz]
# 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

# 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 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

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
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

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
• 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

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

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

local,kernel: 5.4.0-212055-gb05d16429dac

uri: ip:192.168.1.166

IIO context has 4 devices:

9 channels found:

altvoltage1: TX_LO (output)

8 channel-specific attributes found:

attr  0: external 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  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  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  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  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 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 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 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 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 72: adi,ctrl-outs-index value: 0

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 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 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 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 141: adi,gc-rx2-mode value: 2

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

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 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

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

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

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```

• 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