Receiver
A MIMO receiver.
obj/receiver/receiver.m
Subclasses: Hybrid Digital/Analog Receiver
On This Page
- About
- Creating a Receiver
- Key Properties
- Setting the Number of Receive Streams
- Setting the Symbol Bandwidth
- Setting the Noise Power
- Example Setup
- Setting the Received Signal
- Setting/Realizing Noise
- Setting the Combiner
- Getting the Receive Symbol
- Shorthand Methods
- List of Properties
- List of Methods
- Methods Documentation
About
The receiver
object captures the properties and responsibilities of reception—the estimation of a symbol vector. Its primary responsibility lay in introducing additive noise and executing MIMO combining to retrieve a symbol vector from a captured received signal vector.
The received symbol vector after applying the receiver’s combiner can be written as
where is the complex received signal vector striking the receive array, is the complex noise vector added per-antenna, and is the combining matrix.
The receiver
object is used to represent the portion of a device responsible for reception, including MIMO combining.
The receiver
object is responsible for incorporating additive noise (which, in practice, is primarily introduced and amplified by components in the receive chain). Currently, MFM only supports additive white Gaussian noise (AWGN) introduced i.i.d. per-antenna.
Creating a Receiver
To create a receiver
object rx
, a convenient way is to use
rx = receiver.create();
Key Properties
The combining matrix of a receiver
object rx
is captured by the property
rx.combiner
Its receive symbol is represented by
rx.receive_symbol
The symbol bandwidth (in Hz) and symbol period (in seconds) are captured by
rx.symbol_bandwidth
rx.symbol_period
The noise power spectral density (in watts per Hz) is captured by
rx.noise_power_per_Hz
The integrated noise power (in watts) is captured by
rx.noise_power
The noise energy per symbol (in joules) is captured by
rx.noise_energy_per_symbol
Setting the Number of Receive Streams
To set the number of streams multiplexed at the receiver , one can use
rx.set_num_streams(Ns)
where the number of streams Ns
should be a positive integer.
Setting the Symbol Bandwidth
To set the symbol bandwidth at a receiver rx
, use
rx.set_symbol_bandwidth(B)
where B
is the symbol bandwidth in Hz.
This automatically updates the receiver
’s symbol period according to
Setting the Noise Level
Additive noise is introduced per-antenna. Currently, only Gaussian noise is supported in MFM. The noise vector is drawn from the complex Gaussian distribution as
where is the noise energy per symbol (in joules).
Rather than set the noise energy per symbol directly, it is more practical to set the noise power spectral density and symbol bandwidth, which togther define the noise power and noise energy per symbol.
To set the noise power spectral density of the additive noise at receiver
object rx
, use
rx.set_noise_power_per_Hz(noise_psd,unit)
where noise_psd
is the noise power per Hz and unit
is an optional string specifying the units of noise_psd
(default of watts per Hz).
For example, to set the noise power spectral density to -174 dBm/Hz, used
rx.set_noise_power_per_Hz(-174,'dBm_Hz')
Based on the current symbol bandwidth, this will automatically update the noise energy per symbol and noise power properties.
Since MFM assumes the relationship , the noise power spectral density (power per Hz) is equal to the noise energy per symbol.
The noise power (in watts) is equal to the noise power spectral density times the bandwidth as
Example Setup
Setting up a receiver
object rx
typically looks something similar to
rx = receiver.create()
rx.set_num_streams(Ns)
rx.set_symbol_bandwidth(B)
rx.set_noise_power_per_Hz(noise_psd,unit)
Setting the Received Signal
To set the received signal vector striking the receive array, use
rx.set_received_signal(y)
Setting/Realizing Noise
A new noise vector can be realized, according to the current noise level, via
rx.set_noise()
which is reflected in the property rx.noise
.
If desired, the noise vector can be set manually to a vector n
via
rx.set_noise(n)
Setting the Combiner
To set the combiner of a receiver, use
rx.set_combiner(W)
where W
is a combining matrix.
Getting the Receive Symbol
The receive symbol can be fetched via
s = rx.get_receive_symbol()
where s
is the receive symbol vector.
List of Properties
The receiver
object contains the following properties:
receiver.name
receiver.type
receiver.array
receiver.num_antennas
receiver.num_streams
receiver.symbol_bandwidth
receiver.symbol_period
receiver.combiner
receiver.noise
receiver.received_signal
receiver.receive_symbol
receiver.channel_state_information
receiver.noise_power
receiver.noise_energy_per_symbol
receiver.noise_power_per_Hz
receiver.noise_covariance
receiver.receive_strategy
receiver.source
List of Methods
The receiver
object contains the following methods:
receiver.N0
Returns the noise energy per symbol.receiver.Nr
Returns the number of receive antennas.receiver.Ns
Returns the number of streams.receiver.Rn
Returns the noise covariance matrix.receiver.W
Returns the combining matrix.receiver.check_combiner_dimensions
Checks to see if the combining matrix has dimensions appropriate for the current number of antennas and streams.receiver.check_receive_strategy
Returns a boolean indicating if a receive strategy is valid.receiver.configure_receiver
Configures the receiver’s combiner according to the current/specified receive strategy, incorporating channel state information as applicable.receiver.configure_receiver_eigen
Configures the receiver to receive along the strongest components of the desired channel, neglecting interference, etc.receiver.configure_receiver_identity
Configures the receive combiner to an identity matrix.receiver.configure_receiver_mmse_desired
Configures the receiver in an LMMSE fashion to reject noise. Does not reject interference.receiver.configure_receiver_mmse_interference
Configures the receiver in an LMMSE fashion to reject noise and interference.receiver.create
Creates a receiver.receiver.get_receive_symbol
Returns the receive symbol based on the curent received signal vector, noise, and combiner.receiver.get_source_channel_state_information_index
Returns the index of the receive CSI entry whose transmit device corresponds to the receiver’s source device.receiver.get_valid_receive_strategies
Returns a cell containing all valid receive strategy strings.receiver.initialize
Executes initializations for a receiver.receiver.n
Returns the noise vector (per-antenna).receiver.parse_channel_state_information
Splits the CSI into two components: (i) a struct containing CSI for receiving from the source and (ii) a cell of structs containing CSI for all other links (e.g., interference channels).receiver.receiver
Creates an instance of a receiver object.receiver.s
Returns the receive symbol vector.receiver.set_array
Sets the receiver’s array object and updates the number of receive antennas.receiver.set_channel_state_information
Sets the receive channel state information (CSI).receiver.set_combiner
Sets the receive combining matrix.receiver.set_name
Sets the name of the receiver.receiver.set_noise
Sets the noise vector at the receive array.receiver.set_noise_covariance
Sets the noise covariance matrix.receiver.set_noise_power_per_Hz
Sets the noise power per Hz based for a given noise power spectral density.receiver.set_num_streams
Sets the number of data streams being received.receiver.set_receive_strategy
Sets the receive strategy.receiver.set_receive_symbol
Sets the receive symbol.receiver.set_received_signal
Sets the received signal vector.receiver.set_source
Sets the source (device the receiver aims to serve).receiver.set_symbol_bandwidth
Sets the receive symbol bandwidth.receiver.set_type
Sets the type of the receiver.receiver.turn_off
Turns off the receiver by setting its combiner to a zeros matrix.receiver.update_noise_covariance
Updates the noise covariance matrix based on the current number of antennas and noise power.receiver.update_noise_power
Updates the noise power based on the current noise power per Hz and symbol bandwidth.receiver.update_receive_symbol
Updates the receive symbol (after combiner) based on the current received signal and noise.receiver.y
Returns the received signal vector.
Methods Documentation
N0()
Returns the noise energy per symbol.
- Usage:
val = N0()
- Return Values:
val
— the noise energy per symbol
Nr()
Returns the number of receive antennas.
- Usage:
val = Nr()
- Return Values:
val
— the number of receive antennas
Ns()
Returns the number of streams.
- Usage:
val = Ns()
- Return Values:
val
— the number of streams
Rn()
Returns the noise covariance matrix.
- Usage:
val = Rn()
- Return Values:
val
— the noise covariance matrix
W()
Returns the combining matrix.
- Usage:
val = W()
- Return Values:
val
— the combining matrix
check_combiner_dimensions(W)
Checks to see if the combining matrix has dimensions appropriate for the current number of antennas and streams.
- Usage:
out = check_combiner_dimensions()
out = check_combiner_dimensions(W)
- Input Arguments:
W
— (optional) a combining matrix; if not passed, the receivers’s current combiner will be assessed- Return Values:
out
— a boolean indicating if the combiner is of appropriate dimension
check_receive_strategy(strategy)
Returns a boolean indicating if a receive strategy is valid.
- Usage:
out = check_receive_strategy(strategy)
- Input Arguments:
strategy
— a string indentifying a specific receive strategy- Return Values:
out
— a boolean
configure_receiver(strategy)
Configures the receiver’s combiner according to the current/specified receive strategy, incorporating channel state information as applicable.
- Usage:
configure_receiver()
configure_receiver(strategy)
- Input Arguments:
strategy
— (optional) receive strategy to use; if not passed, the current receive strategy will be used
configure_receiver_eigen()
Configures the receiver to receive along the strongest components of the desired channel, neglecting interference, etc.
- Usage:
configure_receiver_eigen()
configure_receiver_identity()
Configures the receive combiner to an identity matrix.
- Usage:
configure_receiver_identity()
configure_receiver_mmse_desired()
Configures the receiver in an LMMSE fashion to reject noise. Does not reject interference.
- Usage:
configure_receiver_mmse_desired()
configure_receiver_mmse_interference()
Configures the receiver in an LMMSE fashion to reject noise and interference.
- Usage:
configure_receiver_mmse_interference()
create(type)
Creates a receiver.
- Usage:
obj = receiver.create()
obj = receiver.create(type)
- Input Arguments:
type
— (optional) a string specifying the type of receiver to create; either ‘digital’ or ‘hybrid’- Return Values:
obj
— a receiver object
get_receive_symbol()
Returns the receive symbol based on the curent received signal vector, noise, and combiner.
- Usage:
s = get_receive_symbol()
- Return Values:
s
— the receive symbol
get_source_channel_state_information_index()
Returns the index of the receive CSI entry whose transmit device corresponds to the receiver’s source device.
- Usage:
idx = get_source_channel_state_information_index()
- Return Values:
idx
— an index; if zero, the CSI entry was not found
get_valid_receive_strategies()
Returns a cell containing all valid receive strategy strings.
- Usage:
out = get_valid_receive_strategies()
- Return Values:
out
— a cell of strings- Notes:
- This function will differ between a fully-digital receiver and hybrid digital/analog receiver to account for receive strategies that are specific to each.
- This function will need to be updated anytime a custom/new receive strategy is added.
- The strings should be all lowercase.
initialize()
Executes initializations for a receiver.
- Usage:
initialize()
n()
Returns the noise vector (per-antenna).
- Usage:
val = n()
- Return Values:
val
— the noise vector (per-antenna)
parse_channel_state_information()
Splits the CSI into two components: (i) a struct containing CSI for receiving from the source and (ii) a cell of structs containing CSI for all other links (e.g., interference channels).
- Usage:
[csi_des,csi_int] = parse_channel_state_information()
- Return Values:
csi_des
— a CSI structcsi_int
— a cell of one or more CSI structs
receiver(name)
Creates an instance of a receiver object.
- Usage:
obj = receiver()
obj = receiver(name)
- Input Arguments:
name
— (optional) a name for the receiver- Return Values:
obj
— a receiver object
s()
Returns the receive symbol vector.
- Usage:
val = s()
- Return Values:
val
— the receive symbol vector
set_array(array)
Sets the receiver’s array object and updates the number of receive antennas.
- Usage:
set_array(array)
- Input Arguments:
array
— an array object- Notes:
- Also updates the noise covariance.
set_channel_state_information(csi)
Sets the receive channel state information (CSI).
- Usage:
set_channel_state_information(csi)
- Input Arguments:
csi
— a cell of channel state information structs
set_combiner(W)
Sets the receive combining matrix.
- Usage:
set_combiner(W)
- Input Arguments:
W
— receive combining matrix
set_name(name)
Sets the name of the receiver.
- Usage:
set_name()
set_name(name)
- Input Arguments:
name
— (optional) a string; if not passed, ‘receiver’ is the default name used
set_noise(n)
Sets the noise vector at the receive array.
- Usage:
set_noise()
set_noise(n)
- Input Arguments:
n
— (optional) a noise vector; if not passed, noise will be generated according to the noise power
set_noise_covariance(Rn)
Sets the noise covariance matrix.
- Usage:
set_noise_covariance(Rn)
- Input Arguments:
Rn
— noise covariance matrix
set_noise_power_per_Hz(noise_psd,unit)
Sets the noise power per Hz based for a given noise power spectral density.
- Usage:
set_noise_power_per_Hz(noise_psd)
set_noise_power_per_Hz(noise_psd,unit)
- Input Arguments:
noise_psd
— noise power spectral density (power per Hz) (e.g., -174 dBm/Hz)unit
— an optional unit specifying the units of noise_psd (e.g., ‘dBm_Hz’ for dBm/Hz (default) or ‘watts_Hz’ for watts/Hz)- Notes:
- Also updates the noise power and noise covariance.
set_num_streams(Ns)
Sets the number of data streams being received.
- Usage:
set_num_streams(Ns)
- Input Arguments:
Ns
— number of data streams
set_receive_strategy(strategy)
Sets the receive strategy.
- Usage:
set_receive_strategy()
set_receive_strategy(strategy)
- Input Arguments:
strategy
— (optional) a string specifying the receive strategy; options vary depending on receiver type (digital vs. hybrid); if not passed, identity reception will be used
set_receive_symbol(s)
Sets the receive symbol.
- Usage:
set_receive_symbol(s)
- Input Arguments:
s
— the receive symbol (e.g., after combiner)
set_received_signal(y)
Sets the received signal vector.
- Usage:
set_received_signal(y)
- Input Arguments:
y
— the received signal vector (i.e., vector impinging the receive array)
set_source(device_source)
Sets the source (device the receiver aims to serve).
- Usage:
set_source(device_source)
- Input Arguments:
device_source
— a device object
set_symbol_bandwidth(B)
Sets the receive symbol bandwidth.
- Usage:
set_symbol_bandwidth(B)
- Input Arguments:
B
— symbol bandwidth in Hertz- Notes:
- Also updates the symbol period and noise power.
set_type(type)
Sets the type of the receiver.
- Usage:
set_type()
set_type(type)
- Input Arguments:
type
— (optional) a string; if not passed, ‘digital’ is the default type used
turn_off()
Turns off the receiver by setting its combiner to a zeros matrix.
- Usage:
turn_off()
update_noise_covariance()
Updates the noise covariance matrix based on the current number of antennas and noise power.
- Usage:
update_noise_covariance()
- Notes:
- We have assumed i.i.d. noise across antennas.
update_noise_power()
Updates the noise power based on the current noise power per Hz and symbol bandwidth.
- Usage:
update_noise_power()
- Notes:
- Also updates the noise covariance matrix.
- As of now (Jan. 12, 2021), noise per symbol is equal to the noise power per Hz. Changes to notation or future accommodations may change how we define these two quantities so we are leaving them both present for the time being.
update_receive_symbol()
Updates the receive symbol (after combiner) based on the current received signal and noise.
- Usage:
update_receive_symbol()
- Notes:
- Should be called when the combiner, received signal, or noise are changed.
y()
Returns the received signal vector.
- Usage:
val = y()
- Return Values:
val
— the received signal vector