43 if (info.sample_rate ==
cfg.sample_rate && info.channels ==
cfg.channels &&
44 info.bits_per_sample ==
cfg.bits_per_sample)
46 cfg.sample_rate = info.sample_rate;
47 cfg.channels = info.channels;
48 cfg.bits_per_sample = info.bits_per_sample;
54 using audio_tools::AudioDecoder::begin;
64 if (!
cfg.isValid())
return false;
99 size_t write(
const uint8_t* data,
size_t len)
override {
101 input.write(data, len,
102 [
this](
float sample) {
addSample(sample,
true); });
121 static constexpr int BINS = 16;
182 for (
int b = 0; b <
BINS; b++) {
202 double w = 2.0 * M_PI * (
cfg.carrier_freq + offset) /
cfg.sample_rate;
210 return ((
noise_seed >> 8) & 0xFFFF) / 65535.0f - 0.5f;
215 if (add_noise &&
cfg.rx_noise != 0.0f)
221 sum_i += values[0] - old[0];
222 sum_q += values[1] - old[1];
235 float prev_phase =
phase;
237 int bin = (int)(prev_phase *
BINS);
250 if (error > 0.5f) error -= 1.0f;
251 if (error < -0.5f) error += 1.0f;
262 for (
int k = 0; k <
window; k++) {
275 for (
int b = 0; b <
BINS; b++) {
282 if (b == 0 ||
hist[b] < min) min =
hist[b];
285 for (
int b = 0; b <
BINS; b++) {
286 float angle = 2.0f * (float)M_PI * (b + 0.5f) /
BINS;
287 float weight =
hist[b] - min;
288 x += weight * cosf(angle);
289 y += weight * sinf(angle);
291 if (x == 0 && y == 0)
return;
292 float t = atan2f(y, x) / (2.0f * (float)M_PI);
293 target = t < 0 ? t + 1.0f : t;
306 float amplitude = 2.0f * sqrtf(zi * zi + zq * zq) /
window;
309 bool present = amplitude >=
cfg.min_amplitude &&
310 amplitude > 0.5f * rms_amplitude;
311 float mag2 = dr * dr + di * di;
318 float raw = atan2f(di, dr);
320 if (step < 0) step += 2.0f * (float)M_PI;
327 int bit = dr > 0 ? 1 : 0;
329 if (present &&
cfg.afc) {
334 bool reversal =
carrier ? bit == 0 :
true;
335 error = reversal ? atan2f(-di, -dr) : atan2f(di, dr);
338 float spacing = 2.0f * (float)M_PI / m;
339 error = raw - spacing * lroundf(raw / spacing);
342 if (!
carrier && fabsf(error) > 0.75f * (
float)M_PI) error = 0;
344 (2.0f * (float)M_PI);
345 float max_offset =
cfg.symbol_rate / 2;
346 if (offset > max_offset) offset = max_offset;
347 if (offset < -max_offset) offset = -max_offset;
359 bool weak_symbol = amplitude <
cfg.min_amplitude ||
363 bool steady = fabsf(raw) < (float)M_PI / m;
380 switch (
cfg.modulation) {
384 for (
int sym = 0; sym < 4; sym++) {
385 float expected = (float)M_PI + (
float)M_PI / 2 * ((4 - sym) & 3);
386 metric[sym] = cosf(step - expected);
388 int decoded =
qpsk.decode(metric);
389 if (decoded >= 0)
varicode(decoded);
393 float pos = (step - (float)M_PI) / ((
float)M_PI / 4);
394 int sym = ((int)lroundf(
pos) % 8 + 8) % 8;
395 for (
int b = 0; b < 3; b++)
mfskVaricode((sym >> b) & 1);
429 if (p_print !=
nullptr) p_print->write(ch);
435 if ((
code >> 1) != 0) {
437 if (ch >= 0 && p_print !=
nullptr) {
438 p_print->write((uint8_t)ch);
467 status(
"### CARRIER %s %.2f baud @ %.1f Hz ###\n", name,
480 "\n### NOCARRIER ndata=%u quality=%.3f ampl=%.3f freq=%.1f Hz ###\n",
static int decode(uint16_t bits)
Byte of the indicated code: returns -1 if the code is unknown.
Definition PSK.h:239
Common API of the demodulators (FSKDecoder, MFSKDecoder): PCM audio data is written to the decoder an...
Definition ModemBase.h:344
void status(const char *fmt,...)
Definition ModemBase.h:367
void addSample(float x, bool add_noise)
Definition PSKDecoder.h:213
PSKConfig & config()
The configuration which was provided in begin().
Definition PSKDecoder.h:116
static constexpr int MAX_ONES
Definition PSKDecoder.h:123
void setAudioInfo(audio_tools::AudioInfo info) override
Defines the format of the input audio data.
Definition PSKDecoder.h:42
void output(uint8_t ch)
Definition PSKDecoder.h:427
float step_im
Definition PSKDecoder.h:141
PSKDecoder(Print &out)
Definition PSKDecoder.h:32
uint8_t held[MAX_ONES]
Definition PSKDecoder.h:169
float freq_offset
Definition PSKDecoder.h:142
PSKConfig cfg
Definition PSKDecoder.h:132
int pos
Definition PSKDecoder.h:144
static constexpr int BINS
Definition PSKDecoder.h:121
float prev_i
Definition PSKDecoder.h:157
float track_amplitude
Definition PSKDecoder.h:171
float phase
Definition PSKDecoder.h:149
static constexpr float MAX_CORRECTION
Definition PSKDecoder.h:130
bool begin() override
Definition PSKDecoder.h:62
uint32_t sample_count
Definition PSKDecoder.h:146
PSKConfig defaultConfig()
Provides a default configuration: psk31.
Definition PSKDecoder.h:35
static constexpr float TIMING_GAIN
Definition PSKDecoder.h:129
PcmInput input
Definition PSKDecoder.h:135
void varicode(int bit)
Collects the bits of a character: characters are separated by "00".
Definition PSKDecoder.h:433
float nco_re
Definition PSKDecoder.h:141
float step_re
Definition PSKDecoder.h:141
bool carrier
Definition PSKDecoder.h:160
float quality
Definition PSKDecoder.h:158
unsigned ndata
Definition PSKDecoder.h:173
int ones
Definition PSKDecoder.h:162
audio_tools::AudioInfo audioInfo() override
Definition PSKDecoder.h:52
int bin_count[BINS]
Definition PSKDecoder.h:153
int weak
Definition PSKDecoder.h:163
static constexpr float TIMING_SMOOTHING
Definition PSKDecoder.h:128
uint32_t mfsk_code
Definition PSKDecoder.h:167
float sum_i
Definition PSKDecoder.h:145
float hist[BINS]
Definition PSKDecoder.h:154
float nco_im
Definition PSKDecoder.h:141
float quality_m
Definition PSKDecoder.h:159
float prev_q
Definition PSKDecoder.h:157
int positions()
number of phase positions
Definition PSKDecoder.h:297
audio_tools::Vector< float > history
Definition PSKDecoder.h:143
QPSKCode qpsk
Definition PSKDecoder.h:166
int nheld
Definition PSKDecoder.h:170
bool is_finished
Definition PSKDecoder.h:134
float noise()
uniform random value in the range -0.5 to 0.5
Definition PSKDecoder.h:208
float samples_per_symbol
Definition PSKDecoder.h:137
void endOfCarrier()
Definition PSKDecoder.h:471
void setFrequencyOffset(float offset)
Definition PSKDecoder.h:200
static constexpr float AFC_GAIN
Definition PSKDecoder.h:127
float countdown
Definition PSKDecoder.h:151
unsigned nsymbols
Definition PSKDecoder.h:174
void startOfCarrier(float amplitude)
Definition PSKDecoder.h:450
bool isFinished() override
true if the decoding was stopped (rx_one)
Definition PSKDecoder.h:110
static constexpr int MIN_PREAMBLE
Definition PSKDecoder.h:122
float bin_sum[BINS]
Definition PSKDecoder.h:152
int window
Definition PSKDecoder.h:138
float sum_q
Definition PSKDecoder.h:145
float target
Definition PSKDecoder.h:150
float amplitude_total
Definition PSKDecoder.h:176
float frequencyOffset()
Current frequency offset of the received signal in Hz.
Definition PSKDecoder.h:113
void mfskVaricode(int bit)
MFSK Varicode (8PSK): a character ends with "001".
Definition PSKDecoder.h:405
void resetState()
Definition PSKDecoder.h:178
void decide()
Bit decision from the phase difference to the previous symbol.
Definition PSKDecoder.h:300
bool isCarrier() override
true while a transmission is received
Definition PSKDecoder.h:107
size_t write(const uint8_t *data, size_t len) override
Provide PCM data to the decoder.
Definition PSKDecoder.h:99
static constexpr int MAX_WEAK
the signal is lost after MAX_WEAK symbols below LOST_LEVEL
Definition PSKDecoder.h:125
void updateTiming()
The decision time is the circular center of the energy distribution.
Definition PSKDecoder.h:273
void flush() override
Processes the remaining samples (e.g. at the end of the input).
Definition PSKDecoder.h:87
float sum_power
Definition PSKDecoder.h:145
uint32_t noise_seed
Definition PSKDecoder.h:136
float quality_total
Definition PSKDecoder.h:175
static constexpr float LOST_LEVEL
Definition PSKDecoder.h:126
int last_bit
Definition PSKDecoder.h:164
bool begin(PSKConfig config)
Starts the processing with the indicated configuration.
Definition PSKDecoder.h:57
void releaseHeld()
Definition PSKDecoder.h:422
int zeros
Definition PSKDecoder.h:161
bool is_active
Definition PSKDecoder.h:133
void recalculate()
Avoids the accumulation of rounding errors.
Definition PSKDecoder.h:260
void end() override
Processes the remaining samples and reports the end of the carrier.
Definition PSKDecoder.h:80
uint16_t code
Definition PSKDecoder.h:165
Rate 1/2 convolutional code with K=5 (polynomials 0x17 and 0x19) of QPSK31 (fldigi) and a soft decisi...
Definition PSK.h:302
static int decode(uint16_t bits)
Byte of the indicated code: returns -1 if the code is unknown.
Definition PSK.h:167
TinyModem: software audio modems and packets with error correction.
Definition AX25.h:11
@ QPSK
Definition PSK.h:18
@ PSK8
3 bits per symbol without FEC, MFSK Varicode
Definition PSK.h:20
@ BPSK
1 bit per symbol, PSK31 Varicode
Definition PSK.h:15
Configuration of the PSK modem (PSKEncoder, PSKDecoder): differential PSK with cosine shaped transiti...
Definition PSK.h:34
bool setMode(const char *mode)
Definition PSK.h:66