Direction of arrival estimation using commodity hardware
concept
step 1:
get a few SDRs
RTL SDR:
step 2:
synchronize them
Problem:
Solution:
1st attempt
2nd attempt
3rd attempt
3rd attempt
Drifting between the receivers is fixed
But there are still offsets to compensate:
2¹⁸=262144
samplesPhase diagram before compensation:
Phase diagram after compensation:
Remaining constant offset caused by LO-phase differences
⇒ compensated by subtracting a constant
step 3:
direction estimation
Use phase differences between antennas to estimate the source direction
Without noise the direction can be calculated from the phase difference, wavelength and antenna distance using simple trigonometry
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
Split into two parts:
To estimate the direction of arrival the program:
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
Use FFT to split signal into bins
Use MUSIC to analyze these bins
The software sources are released under the GNU GPLv3 license:
The thesis and this presentation are released under the GNU FDLv1.3: