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::AudioEncoder::begin;
64 if (!
cfg.isValid())
return false;
65 if (
cfg.bits_per_sample != 16) {
66 LOGE(
"PSKEncoder: bits_per_sample must be 16, not %d",
67 (
int)
cfg.bits_per_sample);
70 if (
cfg.channels < 1) {
71 LOGE(
"PSKEncoder: invalid number of channels: %d", (
int)
cfg.channels);
77 double w = 2.0 * M_PI *
cfg.carrier_freq /
cfg.sample_rate;
92 size_t write(
const uint8_t* data,
size_t len)
override {
94 for (
size_t j = 0; j < len; j++) {
106 switch (
cfg.modulation) {
109 for (
int j = 0; j <
cfg.postamble_symbols; j++)
sendBit(0);
112 for (
int j = 0; j < 3; j++)
sendChar(0);
117 for (
int j = 0; j <
cfg.postamble_symbols; j++)
sendBit(1);
121 for (
size_t j = 0; j < silence_samples; j++)
samples.write(0.0f);
135 for (
size_t j = 0; j < n * 3 / 11 + 1; j++)
sendChar(0);
137 for (
size_t j = 0; j < n; j++)
sendBit(0);
200 switch (
cfg.modulation) {
202 int symbol =
code.encode(bit);
229 float angle = (float)M_PI + step * (
float)M_PI / 8;
230 float c = cosf(angle), s = sinf(angle);
232 if (fabsf(c) < 1e-6f) c = 0;
233 if (fabsf(s) < 1e-6f) s = 0;
234 point_re = prev_re * c - prev_im * s;
235 point_im = prev_re * s + prev_im * c;
240 size_t n = stop - start;
241 for (
size_t j = 0; j < n; j++) {
242 float t = (float)j / n;
243 float i_value, q_value;
246 float a = 0.5f + 0.5f * cosf((
float)M_PI * t);
247 i_value = a * prev_re + (1.0f - a) *
point_re;
248 q_value = a * prev_im + (1.0f - a) *
point_im;
251 : cosf((
float)M_PI / 2 * t);
266 float mag = sqrtf(
re *
re +
im *
im);
static Code encode(uint8_t ch)
Code of the indicated byte.
Definition PSK.h:236
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
bool is_active
Definition PSKEncoder.h:162
void sendStep(int step)
Definition PSKEncoder.h:222
float point_im
Definition PSKEncoder.h:167
Shape
Definition PSKEncoder.h:155
@ FADE_IN
Definition PSKEncoder.h:155
@ TRANSITION
Definition PSKEncoder.h:155
@ FADE_OUT
Definition PSKEncoder.h:155
QPSKCode code
Definition PSKEncoder.h:161
void nextCarrier()
Definition PSKEncoder.h:261
SampleOutput samples
Definition PSKEncoder.h:160
bool begin(PSKConfig config)
Starts the processing with the indicated configuration.
Definition PSKEncoder.h:57
static constexpr int STEADY
Definition PSKEncoder.h:158
void sendSymbol(int step, Shape shape)
Definition PSKEncoder.h:226
void startTransmission()
Definition PSKEncoder.h:175
bool begin() override
Definition PSKEncoder.h:62
bool transmitting
Definition PSKEncoder.h:163
PSKConfig cfg
Definition PSKEncoder.h:159
uint64_t symbol_index
Definition PSKEncoder.h:165
int bits
Definition PSKEncoder.h:169
void sendBit(int bit)
Definition PSKEncoder.h:199
double samples_per_symbol
Definition PSKEncoder.h:164
audio_tools::AudioInfo audioInfo() override
Definition PSKEncoder.h:52
static constexpr int REVERSAL
phase steps as index of fldigi's 16 PSK positions (180 + n * 22.5 deg)
Definition PSKEncoder.h:157
void end() override
Definition PSKEncoder.h:86
bool writeIdle(size_t nsamples) override
Definition PSKEncoder.h:129
void setAudioInfo(audio_tools::AudioInfo info) override
Defines the sample rate and number of channels of the generated audio.
Definition PSKEncoder.h:45
void setOutput(Print &out) override
Definition PSKEncoder.h:39
float im
Definition PSKEncoder.h:171
float point_re
Definition PSKEncoder.h:167
bool endTransmission(size_t silence_samples=0) override
Definition PSKEncoder.h:104
void sendChar(uint8_t ch)
Definition PSKEncoder.h:187
int bit_count
Definition PSKEncoder.h:169
float re
Definition PSKEncoder.h:171
PSKConfig & config()
The configuration which was provided in begin().
Definition PSKEncoder.h:150
PSKConfig defaultConfig()
Provides a default configuration: psk31.
Definition PSKEncoder.h:33
PSKEncoder(Print &out)
Definition PSKEncoder.h:30
float symbolRate() override
Symbols per second.
Definition PSKEncoder.h:147
float step_re
Definition PSKEncoder.h:172
float step_im
Definition PSKEncoder.h:172
size_t write(const uint8_t *data, size_t len) override
Modulates the bytes.
Definition PSKEncoder.h:92
bool isTransmitting() override
true between the first byte and endTransmission()
Definition PSKEncoder.h:144
uint32_t sample_count
Definition PSKEncoder.h:173
Rate 1/2 convolutional code with K=5 (polynomials 0x17 and 0x19) of QPSK31 (fldigi) and a soft decisi...
Definition PSK.h:302
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
static Code encode(uint8_t ch)
Code of the indicated byte.
Definition PSK.h:164
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
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
Varicode bits of a character.
Definition PSK.h:158
uint8_t length
Definition PSK.h:160
uint16_t bits
Definition PSK.h:159