diff options
| author | drowe67 <[email protected]> | 2023-07-20 08:59:48 +0930 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-20 08:59:48 +0930 |
| commit | 06d4c11e699b0351765f10398abb4f663a984f36 (patch) | |
| tree | 33e22af0814c5b6c3d676f096ae8c2ac8a3ed9f0 /src/ofdm_mod.c | |
| parent | 6588e77f38bdebd7adffe091b22e7760d95d0ccb (diff) | |
| parent | 4d6c143c0abec15e1d6ed1fd95d36f80e6cb7df8 (diff) | |
Merge pull request #3 from drowe67/dr-cleanup21.2.0
Cleanup Part 2
Diffstat (limited to 'src/ofdm_mod.c')
| -rw-r--r-- | src/ofdm_mod.c | 703 |
1 files changed, 367 insertions, 336 deletions
diff --git a/src/ofdm_mod.c b/src/ofdm_mod.c index 800b410..d4c495e 100644 --- a/src/ofdm_mod.c +++ b/src/ofdm_mod.c @@ -29,382 +29,413 @@ #define OPTPARSE_IMPLEMENTATION #define OPTPARSE_API static -#include "optparse.h" - #include <assert.h> +#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <math.h> #include "codec2_ofdm.h" -#include "ofdm_internal.h" #include "gp_interleaver.h" -#include "ldpc_codes.h" #include "interldpc.h" +#include "ldpc_codes.h" +#include "ofdm_internal.h" +#include "optparse.h" #include "varicode.h" -#define IS_DIR_SEPARATOR(c) ((c) == '/') +#define IS_DIR_SEPARATOR(c) ((c) == '/') static const char *progname; void opt_help() { - fprintf(stderr, "\nusage: %s [options]\n\n", progname); - fprintf(stderr, " --in filename Name of InputOneCharPerBitFile\n"); - fprintf(stderr, " --out filename Name of OutputModemRawFile\n"); - fprintf(stderr, " --mode modeName Predefined mode 700D|700E|2020|2020B|datac0 ... etc\n"); - fprintf(stderr, " --nc [17..62] Number of Carriers (17 default, 62 max)\n"); - fprintf(stderr, " --ns symbols One pilot every ns symbols (8 default)\n"); - fprintf(stderr, " --tcp Nsecs Cyclic Prefix Duration (.002 default)\n"); - fprintf(stderr, " --ts Nsecs Symbol Duration (.018 default)\n"); - fprintf(stderr, " --testframes Nsecs Transmit test frames for Nsec (--testframes NpacketsPerBurst in burst mode)\n"); - fprintf(stderr, " --tx_freq freq Set an optional modulation TX centre frequency (1500.0 default)\n"); - fprintf(stderr, " --rx_freq freq Set an optional modulation RX centre frequency (1500.0 default)\n\n"); - fprintf(stderr, " --verbose [1|2|3] Verbose output level to stderr (default off)\n"); - fprintf(stderr, " --txbpf Transmit band pass filter on (default off)\n"); - fprintf(stderr, " --clip Transmit clipper (default off)\n"); - fprintf(stderr, " --text Include a standard text message boolean (default off)\n"); - fprintf(stderr, " -i --ldpc [1|2] Run LDPC decoder (1 -> (224,112) 700D code, 2 -> (504,396) 2020 code).\n" - " In testframe mode raw and coded errors will be counted.\n"); - fprintf(stderr, " --bursts nBursts Burst mode: Send nBursts of testframes each\n"); - fprintf(stderr, "\n"); - exit(-1); + fprintf(stderr, "\nusage: %s [options]\n\n", progname); + fprintf(stderr, " --in filename Name of InputOneCharPerBitFile\n"); + fprintf(stderr, " --out filename Name of OutputModemRawFile\n"); + fprintf(stderr, + " --mode modeName Predefined mode 700D|700E|2020|2020B|datac0 " + "... etc\n"); + fprintf(stderr, + " --nc [17..62] Number of Carriers (17 default, 62 max)\n"); + fprintf(stderr, + " --ns symbols One pilot every ns symbols (8 default)\n"); + fprintf(stderr, + " --tcp Nsecs Cyclic Prefix Duration (.002 default)\n"); + fprintf(stderr, " --ts Nsecs Symbol Duration (.018 default)\n"); + fprintf(stderr, + " --testframes Nsecs Transmit test frames for Nsec (--testframes " + "NpacketsPerBurst in burst mode)\n"); + fprintf(stderr, + " --tx_freq freq Set an optional modulation TX centre " + "frequency (1500.0 default)\n"); + fprintf(stderr, + " --rx_freq freq Set an optional modulation RX centre " + "frequency (1500.0 default)\n\n"); + fprintf( + stderr, + " --verbose [1|2|3] Verbose output level to stderr (default off)\n"); + fprintf( + stderr, + " --txbpf Transmit band pass filter on (default off)\n"); + fprintf(stderr, " --clip Transmit clipper (default off)\n"); + fprintf(stderr, + " --text Include a standard text message boolean " + "(default off)\n"); + fprintf(stderr, + " -i --ldpc [1|2] Run LDPC decoder (1 -> (224,112) 700D code, " + "2 -> (504,396) 2020 code).\n" + " In testframe mode raw and coded errors will " + "be counted.\n"); + fprintf( + stderr, + " --bursts nBursts Burst mode: Send nBursts of testframes each\n"); + fprintf(stderr, "\n"); + exit(-1); } int main(int argc, char *argv[]) { - char *fin_name, *fout_name; - int i, opt, val; - - char *pn = argv[0] + strlen(argv[0]); - - while (pn != argv[0] && !IS_DIR_SEPARATOR(pn[-1])) - --pn; - - progname = pn; - - /* Turn off stream buffering */ - - setvbuf(stdin, NULL, _IONBF, BUFSIZ); - setvbuf(stdout, NULL, _IONBF, BUFSIZ); - - FILE *fin = stdin; - FILE *fout = stdout; - - /* set for LDPC coded or uncoded frames */ - - int ldpc_en = 0; - - int input_specified = 0; - int output_specified = 0; - int verbose = 0; - bool clip_en = false; - int txbpf_en = 0; - int testframes = 0; - int use_text = 0; - - int Npackets = 0; - int Nsec = 0; - int burst_mode = 0; - int Nbursts = 1; - - /* set up the default modem config */ - struct OFDM_CONFIG *ofdm_config = (struct OFDM_CONFIG *) calloc(1, sizeof (struct OFDM_CONFIG)); - assert(ofdm_config != NULL); - char mode[32] = "700D"; - ofdm_init_mode(mode, ofdm_config); - - int Ndatabitsperpacket = 0; - struct optparse options; - - struct optparse_long longopts[] = { - {"in", 'a', OPTPARSE_REQUIRED}, - {"out", 'b', OPTPARSE_REQUIRED}, - {"nc", 'c', OPTPARSE_REQUIRED}, - {"ns", 'm', OPTPARSE_REQUIRED}, - {"tcp", 'd', OPTPARSE_REQUIRED}, - {"ts", 'e', OPTPARSE_REQUIRED}, - {"testframes", 'f', OPTPARSE_REQUIRED}, - {"tx_freq", 'n', OPTPARSE_REQUIRED}, - {"rx_freq", 'i', OPTPARSE_REQUIRED}, - {"ldpc", 'j', OPTPARSE_NONE}, - {"txbpf", 'k', OPTPARSE_NONE}, - {"clip", 'r', OPTPARSE_NONE}, - {"text", 'l', OPTPARSE_NONE}, - {"verbose", 'v', OPTPARSE_REQUIRED}, - {"mode", 'g', OPTPARSE_REQUIRED}, - {"help", 'h', OPTPARSE_NONE}, - {"bursts", 'o', OPTPARSE_REQUIRED}, - {0, 0, 0} - }; - - optparse_init(&options, argv); - - while ((opt = optparse_long(&options, longopts, NULL)) != -1) { - switch (opt) { - case '?': - case 'h': - opt_help(); - case 'a': - fin_name = options.optarg; - input_specified = 1; - break; - case 'b': - fout_name = options.optarg; - output_specified = 1; - break; - case 'c': - val = atoi(options.optarg); - - if (val > 62 || val < 17) { - opt_help(); - } else { - ofdm_config->nc = val; - } - break; - case 'd': - ofdm_config->tcp = atof(options.optarg); - break; - case 'e': - ofdm_config->ts = atof(options.optarg); - ofdm_config->rs = 1.0f / ofdm_config->ts; - break; - case 'm': - ofdm_config->ns = atoi(options.optarg); - break; - case 'f': - testframes = 1; - Nsec = atoi(options.optarg); - break; - case 'g': - strcpy(mode, options.optarg); - ofdm_init_mode(mode, ofdm_config); - break; - case 'n': - ofdm_config->tx_centre = atof(options.optarg); - break; - case 'o': - burst_mode = 1; - Nbursts = atoi(options.optarg); - fprintf(stderr, "bursts: %d\n", Nbursts); - break; - case 'i': - ofdm_config->rx_centre = atof(options.optarg); - break; - case 'j': - ldpc_en = 1; - break; - case 'k': - txbpf_en = 1; - break; - case 'l': - use_text = 1; - break; - case 'r': - clip_en = true; - break; - case 'v': - verbose = atoi(options.optarg); - if (verbose < 0 || verbose > 3) - verbose = 0; + char *fin_name, *fout_name; + int i, opt, val; + + char *pn = argv[0] + strlen(argv[0]); + + while (pn != argv[0] && !IS_DIR_SEPARATOR(pn[-1])) --pn; + + progname = pn; + + /* Turn off stream buffering */ + + setvbuf(stdin, NULL, _IONBF, BUFSIZ); + setvbuf(stdout, NULL, _IONBF, BUFSIZ); + + FILE *fin = stdin; + FILE *fout = stdout; + + /* set for LDPC coded or uncoded frames */ + + int ldpc_en = 0; + + int input_specified = 0; + int output_specified = 0; + int verbose = 0; + bool clip_en = false; + int txbpf_en = 0; + int testframes = 0; + int use_text = 0; + + int Npackets = 0; + int Nsec = 0; + int burst_mode = 0; + int Nbursts = 1; + + /* set up the default modem config */ + struct OFDM_CONFIG *ofdm_config = + (struct OFDM_CONFIG *)calloc(1, sizeof(struct OFDM_CONFIG)); + assert(ofdm_config != NULL); + char mode[32] = "700D"; + ofdm_init_mode(mode, ofdm_config); + + int Ndatabitsperpacket = 0; + struct optparse options; + + struct optparse_long longopts[] = {{"in", 'a', OPTPARSE_REQUIRED}, + {"out", 'b', OPTPARSE_REQUIRED}, + {"nc", 'c', OPTPARSE_REQUIRED}, + {"ns", 'm', OPTPARSE_REQUIRED}, + {"tcp", 'd', OPTPARSE_REQUIRED}, + {"ts", 'e', OPTPARSE_REQUIRED}, + {"testframes", 'f', OPTPARSE_REQUIRED}, + {"tx_freq", 'n', OPTPARSE_REQUIRED}, + {"rx_freq", 'i', OPTPARSE_REQUIRED}, + {"ldpc", 'j', OPTPARSE_NONE}, + {"txbpf", 'k', OPTPARSE_NONE}, + {"clip", 'r', OPTPARSE_NONE}, + {"text", 'l', OPTPARSE_NONE}, + {"verbose", 'v', OPTPARSE_REQUIRED}, + {"mode", 'g', OPTPARSE_REQUIRED}, + {"help", 'h', OPTPARSE_NONE}, + {"bursts", 'o', OPTPARSE_REQUIRED}, + {0, 0, 0}}; + + optparse_init(&options, argv); + + while ((opt = optparse_long(&options, longopts, NULL)) != -1) { + switch (opt) { + case '?': + case 'h': + opt_help(); + case 'a': + fin_name = options.optarg; + input_specified = 1; + break; + case 'b': + fout_name = options.optarg; + output_specified = 1; + break; + case 'c': + val = atoi(options.optarg); + + if (val > 62 || val < 17) { + opt_help(); + } else { + ofdm_config->nc = val; } + break; + case 'd': + ofdm_config->tcp = atof(options.optarg); + break; + case 'e': + ofdm_config->ts = atof(options.optarg); + ofdm_config->rs = 1.0f / ofdm_config->ts; + break; + case 'm': + ofdm_config->ns = atoi(options.optarg); + break; + case 'f': + testframes = 1; + Nsec = atoi(options.optarg); + break; + case 'g': + strcpy(mode, options.optarg); + ofdm_init_mode(mode, ofdm_config); + break; + case 'n': + ofdm_config->tx_centre = atof(options.optarg); + break; + case 'o': + burst_mode = 1; + Nbursts = atoi(options.optarg); + fprintf(stderr, "bursts: %d\n", Nbursts); + break; + case 'i': + ofdm_config->rx_centre = atof(options.optarg); + break; + case 'j': + ldpc_en = 1; + break; + case 'k': + txbpf_en = 1; + break; + case 'l': + use_text = 1; + break; + case 'r': + clip_en = true; + break; + case 'v': + verbose = atoi(options.optarg); + if (verbose < 0 || verbose > 3) verbose = 0; } + } - /* Print remaining arguments to give user a hint */ + /* Print remaining arguments to give user a hint */ - char *arg; + char *arg; - while ((arg = optparse_arg(&options))) - fprintf(stderr, "%s\n", arg); + while ((arg = optparse_arg(&options))) fprintf(stderr, "%s\n", arg); - if (input_specified) { - if ((fin = fopen(fin_name, "rb")) == NULL) { - fprintf(stderr, "Error opening input bits file: %s\n", fin_name); - exit(-1); - } + if (input_specified) { + if ((fin = fopen(fin_name, "rb")) == NULL) { + fprintf(stderr, "Error opening input bits file: %s\n", fin_name); + exit(-1); } + } - if (output_specified) { - if ((fout = fopen(fout_name, "wb")) == NULL) { - fprintf(stderr, "Error opening output modem sample file: %s\n", fout_name); - exit(-1); - } + if (output_specified) { + if ((fout = fopen(fout_name, "wb")) == NULL) { + fprintf(stderr, "Error opening output modem sample file: %s\n", + fout_name); + exit(-1); } - - /* init the modem with our (optionally) custom config */ - struct OFDM *ofdm = ofdm_create(ofdm_config); - assert(ofdm != NULL); - - free(ofdm_config); - - /* Get a copy of the completed modem config (ofdm_create() fills in more parameters) */ - ofdm_config = ofdm_get_config_param(ofdm); - - /* set up some useful constants */ - - int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); - int Npayloadbitsperpacket = Nbitsperpacket - ofdm->nuwbits - ofdm->ntxtbits; - int Nsamperpacket = ofdm_get_samples_per_packet(ofdm); - - /* Set up LPDC code */ - - struct LDPC ldpc; - if (ldpc_en) { - ldpc_codes_setup(&ldpc, ofdm->codename); - ldpc_mode_specific_setup(ofdm, &ldpc); - Ndatabitsperpacket = ldpc.data_bits_per_frame; - - if (verbose > 1) { - fprintf(stderr, "using: %s\n", ofdm->codename); - fprintf(stderr, "LDPC codeword data bits = %d\n", ldpc.ldpc_data_bits_per_frame); - fprintf(stderr, "LDPC codeword total bits = %d\n", ldpc.ldpc_coded_bits_per_frame); - fprintf(stderr, "LDPC codeword data bits used = %d\n", Ndatabitsperpacket); - fprintf(stderr, "LDPC codeword total length in modem packet = %d\n", Npayloadbitsperpacket); - } + } + + /* init the modem with our (optionally) custom config */ + struct OFDM *ofdm = ofdm_create(ofdm_config); + assert(ofdm != NULL); + + free(ofdm_config); + + /* Get a copy of the completed modem config (ofdm_create() fills in more + * parameters) */ + ofdm_config = ofdm_get_config_param(ofdm); + + /* set up some useful constants */ + + int Nbitsperpacket = ofdm_get_bits_per_packet(ofdm); + int Npayloadbitsperpacket = Nbitsperpacket - ofdm->nuwbits - ofdm->ntxtbits; + int Nsamperpacket = ofdm_get_samples_per_packet(ofdm); + + /* Set up LPDC code */ + + struct LDPC ldpc; + if (ldpc_en) { + ldpc_codes_setup(&ldpc, ofdm->codename); + ldpc_mode_specific_setup(ofdm, &ldpc); + Ndatabitsperpacket = ldpc.data_bits_per_frame; + + if (verbose > 1) { + fprintf(stderr, "using: %s\n", ofdm->codename); + fprintf(stderr, "LDPC codeword data bits = %d\n", + ldpc.ldpc_data_bits_per_frame); + fprintf(stderr, "LDPC codeword total bits = %d\n", + ldpc.ldpc_coded_bits_per_frame); + fprintf(stderr, "LDPC codeword data bits used = %d\n", + Ndatabitsperpacket); + fprintf(stderr, "LDPC codeword total length in modem packet = %d\n", + Npayloadbitsperpacket); } - else { - Ndatabitsperpacket = Npayloadbitsperpacket; - } - - if (verbose) { - ofdm_set_verbose(ofdm, verbose); - fprintf(stderr, "Ndatabitsperpacket: %d Npayloadbitsperpacket: %d Nsamperpacket: %d\n", - Ndatabitsperpacket, Npayloadbitsperpacket, Nsamperpacket); - } - - if (testframes) { - if (burst_mode) - Npackets = Nsec; // burst mode: treat Nsecs as Npackets/burst - else - Npackets = round(Nsec/ofdm->tpacket); // streaming mode - if (verbose) - fprintf(stderr, "Npackets: %d\n", Npackets); + } else { + Ndatabitsperpacket = Npayloadbitsperpacket; + } + + if (verbose) { + ofdm_set_verbose(ofdm, verbose); + fprintf( + stderr, + "Ndatabitsperpacket: %d Npayloadbitsperpacket: %d Nsamperpacket: %d\n", + Ndatabitsperpacket, Npayloadbitsperpacket, Nsamperpacket); + } + + if (testframes) { + if (burst_mode) + Npackets = Nsec; // burst mode: treat Nsecs as Npackets/burst + else + Npackets = round(Nsec / ofdm->tpacket); // streaming mode + if (verbose) fprintf(stderr, "Npackets: %d\n", Npackets); + } + + if (clip_en) { + ofdm->clip_en = true; + } + if (txbpf_en) { + ofdm_set_tx_bpf(ofdm, 1); + } + + uint8_t txt_bits[ofdm->ntxtbits]; + memset(txt_bits, 0, ofdm->ntxtbits); + char text_str[] = + "cq cq cq hello world\r"; // Add text bits to match other tests + char *ptr_text = text_str; + + short tx_varicode_bits[VARICODE_MAX_BITS]; + int nvaricode_bits = 0; + int varicode_bit_index = 0; + + complex float tx_sams[Nsamperpacket]; + short tx_real[Nsamperpacket]; + + if (verbose > 1) ofdm_print_info(ofdm); + + for (int b = 0; b < Nbursts; b++) { + if (burst_mode) { + fprintf(stderr, "Tx preamble\n"); + complex float tx_preamble[ofdm->samplesperframe]; + memcpy(tx_preamble, ofdm->tx_preamble, + sizeof(COMP) * ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_preamble, ofdm->samplesperframe); + for (i = 0; i < ofdm->samplesperframe; i++) + tx_real[i] = crealf(tx_preamble[i]); + fwrite(tx_real, sizeof(short), ofdm->samplesperframe, fout); } - if (clip_en) { ofdm->clip_en = true; } - if (txbpf_en) { ofdm_set_tx_bpf(ofdm, 1); } + /* main loop + * ----------------------------------------------------------------*/ + + int packet = 0; + uint8_t data_bits[Ndatabitsperpacket]; + while (fread(data_bits, sizeof(uint8_t), Ndatabitsperpacket, fin) == + Ndatabitsperpacket) { + if (ldpc_en) { + /* fancy LDPC encoded frames ----------------------------*/ + + /* optionally overwrite input data with test frame of + payload data bits known to demodulator */ + + if (testframes) { + if (use_text) { + // Get text bits + int nspare = ofdm->ntxtbits; + int k; + + for (k = 0; k < nspare; k++) { + if (nvaricode_bits) { + txt_bits[k] = tx_varicode_bits[varicode_bit_index++]; + nvaricode_bits--; + } + + if (nvaricode_bits == 0) { + /* get new char and encode */ + char s[2]; + s[0] = *ptr_text++; + + if (*ptr_text == 0) ptr_text = &text_str[0]; + + nvaricode_bits = varicode_encode(tx_varicode_bits, s, + VARICODE_MAX_BITS, 1, 1); + varicode_bit_index = 0; + } + } + } - uint8_t txt_bits[ofdm->ntxtbits]; - memset(txt_bits, 0, ofdm->ntxtbits); - char text_str[] = "cq cq cq hello world\r"; // Add text bits to match other tests - char *ptr_text = text_str; + ofdm_generate_payload_data_bits(data_bits, Ndatabitsperpacket); + } - short tx_varicode_bits[VARICODE_MAX_BITS]; - int nvaricode_bits = 0; - int varicode_bit_index = 0; + ofdm_ldpc_interleave_tx(ofdm, &ldpc, tx_sams, data_bits, txt_bits); + for (i = 0; i < Nsamperpacket; i++) tx_real[i] = crealf(tx_sams[i]); + } else { + /* just modulate uncoded raw bits ------------------------------------*/ - complex float tx_sams[Nsamperpacket]; - short tx_real[Nsamperpacket]; + /* in uncoded mode entire payload is input data bits */ + assert(Ndatabitsperpacket == Npayloadbitsperpacket); - if (verbose > 1) ofdm_print_info(ofdm); + if (testframes) { + /* build up a test frame consisting of unique word, txt bits, and + psuedo-random uncoded payload bits. The psuedo-random generator is + the same as Octave so it can interoperate with ofdm_tx.m/ofdm_rx.m + */ - for (int b=0; b<Nbursts; b++) { - if (burst_mode) { - fprintf(stderr, "Tx preamble\n"); - complex float tx_preamble[ofdm->samplesperframe]; - memcpy(tx_preamble, ofdm->tx_preamble, sizeof(COMP)*ofdm->samplesperframe); - ofdm_hilbert_clipper(ofdm, tx_preamble, ofdm->samplesperframe); - for (i = 0; i < ofdm->samplesperframe; i++) tx_real[i] = crealf(tx_preamble[i]); - fwrite(tx_real, sizeof (short), ofdm->samplesperframe, fout); + ofdm_generate_payload_data_bits(data_bits, Npayloadbitsperpacket); } - - /* main loop ----------------------------------------------------------------*/ - - int packet = 0; - uint8_t data_bits[Ndatabitsperpacket]; - while (fread(data_bits, sizeof (uint8_t), Ndatabitsperpacket, fin) == Ndatabitsperpacket) { - - if (ldpc_en) { - /* fancy LDPC encoded frames ----------------------------*/ - - /* optionally overwrite input data with test frame of - payload data bits known to demodulator */ - - if (testframes) { - - if (use_text) { - // Get text bits - int nspare = ofdm->ntxtbits; - int k; - - for (k = 0; k < nspare; k++) { - if (nvaricode_bits) { - txt_bits[k] = tx_varicode_bits[varicode_bit_index++]; - nvaricode_bits--; - } - - if (nvaricode_bits == 0) { - /* get new char and encode */ - char s[2]; - s[0] = *ptr_text++; - - if (*ptr_text == 0) - ptr_text = &text_str[0]; - - nvaricode_bits = varicode_encode(tx_varicode_bits, s, VARICODE_MAX_BITS, 1, 1); - varicode_bit_index = 0; - } - } - } - - ofdm_generate_payload_data_bits(data_bits, Ndatabitsperpacket); - } - - ofdm_ldpc_interleave_tx(ofdm, &ldpc, tx_sams, data_bits, txt_bits); - for (i = 0; i < Nsamperpacket; i++) tx_real[i] = crealf(tx_sams[i]); - } else { - /* just modulate uncoded raw bits ------------------------------------*/ - - /* in uncoded mode entire payload is input data bits */ - assert(Ndatabitsperpacket == Npayloadbitsperpacket); - - if (testframes) { - /* build up a test frame consisting of unique word, txt bits, and psuedo-random - uncoded payload bits. The psuedo-random generator is the same as Octave so - it can interoperate with ofdm_tx.m/ofdm_rx.m */ - - ofdm_generate_payload_data_bits(data_bits, Npayloadbitsperpacket); - } - - /* assemble packet of bits then modulate */ - uint8_t tx_bits_char[Nbitsperpacket]; - ofdm_assemble_qpsk_modem_packet(ofdm, tx_bits_char, data_bits, txt_bits); - int tx_bits[Nbitsperpacket]; - for (i = 0; i < Nbitsperpacket; i++) tx_bits[i] = tx_bits_char[i]; - COMP tx_sams[Nsamperpacket]; - ofdm_mod(ofdm, tx_sams, tx_bits); - for (i = 0; i < Nsamperpacket; i++) tx_real[i] = tx_sams[i].real; - } - - fwrite(tx_real, sizeof (short), Nsamperpacket, fout); - packet++; - if (testframes && (packet >= Npackets)) - break; - } + /* assemble packet of bits then modulate */ + uint8_t tx_bits_char[Nbitsperpacket]; + ofdm_assemble_qpsk_modem_packet(ofdm, tx_bits_char, data_bits, + txt_bits); + int tx_bits[Nbitsperpacket]; + for (i = 0; i < Nbitsperpacket; i++) tx_bits[i] = tx_bits_char[i]; + COMP tx_sams[Nsamperpacket]; + ofdm_mod(ofdm, tx_sams, tx_bits); + for (i = 0; i < Nsamperpacket; i++) tx_real[i] = tx_sams[i].real; + } + + fwrite(tx_real, sizeof(short), Nsamperpacket, fout); + packet++; + + if (testframes && (packet >= Npackets)) break; + } - if (burst_mode) { - // Post-amble - fprintf(stderr, "Tx postamble\n"); - complex float tx_postamble[ofdm->samplesperframe]; - memcpy(tx_postamble, ofdm->tx_postamble, sizeof(COMP)*ofdm->samplesperframe); - ofdm_hilbert_clipper(ofdm, tx_postamble, ofdm->samplesperframe); - for (i = 0; i < ofdm->samplesperframe; i++) tx_real[i] = crealf(tx_postamble[i]); - fwrite(tx_real, sizeof (short), ofdm->samplesperframe, fout); - // Interburst silence - int samples_delay = ofdm->fs; - short sil_short[samples_delay]; - for(int i=0; i<samples_delay; i++) sil_short[i] = 0; - fwrite(sil_short, sizeof(short), samples_delay, fout); - } + if (burst_mode) { + // Post-amble + fprintf(stderr, "Tx postamble\n"); + complex float tx_postamble[ofdm->samplesperframe]; + memcpy(tx_postamble, ofdm->tx_postamble, + sizeof(COMP) * ofdm->samplesperframe); + ofdm_hilbert_clipper(ofdm, tx_postamble, ofdm->samplesperframe); + for (i = 0; i < ofdm->samplesperframe; i++) + tx_real[i] = crealf(tx_postamble[i]); + fwrite(tx_real, sizeof(short), ofdm->samplesperframe, fout); + // Interburst silence + int samples_delay = ofdm->fs; + short sil_short[samples_delay]; + for (int i = 0; i < samples_delay; i++) sil_short[i] = 0; + fwrite(sil_short, sizeof(short), samples_delay, fout); } + } - if (input_specified) - fclose(fin); + if (input_specified) fclose(fin); - if (output_specified) - fclose(fout); + if (output_specified) fclose(fout); - ofdm_destroy(ofdm); + ofdm_destroy(ofdm); - return 0; + return 0; } |
