https://github.com/zhiim/doa_py
DOA etimation algorithms implemented in Python for ULA, UCA and broadband/wideband DOA estimation
https://github.com/zhiim/doa_py
aoa array array-signal-processing direction-of-arrival doa doa-estimation signal-processing
Last synced: 5 months ago
JSON representation
DOA etimation algorithms implemented in Python for ULA, UCA and broadband/wideband DOA estimation
- Host: GitHub
- URL: https://github.com/zhiim/doa_py
- Owner: zhiim
- License: mit
- Created: 2023-11-17T08:29:51.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2025-11-25T13:37:04.000Z (6 months ago)
- Last Synced: 2025-11-27T12:50:55.599Z (6 months ago)
- Topics: aoa, array, array-signal-processing, direction-of-arrival, doa, doa-estimation, signal-processing
- Language: Python
- Homepage:
- Size: 3.82 MB
- Stars: 41
- Watchers: 2
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DOA_Py
DOA Estimation algorithms implemented in Python. It can be used for ULA, UCA and broadband/wideband DOA estimation.
## Getting Started
### Installation
```bash
pip install doa_py
```
or install from source
```bash
git clone https://github.com/zhiim/doa_py.git
cd doa_py
pip install .
```
### Usage
A sample example of DOA estimation using MUSIC algorithm.
```python
import numpy as np
from doa_py import arrays, signals
from doa_py.algorithm import music
from doa_py.plot import plot_spatial_spectrum
# Create a 8-element ULA with 0.5m spacing
ula = arrays.UniformLinearArray(m=8, dd=0.5)
# Create a complex stochastic signal
source = signals.ComplexStochasticSignal(fc=3e8)
# Simulate the received data
received_data = ula.received_signal(
signal=source, snr=0, nsamples=1000, angle_incidence=np.array([0, 30]), unit="deg"
)
# Calculate the MUSIC spectrum
angle_grids = np.arange(-90, 90, 1)
spectrum = music(
received_data=received_data,
num_signal=2,
array=ula,
signal_fre=3e8,
angle_grids=angle_grids,
unit="deg",
)
# Plot the spatial spectrum
plot_spatial_spectrum(
spectrum=spectrum,
ground_truth=np.array([0, 30]),
angle_grids=angle_grids,
num_signal=2,
)
```
You will a get a figure like this:

Check [examples](./examples/) for for more details on how to use it.
You can see more plot results of the algorithm in the [Showcase](#showcase).
## What's implemented
### Array Structures
- Uniform Linear Array (support array position error and mutual coupling error)
- Uniform Circular Array
### Signal Models
- **Narrowband**
- _ComplexStochasticSignal_: The amplitude of signals at each sampling point is a complex random variable.
- _RandomFreqSignal_: Signals transmitted by different sources have different intermediate frequencies (support coherent mode).
- **Broadband**
- _ChirpSignal_: Chirp signals with different chirp bandwidths within the sampling period.
- _MultiFreqSignal_: Broadband signals formed by the superposition of multiple single-frequency signals within a certain frequency band.
- _MixedSignal_: Narrorband and broadband mixed signal
### Algorithms
- DOA estimation for ULA
- [x] MUSIC
- [x] ESPRIT
- [x] Root-MUSIC
- [x] OMP
- [x] $l_1$-SVD
- DOA estimation for URA
- [ ] URA-MUSIC
- [ ] URA-ESPRIT
- DOA estimation for UCA
- [x] UCA-RB-MUSIC
- [x] UCA-ESPRIT
- Broadband/Wideband DOA estimation
- [x] iMUSIC
- [x] CSSM
- [x] TOPS
- Coherent DOA estimation
- [x] smoothed-MUSIC
### Showcase



## License
This project is licensed under the [MIT](LICENSE) License - see the LICENSE file for details.