From 468164e3e1bc35d7af3eb29d013e0519363e51a4 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Fri, 8 Mar 2013 07:23:45 +0000 Subject: [PATCH] support for extracting bit erro rpatterns git-svn-id: https://svn.code.sf.net/p/freetel/code@1200 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/codec2_fdmdv.h | 5 +++-- codec2-dev/src/fdmdv.c | 11 +++++++++-- codec2-dev/src/fdmdv_put_test_bits.c | 9 +++++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/codec2-dev/src/codec2_fdmdv.h b/codec2-dev/src/codec2_fdmdv.h index 0e9ddb3d..f9f73fb0 100644 --- a/codec2-dev/src/codec2_fdmdv.h +++ b/codec2-dev/src/codec2_fdmdv.h @@ -59,7 +59,7 @@ extern "C" { #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 */ @@ -99,7 +99,8 @@ void CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_ 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); diff --git a/codec2-dev/src/fdmdv.c b/codec2-dev/src/fdmdv.c index 9e6799c3..509a02ae 100644 --- a/codec2-dev/src/fdmdv.c +++ b/codec2-dev/src/fdmdv.c @@ -1102,6 +1102,12 @@ void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_differenc 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() @@ -1113,7 +1119,7 @@ void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_differenc \*---------------------------------------------------------------------------*/ -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[]) { @@ -1132,7 +1138,8 @@ void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, *bit_errors = 0; for(i=0; intest_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]); } diff --git a/codec2-dev/src/fdmdv_put_test_bits.c b/codec2-dev/src/fdmdv_put_test_bits.c index d99273c3..b1b3ee6f 100644 --- a/codec2-dev/src/fdmdv_put_test_bits.c +++ b/codec2-dev/src/fdmdv_put_test_bits.c @@ -48,6 +48,7 @@ int main(int argc, char *argv[]) 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]); @@ -90,6 +91,9 @@ int main(int argc, char *argv[]) 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; @@ -108,7 +112,7 @@ int main(int argc, char *argv[]) } 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; @@ -116,7 +120,7 @@ int main(int argc, char *argv[]) } 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; @@ -132,6 +136,7 @@ int main(int argc, char *argv[]) } 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) ); -- 2.25.1