TinyModem
Header-only software audio modem library
Loading...
Searching...
No Matches
tinymodem::OliviaEncoder Class Reference

Olivia and Contestia modulator (compatible with fldigi): the written characters are collected in blocks of bitsPerSymbol() characters, which are FEC encoded into 64 (Contestia: 32) symbols. Each symbol is a tone with a raised cosine envelope over two symbol periods, so consecutive symbols overlap by half. More...

#include <OliviaEncoder.h>

Inheritance diagram for tinymodem::OliviaEncoder:
Collaboration diagram for tinymodem::OliviaEncoder:

Public Member Functions

 OliviaEncoder ()=default
 OliviaEncoder (Print &out)
OliviaConfig defaultConfig ()
 Provides a default configuration: olivia-32-1000.
void setOutput (Print &out) override
void setAudioInfo (audio_tools::AudioInfo info) override
 Defines the sample rate and number of channels of the generated audio.
audio_tools::AudioInfo audioInfo () override
bool begin (OliviaConfig config)
 Starts the processing with the indicated configuration.
bool begin () override
void end () override
size_t write (const uint8_t *data, size_t len) override
 Sends the characters.
bool endTransmission (size_t silence_samples=0) override
bool writeIdle (size_t nsamples) override
 Sends idle blocks (characters 0) for the indicated number of samples.
bool isTransmitting () override
 true between the first character and endTransmission()
float symbolRate () override
 Symbols per second.
OliviaConfig & config ()
 The configuration which was provided in begin().
 operator bool () override
Public Member Functions inherited from tinymodem::ModemEncoder
void setOutput (Print &out) override
void setGenerator (audio_tools::SoundGenerator< int16_t > &generator)
audio_tools::SoundGenerator< int16_t > & getGenerator ()
 Provides the active tone generator.
void writeSilence (size_t nsamples)
 Writes the indicated number of samples of silence.
void writeTone (float freq, size_t nsamples)
 Writes a tone for the indicated number of samples.
void flush ()
 Ends the transmission.
const char * mime () override

Protected Member Functions

void startTransmission ()
void addChar (uint8_t ch)
void sendBlock ()
void sendSymbol (int tone)
void sendStartTones ()

Protected Attributes

OliviaConfig cfg
SampleOutput samples
OliviaCodec codec
bool is_active = false
bool transmitting = false
int bits = 5
uint8_t block [8]
int block_len = 0
double symbol_time = 0
uint64_t symbol_index = 0
uint64_t sample_index = 0
float prev_freq = 0
float prev_phase = 0
float phase = 0
uint32_t random_seed = 1
Protected Attributes inherited from tinymodem::ModemEncoder
ToneOutput tones

Detailed Description

Olivia and Contestia modulator (compatible with fldigi): the written characters are collected in blocks of bitsPerSymbol() characters, which are FEC encoded into 64 (Contestia: 32) symbols. Each symbol is a tone with a raised cosine envelope over two symbol periods, so consecutive symbols overlap by half.

A transmission starts and ends with the fldigi start/stop tones (at the band edges). Call endTransmission() (or flush()) when the data is complete: an incomplete block is filled with 0 (the idle character). Olivia sends 8 bit characters escaped with 127, like fldigi: the character 127 itself can't be sent and is ignored.

Constructor & Destructor Documentation

◆ OliviaEncoder() [1/2]

tinymodem::OliviaEncoder::OliviaEncoder ( )
default

◆ OliviaEncoder() [2/2]

tinymodem::OliviaEncoder::OliviaEncoder ( Print & out)
inline

Member Function Documentation

◆ addChar()

void tinymodem::OliviaEncoder::addChar ( uint8_t ch)
inlineprotected

◆ audioInfo()

audio_tools::AudioInfo tinymodem::OliviaEncoder::audioInfo ( )
inlineoverride

◆ begin() [1/2]

bool tinymodem::OliviaEncoder::begin ( )
inlineoverride

◆ begin() [2/2]

