#define FDMDV_NC 14 /* default number of data carriers */
#define FDMDV_NC_MAX 20 /* maximum number of data carriers */
-#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, 1400 bit/s */
+#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, for nominal 1400 bit/s */
#define FDMDV_NOM_SAMPLES_PER_FRAME 160 /* modulator output samples/frame and nominal demod samples/frame */
/* at 8000 Hz sample rate */
#define FDMDV_MAX_SAMPLES_PER_FRAME 200 /* max demod samples/frame, use this to allocate storage */
void CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *sync_bit, COMP rx_fdm[], int *nin);
void CODEC2_WIN32SUPPORT fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]);
-void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int *ntest_bits, int rx_bits[]);
+int CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *fdmdv_state);
+void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], int *bit_errors, int *ntest_bits, int rx_bits[]);
void CODEC2_WIN32SUPPORT fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct FDMDV_STATS *fdmdv_stats);
void CODEC2_WIN32SUPPORT fdmdv_get_rx_spectrum(struct FDMDV *fdmdv_state, float mag_dB[], COMP rx_fdm[], int nin);
noise_est[c] = SNR_COEFF*noise_est[c] + (1 - SNR_COEFF)*n[c];
}
+// returns number of shorts in error_pattern[], one short per error
+
+int CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *f) {
+ return f->ntest_bits;
+}
+
/*---------------------------------------------------------------------------*\
FUNCTION....: fdmdv_put_test_bits()
\*---------------------------------------------------------------------------*/
-void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync,
+void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[],
int *bit_errors, int *ntest_bits,
int rx_bits[])
{
*bit_errors = 0;
for(i=0; i<f->ntest_bits; i++) {
- *bit_errors += test_bits[i] ^ f->rx_test_bits_mem[i];
+ error_pattern[i] = test_bits[i] ^ f->rx_test_bits_mem[i];
+ *bit_errors += error_pattern[i];
//printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]);
}
int bits_per_codec_frame;
int bytes_per_codec_frame;
int Nc;
+ int *error_pattern;
if (argc < 2) {
printf("usage: %s InputBitFile [Nc]\n", argv[0]);
rx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame);
assert(rx_bits != NULL);
+ error_pattern = (int*)malloc(fdmdv_error_pattern_size(fdmdv)*sizeof(int));
+ assert(error_pattern != NULL);
+
total_bit_errors = 0;
total_bits = 0;
}
assert(byte == bytes_per_codec_frame);
- fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, rx_bits);
+ fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &bit_errors, &ntest_bits, rx_bits);
if (test_frame_sync == 1) {
total_bit_errors += bit_errors;
total_bits = total_bits + ntest_bits;
}
else
printf("-");
- fdmdv_put_test_bits(fdmdv, &test_frame_sync, &bit_errors, &ntest_bits, &rx_bits[bits_per_fdmdv_frame]);
+ fdmdv_put_test_bits(fdmdv, &test_frame_sync, error_pattern, &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;
}
fclose(fin);
+ free(error_pattern);
fdmdv_destroy(fdmdv);
printf("\nbits %d errors %d BER %1.4f\n", total_bits, total_bit_errors, (float)total_bit_errors/(1E-6+total_bits) );