Adam Parower Full Duplex Radio
Adam Parower Full Duplex Radio
Adam Parower Full Duplex Radio
System
Adam Parower
The Aerospace Corporation
2
What is Full-Duplex Communications?
… it’s not the ‘usual definition’
• Transmit and receive on the same antenna on the same frequency at the same time
– Potentially double (or more) throughput in the same spectrum
– Considered impossible for typical communications links
– Multiple classical textbooks explicitly state it can’t be done
Guard Band
Uplink Downlink Uplink Downlink Uplink Downlink
time frequency
Full-Duplex Link Full-Duplex Link
Uplink Uplink
Downlink Downlink
time frequency
3
The Problem
TX D/A PA
Self-
interference
Sources of self-interference
• Circulator leakage
RX A/D LNA • Antenna reflection
• EM coupling on cables
• Reflections off objects
4
The Solution
Very active area of research in the past several years
TX D/A PA
Self-
interference
Digital RF
Cancellation Cancellaton
RX A/D LNA
All reported full-duplex systems use both analog and digital cancellation
5
Digital Cancellation
6
Modeling the Black Box
Linear Model
7
Modeling the Black Box
Nonlinear Distortion
10
Algorithms
For Solving 𝐴𝑥 = 𝑏
• These GNU Radio blocks are not just for full duplex!
• They can be used to solve any problem where it is desirable to cancel a known signal
that may have undergone linear and/or nonlinear distortion.
12
Performance Optimization
13
Implementation (Pseudocode)
SVD Block
int svd_canceller_cc_impl::general_work(
int noutput_items, gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
{
gr_complex* ref = input_signals[0]; // ref = transmitted signal
gr_complex* b = input_signals[1]; // b = received signal
gr_complex* out = output_signals[0];
construct_A_matrix(ref, A);
cgelsd(A, b, x, ...); // solve Ax = b for x (using SVD)
cgemv(A, x, b, out, ...); // residual = b – Ax
consume_each(block_size);
return block_size;
}
14
Implementation (Pseudocode)
QR Decomposition Block
int qr_canceller_cc_impl::general_work(
int noutput_items, gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
{
gr_complex* ref = input_signals[0]; // ref = transmitted signal
gr_complex* b = input_signals[1]; // b = received signal
gr_complex* out = output_signals[0];
construct_A_matrix(ref, A);
cgeqrf(A, temp, ...); // perform QR factorization on A
cungqr(temp, Q, ...); // compute Q explicitly
cgemv(Q, b, Qb, ...); // compute 𝑄 𝑇 𝑏
cgemv(Q, Qb, b, out, ...); // residual = 𝑏 − 𝑄 𝑄𝑇 𝑏
consume_each(block_size);
return block_size;
}
15
Implementation (Block Diagram)
LMS Block
16
Results and Performance
Cancellation
1.0
0.8
SNR After Cancellation (dB)
0.6
-0.2
SNR Before Cancellation (dB)
SVD Block QR Block LMS Block
17
Results and Performance
Throughput
55
50
45
40
Throughput (Msps)
35
30
25 Test conditions:
20 • Intel Xeon X5660 (2.80GHz)
15 • 8 threads
10
0
0 10 20 30 40 50
Number of Coefficients
SVD Block QR Block LMS Block
18
Using USRP Products
• If you decide to use USRPs in a full-duplex radio system, here are some tips ...
Source: https://www.ettus.com/content/images/prod_un210-kit_01_lg.jpg
19
Using USRP Products
Timing Synchronization
• For this flowgraph to work, the USRP sink and source blocks must start streaming at the same time.
• These blocks provide functions for timing synchronization:
– set_time_now()
– set_time_next_pps()
– set_start_time()
• We can edit the GRC-generated Python code to call these functions ...
– But if we make a change to the flowgraph and regenerate, we have to do it again
– There must be a better way ...
20
Function Caller Block
• Wouldn’t it be nice if there was a GRC block that allowed us to embed arbitrary function calls in the
generated code, that execute before the flowgraph starts?
• We created one:
Generated Python code:
val = self.usrp_source.set_time_now(0)
...
val = self.usrp_sink.set_time_now(0)
...
val = self.usrp_source.set_start_time(1)
...
val = self.usrp_sink.set_start_time(1)
21
Using USRP Products
Timing Synchronization
• Even after synchronizing the USRP source and sink, there is still a timing offset:
– Deterministic and repeatable
– Appears to be sample-rate dependent
– On the order of 10-50 samples
22
Using USRP Products
Built-in vs. External Mixers
Source: https://www.ettus.com/product/category/Daughterboards
23
Using USRP Products
Built-in vs. External Mixers
• For applications like full duplex where high SNR is essential, use external mixers for optimal performance:
Transmitter
Setup
Digital
Cancellation
(dB) BasicTX +
External
SBX
Up-
converter Test conditions:
BasicRX + • USRP X310
External • Analog loopback
54.4 44.6
Down-
Receiver converter
Setup
24
Summary and Conclusions
• By using Intel libraries and multi-threading, we can support bandwidths in the tens of MHz.
• If parallelized, adaptive algorithms like LMS provide higher throughput with minimal cost to cancellation.
• Digital cancellation blocks can be applied to any scenario involving suppression of a known signal.
25
Questions?
26