Struct OESS

Source
pub struct OESS { /* private fields */ }
Expand description

Encoder / decoder using the OESS algorithm

The implementation follows https://doi.org/10.1109/JLT.2022.3201901. Most of the algorithm is implemented in trellis::Trellis though.

Implementations§

Source§

impl OESS

Source

pub fn new(e_max: usize, n_max: usize, ask: ASK) -> OESS

Returns a new OESS instance

OESS is sensitive to the maximum energy parameter. If there is a lower maximum energy that would allow the same number of bits in the index, all sequences with energy higher than this lower maximum energy will not be used. Thus the OESS algorithm is only defined for the lowest maximum energy that allows for a certain number of bits in the index. More specifically the following condition must hold:

|S(e_max - 8)| < 2^k ≤ |S(e_max)|

  • |S(E)| is the cardinality of the set of all amplitude sequences with energy less than or equal to E
  • k is a positive integer (equal to the number of bits in the index)

To find an acceptable e_max argument use OESS::optimal_e_max().

Source

pub fn optimal_e_max(e_max: usize, n_max: usize, ask: &ASK) -> usize

Returns the next lower optimal e_max value

An ESS encoder with the provided arguments can encode a certain number of bits. This function returns the lowest e_max parameter so that an ESS encoder with the new e_max still encodes the same number of bits.

Trait Implementations§

Source§

impl DistributionMatcher for OESS

Source§

fn amplitude_distribution(&self) -> Vec<f32>

Returns the probabilities of the amplitude values

The probabilities are returned as an array with the lowest index corresponding to the lowest amplitude.

Calculation for the partial trellis is based on formula (36) in section IV-D in https://doi.org/10.1109/JLT.2022.3201901.

Source§

fn n_max(&self) -> usize

Returns the number of amplitudes in an amplitude sequence
Source§

fn e_max(&self) -> usize

Returns the maximum allowed energy for an amplitude sequence
Source§

fn ask_num(&self) -> usize

Returns the number of the used ASK, e.g. 8 if 8-ASK is used
Source§

fn encode(&self, data: &Integer) -> Result<Vec<usize>, &str>

Returns the amplitude sequence for the given data or an error message if the data is imvalid
Source§

fn decode(&self, amplitude_sequence: &[usize]) -> Result<Integer, &str>

Returns the data for the given amplitude sequence or an error message if the data is invalid
Source§

fn num_sequences_possible(&self) -> Integer

Returns the maximum number of possible amplitude sequences Read more
Source§

fn energy_distribution(&self) -> Vec<f32>

Returns the probabilities of the amplitude sequence energies Read more
Source§

fn num_sequences(&self) -> Integer

Returns the number of used amplitude sequences Read more
Source§

fn num_data_bits(&self) -> u32

Returns the number of bits encoded per amplitude sequence
Source§

fn average_energy(&self) -> f32

Returns the average energy of amplitude sequences

Auto Trait Implementations§

§

impl Freeze for OESS

§

impl RefUnwindSafe for OESS

§

impl Send for OESS

§

impl Sync for OESS

§

impl Unpin for OESS

§

impl UnwindSafe for OESS

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.