Skip to content

rodavrow/passiveRadar

 
 

Repository files navigation

A passive radar locates targets by detecting the echoes of broadcast signals that bounce off of them. This repository contains signal processing scripts for a FM radio based passive radar. Check out this page for more information about how passive radar works.

Requirements

The code is written in Python using Numpy, Scipy, h5py, dask, and matplotlib. I recommend using a 64-bit python distribution to avoid memory limitations.

File Contents

PRconfig.yaml: Configuration file for defining passive radar parameters. (Note that not all parameters defined in PRconfig.yaml are currently used, but will be added in a later version.)

PRrun.py: Main entry point to the program. Computes a sequence of range-doppler maps from the raw input signals. Broadly the steps are:

  1. Load the passive radar data, tune to the center frequency of the channel that is being used and decimate to the channel bandwidth
  2. Correct a constant time offset between the two input channels
  3. Apply a least squares adaptive filter for clutter removal
  4. Compute range-doppler maps for each signal block and save them to a file.

passiveRadar\PRalgo.py : Contains most of the passive radar signal processing functionality (least squares filtering and range-doppler processing.)

passiveRadar\signal_utils: various utility functions such as deinterleave_IQ and frequency_shift.

passiveRadar\range_doppler_plot.py: Once the range-doppler surfaces for each time step have been computed, range_doppler_plot.py can be used to generate passive radar video frames. Each frame is stored as an image in a specified directory. Use your favorite video software to render them into a video.

Obtaining Passive Radar Data

The following GNUradio block diagram can be used to receive passive radar data from a pair of RTL-SDR dongles modified to share a clock.

Recording baseband data like this results in pretty large files so unfortunately I can't post any example files in this repository. On a temporary basis you can find a 6GB example file at https://drive.google.com/open?id=18dG__H-nbuHJtG6WCHtPq3c_PRLqJA2O.

Input File Format

The program expects the input to be two continuous streams of interleaved IQ data (the reference and observation channels). The current implementation assumes both channels are contained in a single hdf5 file, but it would be straightforward to use a different format. For large input files it is important that the data can be lazily read into memory as it is needed instead of loaded all at the same time.

An easy way to convert binary data files to hdf5 is the h5import command-line tool which is included in the latest hdf5 release. See using_h5import.txt for brief instructions.

Algorithm Details

Least Squares Filtering:

Three least squares filter implementations are provided in passiveRadar\PRalgo.py:

  1. LS_Filter : direct least squares implementation based on matrix inversion

  2. LS_Filter_SVD : least squares filter implementation based on the singular value decomposition. Slower than the direct matrix inversion method but guaranteed stability.

  3. LS_Filter_Toeplitz : least squares filter implementation which makes strong assumptions about the statistical stationarity of the input signals. Much faster than the previous two implementations but can be inaccurate if the assumptions are violated (in my experience this rarely happens).

Range-Doppler Processing

Range-doppler processing is achieved by computing the cross-ambiguity function. Two cross-ambiguity function implementations are provided in passiveRadar\PRalgo.py:

  1. fast_xambg: Fast cross-ambiguity algorithm which computes the following steps for each range value:

    1. Take the product of the reference channel with the time-shifted surveillance channel

    2. Apply a FIR decimation filter and decimate to the desired range of doppler values (eg. , decimating to 512 Sa/s gives a Doppler range of -256 Hz to 256Hz)

    3. Take the FFT.

    The decimation filter used in step 2 is a flat-top FIR filter of length 10*(decimation factor)+1.

  2. fast_xambg_ones: Fast cross-ambiguity function identical to fast_xambg but which uses an all-ones filter prior to decimation and FFT. Runs faster than fast_xambg but causes sinc-shaped drooping of the ambiguity surface at high doppler values (not usually a problem).

Contributing

Please submit a pull request if you find any bugs or have ideas about how the software can be improved.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%