Direction-of-Arrival (DoA) Estimation Algorithm

This thread introduces one of Navigine’s most technically sophisticated projects—our Direction-of-Arrival (DoA) estimation demo. Using raw IQ samples from the Minew AoA Locator, this algorithm accurately calculates azimuth and elevation angles, then translates them into beacon positioning on the XY plane.

Built on principles from our AoA article, this solution uses adjacent elements in a linear antenna array to calculate signal orientation with sub-6° accuracy across diverse sample points.

Getting Started

To run the demo:

cd src/ cat ../data/static.json | python3 aoa_demo.py

Output includes:

x_beacon: 9.232542, y_beacon: 5.490652 azimuth_angle: 43.0°, elevation_angle: -17.0° ...

You’ll receive multiple beacon positions with their corresponding orientation angles—ideal for evaluating locator performance in RTLS scenarios.

Sample Data & Visuals

  • Beacon Positioning Example: location.jpg
  • Locator Configuration: locator_settings.jpg
  • Azimuth Phase Variation Demo: dynamic_azimuth_phases
  • Live Movement Experiment Video: dynamic_test.MOV

The results closely match those in our AoA accuracy study, demonstrating angular deviations no greater than ±6° under controlled conditions.

Observed Challenges

In dynamic tests—such as slight lateral movement of a stationary beacon—we observed unexpected angular drift. The azimuth angle varied despite the beacon returning to its original location, suggesting a sensitivity that deserves deeper investigation.

Relevant input data for this scenario is stored in dynamic.json.

Let’s Collaborate!

Have insights, suggestions, or improvement ideas for our DoA estimation approach? Feel free to:

  • :star: Star the repo
  • :hammer_and_wrench: Fork it
  • :memo: Share issues or contribute improvements
  • :speech_balloon: Start a thread right here in SDK & Open Source

We’d love to hear how you’re using AoA tech—or how we can refine it for your deployment scenarios.

Learn more about Navigine: https://navigine.com/