/doamm

Implementation of algorithms for refinement of direction of arrival estimators by optimization

Primary LanguagePython

Refinement of Direction of Arrival Estimators by Majorization-Minimization Optimization on the Array Manifold

This repository contains implementation for the algorithms and experiments of the paper Refinement of Direction of Arrival Estimators by Majorization-Minimization Optimization on the Array Manifold by Robin Scheibler and Masahito Togami.

Abstract

We propose a generalized formulation of direction of arrival estimation that includes many existing methods such as steered response power, subspace, coherent and incoherent, as well as speech sparsity-based methods. Unlike most conventional methods that rely exclusively on grid search, we introduce a continuous optimization algorithm to refine DOA estimates beyond the resolution of the initial grid. The algorithm is derived from the majorization-minimization (MM) technique. We derive two surrogate functions, one quadratic and one linear. Both lead to efficient iterative algorithms that do not require hyperparameters, such as step size, and ensure that the DOA estimates never leave the array manifold, without the need for a projection step. In numerical experiments, we show that the accuracy after a few iterations of the MM algorithm nearly removes dependency on the resolution of the initial grid used. We find that the quadratic surrogate function leads to very fast convergence, but the simplicity of the linear algorithm is very attractive, and the performance gap small.

Authors

  • Robin Scheibler
  • Masahito Togami

Experiments

We work with anaconda to simplify the environement setup.

conda env create -f environment.yml
conda activate doamm

For the experiment on simulated data, run the following.

# Generate Fig. 1 and Table 2
# - this will create the folder ./sim_results/YYYMMDD-HHmmss_experiment1_effect_grid_size
python ./doa_experiment_para.py ./doa_experiment_para.py ./config_experiment_grid.yml
# - plot Fig. 1
python ./make_figure1.py ./sim_results/YYYYmmdd-HHMMSS_experiment1_effect_grid_size
# - plot Table 2
python ./make_table_runtime.py ./sim_results/YYYYmmdd-HHMMSS_experiment1_effect_grid_size

# Generate Table 1
# - this will create the folder ./sim_results/YYYMMDD-HHmmss_experiment1_effect_s
python ./doa_experiment_para.py ./doa_experiment_para.py ./config_experiment_s.yml
python ./make_table1.py ./sim_results/YYYYmmdd-HHMMSS_experiment1_effect_s

For the experiment on recorded data, it is necessary to download the Pyramic dataset here

git clone https://github.com/fakufaku/pyramic-dataset
cd pyramic-dataset
wget -qO- https://zenodo.org/record/1209563/files/pyramic_segmented_<sample_type>.tar.gz | tar xzv
cd ..

Then, run the following

# Run the experiment
python ./doa_experiment_pyramic.py run ./pyramic-dataset/calibration/calibrated_locations.json --sources 1 --output ./sim_results/pyramic_doa_results.json

# Plot Fig. 2
python ./doa_experiment_pyramic.py plot ./sim_results/pyramic_doa_results.json -s figures/pyramic_figure.pdf

License

This code is released under MIT License.

Copyright 2021 Robin Scheibler and Masahito Togami