aboutsummaryrefslogtreecommitdiff
path: root/src/fdmdv_demod.c
diff options
context:
space:
mode:
authordrowe67 <[email protected]>2023-07-20 08:59:48 +0930
committerGitHub <[email protected]>2023-07-20 08:59:48 +0930
commit06d4c11e699b0351765f10398abb4f663a984f36 (patch)
tree33e22af0814c5b6c3d676f096ae8c2ac8a3ed9f0 /src/fdmdv_demod.c
parent6588e77f38bdebd7adffe091b22e7760d95d0ccb (diff)
parent4d6c143c0abec15e1d6ed1fd95d36f80e6cb7df8 (diff)
Merge pull request #3 from drowe67/dr-cleanup21.2.0
Cleanup Part 2
Diffstat (limited to 'src/fdmdv_demod.c')
-rw-r--r--src/fdmdv_demod.c380
1 files changed, 194 insertions, 186 deletions
diff --git a/src/fdmdv_demod.c b/src/fdmdv_demod.c
index c671cd9..e3ef8a7 100644
--- a/src/fdmdv_demod.c
+++ b/src/fdmdv_demod.c
@@ -15,7 +15,6 @@
\*---------------------------------------------------------------------------*/
-
/*
Copyright (C) 2012 David Rowe
@@ -34,216 +33,225 @@
*/
#include <assert.h>
+#include <errno.h>
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <math.h>
-#include <errno.h>
#include "codec2_fdmdv.h"
-#include "octave.h"
-#include "freedv_api.h"
-
#include "debug_alloc.h"
+#include "freedv_api.h"
+#include "octave.h"
/* lof of information we want to dump to Octave */
-#define MAX_FRAMES 50*60 /* 1 minute at 50 symbols/s */
-
-int main(int argc, char *argv[])
-{
- FILE *fin, *fout;
- struct FDMDV *fdmdv;
- char *packed_bits;
- int *rx_bits;
- int *codec_bits;
- COMP rx_fdm[FDMDV_MAX_SAMPLES_PER_FRAME];
- short rx_fdm_scaled[FDMDV_MAX_SAMPLES_PER_FRAME];
- int i, bit, byte, c;
- int nin, nin_prev;
- int sync_bit = 0, reliable_sync_bit;
- int sync = 0;
- int f;
- FILE *foct = NULL;
- struct MODEM_STATS stats;
- COMP *rx_fdm_log;
- int rx_fdm_log_col_index;
- COMP *rx_symbols_log;
- int sync_log[MAX_FRAMES];
- float rx_timing_log[MAX_FRAMES];
- float foff_log[MAX_FRAMES];
- int sync_bit_log[MAX_FRAMES];
- int rx_bits_log[FDMDV_BITS_PER_FRAME*MAX_FRAMES];
- float snr_est_log[MAX_FRAMES];
- float *rx_spec_log;
- int max_frames_reached;
- int bits_per_fdmdv_frame;
- int bits_per_codec_frame;
- int bytes_per_codec_frame;
- int Nc;
-
- if (argc < 2) {
- printf("usage: %s InputModemRawFile OutputBitFile [Nc [OctaveDumpFile]]\n", argv[0]);
- printf("e.g %s hts1a_fdmdv.raw hts1a.c2\n", argv[0]);
- exit(1);
+#define MAX_FRAMES 50 * 60 /* 1 minute at 50 symbols/s */
+
+int main(int argc, char *argv[]) {
+ FILE *fin, *fout;
+ struct FDMDV *fdmdv;
+ char *packed_bits;
+ int *rx_bits;
+ int *codec_bits;
+ COMP rx_fdm[FDMDV_MAX_SAMPLES_PER_FRAME];
+ short rx_fdm_scaled[FDMDV_MAX_SAMPLES_PER_FRAME];
+ int i, bit, byte, c;
+ int nin, nin_prev;
+ int sync_bit = 0, reliable_sync_bit;
+ int sync = 0;
+ int f;
+ FILE *foct = NULL;
+ struct MODEM_STATS stats;
+ COMP *rx_fdm_log;
+ int rx_fdm_log_col_index;
+ COMP *rx_symbols_log;
+ int sync_log[MAX_FRAMES];
+ float rx_timing_log[MAX_FRAMES];
+ float foff_log[MAX_FRAMES];
+ int sync_bit_log[MAX_FRAMES];
+ int rx_bits_log[FDMDV_BITS_PER_FRAME * MAX_FRAMES];
+ float snr_est_log[MAX_FRAMES];
+ float *rx_spec_log;
+ int max_frames_reached;
+ int bits_per_fdmdv_frame;
+ int bits_per_codec_frame;
+ int bytes_per_codec_frame;
+ int Nc;
+
+ if (argc < 2) {
+ printf("usage: %s InputModemRawFile OutputBitFile [Nc [OctaveDumpFile]]\n",
+ argv[0]);
+ printf("e.g %s hts1a_fdmdv.raw hts1a.c2\n", argv[0]);
+ exit(1);
+ }
+
+ if (strcmp(argv[1], "-") == 0)
+ fin = stdin;
+ else if ((fin = fopen(argv[1], "rb")) == NULL) {
+ fprintf(stderr, "Error opening input modem sample file: %s: %s.\n", argv[1],
+ strerror(errno));
+ exit(1);
+ }
+
+ if (strcmp(argv[2], "-") == 0)
+ fout = stdout;
+ else if ((fout = fopen(argv[2], "wb")) == NULL) {
+ fprintf(stderr, "Error opening output bit file: %s: %s.\n", argv[2],
+ strerror(errno));
+ exit(1);
+ }
+
+ if (argc >= 4) {
+ Nc = atoi(argv[3]);
+
+ if ((Nc < 2) || (Nc > FDMDV_NC_MAX)) {
+ fprintf(stderr, "Error number of carriers must be between 2 and %d\n",
+ FDMDV_NC_MAX);
+ exit(1);
}
-
- if (strcmp(argv[1], "-") == 0) fin = stdin;
- else if ( (fin = fopen(argv[1],"rb")) == NULL ) {
- fprintf(stderr, "Error opening input modem sample file: %s: %s.\n",
- argv[1], strerror(errno));
- exit(1);
+ } else
+ Nc = FDMDV_NC;
+
+ fdmdv = fdmdv_create(Nc);
+ modem_stats_open(&stats);
+
+ bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv);
+ bits_per_codec_frame = 2 * fdmdv_bits_per_frame(fdmdv);
+ bytes_per_codec_frame = (bits_per_codec_frame + 7) / 8;
+
+ /* malloc some buffers that are dependent on Nc */
+
+ packed_bits = (char *)MALLOC(bytes_per_codec_frame);
+ assert(packed_bits != NULL);
+ rx_bits = (int *)MALLOC(sizeof(int) * bits_per_codec_frame);
+ assert(rx_bits != NULL);
+ codec_bits = (int *)MALLOC(2 * sizeof(int) * bits_per_fdmdv_frame);
+ assert(codec_bits != NULL);
+
+ /* malloc some of the larger variables to prevent out of stack problems */
+
+ rx_fdm_log =
+ (COMP *)MALLOC(sizeof(COMP) * FDMDV_MAX_SAMPLES_PER_FRAME * MAX_FRAMES);
+ assert(rx_fdm_log != NULL);
+ rx_spec_log = (float *)MALLOC(sizeof(float) * MODEM_STATS_NSPEC * MAX_FRAMES);
+ assert(rx_spec_log != NULL);
+ rx_symbols_log = (COMP *)MALLOC(sizeof(COMP) * (Nc + 1) * MAX_FRAMES);
+ assert(rx_fdm_log != NULL);
+
+ f = 0;
+ nin = FDMDV_NOM_SAMPLES_PER_FRAME;
+ rx_fdm_log_col_index = 0;
+ max_frames_reached = 0;
+
+ while (fread(rx_fdm_scaled, sizeof(short), nin, fin) == nin) {
+ for (i = 0; i < nin; i++) {
+ rx_fdm[i].real = (float)rx_fdm_scaled[i] / FDMDV_SCALE;
+ rx_fdm[i].imag = 0;
}
+ nin_prev = nin;
+ fdmdv_demod(fdmdv, rx_bits, &reliable_sync_bit, rx_fdm, &nin);
- if (strcmp(argv[2], "-") == 0) fout = stdout;
- else if ( (fout = fopen(argv[2],"wb")) == NULL ) {
- fprintf(stderr, "Error opening output bit file: %s: %s.\n",
- argv[2], strerror(errno));
- exit(1);
- }
-
- if (argc >= 4) {
- Nc = atoi(argv[3]);
-
- if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) {
- fprintf(stderr, "Error number of carriers must be between 2 and %d\n", FDMDV_NC_MAX);
- exit(1);
- }
- }
- else
- Nc = FDMDV_NC;
-
- fdmdv = fdmdv_create(Nc);
- modem_stats_open(&stats);
-
- bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv);
- bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv);
- bytes_per_codec_frame = (bits_per_codec_frame+7)/8;
+ /* log data for optional Octave dump */
- /* malloc some buffers that are dependent on Nc */
+ if (f < MAX_FRAMES) {
+ fdmdv_get_demod_stats(fdmdv, &stats);
- packed_bits = (char*)MALLOC(bytes_per_codec_frame); assert(packed_bits != NULL);
- rx_bits = (int*)MALLOC(sizeof(int)*bits_per_codec_frame); assert(rx_bits != NULL);
- codec_bits = (int*)MALLOC(2*sizeof(int)*bits_per_fdmdv_frame); assert(codec_bits != NULL);
+ /* log modem states for later dumping to Octave log file */
- /* malloc some of the larger variables to prevent out of stack problems */
+ memcpy(&rx_fdm_log[rx_fdm_log_col_index], rx_fdm,
+ sizeof(COMP) * nin_prev);
+ rx_fdm_log_col_index += nin_prev;
- rx_fdm_log = (COMP*)MALLOC(sizeof(COMP)*FDMDV_MAX_SAMPLES_PER_FRAME*MAX_FRAMES);
- assert(rx_fdm_log != NULL);
- rx_spec_log = (float*)MALLOC(sizeof(float)*MODEM_STATS_NSPEC*MAX_FRAMES);
- assert(rx_spec_log != NULL);
- rx_symbols_log = (COMP*)MALLOC(sizeof(COMP)*(Nc+1)*MAX_FRAMES);
- assert(rx_fdm_log != NULL);
+ for (c = 0; c < Nc + 1; c++)
+ rx_symbols_log[f * (Nc + 1) + c] = stats.rx_symbols[0][c];
+ foff_log[f] = stats.foff;
+ rx_timing_log[f] = stats.rx_timing;
+ sync_log[f] = stats.sync;
+ sync_bit_log[f] = sync_bit;
+ memcpy(&rx_bits_log[bits_per_fdmdv_frame * f], rx_bits,
+ sizeof(int) * bits_per_fdmdv_frame);
+ snr_est_log[f] = stats.snr_est;
- f = 0;
- nin = FDMDV_NOM_SAMPLES_PER_FRAME;
- rx_fdm_log_col_index = 0;
- max_frames_reached = 0;
+ modem_stats_get_rx_spectrum(&stats, &rx_spec_log[f * MODEM_STATS_NSPEC],
+ rx_fdm, nin_prev);
- while(fread(rx_fdm_scaled, sizeof(short), nin, fin) == nin)
- {
- for(i=0; i<nin; i++) {
- rx_fdm[i].real = (float)rx_fdm_scaled[i]/FDMDV_SCALE;
- rx_fdm[i].imag = 0;
- }
- nin_prev = nin;
- fdmdv_demod(fdmdv, rx_bits, &reliable_sync_bit, rx_fdm, &nin);
-
- /* log data for optional Octave dump */
-
- if (f < MAX_FRAMES) {
- fdmdv_get_demod_stats(fdmdv, &stats);
-
- /* log modem states for later dumping to Octave log file */
-
- memcpy(&rx_fdm_log[rx_fdm_log_col_index], rx_fdm, sizeof(COMP)*nin_prev);
- rx_fdm_log_col_index += nin_prev;
-
- for(c=0; c<Nc+1; c++)
- rx_symbols_log[f*(Nc+1)+c] = stats.rx_symbols[0][c];
- foff_log[f] = stats.foff;
- rx_timing_log[f] = stats.rx_timing;
- sync_log[f] = stats.sync;
- sync_bit_log[f] = sync_bit;
- memcpy(&rx_bits_log[bits_per_fdmdv_frame*f], rx_bits, sizeof(int)*bits_per_fdmdv_frame);
- snr_est_log[f] = stats.snr_est;
-
- modem_stats_get_rx_spectrum(&stats, &rx_spec_log[f*MODEM_STATS_NSPEC], rx_fdm, nin_prev);
-
- f++;
- }
-
- if ((f == MAX_FRAMES) && !max_frames_reached) {
- fprintf(stderr,"MAX_FRAMES exceed in Octave log, log truncated\n");
- max_frames_reached = 1;
- }
+ f++;
+ }
- if (reliable_sync_bit)
- sync = 1;
- //printf("sync_bit: %d reliable_sync_bit: %d sync: %d\n", sync_bit, reliable_sync_bit, sync);
+ if ((f == MAX_FRAMES) && !max_frames_reached) {
+ fprintf(stderr, "MAX_FRAMES exceed in Octave log, log truncated\n");
+ max_frames_reached = 1;
+ }
- if (sync == 0) {
- memcpy(codec_bits, rx_bits, bits_per_fdmdv_frame*sizeof(int));
- sync = 1;
- }
- else {
- memcpy(&codec_bits[bits_per_fdmdv_frame], rx_bits, bits_per_fdmdv_frame*sizeof(int));
-
- /* pack bits, MSB received first */
-
- bit = 7; byte = 0;
- memset(packed_bits, 0, bytes_per_codec_frame);
- for(i=0; i<bits_per_codec_frame; i++) {
- packed_bits[byte] |= (codec_bits[i] << bit);
- bit--;
- if (bit < 0) {
- bit = 7;
- byte++;
- }
- }
-
- fwrite(packed_bits, sizeof(char), bytes_per_codec_frame, fout);
- sync = 0;
+ if (reliable_sync_bit) sync = 1;
+ // printf("sync_bit: %d reliable_sync_bit: %d sync: %d\n", sync_bit,
+ // reliable_sync_bit, sync);
+
+ if (sync == 0) {
+ memcpy(codec_bits, rx_bits, bits_per_fdmdv_frame * sizeof(int));
+ sync = 1;
+ } else {
+ memcpy(&codec_bits[bits_per_fdmdv_frame], rx_bits,
+ bits_per_fdmdv_frame * sizeof(int));
+
+ /* pack bits, MSB received first */
+
+ bit = 7;
+ byte = 0;
+ memset(packed_bits, 0, bytes_per_codec_frame);
+ for (i = 0; i < bits_per_codec_frame; i++) {
+ packed_bits[byte] |= (codec_bits[i] << bit);
+ bit--;
+ if (bit < 0) {
+ bit = 7;
+ byte++;
}
+ }
-
- /* if this is in a pipeline, we probably don't want the usual
- buffering to occur */
-
- if (fout == stdout) fflush(stdout);
+ fwrite(packed_bits, sizeof(char), bytes_per_codec_frame, fout);
+ sync = 0;
}
- /* Optional dump to Octave log file */
-
- if (argc == 5) {
-
- if ((foct = fopen(argv[4],"wt")) == NULL ) {
- fprintf(stderr, "Error opening Octave dump file: %s: %s.\n",
- argv[4], strerror(errno));
- exit(1);
- }
- octave_save_complex(foct, "rx_fdm_log_c", rx_fdm_log, 1, rx_fdm_log_col_index, FDMDV_MAX_SAMPLES_PER_FRAME);
- octave_save_complex(foct, "rx_symbols_log_c", (COMP*)rx_symbols_log, Nc+1, f, MAX_FRAMES);
- octave_save_float(foct, "foff_log_c", foff_log, 1, f, MAX_FRAMES);
- octave_save_float(foct, "rx_timing_log_c", rx_timing_log, 1, f, MAX_FRAMES);
- octave_save_int(foct, "sync_log_c", sync_log, 1, f);
- octave_save_int(foct, "rx_bits_log_c", rx_bits_log, 1, bits_per_fdmdv_frame*f);
- octave_save_int(foct, "sync_bit_log_c", sync_bit_log, 1, f);
- octave_save_float(foct, "snr_est_log_c", snr_est_log, 1, f, MAX_FRAMES);
- octave_save_float(foct, "rx_spec_log_c", rx_spec_log, f, MODEM_STATS_NSPEC, MODEM_STATS_NSPEC);
- fclose(foct);
- }
-
- //fdmdv_dump_osc_mags(fdmdv);
+ /* if this is in a pipeline, we probably don't want the usual
+ buffering to occur */
- fclose(fin);
- fclose(fout);
- FREE(rx_fdm_log);
- FREE(rx_spec_log);
- fdmdv_destroy(fdmdv);
+ if (fout == stdout) fflush(stdout);
+ }
- if (packed_bits != NULL) FREE(packed_bits);
+ /* Optional dump to Octave log file */
- return 0;
+ if (argc == 5) {
+ if ((foct = fopen(argv[4], "wt")) == NULL) {
+ fprintf(stderr, "Error opening Octave dump file: %s: %s.\n", argv[4],
+ strerror(errno));
+ exit(1);
+ }
+ octave_save_complex(foct, "rx_fdm_log_c", rx_fdm_log, 1,
+ rx_fdm_log_col_index, FDMDV_MAX_SAMPLES_PER_FRAME);
+ octave_save_complex(foct, "rx_symbols_log_c", (COMP *)rx_symbols_log,
+ Nc + 1, f, MAX_FRAMES);
+ octave_save_float(foct, "foff_log_c", foff_log, 1, f, MAX_FRAMES);
+ octave_save_float(foct, "rx_timing_log_c", rx_timing_log, 1, f, MAX_FRAMES);
+ octave_save_int(foct, "sync_log_c", sync_log, 1, f);
+ octave_save_int(foct, "rx_bits_log_c", rx_bits_log, 1,
+ bits_per_fdmdv_frame * f);
+ octave_save_int(foct, "sync_bit_log_c", sync_bit_log, 1, f);
+ octave_save_float(foct, "snr_est_log_c", snr_est_log, 1, f, MAX_FRAMES);
+ octave_save_float(foct, "rx_spec_log_c", rx_spec_log, f, MODEM_STATS_NSPEC,
+ MODEM_STATS_NSPEC);
+ fclose(foct);
+ }
+
+ // fdmdv_dump_osc_mags(fdmdv);
+
+ fclose(fin);
+ fclose(fout);
+ FREE(rx_fdm_log);
+ FREE(rx_spec_log);
+ fdmdv_destroy(fdmdv);
+
+ if (packed_bits != NULL) FREE(packed_bits);
+
+ return 0;
}
-