bool tinymodem::OliviaEncoder::begin ( OliviaConfig config)
inline

Starts the processing with the indicated configuration.

◆ config()

OliviaConfig & tinymodem::OliviaEncoder::config ( )
inline

The configuration which was provided in begin().

◆ defaultConfig()

OliviaConfig tinymodem::OliviaEncoder::defaultConfig ( )
inline

Provides a default configuration: olivia-32-1000.

◆ end()

void tinymodem::OliviaEncoder::end ( )
inlineoverride

◆ endTransmission()

bool tinymodem::OliviaEncoder::endTransmission ( size_t silence_samples = 0)
inlineoverridevirtual

Sends the incomplete block and the stop tones (and adds optional silence): returns true if a transmission was ended.

Implements tinymodem::ModemEncoder.

◆ isTransmitting()

bool tinymodem::OliviaEncoder::isTransmitting ( )
inlineoverridevirtual

true between the first character and endTransmission()

Implements tinymodem::ModemEncoder.

◆ operator bool()

tinymodem::OliviaEncoder::operator bool ( )
inlineoverride

◆ sendBlock()

void tinymodem::OliviaEncoder::sendBlock ( )
inlineprotected

◆ sendStartTones()

void tinymodem::OliviaEncoder::sendStartTones ( )
inlineprotected

The fldigi start and stop tones: the lower and upper band edge twice, each for 2048 samples at 8000 Hz

◆ sendSymbol()

void tinymodem::OliviaEncoder::sendSymbol ( int tone)
inlineprotected

Writes one symbol period: the second half of the previous symbol and the first half of this symbol (-1 = none)

◆ setAudioInfo()

void tinymodem::OliviaEncoder::setAudioInfo ( audio_tools::AudioInfo info)
inlineoverride

Defines the sample rate and number of channels of the generated audio.

◆ setOutput()

void tinymodem::OliviaEncoder::setOutput ( Print & out)
inlineoverride

◆ startTransmission()

void tinymodem::OliviaEncoder::startTransmission ( )
inlineprotected

◆ symbolRate()

float tinymodem::OliviaEncoder::symbolRate ( )
inlineoverridevirtual

Symbols per second.

Implements tinymodem::ModemEncoder.

◆ write()

size_t tinymodem::OliviaEncoder::write ( const uint8_t * data,
size_t len )
inlineoverride

Sends the characters.

◆ writeIdle()

bool tinymodem::OliviaEncoder::writeIdle ( size_t nsamples)
inlineoverridevirtual

Sends idle blocks (characters 0) for the indicated number of samples.

Reimplemented from tinymodem::ModemEncoder.

Member Data Documentation

◆ bits

int tinymodem::OliviaEncoder::bits = 5
protected

◆ block

uint8_t tinymodem::OliviaEncoder::block[8]
protected

◆ block_len

int tinymodem::OliviaEncoder::block_len = 0
protected

◆ cfg

OliviaConfig tinymodem::OliviaEncoder::cfg
protected

◆ codec

OliviaCodec tinymodem::OliviaEncoder::codec
protected

◆ is_active

bool tinymodem::OliviaEncoder::is_active = false
protected

◆ phase

float tinymodem::OliviaEncoder::phase = 0
protected

◆ prev_freq

float tinymodem::OliviaEncoder::prev_freq = 0
protected

◆ prev_phase

float tinymodem::OliviaEncoder::prev_phase = 0
protected

◆ random_seed

uint32_t tinymodem::OliviaEncoder::random_seed = 1
protected

◆ sample_index

uint64_t tinymodem::OliviaEncoder::sample_index = 0
protected

◆ samples

SampleOutput tinymodem::OliviaEncoder::samples
protected

◆ symbol_index

uint64_t tinymodem::OliviaEncoder::symbol_index = 0
protected

◆ symbol_time

double tinymodem::OliviaEncoder::symbol_time = 0
protected

◆ transmitting

bool tinymodem::OliviaEncoder::transmitting = false
protected

The documentation for this class was generated from the following file: