Signals¶
signals¶
This file contains the digital signal processing functionality of Borealis. This includes generation of pulses, determination of antenna phases for beamforming, filtering and downsampling of received signals, beamforming of filtered signals, and extraction of lag profiles from beamformed samples.
- copyright
2024 SuperDARN Canada
- author
Remington Rohel
- class src.utils.signals.DSP(rx_rate, filter_taps, mixing_freqs, dm_rates, use_shared_mem=True)[source]¶
Bases:
object
This class performs the digital signal processing functions of Borealis. Filtering and downsampling are specified by lists of filter taps and downsampling factors, which must have the same length. The first filter stage is always a bandpass filter, specified by a list of mixing frequencies which can be selected simultaneously. All subsequent filter stages are lowpass.
Beamforming can also be conducted on the filtered and downsampled data, requiring a list of complex antenna phases for the beamforming operation. Multiple beams can be formed simultaneously.
This class also supports extraction of lag profiles from multi-pulse sequences.
- static apply_bandpass_decimate(input_samples, bp_filters, mixing_freqs, dm_rate, rx_rate)[source]¶
Apply a Frerking bandpass filter to the input samples. Several different frequencies can be centered on simultaneously. Downsampling is done in parallel via a strided window view of the input samples.
- Parameters
input_samples (ndarray [num_antennas, num_samples]) – The input raw rf samples for each antenna.
bp_filters (ndarray [num_slices, num_taps]) – The bandpass filter(s).
mixing_freqs (list) – The frequencies used to mix the first stage filter for bandpass.
dm_rate (int) – The decimation rate of this stage
rx_rate (float) – The rf rx rate.
- Returns
Samples after bandpass filter and downsampling operations. Shape [num_slices, num_antennas, samples]
- Return type
ndarray
- apply_filters(input_samples)[source]¶
Applies the multi-stage filter to input_samples. Filter results are kept on the same device as input_samples.
- Parameters
input_samples (ndarray) – The wideband samples to operate on.
- static apply_lowpass_decimate(input_samples, lp_filter, dm_rate)[source]¶
Apply a lowpass filter to the baseband input samples. Downsampling is done in parallel via a strided window view of the input samples.
- Parameters
input_samples (ndarray [num_slices, num_antennas, num_samples]) – Baseband input samples
lp_filter (ndarray [1, num_taps]) – Lowpass filter taps
dm_rate (int) – The decimation rate of this stage.
- Returns
Samples after lowpass filter and downsampling operations. Shape [num_slices, num_antennas, samples]
- Return type
ndarray
- beamform(beam_phases)[source]¶
Applies the beamforming operation to the antennas_iq samples. Different beam directions are formed in parallel, and the results are stored in SharedMemory if so specified for this instance.
- Parameters
beam_phases (list) – The phases used to beamform the filtered samples.
- static beamform_samples(filtered_samples, beam_phases)[source]¶
Beamform the filtered samples for multiple beams simultaneously.
- Parameters
filtered_samples (ndarray [num_slices, num_antennas, num_samples]) – The filtered input samples.
beam_phases (ndarray [num_slices, num_beams, num_antennas]) – The beam phases used to phase each antenna’s samples before combining.
- Returns
Beamformed samples of shape [num_slices, num_beams, num_samples]
- Return type
np.ndarray
- cfs_freq_analysis(metadata, n)[source]¶
Performs decimation and frequency analysis on clear frequency search data. Data will not be in shared memory.
- static correlations_from_samples(beamformed_samples_1, beamformed_samples_2, output_sample_rate, slice_index_details)[source]¶
Correlate two sets of beamformed samples together. Correlation matrices are used and indices corresponding to lag pulse pairs are extracted.
- Parameters
beamformed_samples_1 (ndarray [num_slices, num_beams, num_samples]) – The first beamformed samples.
beamformed_samples_2 (ndarray [num_slices, num_beams, num_samples]) – The second beamformed samples.
output_sample_rate (float) – Sampling rate of data.
slice_index_details (list) – Details used to extract indices for each slice.
- Returns
Correlations for slices. List of length num_slices, with each entry having shape [num_beams, num_range_gates, num_lags].
- Return type
list[ndarray]
- static create_filters(filter_taps, mixing_freqs, rx_rate)[source]¶
Creates and shapes the filters arrays using the original sets of filter taps. The first stage filters are mixed to bandpass and the low pass filters are reshaped. The filters coefficients are typically symmetric, except for the first-stage bandpass filters. Mixing frequencies should be given as an offset from the center frequency. For example, with 12 MHz center frequency and a 10.5 MHz transmit frequency, the mixing frequency should be -1.5 MHz.
- Parameters
- Returns
List of stages of filter taps. First stage is bandpass, subsequent stages are lowpass.
- Return type
list[ndarray]
- move_filter_results()[source]¶
Move the final results of filtering (antennas_iq data) to the CPU, optionally in SharedMemory if specified for this instance.
- static windowed_view(ndarray, window_len, step)[source]¶
Creates a strided and windowed view of the ndarray. This allows us to skip samples that will otherwise be dropped without missing samples needed for the convolutions windows. The strides will also not extend out of bounds meaning we do not need to pad extra samples and then drop bad samples after the fact.
- src.utils.signals.basic_pulse_phase_offset(exp_slice)[source]¶
Calculate the phase difference of each pulse with respect to the first pulse based on the transmit frequency and the pulse separation.
- Parameters
exp_slice (class) – The experiment slice information
- Returns
Pulse phase offsets
- Return type
array (rad)
- src.utils.signals.get_phase_shift(beam_angle: list[float], freq_khz: float, antenna_locations: ndarray)[source]¶
Find the complex excitation for all antennas to make beams in all given directions.
- Parameters
beam_angle (list) – list of azimuthal direction of the beam off boresight, in degrees, positive beamdir being to the right of the boresight (looking along boresight from ground).
freq_khz (float) – transmit frequency in kHz
antenna_locations (np.ndarray) – x-coordinates of each antenna in the array, in meters. Shape [num_antennas]
- Returns
phase_shift a 2D array of shape [beams, antennas] giving the complex excitation for each antenna required to form each beam.
- Return type
phase_shift ndarray
- src.utils.signals.get_samples(rate, wave_freq, pulse_len, ramp_time, max_amplitude)[source]¶
Get basic (not phase-shifted) samples for a given pulse.
Find the normalized sample array given the rate (Hz), frequency (Hz), pulse length (s). Will shift for beam later.
- Parameters
rate (float) – tx sampling rate, in Hz.
wave_freq (float) – frequency offset from the centre frequency on the USRP, given in Hz. To be mixed with the centre frequency before transmitting. (ex. centre = 12 MHz, wave_freq = + 1.2 MHz, output = 13.2 MHz.
pulse_len (float) – length of the pulse (in seconds)
ramp_time (float) – ramp up and ramp down time for the pulse, in seconds. Typical 0.00001 s from config.
max_amplitude (float) – USRP’s max DAC amplitude. N200 = 0.707 max
- Returns samples
a numpy array of complex samples, representing all samples needed for a pulse of length pulse_len sampled at a rate of rate.
- Return type
ndarray