From c879333e0e54c7b51e90187a3c8ae21936b1f8a9 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 28 Feb 2013 02:48:38 +0000 Subject: [PATCH] modified modulator side to support variable number of carriers, tested OK on default Nc=14 git-svn-id: https://svn.code.sf.net/p/freetel/code@1176 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/codec2_fdmdv.h | 2 ++ codec2-dev/src/fdmdv.c | 18 +++++++++----- codec2-dev/src/fdmdv_get_test_bits.c | 35 +++++++++++++++++++--------- codec2-dev/src/fdmdv_internal.h | 2 +- codec2-dev/src/fdmdv_mod.c | 31 +++++++++++++++++------- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/codec2-dev/src/codec2_fdmdv.h b/codec2-dev/src/codec2_fdmdv.h index 38e97140..f93be530 100644 --- a/codec2-dev/src/codec2_fdmdv.h +++ b/codec2-dev/src/codec2_fdmdv.h @@ -81,6 +81,7 @@ extern "C" { struct FDMDV; struct FDMDV_STATS { + int Nc; float snr_est; /* estimated SNR of rx signal in dB (3 kHz noise BW) */ COMP rx_symbols[FDMDV_NSYM]; /* latest received symbols, for scatter plot */ int fest_coarse_fine; /* freq est state, 0-coarse 1-fine */ @@ -91,6 +92,7 @@ struct FDMDV_STATS { struct FDMDV * CODEC2_WIN32SUPPORT fdmdv_create(int Nc); void CODEC2_WIN32SUPPORT fdmdv_destroy(struct FDMDV *fdmdv_state); +int CODEC2_WIN32SUPPORT fdmdv_bits_per_frame(struct FDMDV *fdmdv_state); void CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[], int *sync_bit); void CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *sync_bit, COMP rx_fdm[], int *nin); diff --git a/codec2-dev/src/fdmdv.c b/codec2-dev/src/fdmdv.c index 947ca717..8527a32a 100644 --- a/codec2-dev/src/fdmdv.c +++ b/codec2-dev/src/fdmdv.c @@ -259,6 +259,11 @@ void CODEC2_WIN32SUPPORT fdmdv_destroy(struct FDMDV *fdmdv) free(fdmdv); } +int CODEC2_WIN32SUPPORT fdmdv_bits_per_frame(struct FDMDV *fdmdv) +{ + return (fdmdv->Nc * NB); +} + /*---------------------------------------------------------------------------*\ FUNCTION....: fdmdv_get_test_bits() @@ -402,7 +407,7 @@ void tx_filter(COMP tx_baseband[NC+1][M], int Nc, COMP tx_symbols[], COMP tx_fil \*---------------------------------------------------------------------------*/ -void fdm_upconvert(COMP tx_fdm[], COMP tx_baseband[NC+1][M], COMP phase_tx[], COMP freq[]) +void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M], COMP phase_tx[], COMP freq[]) { int i,c; COMP two = {2.0, 0.0}; @@ -415,7 +420,7 @@ void fdm_upconvert(COMP tx_fdm[], COMP tx_baseband[NC+1][M], COMP phase_tx[], CO /* Nc/2 tones below centre freq */ - for (c=0; cNc, fdmdv->prev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit); memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(NC+1)); tx_filter(tx_baseband, fdmdv->Nc, tx_symbols, fdmdv->tx_filter_memory); - fdm_upconvert(tx_fdm, tx_baseband, fdmdv->phase_tx, fdmdv->freq); + fdm_upconvert(tx_fdm, fdmdv->Nc, tx_baseband, fdmdv->phase_tx, fdmdv->freq); *sync_bit = fdmdv->tx_pilot_bit; } @@ -1340,6 +1345,7 @@ void CODEC2_WIN32SUPPORT fdmdv_get_demod_stats(struct FDMDV *fdmdv, { int c; + fdmdv_stats->Nc = fdmdv->Nc; fdmdv_stats->snr_est = calc_snr(fdmdv->sig_est, fdmdv->noise_est); fdmdv_stats->fest_coarse_fine = fdmdv->coarse_fine; fdmdv_stats->foff = fdmdv->foff; diff --git a/codec2-dev/src/fdmdv_get_test_bits.c b/codec2-dev/src/fdmdv_get_test_bits.c index 234dac34..04db3d0b 100644 --- a/codec2-dev/src/fdmdv_get_test_bits.c +++ b/codec2-dev/src/fdmdv_get_test_bits.c @@ -35,17 +35,17 @@ #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 *fout; struct FDMDV *fdmdv; - char packed_bits[BYTES_PER_CODEC_FRAME]; - int tx_bits[2*FDMDV_BITS_PER_FRAME]; + char *packed_bits; + int *tx_bits; int n, i, bit, byte; int numBits, nCodecFrames; + int bits_per_fdmdv_frame; + int bits_per_codec_frame; + int bytes_per_codec_frame; if (argc < 3) { printf("usage: %s OutputBitFile numBits\n", argv[0]); @@ -61,20 +61,31 @@ int main(int argc, char *argv[]) } numBits = atoi(argv[2]); - nCodecFrames = numBits/BITS_PER_CODEC_FRAME; fdmdv = fdmdv_create(FDMDV_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; + + packed_bits = (char*)malloc(bytes_per_codec_frame); + assert(packed_bits != NULL); + tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame); + assert(tx_bits != NULL); + + nCodecFrames = numBits/bytes_per_codec_frame; + for(n=0; n> bit) & 0x1; bit--; if (bit < 0) { @@ -90,14 +101,14 @@ int main(int argc, char *argv[]) byte++; } } - assert(byte == BYTES_PER_CODEC_FRAME); + assert(byte == bytes_per_codec_frame); /* modulate even and odd frames */ fdmdv_mod(fdmdv, tx_fdm, tx_bits, &sync_bit); assert(sync_bit == 1); - fdmdv_mod(fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &tx_bits[FDMDV_BITS_PER_FRAME], &sync_bit); + fdmdv_mod(fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &tx_bits[bits_per_fdmdv_frame], &sync_bit); assert(sync_bit == 0); /* scale and save to disk as shorts */ @@ -116,6 +127,8 @@ int main(int argc, char *argv[]) //fdmdv_dump_osc_mags(fdmdv); + free(tx_bits); + free(packed_bits); fclose(fin); fclose(fout); fdmdv_destroy(fdmdv); -- 2.25.1