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

PSK modulator (compatible with fldigi): the written bytes are Varicode encoded and each symbol is a phase step with a cosine shaped transition from the previous phase. More...

#include <PSKEncoder.h>

Inheritance diagram for tinymodem::PSKEncoder:
Collaboration diagram for tinymodem::PSKEncoder:

Public Member Functions

 PSKEncoder ()=default
 PSKEncoder (Print &out)
PSKConfig defaultConfig ()
 Provides a default configuration: psk31.
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 (PSKConfig 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
 Modulates the bytes.
bool endTransmission (size_t silence_samples=0) override
bool writeIdle (size_t nsamples) override
bool isTransmitting () override
 true between the first byte and endTransmission()
float symbolRate () override
 Symbols per second.
PSKConfig & 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 Types

enum class  Shape { TRANSITION , FADE_IN , FADE_OUT }

Protected Member Functions

void startTransmission ()
void sendChar (uint8_t ch)
void sendBit (int bit)
void sendStep (int step)
void sendSymbol (int step, Shape shape)
void nextCarrier ()

Protected Attributes

PSKConfig cfg
SampleOutput samples
QPSKCode code
bool is_active = false
bool transmitting = false
double samples_per_symbol = 0
uint64_t symbol_index = 0
float point_re = 1.0f
float point_im = 0.0f
int bits = 0
int bit_count = 0
float re = 1.0f
float im = 0.0f
float step_re = 1.0f
float step_im = 0.0f
uint32_t sample_count = 0
Protected Attributes inherited from tinymodem::ModemEncoder
ToneOutput tones

Static Protected Attributes

static constexpr int REVERSAL = 0
 phase steps as index of fldigi's 16 PSK positions (180 + n * 22.5 deg)
static constexpr int STEADY = 8

Detailed Description

PSK modulator (compatible with fldigi): the written bytes are Varicode encoded and each symbol is a phase step with a cosine shaped transition from the previous phase.

BPSK (PSK31): the characters are separated by "00", a 0 bit is a phase reversal, a 1 bit keeps the phase. QPSK: each bit is encoded by a rate 1/2 convolutional code into a phase step of 0, 90, 180 or 270 degrees. 8PSK: the MFSK Varicode bits are sent in groups of 3 as phase steps of 45 degrees.

A transmission starts with phase reversals (preamble). Call endTransmission() (or flush()) when the data is complete: the postamble is sent (BPSK and 8PSK: steady carrier, QPSK: encoded 0 bits) and the signal fades out.

Member Enumeration Documentation

◆ Shape

enum class tinymodem::PSKEncoder::Shape
strongprotected
Enumerator
TRANSITION 
FADE_IN 
FADE_OUT 

Constructor & Destructor Documentation

◆ PSKEncoder() [1/2]

tinymodem::PSKEncoder::PSKEncoder ( )
default

◆ PSKEncoder() [2/2]

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

Member Function Documentation

◆ audioInfo()

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

◆ begin() [1/2]

bool tinymodem::PSKEncoder::begin ( )
inlineoverride

◆ begin() [2/2]

bool tinymodem::PSKEncoder::begin ( PSKConfig config)
inline

Starts the processing with the indicated configuration.

◆ config()

PSKConfig & tinymodem::PSKEncoder::config ( )
inline

The configuration which was provided in begin().

◆ defaultConfig()

PSKConfig tinymodem::PSKEncoder::defaultConfig ( )
inline

Provides a default configuration: psk31.

◆ end()

void tinymodem::PSKEncoder::end ( )
inlineoverride

◆ endTransmission()

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

Sends the postamble and fades out (and adds optional silence): returns true if a transmission was ended.

Implements tinymodem::ModemEncoder.

◆ isTransmitting()

bool tinymodem::PSKEncoder::isTransmitting ( )
inlineoverridevirtual

true between the first byte and endTransmission()

Implements tinymodem::ModemEncoder.

◆ nextCarrier()

void tinymodem::PSKEncoder::nextCarrier ( )
inlineprotected

◆ operator bool()

tinymodem::PSKEncoder::operator bool ( )
inlineoverride

◆ sendBit()

void tinymodem::PSKEncoder::sendBit ( int bit)
inlineprotected

◆ sendChar()

void tinymodem::PSKEncoder::sendChar ( uint8_t ch)
inlineprotected

◆ sendStep()

void tinymodem::PSKEncoder::sendStep ( int step)
inlineprotected

◆ sendSymbol()

void tinymodem::PSKEncoder::sendSymbol ( int step,
Shape shape )
inlineprotected

Moves the constellation point by the phase step (index of 180 + n * 22.5 degrees)

◆ setAudioInfo()

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

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

◆ setOutput()

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

◆ startTransmission()

void tinymodem::PSKEncoder::startTransmission ( )
inlineprotected

◆ symbolRate()

float tinymodem::PSKEncoder::symbolRate ( )
inlineoverridevirtual

Symbols per second.

Implements tinymodem::ModemEncoder.

◆ write()

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

Modulates the bytes.

◆ writeIdle()

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

Sends the idle signal (BPSK and QPSK: 0 bits, 8PSK: the character 0) for the indicated number of samples

Reimplemented from tinymodem::ModemEncoder.

Member Data Documentation

◆ bit_count

int tinymodem::PSKEncoder::bit_count = 0
protected

◆ bits

int tinymodem::PSKEncoder::bits = 0
protected

◆ cfg

PSKConfig tinymodem::PSKEncoder::cfg
protected

◆ code

QPSKCode tinymodem::PSKEncoder::code
protected

◆ im

float tinymodem::PSKEncoder::im = 0.0f
protected

◆ is_active

bool tinymodem::PSKEncoder::is_active = false
protected

◆ point_im

float tinymodem::PSKEncoder::point_im = 0.0f
protected

◆ point_re

float tinymodem::PSKEncoder::point_re = 1.0f
protected

◆ re

float tinymodem::PSKEncoder::re = 1.0f
protected

◆ REVERSAL

int tinymodem::PSKEncoder::REVERSAL = 0
staticconstexprprotected

phase steps as index of fldigi's 16 PSK positions (180 + n * 22.5 deg)

◆ sample_count

uint32_t tinymodem::PSKEncoder::sample_count = 0
protected

◆ samples

SampleOutput tinymodem::PSKEncoder::samples
protected

◆ samples_per_symbol

double tinymodem::PSKEncoder::samples_per_symbol = 0
protected

◆ STEADY

int tinymodem::PSKEncoder::STEADY = 8
staticconstexprprotected

◆ step_im

float tinymodem::PSKEncoder::step_im = 0.0f
protected

◆ step_re

float tinymodem::PSKEncoder::step_re = 1.0f
protected

◆ symbol_index

uint64_t tinymodem::PSKEncoder::symbol_index = 0
protected

◆ transmitting

bool tinymodem::PSKEncoder::transmitting = false
protected

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