From: drowe67 Date: Sat, 30 May 2015 00:01:56 +0000 (+0000) Subject: added some diagnostics for plotting states of cohpsk_demod, still a few glicthes... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=cae81a646d796137ade86c45edd4108778fa9993;p=freetel-svn-tracking.git added some diagnostics for plotting states of cohpsk_demod, still a few glicthes to work out git-svn-id: https://svn.code.sf.net/p/freetel/code@2166 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/cohpsk_demod_plot.m b/codec2-dev/octave/cohpsk_demod_plot.m new file mode 100644 index 00000000..fe0c78a2 --- /dev/null +++ b/codec2-dev/octave/cohpsk_demod_plot.m @@ -0,0 +1,49 @@ +% cohpsk_demod.m +% David Rowe May 2015 +% +% Plot Octave outputs from cohpsk_demod_plot + +Nc=7; Nd=2; + +load ../build_linux/src/cohpsk_demod.txt +load ../build_linux/src/cohpsk_put_test_bits.txt + +figure(1) +clf; + +% plot combined signals to show diversity gains + +combined = rx_symb_log_c(:,1:Nc); +for d=2:Nd + combined += rx_symb_log_c(:, (d-1)*Nc+1:d*Nc); +end +plot(combined*exp(j*pi/4)/sqrt(Nd),'+') +title('Scatter'); +axis([-2 2 -2 2]) + +figure(2) +clf; +subplot(211) +plot(rx_phi_log_c) +title('phase') +subplot(212) +plot(rx_amp_log_c) +title('amplitide') + +figure(3) +subplot(211) +plot(rx_timing_log_c) +title('rx timing'); +subplot(212) +stem(ratio_log_c) +title('Sync ratio'); + +figure(4); +clf; +plot(nerr_log_c); +title('Bit Errors'); + +figure(5); +clf; +plot(error_positions_hist_c); +title('Error Position Histogram'); diff --git a/codec2-dev/src/CMakeLists.txt b/codec2-dev/src/CMakeLists.txt index 05ce4675..981c4116 100644 --- a/codec2-dev/src/CMakeLists.txt +++ b/codec2-dev/src/CMakeLists.txt @@ -284,7 +284,7 @@ target_link_libraries(cohpsk_demod ${CMAKE_REQUIRED_LIBRARIES} codec2) add_executable(cohpsk_get_test_bits cohpsk_get_test_bits.c) target_link_libraries(cohpsk_get_test_bits ${CMAKE_REQUIRED_LIBRARIES} codec2) -add_executable(cohpsk_put_test_bits cohpsk_put_test_bits.c) +add_executable(cohpsk_put_test_bits cohpsk_put_test_bits.c octave.c) target_link_libraries(cohpsk_put_test_bits ${CMAKE_REQUIRED_LIBRARIES} codec2) add_executable(cohpsk_ch cohpsk_ch.c) diff --git a/codec2-dev/src/cohpsk_demod.c b/codec2-dev/src/cohpsk_demod.c index 507d06ac..47fc42f1 100644 --- a/codec2-dev/src/cohpsk_demod.c +++ b/codec2-dev/src/cohpsk_demod.c @@ -40,6 +40,7 @@ #include "octave.h" #define LOG_FRAMES 100 +#define SYNC_FRAMES 12 /* sync state uses up extra log storage as we reprocess several times */ int main(int argc, char *argv[]) { @@ -52,6 +53,7 @@ int main(int argc, char *argv[]) float *rx_amp_log; float *rx_phi_log; COMP *rx_symb_log; + float f_est_log[LOG_FRAMES], ratio_log[LOG_FRAMES]; int i, r, c, log_data_r, oct, logframes; if (argc < 3) { @@ -94,6 +96,8 @@ int main(int argc, char *argv[]) assert(rx_phi_log != NULL); rx_symb_log = (COMP *)malloc(sizeof(COMP)*logframes*NSYMROW*COHPSK_NC*ND); assert(rx_symb_log != NULL); + cohpsk->rx_timing_log = (float*)malloc(sizeof(float)*SYNC_FRAMES*logframes*NSYMROWPILOT); + assert(cohpsk->rx_timing_log != NULL); } log_data_r = 0; @@ -123,6 +127,10 @@ int main(int argc, char *argv[]) rx_symb_log[log_data_r*COHPSK_NC*ND+c] = cohpsk->rx_symb[r][c]; } } + + f_est_log[frames-1] = cohpsk->f_est; + ratio_log[frames-1] = cohpsk->ratio; + //printf("frames: %d log_data_r: %d\n", frames, log_data_r); if (frames == logframes) oct = 0; @@ -145,6 +153,9 @@ int main(int argc, char *argv[]) octave_save_float(foct, "rx_amp_log_c", (float*)rx_amp_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); octave_save_float(foct, "rx_phi_log_c", (float*)rx_phi_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); octave_save_complex(foct, "rx_symb_log_c", (COMP*)rx_symb_log, log_data_r, COHPSK_NC*ND, COHPSK_NC*ND); + octave_save_float(foct, "rx_timing_log_c", (float*)cohpsk->rx_timing_log, 1, cohpsk->rx_timing_log_index, cohpsk->rx_timing_log_index); + octave_save_float(foct, "f_est_log_c", f_est_log, 1, logframes, logframes); + octave_save_float(foct, "ratio_log_c", ratio_log, 1, logframes, logframes); fclose(foct); } diff --git a/codec2-dev/src/cohpsk_put_test_bits.c b/codec2-dev/src/cohpsk_put_test_bits.c index 3a2d85e0..086c85cf 100644 --- a/codec2-dev/src/cohpsk_put_test_bits.c +++ b/codec2-dev/src/cohpsk_put_test_bits.c @@ -36,20 +36,24 @@ #include "codec2_cohpsk.h" #include "test_bits_coh.h" +#include "octave.h" + +#define LOG_FRAMES 100 int main(int argc, char *argv[]) { - FILE *fin; + FILE *fin, *foct; int rx_bits[COHPSK_BITS_PER_FRAME]; - int *ptest_bits_coh, *ptest_bits_coh_end; + int *ptest_bits_coh, *ptest_bits_coh_end; int state, next_state, i, nbits, errors, nerrors; - int error_positions_hist[COHPSK_BITS_PER_FRAME]; + int error_positions_hist[COHPSK_BITS_PER_FRAME], logframes; + int nerr_log[LOG_FRAMES]; for(i=0; i= ptest_bits_coh_end) { ptest_bits_coh = (int*)test_bits_coh; } + if (logframes < LOG_FRAMES) + nerr_log[logframes++] = errors; } state = next_state; @@ -101,8 +124,14 @@ int main(int argc, char *argv[]) if (fin == stdin) fflush(stdin); } + if (foct != NULL) { + octave_save_int(foct, "nerr_log_c", nerr_log, 1, logframes); + octave_save_int(foct, "error_positions_hist_c", error_positions_hist, 1, logframes); + fclose(foct); + } + fclose(fin); - printf("BER: %4.3f Nbits: %d Nerrors: %d\n", (float)nerrors/nbits, nbits, nerrors); + fprintf(stderr, "BER: %4.3f Nbits: %d Nerrors: %d\n", (float)nerrors/nbits, nbits, nerrors); return 0; } diff --git a/codec2-dev/src/freedv_rx.c b/codec2-dev/src/freedv_rx.c index 1215b7a3..94744a96 100644 --- a/codec2-dev/src/freedv_rx.c +++ b/codec2-dev/src/freedv_rx.c @@ -90,6 +90,8 @@ int main(int argc, char *argv[]) { freedv->callback_state = (void*)&my_cb_state; freedv->freedv_put_next_rx_char = &my_put_next_rx_char; + freedv->snr_thresh = -100.0; + /* Note we need to work out how many samples demod needs on each call (nin). This is used to adjust for differences in the tx and rx sample clock frequencies. Note also the number of output