40 cfg.sample_rate = info.sample_rate;
41 cfg.channels = info.channels;
42 cfg.bits_per_sample = info.bits_per_sample;
48 using audio_tools::AudioEncoder::begin;
58 if (!
cfg.isValid())
return false;
59 if (
cfg.bits_per_sample != 16) {
60 LOGE(
"OliviaEncoder: bits_per_sample must be 16, not %d",
61 (
int)
cfg.bits_per_sample);
64 if (
cfg.channels < 1) {
65 LOGE(
"OliviaEncoder: invalid number of channels: %d", (
int)
cfg.channels);
85 size_t write(
const uint8_t* data,
size_t len)
override {
87 for (
size_t j = 0; j < len; j++) {
90 if (
codec.isSkipped(ch) || (!
cfg.contestia && ch == 127))
continue;
91 if (!
cfg.contestia && ch > 127) {
111 for (
size_t j = 0; j < silence_samples; j++)
samples.write(0.0f);
120 size_t block_samples =
122 size_t n = nsamples / block_samples + 1;
174 for (
int t = 0; t <
codec.blockLen(); t++)
182 float freq = tone < 0 ? 0 :
cfg.toneFreq(tone);
188 float w = 0.5f - 0.5f * cosf((
float)M_PI * tau /
symbol_time);
190 if (freq > 0) value += w * cosf(
phase + 2.0f * (
float)M_PI * freq * tau);
192 value += (1.0f - w) *
203 float step = ((
random_seed >> 16) & 1) ? (
float)M_PI / 2 : -(float)M_PI / 2;
211 size_t len = 2048 *
cfg.sample_rate / 8000;
212 size_t ramp = len / 8;
213 float freqs[2] = {
cfg.center_freq -
cfg.bandwidth / 2.0f,
214 cfg.center_freq +
cfg.bandwidth / 2.0f};
215 for (
int j = 0; j < 4; j++) {
216 float w = 2.0f * (float)M_PI * freqs[j % 2] /
cfg.sample_rate;
217 for (
size_t i = 0; i < len; i++) {
219 if (i < ramp) gain = 0.5f - 0.5f * cosf((
float)M_PI * i / ramp);
220 if (len - 1 - i < ramp)
221 gain = 0.5f - 0.5f * cosf((
float)M_PI * (len - 1 - i) / ramp);
222 samples.write(gain * cosf(w * i));
Common API of the modulators (FSKEncoder, MFSKEncoder): the written data is converted to 16 bit PCM a...
Definition ModemBase.h:286
void setOutput(Print &out) override
Definition ModemBase.h:288
ToneOutput tones
Definition ModemBase.h:334
The forward error correction of Olivia and Contestia (as in fldigi): each character of a block of bit...
Definition Olivia.h:213
static uint8_t grayCode(uint8_t binary)
Definition Olivia.h:287
void startTransmission()
Definition OliviaEncoder.h:156
bool writeIdle(size_t nsamples) override
Sends idle blocks (characters 0) for the indicated number of samples.
Definition OliviaEncoder.h:118
void sendSymbol(int tone)
Definition OliviaEncoder.h:181
bool transmitting
Definition OliviaEncoder.h:144
float prev_freq
Definition OliviaEncoder.h:152
uint8_t block[8]
Definition OliviaEncoder.h:146
void addChar(uint8_t ch)
Definition OliviaEncoder.h:165
OliviaCodec codec
Definition OliviaEncoder.h:142
float phase
Definition OliviaEncoder.h:153
bool begin(OliviaConfig config)
Starts the processing with the indicated configuration.
Definition OliviaEncoder.h:51
void end() override
Definition OliviaEncoder.h:79
bool begin() override
Definition OliviaEncoder.h:56
uint32_t random_seed
Definition OliviaEncoder.h:154
uint64_t symbol_index
Definition OliviaEncoder.h:150
void setOutput(Print &out) override
Definition OliviaEncoder.h:33
OliviaConfig & config()
The configuration which was provided in begin().
Definition OliviaEncoder.h:135
OliviaEncoder(Print &out)
Definition OliviaEncoder.h:28
bool isTransmitting() override
true between the first character and endTransmission()
Definition OliviaEncoder.h:129
uint64_t sample_index
Definition OliviaEncoder.h:151
bool is_active
Definition OliviaEncoder.h:143
double symbol_time
Definition OliviaEncoder.h:148
void sendBlock()
Definition OliviaEncoder.h:171
float symbolRate() override
Symbols per second.
Definition OliviaEncoder.h:132
float prev_phase
Definition OliviaEncoder.h:152
int bits
Definition OliviaEncoder.h:145
int block_len
Definition OliviaEncoder.h:147
SampleOutput samples
Definition OliviaEncoder.h:141
bool endTransmission(size_t silence_samples=0) override
Definition OliviaEncoder.h:103
OliviaConfig cfg
Definition OliviaEncoder.h:140
size_t write(const uint8_t *data, size_t len) override
Sends the characters.
Definition OliviaEncoder.h:85
void sendStartTones()
Definition OliviaEncoder.h:210
void setAudioInfo(audio_tools::AudioInfo info) override
Defines the sample rate and number of channels of the generated audio.
Definition OliviaEncoder.h:39
OliviaConfig defaultConfig()
Provides a default configuration: olivia-32-1000.
Definition OliviaEncoder.h:31
audio_tools::AudioInfo audioInfo() override
Definition OliviaEncoder.h:46
Writes float samples (-1.0 to 1.0) as 16 bit PCM with the requested number of channels and volume to ...
Definition ModemBase.h:118
TinyModem: software audio modems and packets with error correction.
Definition AX25.h:11
Configuration of the Olivia and Contestia modems (OliviaEncoder, OliviaDecoder): MFSK with 2 to 256 t...
Definition Olivia.h:31
static constexpr float BASE_RATE
internal sample rate which defines the signal
Definition Olivia.h:65