From 2c32fed033efaa6e48c2168bc34c4319010b9d5f Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 15 Jul 2015 04:42:40 +0000 Subject: [PATCH] error pattern plotting working for 1600 and 700 modes git-svn-id: https://svn.code.sf.net/p/freetel/code@2238 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2-dev/README.txt | 22 +++++++++--- fdmdv2-dev/src/fdmdv2_main.cpp | 61 ++++++++++++++++++++++------------ fdmdv2-dev/src/fdmdv2_main.h | 4 +++ 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/fdmdv2-dev/README.txt b/fdmdv2-dev/README.txt index dcf2f571..86310b0e 100644 --- a/fdmdv2-dev/README.txt +++ b/fdmdv2-dev/README.txt @@ -152,7 +152,15 @@ TODO [X] freedv API support [X] BER displayed on GUI for 700 and 1600 [ ] plot error patterns for 700 and 1600 + + callback for error patterns, or poll via stats interface [ ] plot error histograms for 700 and 1600 + + map bit error to carrier, have done this in tcohpsk? + + how to reset histogram? On error reset? + + histogram screen ... new code? + + test with filter + [ ] Plot per carrier average Es/No, or even just Es + + good proxy for error histograms if No is constant + + this is just a "slow" FFT option I think...... [X] Mel Bugs [X] resync issue @@ -163,24 +171,30 @@ TODO [X] On TX, intermittently PTT will cause signal to be heard in speakers. Toggle PTT or Stop/Start toggle and then starts working. - [ ] Squelch control on 1600 mode will not open up squelch to 0 (appears to be around 2 dB) + [X] Squelch control on 1600 mode will not open up squelch to 0 (appears to be around 2 dB) [X] space bar keys PTT when entering text info box - [ ] checksum based txt reception + [X] checksum based txt reception + only print if valid [ ] short varicode doesn't work + + #ifdef-ed out for now + cld be broken in freedv_api [ ] FreeDV 700 improvements [ ] bpf filter after clipping to remove clicks [ ] tcohpsk first, measure PAPR, impl loss [ ] error masking + [ ] excitation params + [ ] training [ ] plotting other demod stats like ch ampl and phase ests + [ ] profile with perf, different libresample routine + [ ] check for occassional freedv 700 loss of sync + + scatter seems to jump [X] win32 [X] X-compile works [X] basic installer - [ ] add ilbusb0.dll - [ ] add hamlib stuff + [X] Win32 installer + + Richard has taken care of this [ ] Small fixes [X] Playfile bug diff --git a/fdmdv2-dev/src/fdmdv2_main.cpp b/fdmdv2-dev/src/fdmdv2_main.cpp index fd66a30b..4cc85509 100644 --- a/fdmdv2-dev/src/fdmdv2_main.cpp +++ b/fdmdv2-dev/src/fdmdv2_main.cpp @@ -47,10 +47,9 @@ int g_test_frame_sync_state; int g_test_frame_count; int g_total_bits; int g_total_bit_errors; -int g_sz_error_pattern; -short *g_error_pattern; -struct FIFO *g_errorFifo; int g_channel_noise; +float g_sig_pwr_av = 0.0; +struct FIFO *g_error_pattern_fifo; // time averaged magnitude spectrum used for waterfall and spectrum display float g_avmag[MODEM_STATS_NSPEC]; @@ -1105,23 +1104,37 @@ void MainFrame::OnTimer(wxTimerEvent &evt) float b = (float)g_pfreedv->total_bit_errors/(1E-6+g_pfreedv->total_bits); sprintf(ber, "BER: %4.3f", b); wxString ber_string(ber); m_textBER->SetLabel(ber_string); - #ifdef FIXME // update error plots - short *error_pattern = new short[g_sz_error_pattern]; + int sz_error_pattern = g_pfreedv->sz_error_pattern; + short error_pattern[sz_error_pattern]; - if (fifo_read(g_errorFifo, error_pattern, g_sz_error_pattern) == 0) { + if (fifo_read(g_error_pattern_fifo, error_pattern, sz_error_pattern) == 0) { int i,b; - for(b=0; badd_new_sample(b, b + 0.8*error_pattern[i]); + + if (g_pfreedv->mode == FREEDV_MODE_1600) { + /* FreeDV 1600 mapping from error pattern to bit on each carrier */ + + for(b=0; badd_new_sample(b, b + 0.8*error_pattern[i]); + } + } + + if (g_pfreedv->mode == FREEDV_MODE_700) { + /* FreeDV 700 mapping from error pattern to bit on each + carrier. Note we don't have access to carriers before + diversity re-combination, so this won't give us the full + picture, we have to assume Nc/2 carriers. */ + + for(b=0; badd_new_sample(b, b + 0.8*error_pattern[i]); + } } - m_panelTestFrameErrors->Refresh(); + m_panelTestFrameErrors->Refresh(); } - - delete error_pattern; - #endif } // command from UDP thread that is best processed in main thread to avoid seg faults @@ -2001,6 +2014,11 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) g_pfreedv->callback_state = NULL; g_pfreedv->freedv_get_next_tx_char = &my_get_next_tx_char; g_pfreedv->freedv_put_next_rx_char = &my_put_next_rx_char; + + g_pfreedv->error_pattern_callback_state = (void*)m_panelTestFrameErrors; + g_pfreedv->freedv_put_error_pattern = &my_freedv_put_error_pattern; + g_error_pattern_fifo = fifo_create(2*g_pfreedv->sz_error_pattern); + //if (g_mode == FREEDV_MODE_700) // cohpsk_set_verbose(g_pfreedv->cohpsk, 1); @@ -2020,8 +2038,6 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) // adjust scatter diagram for Number of FDM carriers - g_errorFifo = fifo_create(2*g_sz_error_pattern); - m_panelScatter->setNc(g_Nc); // init Codec 2 LPC Post Filter @@ -2109,9 +2125,8 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event) // free up states - free(g_error_pattern); - fifo_destroy(g_errorFifo); modem_stats_close(&g_stats); + fifo_destroy(g_error_pattern_fifo); freedv_close(g_pfreedv); speex_preprocess_state_destroy(g_speex_st); m_newMicInFilter = m_newSpkOutFilter = true; @@ -3218,10 +3233,8 @@ void per_frame_rx_processing( rx_fdm[i].imag = 0.0; } - // only implemented for FreeDV 1600 at this stage - - if (g_channel_noise && FREEDV_MODE_1600) { - fdmdv_simulate_channel(g_pfreedv->fdmdv, rx_fdm, nin, 2.0); + if (g_channel_noise) { + fdmdv_simulate_channel(&g_sig_pwr_av, rx_fdm, nin, 2.0); } fdmdv_freq_shift(rx_fdm_offset, rx_fdm, g_RxFreqOffsetHz, &g_RxFreqOffsetPhaseRect, nin); nout = freedv_comprx(g_pfreedv, output_buf, rx_fdm_offset); @@ -3511,3 +3524,9 @@ void my_put_next_rx_char(void *callback_state, char c) { //fprintf(stderr, "put_next_rx_char: %c\n", (char)c); fifo_write(g_rxDataOutFifo, &ch, 1); } + +// Callback from FreeDv API to update error plots + +void my_freedv_put_error_pattern(void *state, short error_pattern[], int sz_error_pattern) { + fifo_write(g_error_pattern_fifo, error_pattern, sz_error_pattern); +} diff --git a/fdmdv2-dev/src/fdmdv2_main.h b/fdmdv2-dev/src/fdmdv2_main.h index 21543b86..4f8c2425 100644 --- a/fdmdv2-dev/src/fdmdv2_main.h +++ b/fdmdv2-dev/src/fdmdv2_main.h @@ -598,6 +598,10 @@ void per_frame_rx_processing( FIFO *input_fifo // modem samples input to demod ); +// FreeDv API calls this when there is a test frame that needs a-plottin' + +void my_freedv_put_error_pattern(void *state, short error_pattern[], int sz_error_pattern); + // FreeDv API calls these puppies when it needs/receives a text char char my_get_next_tx_char(void *callback_state); -- 2.25.1