DOA Estimation algorithms implemented in Python. It can be used for ULA, UCA and broadband/wideband DOA estimation.
pip install doa_py
or install from source
git clone https://github.com/zhiim/doa_py.git
cd doa_py
pip install .
A sample example of DOA estimation using MUSIC algorithm.
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
for more examples.
- Uniform Linear Array (ULA)
- Uniform Rectangular Array (URA, to be implemented)
- Uniform Circular Array (UCA)
- 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 (IF). - 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.
- DOA estimation for ULA
- MUSIC
- ESPRIT
- Root-MUSIC
- OMP
- l1-SVD
- DOA estimation for URA
- URA-MUSIC
- URA-ESPRIT
- DOA estimation for UCA
- UCA-RB-MUSIC
- UCA-ESPRIT
- Broadband/Wideband DOA estimation
- ISSM
- CSSM
- TOPS
This project is licensed under the MIT License - see the LICENSE file for details.