made specifying the mode nicer

This commit is contained in:
Ahmet Inan 2025-07-19 12:40:47 +02:00
commit a626441665
3 changed files with 50 additions and 11 deletions

2
Makefile vendored
View file

@ -15,7 +15,7 @@ CXX = clang++ -stdlib=libc++ -march=native
all: encode decode all: encode decode
test: encode decode test: encode decode
$(QEMU) ./encode audio.wav 48000 16 1 1500 ANONYMOUS 48 /dev/urandom $(QEMU) ./encode audio.wav 48000 16 1 1500 ANONYMOUS QAM16 1/2 short /dev/urandom
$(QEMU) ./decode audio.wav /dev/null $(QEMU) ./decode audio.wav /dev/null
encode: encode.cc common.hh encode: encode.cc common.hh

4
README.md vendored
View file

@ -12,7 +12,7 @@ dd if=/dev/urandom of=uncoded.dat bs=1 count=256
Encode file ```uncoded.dat``` to ```encoded.wav``` [WAV](https://en.wikipedia.org/wiki/WAV) audio file with 48000 Hz sample rate, 16 bits and only 1 (real) channel: Encode file ```uncoded.dat``` to ```encoded.wav``` [WAV](https://en.wikipedia.org/wiki/WAV) audio file with 48000 Hz sample rate, 16 bits and only 1 (real) channel:
``` ```
./encode encoded.wav 48000 16 1 1500 ANONYMOUS 176 uncoded.dat ./encode encoded.wav 48000 16 1 1500 ANONYMOUS QAM16 1/2 short uncoded.dat
``` ```
Start recording to ```recorded.wav``` audio file and stop after 5 seconds: Start recording to ```recorded.wav``` audio file and stop after 5 seconds:
@ -96,7 +96,7 @@ Prerequisite: [disorders](https://github.com/aicodix/disorders)
Encode ```uncoded.dat``` to [analytic](https://en.wikipedia.org/wiki/Analytic_signal) audio signal, add [multipath](https://en.wikipedia.org/wiki/Multipath_propagation), [CFO, SFO](https://en.wikipedia.org/wiki/Carrier_frequency_offset), [AWGN](https://en.wikipedia.org/wiki/Additive_white_Gaussian_noise), decode and compare: Encode ```uncoded.dat``` to [analytic](https://en.wikipedia.org/wiki/Analytic_signal) audio signal, add [multipath](https://en.wikipedia.org/wiki/Multipath_propagation), [CFO, SFO](https://en.wikipedia.org/wiki/Carrier_frequency_offset), [AWGN](https://en.wikipedia.org/wiki/Additive_white_Gaussian_noise), decode and compare:
``` ```
./encode - 48000 16 2 1500 ANONYMOUS 176 uncoded.dat | ../disorders/multipath - - ../disorders/multipath.txt 10 | ../disorders/cfo - - 234.567 | ../disorders/sfo - - 147 | ../disorders/awgn - - -20 | ./decode - - | diff -q -s uncoded.dat - ./encode - 48000 16 2 1500 ANONYMOUS QAM16 1/2 short uncoded.dat | ../disorders/multipath - - ../disorders/multipath.txt 10 | ../disorders/cfo - - 234.567 | ../disorders/sfo - - 147 | ../disorders/awgn - - -20 | ./decode - - | diff -q -s uncoded.dat -
``` ```
### Reading ### Reading

View file

@ -361,8 +361,8 @@ int64_t base37_encoder(const char *str)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
if (argc < 9) { if (argc < 11) {
std::cerr << "usage: " << argv[0] << " OUTPUT RATE BITS CHANNELS OFFSET CALLSIGN MODE INPUT.." << std::endl; std::cerr << "usage: " << argv[0] << " OUTPUT RATE BITS CHANNELS OFFSET CALLSIGN MODULATION CODERATE FRAMESIZE INPUT.." << std::endl;
return 1; return 1;
} }
@ -383,10 +383,48 @@ int main(int argc, char **argv)
std::cerr << "Unsupported call sign." << std::endl; std::cerr << "Unsupported call sign." << std::endl;
return 1; return 1;
} }
int input_count = argc - 8; int oper_mode = 0;
int oper_mode = std::atoi(argv[7]); char *modulation = argv[7];
if (oper_mode < 0 || oper_mode > 255) { if (!strcmp(modulation, "DBPSK")) {
std::cerr << "Unsupported operation mode." << std::endl; oper_mode |= 0 << 4;
} else if (!strcmp(modulation, "DQPSK")) {
oper_mode |= 1 << 4;
} else if (!strcmp(modulation, "D8PSK")) {
oper_mode |= 2 << 4;
} else if (!strcmp(modulation, "QAM16")) {
oper_mode |= 3 << 4;
} else if (!strcmp(modulation, "QAM64")) {
oper_mode |= 4 << 4;
} else if (!strcmp(modulation, "QAM256")) {
oper_mode |= 5 << 4;
} else if (!strcmp(modulation, "QAM1024")) {
oper_mode |= 6 << 4;
} else if (!strcmp(modulation, "QAM4096")) {
oper_mode |= 7 << 4;
} else {
std::cerr << "Unsupported modulation." << std::endl;
return 1;
}
char *code_rate = argv[8];
if (!strcmp(code_rate, "1/2")) {
oper_mode |= 0 << 1;
} else if (!strcmp(code_rate, "2/3")) {
oper_mode |= 1 << 1;
} else if (!strcmp(code_rate, "3/4")) {
oper_mode |= 2 << 1;
} else if (!strcmp(code_rate, "5/6")) {
oper_mode |= 3 << 1;
} else {
std::cerr << "Unsupported code rate." << std::endl;
return 1;
}
char *frame_size = argv[9];
if (!strcmp(frame_size, "short")) {
oper_mode |= 0;
} else if (!strcmp(frame_size, "normal")) {
oper_mode |= 1;
} else {
std::cerr << "Unsupported frame size." << std::endl;
return 1; return 1;
} }
int band_width = 2400; int band_width = 2400;
@ -399,12 +437,13 @@ int main(int argc, char **argv)
typedef DSP::Complex<value> cmplx; typedef DSP::Complex<value> cmplx;
DSP::WriteWAV<value> output_file(output_name, output_rate, output_bits, output_chan); DSP::WriteWAV<value> output_file(output_name, output_rate, output_bits, output_chan);
output_file.silence(output_rate); output_file.silence(output_rate);
int input_count = argc - 10;
switch (output_rate) { switch (output_rate) {
case 44100: case 44100:
delete new Encoder<value, cmplx, 44100>(&output_file, argv + 8, input_count, freq_off, call_sign, oper_mode); delete new Encoder<value, cmplx, 44100>(&output_file, argv + 10, input_count, freq_off, call_sign, oper_mode);
break; break;
case 48000: case 48000:
delete new Encoder<value, cmplx, 48000>(&output_file, argv + 8, input_count, freq_off, call_sign, oper_mode); delete new Encoder<value, cmplx, 48000>(&output_file, argv + 10, input_count, freq_off, call_sign, oper_mode);
break; break;
default: default:
std::cerr << "Unsupported sample rate." << std::endl; std::cerr << "Unsupported sample rate." << std::endl;