72 if (!
parseMode(mode, t, b, c))
return false;
80 static bool isMode(
const char* mode) {
89 while ((1 << (bits + 1)) <=
tones) bits++;
96 while ((125 << (bw + 1)) <=
bandwidth) bw++;
113 double multiplier = (
center_freq - offset) / 500.0;
114 return (
int)((
symbolLen() / 16) * multiplier) + 1;
133 LOGE(
"Olivia: tones must be a power of 2 (2 - 256)");
138 LOGE(
"Olivia: bandwidth must be 125, 250, 500, 1000 or 2000");
142 LOGE(
"Olivia: %d tones with %d Hz are not supported",
tones,
bandwidth);
146 LOGE(
"Olivia: invalid synchronizer settings");
150 LOGE(
"Olivia: the center frequency %.1f Hz is out of range",
154 if (sample_rate < 4000) {
155 LOGE(
"Olivia: the sample rate must be at least 4000 Hz");
167 if (mode ==
nullptr)
return false;
182 if (*rest == 0)
return true;
183 if (*rest !=
'-' && *rest !=
'_')
return false;
185 tones = strtol(rest + 1, &end, 10);
186 if (*end !=
'-' && *end !=
'_' && *end !=
'/')
return false;
188 if (tolower(*end) ==
'k') {
192 if (*end != 0)
return false;
198 static bool startsWith(
const char* str,
const char* prefix) {
200 if (tolower(*str++) != *prefix++)
return false;
215 void begin(
int bits_per_symbol,
bool is_contestia) {
216 bits = bits_per_symbol;
228 for (
int t = 0; t <
block_len; t++) symbols[t] = 0;
229 for (
int b = 0; b <
bits; b++) {
230 for (
int t = 0; t <
block_len; t++) fht[t] = 0;
241 code_bit = (code_bit + 1) & (
block_len - 1);
243 int bit = b + rotate;
245 symbols[t] |= 1 << bit;
247 if (++rotate >=
bits) rotate = 0;
255 uint8_t
decodeChar(
const int8_t* soft,
int b,
float& peak,
float& noise) {
260 int32_t bit = soft[t *
bits + rotate];
263 code_bit = (code_bit + 1) & (
block_len - 1);
264 if (++rotate >=
bits) rotate = 0;
273 if (abs(fht[t]) > abs(max)) {
281 noise = (sum - peak * peak) / (
block_len - 1);
287 static uint8_t
grayCode(uint8_t binary) {
return binary ^ (binary >> 1); }
302 return contestia ? 0xEDB88320ull : 0xE257E6D0291574ECull;
309 if (ch >=
'a' && ch <=
'z') ch +=
'A' -
'a';
310 if (ch ==
' ')
return 59;
311 if (ch ==
'\n')
return 60;
312 if (ch == 0)
return 0;
313 if (ch >= 33 && ch <= 90)
return ch - 32;
314 if (ch == 8)
return 61;
320 if (ch == 59)
return ' ';
321 if (ch == 60)
return '\n';
322 if (ch == 61)
return 8;
329 for (
int step = 1; step < len; step *= 2)
330 for (
int ptr = 0; ptr < len; ptr += 2 * step)
331 for (
int j = ptr; j < ptr + step; j++) {
332 T a = data[j], b = data[j + step];
334 data[j + step] = b - a;
340 static void ifht(T* data,
int len) {
341 for (
int step = len / 2; step; step /= 2)
342 for (
int ptr = 0; ptr < len; ptr += 2 * step)
343 for (
int j = ptr; j < ptr + step; j++) {
344 T a = data[j], b = data[j + step];
346 data[j + step] = a + b;
The forward error correction of Olivia and Contestia (as in fldigi): each character of a block of bit...
Definition Olivia.h:213
void begin(int bits_per_symbol, bool is_contestia)
Definition Olivia.h:215
int shift() const
Definition Olivia.h:305
uint8_t encodeChar(uint8_t ch) const
Definition Olivia.h:307
static void fhtTransform(T *data, int len)
fast Hadamard transform (fldigi FHT)
Definition Olivia.h:328
uint64_t scramblingCode() const
Definition Olivia.h:301
bool isSkipped(uint8_t ch) const
Definition Olivia.h:223
void encodeBlock(const uint8_t *chars, uint8_t *symbols)
Encodes bits characters into block_len symbols (binary, not Gray coded).
Definition Olivia.h:226
uint8_t decodeChar(uint8_t ch) const
Definition Olivia.h:318
static uint8_t binaryCode(uint8_t gray)
Definition Olivia.h:289
int block_len
Definition Olivia.h:298
uint8_t decodeChar(const int8_t *soft, int b, float &peak, float &noise)
Definition Olivia.h:255
int bits
Definition Olivia.h:297
static uint8_t grayCode(uint8_t binary)
Definition Olivia.h:287
static void ifht(T *data, int len)
inverse fast Hadamard transform (fldigi IFHT)
Definition Olivia.h:340
bool contestia
Definition Olivia.h:299
int blockLen() const
Definition Olivia.h:285
TinyModem: software audio modems and packets with error correction.
Definition AX25.h:11
int symbolsPerBlock() const
symbols per FEC block: 64 for Olivia, 32 for Contestia
Definition Olivia.h:104
uint8_t channel
receiver: input channel which is used for the decoding
Definition Olivia.h:60
bool contestia
Contestia instead of Olivia.
Definition Olivia.h:45
int tones
number of tones (power of 2: 2 - 256)
Definition Olivia.h:39
bool rx_one
receiver: stop after the first transmission
Definition Olivia.h:58
bool start_tones
transmitter: send the start and stop tones (like fldigi)
Definition Olivia.h:49
bool setMode(const char *mode)
Definition Olivia.h:69
int symbolLen() const
FFT length (window of a symbol) in samples at 8000 Hz.
Definition Olivia.h:94
static bool startsWith(const char *str, const char *prefix)
Definition Olivia.h:198
static constexpr float BASE_RATE
internal sample rate which defines the signal
Definition Olivia.h:65
float rx_noise
receiver: (testing only) amplitude of added uniform noise
Definition Olivia.h:62
bool isValid() const
Checks the configuration: returns false (and logs the reason) if invalid.
Definition Olivia.h:131
int bitsPerSymbol() const
number of bits per symbol (log2 of the tones)
Definition Olivia.h:87
int sync_integration
receiver: integration period of the synchronizer in FEC blocks
Definition Olivia.h:54
OliviaConfig()
Definition Olivia.h:32
float symbolRate() const
symbols per second
Definition Olivia.h:123
float charRate() const
characters per second
Definition Olivia.h:126
static constexpr int MAX_SYMBOL_LEN
largest supported FFT length
Definition Olivia.h:162
float sync_threshold
receiver: minimum signal to noise ratio of the synchronizer
Definition Olivia.h:56
static bool isMode(const char *mode)
true if the mode is an Olivia or Contestia mode
Definition Olivia.h:80
float toneFreq(int tone) const
frequency of a tone in Hz
Definition Olivia.h:118
float center_freq
center frequency in Hz
Definition Olivia.h:43
float volume
transmit amplitude (0.0 - 1.0)
Definition Olivia.h:47
int sync_margin
Definition Olivia.h:52
int symbolSepar() const
distance of two symbols in samples at 8000 Hz
Definition Olivia.h:101
static bool parseMode(const char *mode, int &tones, int &bandwidth, bool &contestia)
Definition Olivia.h:165
int bandwidth
bandwidth in Hz: 125, 250, 500, 1000 or 2000
Definition Olivia.h:41
int bitsPerCharacter() const
bits per character: 7 for Olivia, 6 for Contestia
Definition Olivia.h:107
int firstCarrier() const
lowest tone as FFT bin (like fldigi)
Definition Olivia.h:110