The External Calibrator for Hydrogen Arrays (ECHO) is a system for calibrating wide-field radio frequency arrays using a radio transmitter mounted on a drone. Primarily targeting (but not exclusively limited to) arrays operating in the sub-GHz band targeting highly redshifted 21cm radiation from the early universe.
This repository contains software for planning missions and analyzing data. It also contains hardware designs for drones and mounts.
This is an open source project. Use and reuse is encouraged. If you use this code or hardware designs please reference the github repo. http://github.com/dannyjacobs/ECHO and cite our 2017 paper. If you have improvements please fork and send a PR!
Install prerequisites. We recommend the anaconda package manager
Get this repo
git clone https://github.com/dannyjacobs/ECHO.git
Install using pip
cd ECHO
pip install .
The code is organized into a few modules. The beam mapping pipeline steps are
Analyze results. Example analysis steps include:
plot_utils.py
Functions for plotting, but also all functions relating to healpix gridding and manipulation including gridding.
grid_to_healpix
: grids aligned RF power vs XYZ position
into a healpix mapmake_beam
: downselects desired spectral channel, converts from latlon to XYZ and calls grid_to_healpix
project_healpix
: flattens from spherical healpix map to 2d gnomic projectionrotate_hpm
: rotates a healpix map about the polar axis. useful for plottingread_utils.py
Functions for reading and writing drone and beam data. Drone log file formats are not well documented and change all the time.
read_map
: replacement for healpy read function that respects nanswrite_map
: replacement for healpy write function that respect nansapm_version
: tries to determine the version of ardupilot that wrote a log file.read_apm_log_A_B_C
: reads an ardupilot log of version A_B_Cread_echo_spectrum
: reads a spectrum data file output by the ECHO spectrum logger ca 2017 (signalhound + get_sh_spectra)read_orbcomm_spectrum
: reads a spectrum data file output by the Bradley orbcomm system (ca 2017)channel_select
: given a spectrum, list of frequencies, and desired frequency returns closest frequency and spectrum amplitudeinterp_rx
: interpolates received power onto the measured position time gridflag_angles
: flags outlier yaws input times,yaw_angles return matching flag arrayflag_waypoints
: flags a range of time around a list of waypointsapply_flagtimes
: Given a list of bad times, a buffer size and a time array, generate a flag table.
position_utils.py
latlon2xy
: about what you thinkto_spherical
: xyz to spherical
time_utils.py
Most of these are of dubious necessity.
unix_to_gps
: thin wrapper around astropy.Timegps_to_HMS
: convert GPS time to Hours Minutes Seconds, thin wrapper around
server_utils.py
Stuff developed to support real-time operations. This never worked very well with mavlink.
Scripts used in the 2017 paper are all run in one master shell script