diff options
author | Tom Tsou <tom.tsou@ettus.com> | 2015-06-30 12:27:43 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2015-08-13 14:37:42 -0700 |
commit | 2e4138d82a4ad33183a6cbff868b9e6c0d82f239 (patch) | |
tree | 08e3752c60f63521d3777c54c4fd7d1cc948283d | |
parent | 55d792f85fae26b51e059cca5e5a62807f4b3fcf (diff) | |
download | uhd-2e4138d82a4ad33183a6cbff868b9e6c0d82f239.tar.gz uhd-2e4138d82a4ad33183a6cbff868b9e6c0d82f239.tar.bz2 uhd-2e4138d82a4ad33183a6cbff868b9e6c0d82f239.zip |
ad9361: Delay Tx Quad Cal from initialization to streamer start
Patch addresses issue:
#742 "tx_waveforms seems to produce unexpectedly large image"
Tx Quad Cal performance is temporally dependent with better results
when run after the AD9361 is configured for transmission than at
initialization. This gets is roughly 5-10 dB of additional quadrature
image suppression.
Even better performance can be reached when Tx Quad Cal is run
after streaming and the AD9361 is actively transmitting. Calibration
in this state, however, requires user intervention by retuning the
transmit chain by > 100 MHz. Total IQ suppression should be in the
range of 40-50+ dBFS dependent on operating frequency.
Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
-rw-r--r-- | host/lib/usrp/common/ad9361_driver/ad9361_device.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp index 0505343ab..c3bc2d32b 100644 --- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp +++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp @@ -1717,7 +1717,6 @@ void ad9361_device_t::initialize() _calibrate_baseband_dc_offset(); _calibrate_rf_dc_offset(); - _calibrate_tx_quadrature(); _calibrate_rx_quadrature(); /* @@ -1855,7 +1854,6 @@ double ad9361_device_t::set_clock_rate(const double req_rate) _calibrate_baseband_dc_offset(); _calibrate_rf_dc_offset(); - _calibrate_tx_quadrature(); _calibrate_rx_quadrature(); /* @@ -1970,6 +1968,14 @@ void ad9361_device_t::set_active_chains(bool tx1, bool tx2, bool rx1, bool rx2) _io_iface->poke8(0x002, _regs.txfilt); _io_iface->poke8(0x003, _regs.rxfilt); + /* + * Last unconditional Tx calibration point. Any later Tx calibration will + * require user intervention (currently triggered by tuning difference that + * is > 100 MHz). Late calibration provides better performance. + */ + if (tx1 | tx2) + _calibrate_tx_quadrature(); + /* Put back into FDD state if necessary */ if (set_back_to_fdd) _io_iface->poke8(0x014, 0x21); |