SoFi

Phased array image

Direction of arrival estimation using commodity hardware

concept

Concept

FFT Phase differences

step 1:

get a few SDRs

Get a few SDRs

Original SDRs

RTL SDR:

Open SDR

step 2:

synchronize them

Synchronize them

Problem:

SDR Clocks Original

Synchronize them

Solution:

SDR Clocks Chained

Synchronize them

1st attempt

Clock SRC v1

Synchronize them

2nd attempt

Clock SRC v2

Synchronize them

3rd attempt

SDR Clocks Chained

Synchronize them

3rd attempt

Clock SRC v3

Drifting between the receivers is fixed

But there are still offsets to compensate:

Sample aquisition offset

Samples actual time

Sample aquisition offset

Samples observed time

Sample aquisition offset

Samples synchronized time

Sample aquisition offset

Frequency domain

Preprocessing chain

Frequency domain

Complex conjugate multiplication

Frequency domain

Phase diagram before compensation:

Unsynchronized

Phase diagram after compensation:

Synchronized

LO-Phase offset

Remaining constant offset caused by LO-phase differences

⇒ compensated by subtracting a constant

Completely synchronized

step 3:

direction estimation

Direction estimation

Phased array

Use phase differences between antennas to estimate the source direction

Direction estimation

Without noise the direction can be calculated from the phase difference, wavelength and antenna distance using simple trigonometry

Two receiver array

Direction estimation

In the presence of noise the phase differences are scaled down by a common constant

this makes calculating the direction a bit more difficult

implementation

Implementation

Split into two parts:

Implementation

To estimate the direction of arrival the program:

Implementation

1 def gen_position_matrix(self, wavelength):
2     
3     for (idx, test_angle) in enumerate(test_angles):
4         rel_angles= edge_angles + test_angle
5         pos_mat[idx, :]= rel_wl * np.sin(rel_angles)

1 def get_direction_info(self, phases,
2                        idx_start, idx_end):
3     
4     pmat= self.get_position_matrix(wl_start, wl_end)
5     return(pmat @ phase_vector)

conclusion

Conclusion

SoFi UI

Outlook

Use FFT to split signal into bins

Use MUSIC to analyze these bins

FFT and MUSIC based setup

The software sources are released under the GNU GPLv3 license:

github.com/hnez/SoFi

The thesis and this presentation are released under the GNU FDLv1.3:

github.com/hnez/SoFi-Report