ft8_lib/gen_ft8.cpp

99 lines
2.7 KiB
C++
Raw Normal View History

2018-10-18 15:42:43 +08:00
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
2018-11-02 20:03:28 +08:00
#include "common/wave.h"
2018-12-22 22:09:43 +08:00
//#include "ft8/v1/pack.h"
//#include "ft8/v1/encode.h"
2018-11-02 21:43:10 +08:00
#include "ft8/pack_v2.h"
#include "ft8/encode_v2.h"
2018-12-22 22:09:43 +08:00
#include "ft8/constants.h"
2018-10-18 15:42:43 +08:00
2018-11-02 15:55:54 +08:00
// Convert a sequence of symbols (tones) into a sinewave of continuous phase (FSK).
2018-11-02 20:03:28 +08:00
// Symbol 0 gets encoded as a sine of frequency f0, the others are spaced in increasing
2018-11-02 15:55:54 +08:00
// fashion.
void synth_fsk(const uint8_t *symbols, int num_symbols, float f0, float spacing,
float symbol_rate, float signal_rate, float *signal) {
2018-10-18 15:42:43 +08:00
float phase = 0;
float dt = 1/signal_rate;
float dt_sym = 1/symbol_rate;
float t = 0;
int j = 0;
int i = 0;
2018-11-02 15:55:54 +08:00
while (j < num_symbols) {
2018-10-18 15:42:43 +08:00
float f = f0 + symbols[j] * spacing;
phase += 2 * M_PI * f / signal_rate;
signal[i] = sin(phase);
t += dt;
if (t >= dt_sym) {
// Move to the next symbol
t -= dt_sym;
++j;
}
++i;
}
}
2018-10-18 16:16:21 +08:00
void usage() {
printf("Generate a 15-second WAV file encoding a given message.\n");
printf("Usage:\n");
printf("\n");
printf("gen_ft8 MESSAGE WAV_FILE\n");
printf("\n");
printf("(Note that you might have to enclose your message in quote marks if it contains spaces)\n");
}
2018-10-18 15:42:43 +08:00
int main(int argc, char **argv) {
2018-10-18 16:16:21 +08:00
// Expect two command-line arguments
if (argc < 3) {
usage();
return -1;
}
2018-10-18 15:42:43 +08:00
const char *message = argv[1];
const char *wav_path = argv[2];
2018-12-22 22:09:43 +08:00
// First, pack the text data into binary message
2018-10-29 21:28:46 +08:00
uint8_t packed[10];
//int rc = packmsg(message, packed);
int rc = ft8_v2::pack77(message, packed);
2018-10-18 15:42:43 +08:00
if (rc < 0) {
printf("Cannot parse message!\n");
printf("RC = %d\n", rc);
return -2;
}
printf("Packed data: ");
2018-10-29 21:28:46 +08:00
for (int j = 0; j < 10; ++j) {
2018-10-18 15:42:43 +08:00
printf("%02x ", packed[j]);
}
printf("\n");
2018-10-18 16:43:51 +08:00
// Second, encode the binary message as a sequence of FSK tones
2018-12-22 22:09:43 +08:00
uint8_t tones[FT8_NN]; // FT8_NN = 79, lack of better name at the moment
2018-10-29 21:28:46 +08:00
//genft8(packed, 0, tones);
ft8_v2::genft8(packed, tones);
2018-10-18 15:42:43 +08:00
printf("FSK tones: ");
2018-12-22 22:09:43 +08:00
for (int j = 0; j < FT8_NN; ++j) {
2018-10-18 15:42:43 +08:00
printf("%d", tones[j]);
}
printf("\n");
2018-10-18 16:43:51 +08:00
// Third, convert the FSK tones into an audio signal
2018-12-22 22:09:43 +08:00
const int num_samples = (int)(0.5 + FT8_NN / 6.25 * 12000);
2018-10-18 15:42:43 +08:00
const int num_silence = (15 * 12000 - num_samples) / 2;
float signal[num_silence + num_samples + num_silence];
for (int i = 0; i < num_silence + num_samples + num_silence; i++) {
signal[i] = 0;
}
2018-12-22 22:09:43 +08:00
synth_fsk(tones, FT8_NN, 1000, 6.25, 6.25, 12000, signal + num_silence);
2018-10-18 15:42:43 +08:00
save_wav(signal, num_silence + num_samples + num_silence, 12000, wav_path);
return 0;
2018-10-18 16:43:51 +08:00
}