diff options
Diffstat (limited to 'unittest/tcohpsk.c')
| -rw-r--r-- | unittest/tcohpsk.c | 472 |
1 files changed, 255 insertions, 217 deletions
diff --git a/unittest/tcohpsk.c b/unittest/tcohpsk.c index 7b421ed..1519d7d 100644 --- a/unittest/tcohpsk.c +++ b/unittest/tcohpsk.c @@ -29,258 +29,296 @@ */ #include <assert.h> +#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <math.h> -#include "fdmdv_internal.h" -#include "codec2_fdmdv.h" #include "codec2_cohpsk.h" +#include "codec2_fdmdv.h" #include "cohpsk_defs.h" #include "cohpsk_internal.h" -#include "octave.h" #include "comp_prim.h" +#include "fdmdv_internal.h" #include "noise_samples.h" +#include "octave.h" -#define FRAMES 30 /* LOG_FRAMES is #defined in cohpsk_internal.h */ -#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ -#define FRAMESL (SYNC_FRAMES*FRAMES) /* worst case is every frame is out of sync */ +#define FRAMES \ + 30 /* LOG_FRAMES is #defined in cohpsk_internal.h */ +#define SYNC_FRAMES \ + 12 /* sync state uses up extra log storage as we reprocess several times */ +#define FRAMESL \ + (SYNC_FRAMES * FRAMES) /* worst case is every frame is out of sync */ -#define FOFF 58.7 -#define DFOFF (-0.5/(float)COHPSK_FS) -#define ESNODB 8 -#define PPM -1500 +#define FOFF 58.7 +#define DFOFF (-0.5 / (float)COHPSK_FS) +#define ESNODB 8 +#define PPM -1500 extern float pilots_coh[][PILOTS_NC]; -int main(int argc, char *argv[]) -{ - struct COHPSK *coh; - int tx_bits[COHPSK_BITS_PER_FRAME]; - COMP tx_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; - COMP tx_fdm_frame[COHPSK_M*NSYMROWPILOT]; - COMP ch_fdm_frame[COHPSK_M*NSYMROWPILOT]; - //COMP rx_fdm_frame_bb[M*NSYMROWPILOT]; - //COMP ch_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; - float rx_bits_sd[COHPSK_BITS_PER_FRAME]; - int rx_bits[COHPSK_BITS_PER_FRAME]; - - int tx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; - COMP tx_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; - COMP tx_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; - COMP ch_fdm_frame_log[COHPSK_M*NSYMROWPILOT*FRAMES]; - COMP ch_fdm_frame_log_out[(COHPSK_M*NSYMROWPILOT+1)*FRAMES]; - //COMP rx_fdm_frame_bb_log[M*NSYMROWPILOT*FRAMES]; - //COMP ch_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; - COMP ct_symb_ff_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; - float rx_amp_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; - float rx_phi_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; - COMP rx_symb_log[NSYMROW*FRAMES][COHPSK_NC*COHPSK_ND]; - int rx_bits_log[COHPSK_BITS_PER_FRAME*FRAMES]; - - FILE *fout; - int f, r, c, log_r, log_data_r, noise_r, ff_log_r, i; - double foff; - COMP foff_rect, phase_ch; - - struct FDMDV *fdmdv; - //COMP rx_filt[COHPSK_NC*COHPSK_ND][P+1]; - //int rx_filt_log_col_index = 0; - //float env[NT*P]; - //float __attribute__((unused)) rx_timing; - COMP tx_onesym[COHPSK_NC*COHPSK_ND]; - //COMP rx_onesym[COHPSK_NC*COHPSK_ND]; - //int rx_baseband_log_col_index = 0; - //COMP rx_baseband_log[COHPSK_NC*COHPSK_ND][(M+M/P)*NSYMROWPILOT*FRAMES]; - float f_est_log[FRAMES], sig_rms_log[FRAMES], noise_rms_log[FRAMES]; - int f_est_samples; - - int log_bits; - float EsNo, variance; - COMP scaled_noise; - int reliable_sync_bit; - int ch_fdm_frame_log_index, nin_frame, tmp, nout; - - coh = cohpsk_create(); - fdmdv = coh->fdmdv; - assert(coh != NULL); - cohpsk_set_verbose(coh, 1); - - /* these puppies are used for logging data in the bowels on the modem */ - - coh->rx_baseband_log_col_sz = (COHPSK_M+COHPSK_M/P)*NSYMROWPILOT*FRAMESL; - coh->rx_baseband_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*COHPSK_ND*coh->rx_baseband_log_col_sz); - - coh->rx_filt_log_col_sz = (P+1)*NSYMROWPILOT*FRAMESL; - coh->rx_filt_log = (COMP *)malloc(sizeof(COMP)*COHPSK_NC*COHPSK_ND*coh->rx_filt_log_col_sz); - - coh->ch_symb_log_col_sz = COHPSK_NC*COHPSK_ND; - coh->ch_symb_log = (COMP *)malloc(sizeof(COMP)*NSYMROWPILOT*FRAMESL*coh->ch_symb_log_col_sz); - - coh->rx_timing_log = (float*)malloc(sizeof(float)*NSYMROWPILOT*FRAMESL); - - /* init stuff */ - - log_r = log_data_r = noise_r = log_bits = ff_log_r = f_est_samples = 0; - phase_ch.real = 1.0; phase_ch.imag = 0.0; - foff = FOFF; - - /* each carrier has power = 2, total power 2Nc, total symbol rate - NcRs, noise BW B=Fs Es/No = (C/Rs)/(N/B), N = var = - 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) */ - - EsNo = pow(10.0, ESNODB/10.0); - variance = 2.0*COHPSK_FS/(COHPSK_RS*EsNo); - //fprintf(stderr, "doff: %e\n", DFOFF); - - /* Main Loop ---------------------------------------------------------------------*/ - - for(f=0; f<FRAMES; f++) { - - /* --------------------------------------------------------*\ - Mod - \*---------------------------------------------------------*/ - - cohpsk_get_test_bits(coh, tx_bits); - bits_to_qpsk_symbols(tx_symb, (int*)tx_bits, COHPSK_BITS_PER_FRAME); - - for(r=0; r<NSYMROWPILOT; r++) { - for(c=0; c<COHPSK_NC*COHPSK_ND; c++) - tx_onesym[c] = tx_symb[r][c]; - tx_filter_and_upconvert_coh(&tx_fdm_frame[r*COHPSK_M], COHPSK_NC*COHPSK_ND , tx_onesym, fdmdv->tx_filter_memory, - fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); - } - cohpsk_clip(tx_fdm_frame, COHPSK_CLIP, NSYMROWPILOT*COHPSK_M); +int main(int argc, char *argv[]) { + struct COHPSK *coh; + int tx_bits[COHPSK_BITS_PER_FRAME]; + COMP tx_symb[NSYMROWPILOT][COHPSK_NC * COHPSK_ND]; + COMP tx_fdm_frame[COHPSK_M * NSYMROWPILOT]; + COMP ch_fdm_frame[COHPSK_M * NSYMROWPILOT]; + // COMP rx_fdm_frame_bb[M*NSYMROWPILOT]; + // COMP ch_symb[NSYMROWPILOT][COHPSK_NC*COHPSK_ND]; + float rx_bits_sd[COHPSK_BITS_PER_FRAME]; + int rx_bits[COHPSK_BITS_PER_FRAME]; + + int tx_bits_log[COHPSK_BITS_PER_FRAME * FRAMES]; + COMP tx_symb_log[NSYMROWPILOT * FRAMES][COHPSK_NC * COHPSK_ND]; + COMP tx_fdm_frame_log[COHPSK_M * NSYMROWPILOT * FRAMES]; + COMP ch_fdm_frame_log[COHPSK_M * NSYMROWPILOT * FRAMES]; + COMP ch_fdm_frame_log_out[(COHPSK_M * NSYMROWPILOT + 1) * FRAMES]; + // COMP rx_fdm_frame_bb_log[M*NSYMROWPILOT*FRAMES]; + // COMP ch_symb_log[NSYMROWPILOT*FRAMES][COHPSK_NC*COHPSK_ND]; + COMP ct_symb_ff_log[NSYMROWPILOT * FRAMES][COHPSK_NC * COHPSK_ND]; + float rx_amp_log[NSYMROW * FRAMES][COHPSK_NC * COHPSK_ND]; + float rx_phi_log[NSYMROW * FRAMES][COHPSK_NC * COHPSK_ND]; + COMP rx_symb_log[NSYMROW * FRAMES][COHPSK_NC * COHPSK_ND]; + int rx_bits_log[COHPSK_BITS_PER_FRAME * FRAMES]; + + FILE *fout; + int f, r, c, log_r, log_data_r, noise_r, ff_log_r, i; + double foff; + COMP foff_rect, phase_ch; + + struct FDMDV *fdmdv; + // COMP rx_filt[COHPSK_NC*COHPSK_ND][P+1]; + // int rx_filt_log_col_index = 0; + // float env[NT*P]; + // float __attribute__((unused)) rx_timing; + COMP tx_onesym[COHPSK_NC * COHPSK_ND]; + // COMP rx_onesym[COHPSK_NC*COHPSK_ND]; + // int rx_baseband_log_col_index = 0; + // COMP rx_baseband_log[COHPSK_NC*COHPSK_ND][(M+M/P)*NSYMROWPILOT*FRAMES]; + float f_est_log[FRAMES], sig_rms_log[FRAMES], noise_rms_log[FRAMES]; + int f_est_samples; + + int log_bits; + float EsNo, variance; + COMP scaled_noise; + int reliable_sync_bit; + int ch_fdm_frame_log_index, nin_frame, tmp, nout; + + coh = cohpsk_create(); + fdmdv = coh->fdmdv; + assert(coh != NULL); + cohpsk_set_verbose(coh, 1); + + /* these puppies are used for logging data in the bowels on the modem */ + + coh->rx_baseband_log_col_sz = + (COHPSK_M + COHPSK_M / P) * NSYMROWPILOT * FRAMESL; + coh->rx_baseband_log = (COMP *)malloc(sizeof(COMP) * COHPSK_NC * COHPSK_ND * + coh->rx_baseband_log_col_sz); + + coh->rx_filt_log_col_sz = (P + 1) * NSYMROWPILOT * FRAMESL; + coh->rx_filt_log = (COMP *)malloc(sizeof(COMP) * COHPSK_NC * COHPSK_ND * + coh->rx_filt_log_col_sz); + + coh->ch_symb_log_col_sz = COHPSK_NC * COHPSK_ND; + coh->ch_symb_log = (COMP *)malloc(sizeof(COMP) * NSYMROWPILOT * FRAMESL * + coh->ch_symb_log_col_sz); + + coh->rx_timing_log = (float *)malloc(sizeof(float) * NSYMROWPILOT * FRAMESL); + + /* init stuff */ + + log_r = log_data_r = noise_r = log_bits = ff_log_r = f_est_samples = 0; + phase_ch.real = 1.0; + phase_ch.imag = 0.0; + foff = FOFF; + + /* each carrier has power = 2, total power 2Nc, total symbol rate + NcRs, noise BW B=Fs Es/No = (C/Rs)/(N/B), N = var = + 2NcFs/NcRs(Es/No) = 2Fs/Rs(Es/No) */ + + EsNo = pow(10.0, ESNODB / 10.0); + variance = 2.0 * COHPSK_FS / (COHPSK_RS * EsNo); + // fprintf(stderr, "doff: %e\n", DFOFF); + + /* Main Loop + * ---------------------------------------------------------------------*/ + + for (f = 0; f < FRAMES; f++) { + /* --------------------------------------------------------*\ + Mod + \*---------------------------------------------------------*/ - /* --------------------------------------------------------*\ - Channel - \*---------------------------------------------------------*/ + cohpsk_get_test_bits(coh, tx_bits); + bits_to_qpsk_symbols(tx_symb, (int *)tx_bits, COHPSK_BITS_PER_FRAME); - for(r=0; r<NSYMROWPILOT*COHPSK_M; r++) { - foff_rect.real = cos(2.0*M_PI*foff/COHPSK_FS); foff_rect.imag = sin(2.0*M_PI*foff/COHPSK_FS); - foff += DFOFF; - phase_ch = cmult(phase_ch, foff_rect); - ch_fdm_frame[r] = cmult(tx_fdm_frame[r], phase_ch); - } - phase_ch.real /= cabsolute(phase_ch); - phase_ch.imag /= cabsolute(phase_ch); - //fprintf(stderr, "%f\n", foff); - for(r=0; r<NSYMROWPILOT*COHPSK_M; r++,noise_r++) { - scaled_noise = fcmult(sqrt(variance), noise[noise_r]); - ch_fdm_frame[r] = cadd(ch_fdm_frame[r], scaled_noise); - } + for (r = 0; r < NSYMROWPILOT; r++) { + for (c = 0; c < COHPSK_NC * COHPSK_ND; c++) tx_onesym[c] = tx_symb[r][c]; + tx_filter_and_upconvert_coh( + &tx_fdm_frame[r * COHPSK_M], COHPSK_NC * COHPSK_ND, tx_onesym, + fdmdv->tx_filter_memory, fdmdv->phase_tx, fdmdv->freq, + &fdmdv->fbb_phase_tx, fdmdv->fbb_rect); + } + cohpsk_clip(tx_fdm_frame, COHPSK_CLIP, NSYMROWPILOT * COHPSK_M); - /* optional gain to test level sensitivity */ + /* --------------------------------------------------------*\ + Channel + \*---------------------------------------------------------*/ - for(r=0; r<NSYMROWPILOT*COHPSK_M; r++) { - ch_fdm_frame[r] = fcmult(1.0, ch_fdm_frame[r]); - } + for (r = 0; r < NSYMROWPILOT * COHPSK_M; r++) { + foff_rect.real = cos(2.0 * M_PI * foff / COHPSK_FS); + foff_rect.imag = sin(2.0 * M_PI * foff / COHPSK_FS); + foff += DFOFF; + phase_ch = cmult(phase_ch, foff_rect); + ch_fdm_frame[r] = cmult(tx_fdm_frame[r], phase_ch); + } + phase_ch.real /= cabsolute(phase_ch); + phase_ch.imag /= cabsolute(phase_ch); + // fprintf(stderr, "%f\n", foff); + for (r = 0; r < NSYMROWPILOT * COHPSK_M; r++, noise_r++) { + scaled_noise = fcmult(sqrt(variance), noise[noise_r]); + ch_fdm_frame[r] = cadd(ch_fdm_frame[r], scaled_noise); + } - /* tx vector logging */ + /* optional gain to test level sensitivity */ - memcpy(&tx_bits_log[COHPSK_BITS_PER_FRAME*f], tx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME); - memcpy(&tx_fdm_frame_log[COHPSK_M*NSYMROWPILOT*f], tx_fdm_frame, sizeof(COMP)*COHPSK_M*NSYMROWPILOT); - memcpy(&ch_fdm_frame_log[COHPSK_M*NSYMROWPILOT*f], ch_fdm_frame, sizeof(COMP)*COHPSK_M*NSYMROWPILOT); + for (r = 0; r < NSYMROWPILOT * COHPSK_M; r++) { + ch_fdm_frame[r] = fcmult(1.0, ch_fdm_frame[r]); + } - for(r=0; r<NSYMROWPILOT; r++, log_r++) { - for(c=0; c<COHPSK_NC*COHPSK_ND; c++) { - tx_symb_log[log_r][c] = tx_symb[r][c]; - } - } + /* tx vector logging */ + + memcpy(&tx_bits_log[COHPSK_BITS_PER_FRAME * f], tx_bits, + sizeof(int) * COHPSK_BITS_PER_FRAME); + memcpy(&tx_fdm_frame_log[COHPSK_M * NSYMROWPILOT * f], tx_fdm_frame, + sizeof(COMP) * COHPSK_M * NSYMROWPILOT); + memcpy(&ch_fdm_frame_log[COHPSK_M * NSYMROWPILOT * f], ch_fdm_frame, + sizeof(COMP) * COHPSK_M * NSYMROWPILOT); + + for (r = 0; r < NSYMROWPILOT; r++, log_r++) { + for (c = 0; c < COHPSK_NC * COHPSK_ND; c++) { + tx_symb_log[log_r][c] = tx_symb[r][c]; + } } + } + + /* Fs offset simulation */ + + nout = cohpsk_fs_offset(ch_fdm_frame_log_out, ch_fdm_frame_log, + COHPSK_M * NSYMROWPILOT * FRAMES, PPM); + assert(nout < (COHPSK_M * NSYMROWPILOT + 1) * FRAMES); - /* Fs offset simulation */ + nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME; + ch_fdm_frame_log_index = 0; - nout = cohpsk_fs_offset(ch_fdm_frame_log_out, ch_fdm_frame_log, COHPSK_M*NSYMROWPILOT*FRAMES, PPM); - assert(nout < (COHPSK_M*NSYMROWPILOT+1)*FRAMES); + /* --------------------------------------------------------*\ + Demod + \*---------------------------------------------------------*/ - nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME; - ch_fdm_frame_log_index = 0; + for (f = 0; f < FRAMES; f++) { + coh->frame = f; + + // printf("nin_frame: %d\n", nin_frame); + + assert(ch_fdm_frame_log_index < COHPSK_M * NSYMROWPILOT * FRAMES); + tmp = nin_frame; + cohpsk_demod(coh, rx_bits_sd, &reliable_sync_bit, + &ch_fdm_frame_log_out[ch_fdm_frame_log_index], &nin_frame); + for (i = 0; i < COHPSK_BITS_PER_FRAME; i++) + rx_bits[i] = rx_bits_sd[i] < 0.0; + + ch_fdm_frame_log_index += tmp; /* --------------------------------------------------------*\ - Demod + Log each vector \*---------------------------------------------------------*/ - for(f=0; f<FRAMES; f++) { - coh->frame = f; - - //printf("nin_frame: %d\n", nin_frame); - - assert(ch_fdm_frame_log_index < COHPSK_M*NSYMROWPILOT*FRAMES); - tmp = nin_frame; - cohpsk_demod(coh, rx_bits_sd, &reliable_sync_bit, &ch_fdm_frame_log_out[ch_fdm_frame_log_index], &nin_frame); - for(i=0; i<COHPSK_BITS_PER_FRAME; i++) - rx_bits[i] = rx_bits_sd[i] < 0.0; - - ch_fdm_frame_log_index += tmp; - - /* --------------------------------------------------------*\ - Log each vector - \*---------------------------------------------------------*/ - - if (coh->sync == 1) { - - for(r=0; r<NSYMROWPILOT; r++, ff_log_r++) { - for(c=0; c<COHPSK_NC*COHPSK_ND; c++) { - ct_symb_ff_log[ff_log_r][c] = coh->ct_symb_ff_buf[r][c]; - } - } - - for(r=0; r<NSYMROW; r++, log_data_r++) { - for(c=0; c<COHPSK_NC*COHPSK_ND; c++) { - rx_amp_log[log_data_r][c] = coh->amp_[r][c]; - rx_phi_log[log_data_r][c] = coh->phi_[r][c]; - rx_symb_log[log_data_r][c] = coh->rx_symb[r][c]; - } - } - memcpy(&rx_bits_log[COHPSK_BITS_PER_FRAME*log_bits], rx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME); - log_bits++; - f_est_log[f_est_samples] = coh->f_est; - sig_rms_log[f_est_samples] = coh->sig_rms; - noise_rms_log[f_est_samples] = coh->noise_rms; - f_est_samples++;; + if (coh->sync == 1) { + for (r = 0; r < NSYMROWPILOT; r++, ff_log_r++) { + for (c = 0; c < COHPSK_NC * COHPSK_ND; c++) { + ct_symb_ff_log[ff_log_r][c] = coh->ct_symb_ff_buf[r][c]; } + } - assert(log_r <= NSYMROWPILOT*FRAMES); - assert(noise_r <= NSYMROWPILOT*COHPSK_M*FRAMES); - assert(log_data_r <= NSYMROW*FRAMES); - - printf("\r [%d]", f+1); + for (r = 0; r < NSYMROW; r++, log_data_r++) { + for (c = 0; c < COHPSK_NC * COHPSK_ND; c++) { + rx_amp_log[log_data_r][c] = coh->amp_[r][c]; + rx_phi_log[log_data_r][c] = coh->phi_[r][c]; + rx_symb_log[log_data_r][c] = coh->rx_symb[r][c]; + } + } + memcpy(&rx_bits_log[COHPSK_BITS_PER_FRAME * log_bits], rx_bits, + sizeof(int) * COHPSK_BITS_PER_FRAME); + log_bits++; + f_est_log[f_est_samples] = coh->f_est; + sig_rms_log[f_est_samples] = coh->sig_rms; + noise_rms_log[f_est_samples] = coh->noise_rms; + f_est_samples++; + ; } - printf("\n"); - - /*---------------------------------------------------------*\ - Dump logs to Octave file for evaluation - by tcohpsk.m Octave script - \*---------------------------------------------------------*/ - fout = fopen("tcohpsk_out.txt","wt"); - assert(fout != NULL); - fprintf(fout, "# Created by tcohpsk.c\n"); - octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, COHPSK_BITS_PER_FRAME*FRAMES); - octave_save_complex(fout, "tx_symb_log_c", (COMP*)tx_symb_log, NSYMROWPILOT*FRAMES, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_complex(fout, "tx_fdm_frame_log_c", (COMP*)tx_fdm_frame_log, 1, COHPSK_M*NSYMROWPILOT*FRAMES, COHPSK_M*NSYMROWPILOT*FRAMES); - octave_save_complex(fout, "ch_fdm_frame_log_c", (COMP*)ch_fdm_frame_log_out, 1, nout-1, nout-1); - //octave_save_complex(fout, "rx_fdm_frame_bb_log_c", (COMP*)rx_fdm_frame_bb_log, 1, M*NSYMROWPILOT*FRAMES, M*NSYMROWPILOT*FRAMES); - octave_save_complex(fout, "rx_baseband_log_c", (COMP*)coh->rx_baseband_log, COHPSK_NC*COHPSK_ND, coh->rx_baseband_log_col_index, coh->rx_baseband_log_col_sz); - octave_save_complex(fout, "rx_filt_log_c", (COMP*)coh->rx_filt_log, COHPSK_NC*COHPSK_ND, coh->rx_filt_log_col_index, coh->rx_filt_log_col_sz); - octave_save_complex(fout, "ch_symb_log_c", (COMP*)coh->ch_symb_log, coh->ch_symb_log_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_float(fout, "rx_timing_log_c", (float*)coh->rx_timing_log, 1, coh->rx_timing_log_index, coh->rx_timing_log_index); - octave_save_complex(fout, "ct_symb_ff_log_c", (COMP*)ct_symb_ff_log, NSYMROWPILOT*FRAMES, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_float(fout, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_complex(fout, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*COHPSK_ND, COHPSK_NC*COHPSK_ND); - octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, COHPSK_BITS_PER_FRAME*log_bits); - octave_save_float(fout, "f_est_log_c", &f_est_log[1], 1, f_est_samples-1, f_est_samples-1); - octave_save_float(fout, "sig_rms_log_c", sig_rms_log, 1, f_est_samples, f_est_samples-1); - octave_save_float(fout, "noise_rms_log_c", noise_rms_log, 1, f_est_samples, f_est_samples); + assert(log_r <= NSYMROWPILOT * FRAMES); + assert(noise_r <= NSYMROWPILOT * COHPSK_M * FRAMES); + assert(log_data_r <= NSYMROW * FRAMES); + + printf("\r [%d]", f + 1); + } + printf("\n"); + + /*---------------------------------------------------------*\ + Dump logs to Octave file for evaluation + by tcohpsk.m Octave script + \*---------------------------------------------------------*/ + + fout = fopen("tcohpsk_out.txt", "wt"); + assert(fout != NULL); + fprintf(fout, "# Created by tcohpsk.c\n"); + octave_save_int(fout, "tx_bits_log_c", tx_bits_log, 1, + COHPSK_BITS_PER_FRAME * FRAMES); + octave_save_complex(fout, "tx_symb_log_c", (COMP *)tx_symb_log, + NSYMROWPILOT * FRAMES, COHPSK_NC * COHPSK_ND, + COHPSK_NC * COHPSK_ND); + octave_save_complex(fout, "tx_fdm_frame_log_c", (COMP *)tx_fdm_frame_log, 1, + COHPSK_M * NSYMROWPILOT * FRAMES, + COHPSK_M * NSYMROWPILOT * FRAMES); + octave_save_complex(fout, "ch_fdm_frame_log_c", (COMP *)ch_fdm_frame_log_out, + 1, nout - 1, nout - 1); + // octave_save_complex(fout, "rx_fdm_frame_bb_log_c", + // (COMP*)rx_fdm_frame_bb_log, 1, M*NSYMROWPILOT*FRAMES, + // M*NSYMROWPILOT*FRAMES); + octave_save_complex(fout, "rx_baseband_log_c", (COMP *)coh->rx_baseband_log, + COHPSK_NC * COHPSK_ND, coh->rx_baseband_log_col_index, + coh->rx_baseband_log_col_sz); + octave_save_complex(fout, "rx_filt_log_c", (COMP *)coh->rx_filt_log, + COHPSK_NC * COHPSK_ND, coh->rx_filt_log_col_index, + coh->rx_filt_log_col_sz); + octave_save_complex(fout, "ch_symb_log_c", (COMP *)coh->ch_symb_log, + coh->ch_symb_log_r, COHPSK_NC * COHPSK_ND, + COHPSK_NC * COHPSK_ND); + octave_save_float(fout, "rx_timing_log_c", (float *)coh->rx_timing_log, 1, + coh->rx_timing_log_index, coh->rx_timing_log_index); + octave_save_complex(fout, "ct_symb_ff_log_c", (COMP *)ct_symb_ff_log, + NSYMROWPILOT * FRAMES, COHPSK_NC * COHPSK_ND, + COHPSK_NC * COHPSK_ND); + octave_save_float(fout, "rx_amp_log_c", (float *)rx_amp_log, log_data_r, + COHPSK_NC * COHPSK_ND, COHPSK_NC * COHPSK_ND); + octave_save_float(fout, "rx_phi_log_c", (float *)rx_phi_log, log_data_r, + COHPSK_NC * COHPSK_ND, COHPSK_NC * COHPSK_ND); + octave_save_complex(fout, "rx_symb_log_c", (COMP *)rx_symb_log, log_data_r, + COHPSK_NC * COHPSK_ND, COHPSK_NC * COHPSK_ND); + octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, + COHPSK_BITS_PER_FRAME * log_bits); + octave_save_float(fout, "f_est_log_c", &f_est_log[1], 1, f_est_samples - 1, + f_est_samples - 1); + octave_save_float(fout, "sig_rms_log_c", sig_rms_log, 1, f_est_samples, + f_est_samples - 1); + octave_save_float(fout, "noise_rms_log_c", noise_rms_log, 1, f_est_samples, + f_est_samples); #ifdef XX #endif - fclose(fout); + fclose(fout); - cohpsk_destroy(coh); + cohpsk_destroy(coh); - return 0; + return 0; } - |
