#include "codec2_fdmdv.h"
#include "octave.h"
-#define BITS_PER_CODEC_FRAME (2*FDMDV_BITS_PER_FRAME)
-#define BYTES_PER_CODEC_FRAME (BITS_PER_CODEC_FRAME/8)
-
/* lof of information we want to dump to Octave */
#define MAX_FRAMES 50*60 /* 1 minute at 50 symbols/s */
{
FILE *fin, *fout;
struct FDMDV *fdmdv;
- char packed_bits[BYTES_PER_CODEC_FRAME];
- int rx_bits[FDMDV_BITS_PER_FRAME];
- int codec_bits[2*FDMDV_BITS_PER_FRAME];
+ 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;
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 < 3) {
- printf("usage: %s InputModemRawFile OutputBitFile [OctaveDumpFile]\n", argv[0]);
+ printf("usage: %s InputModemRawFile OutputBitFile [Nc] [OctaveDumpFile]\n", argv[0]);
printf("e.g %s hts1a_fdmdv.raw hts1a.c2\n", argv[0]);
exit(1);
}
exit(1);
}
- Nc = FDMDV_NC;
+ if (argc >= 4) {
+ Nc = atoi(argv[3]);
+ if ((Nc % 2) != 0) {
+ fprintf(stderr, "Error number of carriers must be a multiple of 2\n");
+ exit(1);
+ }
+ if ((Nc < 2) || (Nc > FDMDV_NC_MAX) ) {
+ fprintf(stderr, "Error number of carriers must be btween 2 and %d\n", FDMDV_NC_MAX);
+ exit(1);
+ }
+ }
+ else
+ Nc = FDMDV_NC;
+
fdmdv = fdmdv_create(Nc);
+ bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv);
+ bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv);
+ assert((bits_per_codec_frame % 8) == 0); /* make sure integer number of bytes per frame */
+ bytes_per_codec_frame = bits_per_codec_frame/8;
+
+ /* malloc some buffers that are dependant 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);
rx_timing_log[f] = stats.rx_timing;
coarse_fine_log[f] = stats.fest_coarse_fine;
sync_bit_log[f] = sync_bit;
- memcpy(&rx_bits_log[FDMDV_BITS_PER_FRAME*f], rx_bits, sizeof(int)*FDMDV_BITS_PER_FRAME);
+ memcpy(&rx_bits_log[bits_per_fdmdv_frame*f], rx_bits, sizeof(int)*bits_per_fdmdv_frame);
snr_est_log[f] = stats.snr_est;
fdmdv_get_rx_spectrum(fdmdv, &rx_spec_log[f*FDMDV_NSPEC], rx_fdm, nin_prev);
case 0:
if (sync_bit == 0) {
next_state = 1;
- memcpy(codec_bits, rx_bits, FDMDV_BITS_PER_FRAME*sizeof(int));
+ memcpy(codec_bits, rx_bits, bits_per_fdmdv_frame*sizeof(int));
}
else
next_state = 0;
break;
case 1:
if (sync_bit == 1) {
- memcpy(&codec_bits[FDMDV_BITS_PER_FRAME], rx_bits, FDMDV_BITS_PER_FRAME*sizeof(int));
+ 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++) {
+ 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) {
byte++;
}
}
- assert(byte == BYTES_PER_CODEC_FRAME);
+ assert(byte == bytes_per_codec_frame);
- fwrite(packed_bits, sizeof(char), BYTES_PER_CODEC_FRAME, fout);
+ fwrite(packed_bits, sizeof(char), bytes_per_codec_frame, fout);
}
next_state = 0;
break;
/* Optional dump to Octave log file */
- if (argc == 4) {
+ if (argc == 5) {
/* make sure 3rd arg is not just the pipe command */
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, "coarse_fine_log_c", coarse_fine_log, 1, f);
- octave_save_int(foct, "rx_bits_log_c", rx_bits_log, 1, FDMDV_BITS_PER_FRAME*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, FDMDV_NSPEC, FDMDV_NSPEC);
#include "codec2_fdmdv.h"
-#define BITS_PER_CODEC_FRAME (2*FDMDV_BITS_PER_FRAME)
-#define BYTES_PER_CODEC_FRAME (BITS_PER_CODEC_FRAME/8)
-
int main(int argc, char *argv[])
{
FILE *fin;
struct FDMDV *fdmdv;
- char packed_bits[BYTES_PER_CODEC_FRAME];
- int rx_bits[2*FDMDV_BITS_PER_FRAME];
+ char *packed_bits;
+ int *rx_bits;
int i, bit, byte;
int test_frame_sync, bit_errors, total_bit_errors, total_bits, ntest_bits;
+ int bits_per_fdmdv_frame;
+ int bits_per_codec_frame;
+ int bytes_per_codec_frame;
+ int Nc;
if (argc < 2) {
- printf("usage: %s InputBitFile\n", argv[0]);
+ printf("usage: %s InputBitFile [Nc]\n", argv[0]);
printf("e.g %s test.c2\n", argv[0]);
exit(1);
}
exit(1);
}
- fdmdv = fdmdv_create(FDMDV_NC);
+ if (argc == 3) {
+ Nc = atoi(argv[2]);
+ if ((Nc % 2) != 0) {
+ fprintf(stderr, "Error number of carriers must be a multiple of 2\n");
+ exit(1);
+ }
+ 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);
+
+ bits_per_fdmdv_frame = fdmdv_bits_per_frame(fdmdv);
+ bits_per_codec_frame = 2*fdmdv_bits_per_frame(fdmdv);
+ assert((bits_per_codec_frame % 8) == 0); /* make sure integer number of bytes per frame */
+ bytes_per_codec_frame = bits_per_codec_frame/8;
+ fprintf(stderr, "bits_per_fdmdv_frame: %d bits_per_codec_frame: %d bytes_per_codec_frame: %d\n",
+ bits_per_fdmdv_frame, bits_per_codec_frame, bytes_per_codec_frame);
+
+ 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);
+
total_bit_errors = 0;
total_bits = 0;
- while(fread(packed_bits, sizeof(char), BYTES_PER_CODEC_FRAME, fin) == BYTES_PER_CODEC_FRAME) {
+ while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) {
/* unpack bits, MSB first */
bit = 7; byte = 0;
- for(i=0; i<BITS_PER_CODEC_FRAME; i++) {
+ for(i=0; i<bits_per_codec_frame; i++) {
rx_bits[i] = (packed_bits[byte] >> bit) & 0x1;
//printf("%d 0x%x %d\n", i, packed_bits[byte], rx_bits[i]);
bit--;
byte++;
}
}
- assert(byte == BYTES_PER_CODEC_FRAME);
+ assert(byte == bytes_per_codec_frame);
fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, rx_bits);
if (test_frame_sync == 1) {
}
else
printf("-");
- fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, &rx_bits[FDMDV_BITS_PER_FRAME]);
+ fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]);
if (test_frame_sync == 1) {
total_bit_errors += bit_errors;
total_bits = total_bits + ntest_bits;