pulsarbat.RadioSignal#

class pulsarbat.RadioSignal(z, /, *, sample_rate, start_time=None, center_freq, chan_bw, freq_align='center', meta=None)[source]#

Class for heterodyned radio signals.

A radio signal is often heterodyned, so a center frequency (center_freq) and a channel bandwidth (chan_bw) must be provided to determine the frequencies of each channel. Optionally, freq_align is provided to indicate how the channel frequencies are positioned. Usually, the signal data here would be the result of some sort of filterbank.

The signal data (z) must have at least 2 dimensions where the first two dimensions refer to time (axis=0) and frequency (axis=1), respectively.

Parameters:
zarray-like

The signal data. Must be at least 2-dimensional with shape (nsample, nchan, ...).

sample_rateQuantity

The number of samples per second. Must be in units of frequency.

start_timeTime, optional

The start time of the signal (that is, the time at the first sample of the signal). Default is None.

center_freqQuantity

The frequency at the center of the signal’s band. Must be in units of frequency.

chan_bwQuantity

The bandwidth of a channel. The total bandwidth is chan_bw * nchan. Must be in units of frequency.

freq_align{‘bottom’, ‘center’, ‘top’}, default: ‘center’

The alignment of channels relative to the center_freq. Default is ‘center’ (as with odd-length complex DFTs). ‘bottom’ and ‘top’ only have an effect when nchan is even.

metadict, optional

Any metadata that the user might want to attach to the signal.

See also

Signal

Notes

The input signal array must have shape (nsample, nchan, ...), where nsample is the number of time samples, and nchan is the number of frequency channels.

The channels must be adjacent in frequency and of equal channel bandwidth, such that the frequency of a channel i is given by,:

freq_i = center_freq + chan_bw * (i + a - nchan/2)

where i is in [0, ..., nchan - 1], nchan is the number of channels (z.shape[1]), chan_bw is the bandwidth of a single channel, and a is in {0, 0.5, 1} depending on the value of freq_align.

An even-length complex-valued DFT (as implemented in numpy.fft.fft()) would have freq_align = 'bottom' with a center frequency of 0, whereas an odd-length DFT would have freq_align = 'center' due to symmetry. freq_align = 'top' is used in cases where the DFT was conducted on the lower sideband of the signal instead.

When nchan is odd, the freq_align attribute will internally be fixed to ‘center’ since the channels must be necessarily centered on the center_freq.

Attributes

axes_labels

Dictionary of axes labels.

bandwidth

Total bandwidth.

center_freq

Center frequency.

chan_bw

Channel bandwidth.

channel_freqs

Center frequencies of all channels.

data

The signal data.

dt

Sample spacing of the signal (1 / sample_rate).

dtype

Data type of the signal.

freq_align

Alignment of channel frequencies.

max_freq

Frequency at top of the band.

meta

Signal metadata.

min_freq

Frequency at bottom of the band.

nchan

Number of frequency channels.

ndim

Number of dimensions in data.

sample_rate

Sample rate of the signal.

sample_shape

Shape of a sample.

shape

Shape of the signal.

start_time

Start time of the signal (Time at first sample).

stop_time

Stop time of the signal (Time at sample after the last sample).

time_length

Length of signal in time units.

Methods

compute(**kwargs)

Returns signal with computed data.

contains(t, /)

Whether time(s) are within the bounds of the signal.

get_axis(axis)

Axis number from an integer or axis label.

like(obj[, z])

Returns a signal object "like" given signal object.

persist(**kwargs)

Returns signal with data persisted in memory.

rechunk([chunks])

Rechunks signal data if stored as a Dask array.

to_dask_array()

Returns signal with data as a Dask array.

compute(**kwargs)#

Returns signal with computed data.

Has no effect unless data is stored as a Dask Array. kwargs are passed on to the dask.compute() function.

contains(t, /)#

Whether time(s) are within the bounds of the signal.

get_axis(axis)#

Axis number from an integer or axis label.

classmethod like(obj, z=None, /, **kwargs)#

Returns a signal object “like” given signal object.

This classmethod inspects the class signature and creates a signal object like the given reference object. The signal data (as an array) must always be provided as well as any other arguments that are intended to be different than the reference object. All arguments required by the class signature that are not provided are acquired from attributes of the same name in the reference object.

Parameters:
objSignal

The reference signal object.

zarray-like

The signal data.

**kwargs

Additional keyword arguments to pass on to the target class.

persist(**kwargs)#

Returns signal with data persisted in memory.

Has no effect unless data is stored as a Dask Array. kwargs are passed on to the dask.persist() function.

rechunk(chunks=None, **kwargs)#

Rechunks signal data if stored as a Dask array.

If the underlying data is not a Dask array, it is converted to one first. By default, there is no chunking along the first dimension and other dimensions are automatically chunked based on the default chunk size set in Dask’s configuration. kwargs are passed along to dask.array.rechunk().

to_dask_array()#

Returns signal with data as a Dask array.

Uses dask.array.asanyarray() to convert signal data to a Dask array.