error pattern plotting working for 1600 and 700 modes
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 15 Jul 2015 04:42:40 +0000 (04:42 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 15 Jul 2015 04:42:40 +0000 (04:42 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2238 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2-dev/README.txt
fdmdv2-dev/src/fdmdv2_main.cpp
fdmdv2-dev/src/fdmdv2_main.h

index dcf2f57187eabefe899e408bed4799dc628b37aa..86310b0eb379ad0dafb5153b91f5a10e24bff5db 100644 (file)
@@ -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
index fd66a30bd283f38e9a6759c5d7cc1f0f836a9135..4cc85509b4c6021edd5707ddb0942e0893e44759 100644 (file)
@@ -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; b<g_Nc*2; b++) {
-                for(i=b; i<g_sz_error_pattern; i+= 2*g_Nc)
-                    m_panelTestFrameErrors->add_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; b<g_Nc*2; b++) {
+                    for(i=b; i<sz_error_pattern; i+= 2*g_Nc)
+                        m_panelTestFrameErrors->add_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; b<g_Nc; b++) {
+                    for(i=b; i<sz_error_pattern; i+= g_Nc)
+                        m_panelTestFrameErrors->add_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);
+}
index 21543b8640bb8b02d747880281ba4ee709c037f0..4f8c24253987e46bf41c98f2500756790216ab5a 100644 (file)
@@ -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);