GUI support for bit error plot/historam before diversity combination, working OK...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 23 Feb 2017 03:36:56 +0000 (03:36 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 23 Feb 2017 03:36:56 +0000 (03:36 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3048 01035d8c-6547-0410-b346-abe4f91aad63

freedv-dev/src/dlg_options.cpp
freedv-dev/src/dlg_options.h
freedv-dev/src/fdmdv2_main.cpp
freedv-dev/src/fdmdv2_main.h

index 817027ec2519b78f06e0807ffef87529644bfb9c..c28b2aacc555454435594153876e02e238e2c8ea 100644 (file)
@@ -64,9 +64,9 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
     m_ckboxFreeDV700txClip = new wxCheckBox(this, wxID_ANY, _("Clipping"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
     m_ckboxFreeDV700txClip->SetToolTip(_("Clip FreeDv 700 tx waveform to reduce Peak to Average Power Ratio (PAPR)"));
     sbSizer_freedv700->Add(m_ckboxFreeDV700txClip, 0, wxALIGN_LEFT, 0);
-    m_ckboxFreeDV700scatterCombine = new wxCheckBox(this, wxID_ANY, _("Scatter Combine"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
-    m_ckboxFreeDV700scatterCombine->SetToolTip(_("Upper and Lower carriers combined for Scatter diagram"));
-    sbSizer_freedv700->Add(m_ckboxFreeDV700scatterCombine, 0, wxALIGN_LEFT, 0);
+    m_ckboxFreeDV700Combine = new wxCheckBox(this, wxID_ANY, _("Diversity Combine for plots"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
+    m_ckboxFreeDV700Combine->SetToolTip(_("Upper and Lower carriers combined for Scatter/Histogram plots"));
+    sbSizer_freedv700->Add(m_ckboxFreeDV700Combine, 0, wxALIGN_LEFT, 0);
 
     bSizer30->Add(sbSizer_freedv700,0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3);
 
@@ -200,7 +200,7 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
     m_ckboxTestFrame->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnTestFrame), NULL, this);
     m_ckboxChannelNoise->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnChannelNoise), NULL, this);
     m_ckboxFreeDV700txClip->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700txClip), NULL, this);
-    m_ckboxFreeDV700scatterCombine->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700scatterCombine), NULL, this);
+    m_ckboxFreeDV700Combine->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700Combine), NULL, this);
 
     event_in_serial = 0;
     event_out_serial = 0;
@@ -223,7 +223,7 @@ OptionsDlg::~OptionsDlg()
     m_ckboxTestFrame->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnTestFrame), NULL, this);
     m_ckboxChannelNoise->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnChannelNoise), NULL, this);
     m_ckboxFreeDV700txClip->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700txClip), NULL, this);
-    m_ckboxFreeDV700scatterCombine->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700scatterCombine), NULL, this);
+    m_ckboxFreeDV700Combine->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700Combine), NULL, this);
 }
 
 
@@ -259,7 +259,7 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
         m_ckboxEnableChecksum->SetValue(wxGetApp().m_enable_checksum);
 
         m_ckboxFreeDV700txClip->SetValue(wxGetApp().m_FreeDV700txClip);
-        m_ckboxFreeDV700scatterCombine->SetValue(wxGetApp().m_FreeDV700scatterCombine);
+        m_ckboxFreeDV700Combine->SetValue(wxGetApp().m_FreeDV700Combine);
     }
 
     if(inout == EXCHANGE_DATA_OUT)
@@ -301,7 +301,7 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
         wxGetApp().m_enable_checksum = m_ckboxEnableChecksum->GetValue();
 
         wxGetApp().m_FreeDV700txClip = m_ckboxFreeDV700txClip->GetValue();
-        wxGetApp().m_FreeDV700scatterCombine = m_ckboxFreeDV700scatterCombine->GetValue();
+        wxGetApp().m_FreeDV700Combine = m_ckboxFreeDV700Combine->GetValue();
 
         if (storePersistent) {
             pConfig->Write(wxT("/Data/CallSign"), wxGetApp().m_callSign);
@@ -321,7 +321,6 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
             pConfig->Write(wxT("/Events/spam_timer"), wxGetApp().m_events_spam_timer);
 
             pConfig->Write(wxT("/FreeDV700/txClip"), wxGetApp().m_FreeDV700txClip);
-            pConfig->Write(wxT("/FreeDV700/scatterCombine"), wxGetApp().m_FreeDV700scatterCombine);
 
             pConfig->Write(wxT("/Noise/noise_snr"),  wxGetApp().m_noise_snr);
 
@@ -382,8 +381,8 @@ void OptionsDlg::OnFreeDV700txClip(wxScrollEvent& event) {
     wxGetApp().m_FreeDV700txClip = m_ckboxFreeDV700txClip->GetValue();
 }
 
-void OptionsDlg::OnFreeDV700scatterCombine(wxScrollEvent& event) {
-    wxGetApp().m_FreeDV700scatterCombine = m_ckboxFreeDV700scatterCombine->GetValue();
+void OptionsDlg::OnFreeDV700Combine(wxScrollEvent& event) {
+    wxGetApp().m_FreeDV700Combine = m_ckboxFreeDV700Combine->GetValue();
 }
 
 void OptionsDlg::updateEventLog(wxString event_in, wxString event_out) {
index 6c83fef6a9b22b096ea72c52351330ca21a46ad9..0e4f358ff1c223f6cb62ff503a7975dc21aa9f5e 100644 (file)
@@ -68,14 +68,14 @@ class OptionsDlg : public wxDialog
         void    OnTestFrame(wxScrollEvent& event);
         void    OnChannelNoise(wxScrollEvent& event);
         void    OnFreeDV700txClip(wxScrollEvent& event);
-        void    OnFreeDV700scatterCombine(wxScrollEvent& event);
+        void    OnFreeDV700Combine(wxScrollEvent& event);
 
         wxTextCtrl   *m_txtCtrlCallSign; // TODO: this should be renamed to tx_txtmsg, and rename all related incl persis strge
         wxCheckBox   *m_ckboxTestFrame;
         wxCheckBox   *m_ckboxChannelNoise;
         wxTextCtrl   *m_txtNoiseSNR;
         wxCheckBox   *m_ckboxFreeDV700txClip;
-        wxCheckBox   *m_ckboxFreeDV700scatterCombine;
+        wxCheckBox   *m_ckboxFreeDV700Combine;
 
         wxRadioButton *m_rb_textEncoding1;
         wxRadioButton *m_rb_textEncoding2;
index 27bb3d09268c3f892c593b0d972c1136d62c5869..7321b10a3afd235faefa791252e6534a5ce88041 100644 (file)
@@ -499,7 +499,7 @@ MainFrame::MainFrame(wxString plugInName, wxWindow *parent) : TopFrame(plugInNam
     wxGetApp().m_udp_port = (int)pConfig->Read(wxT("/UDP/port"), 3000);
 
     wxGetApp().m_FreeDV700txClip = (float)pConfig->Read(wxT("/FreeDV700/txClip"), t);
-    wxGetApp().m_FreeDV700scatterCombine = (float)pConfig->Read(wxT("/FreeDV700/scatterCombine"), t);
+    wxGetApp().m_FreeDV700Combine = 1;
     wxGetApp().m_noise_snr = (float)pConfig->Read(wxT("/Noise/noise_snr"), 2);
 
     int mode  = pConfig->Read(wxT("/Audio/mode"), (long)0);
@@ -714,7 +714,6 @@ MainFrame::~MainFrame()
         pConfig->Write(wxT("/Filter/SpkOutEQEnable"), wxGetApp().m_SpkOutEQEnable);
 
         pConfig->Write(wxT("/FreeDV700/txClip"), wxGetApp().m_FreeDV700txClip);
-        pConfig->Write(wxT("/FreeDV700/scatterCombine"), wxGetApp().m_FreeDV700scatterCombine);
         pConfig->Write(wxT("/Noise/noise_snr"), wxGetApp().m_noise_snr);
 
         int mode;
@@ -995,8 +994,8 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         
             if ((freedv_get_mode(g_pfreedv) == FREEDV_MODE_700B) || (freedv_get_mode(g_pfreedv) == FREEDV_MODE_700C)) {
             
-                if (wxGetApp().m_FreeDV700scatterCombine) {
-                    m_panelScatter->setNc(g_Nc/2); /* m_FreeDV700scatterCombine may have changed at run time */
+                if (wxGetApp().m_FreeDV700Combine) {
+                    m_panelScatter->setNc(g_Nc/2); /* m_FreeDV700Combine may have changed at run time */
 
                     /* 
                        FreeDV 700 uses diversity, so optionaly combine
@@ -1013,7 +1012,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
                     m_panelScatter->add_new_samples_scatter(rx_symbols_copy);
                 }
                 else {
-                    m_panelScatter->setNc(g_Nc); /* m_FreeDV700scatterCombine may have changed at run time */
+                    m_panelScatter->setNc(g_Nc); /* m_FreeDV700Combine may have changed at run time */
                     /*
                       Sometimes useful to plot carriers separately, e.g. to determine if tx carrier power is constant
                       across carriers.
@@ -1274,6 +1273,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
             freedv_set_total_bit_errors(g_pfreedv, 0);
         }
         freedv_set_test_frames(g_pfreedv, wxGetApp().m_testFrames);
+        freedv_set_test_frames_diversity(g_pfreedv, wxGetApp().m_FreeDV700Combine);
         g_channel_noise =  wxGetApp().m_channel_noise;
 
         if (g_State) {
@@ -1289,6 +1289,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
             // update error pattern plots if supported
 
             int sz_error_pattern = freedv_get_sz_error_pattern(g_pfreedv);
+            //fprintf(stderr, "sz_error_pattern: %d\n", sz_error_pattern);
             if (sz_error_pattern) {
                 short error_pattern[sz_error_pattern];
 
@@ -1321,18 +1322,34 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
        
                     if ((freedv_get_mode(g_pfreedv) == FREEDV_MODE_700B) || (freedv_get_mode(g_pfreedv) == FREEDV_MODE_700C)) {
                         int c;
+                        fprintf(stderr, "after g_error_pattern_fifo read 2\n");
+                        
+                        /* 
+                           FreeDV 700 mapping from error pattern to bit on each carrier, see 
+                           data bit to carrier mapping in:
 
-                        /* 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. */
+                              codec2-dev/octave/cohpsk_frame_design.ods
+                           We can plot a histogram of the errors/carrier before or after diversity
+                           recombination.  Actually one bar for each IQ bit in carrier order.
+                        */
+
+                        int hist_Nc = sz_error_pattern/4;
+                        fprintf(stderr, "hist_Nc: %d\n", hist_Nc);
 
                         for(i=0; i<sz_error_pattern; i++) {
-                            c = i/4;
+                            /* maps to IQ bits from each symbol to a "carrier" (actually one line for each IQ bit in carrier order) */
+                            c = floor(i/4);
+                            /* this will clock in 4 bits/carrier to plot */
                             m_panelTestFrameErrors->add_new_sample(c, c + 0.8*error_pattern[i]);
                             g_error_hist[c] += error_pattern[i];
                             g_error_histn[c]++;
-                            //printf("i: %d c: %d\n", i, c);
+                            printf("i: %d c: %d\n", i, c);
+                        }
+                        for(; i<2*MODEM_STATS_NC_MAX*4; i++) {
+                            c = floor(i/4);
+                            m_panelTestFrameErrors->add_new_sample(c, c);
+                            printf("i: %d c: %d\n", i, c);
                         }
 
                         /* calculate BERs and send to plot */
@@ -1341,9 +1358,10 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
                         for(b=0; b<2*FDMDV_NC_MAX; b++) {
                             ber[b] = 0.0;
                         }
-                        for(b=0; b<g_Nc; b++) {
+                        for(b=0; b<hist_Nc; b++) {
                             ber[b+1] = (float)g_error_hist[b]/g_error_histn[b];
                         }
+                        assert(hist_Nc <= 2*FDMDV_NC_MAX);
                         m_panelTestFrameErrorsHist->add_new_samples(0, ber, 2*FDMDV_NC_MAX);
                     }
  
@@ -1770,10 +1788,10 @@ void MainFrame::VoiceKeyerProcessEvent(int vk_event) {
         m_btnTogPTT->SetValue(false); togglePTT();
         m_togBtnVoiceKeyer->SetValue(false);
         next_state = VK_IDLE;
-   }
+    }
 
-    if ((vk_event != VK_DT) || (vk_state != next_state))
-        fprintf(stderr, "VoiceKeyerProcessEvent: vk_state: %d vk_event: %d next_state: %d  vk_repeat_counter: %d\n", vk_state, vk_event, next_state, vk_repeat_counter);
+    //if ((vk_event != VK_DT) || (vk_state != next_state))
+    //    fprintf(stderr, "VoiceKeyerProcessEvent: vk_state: %d vk_event: %d next_state: %d  vk_repeat_counter: %d\n", vk_state, vk_event, next_state, vk_repeat_counter);
     vk_state = next_state;
 }
 
@@ -2412,7 +2430,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         if (m_rb700b->GetValue()) {
             g_mode = FREEDV_MODE_700B;
             g_Nc = 14;
-            if (wxGetApp().m_FreeDV700scatterCombine) {
+            if (wxGetApp().m_FreeDV700Combine) {
                 m_panelScatter->setNc(g_Nc/2);  /* diversity combnation */
             }
             else {
@@ -2422,7 +2440,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         if (m_rb700c->GetValue()) {
             g_mode = FREEDV_MODE_700C;
             g_Nc = 14;
-            if (wxGetApp().m_FreeDV700scatterCombine) {
+            if (wxGetApp().m_FreeDV700Combine) {
                 m_panelScatter->setNc(g_Nc/2);  /* diversity combnation */
             }
             else {
@@ -2452,7 +2470,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
             freedv_set_callback_txt(g_pfreedv, &my_put_next_rx_char, &my_get_next_tx_char, NULL);
 
             freedv_set_callback_error_pattern(g_pfreedv, my_freedv_put_error_pattern, (void*)m_panelTestFrameErrors);
-            g_error_pattern_fifo = fifo_create(2*freedv_get_sz_error_pattern(g_pfreedv));
+            g_error_pattern_fifo = fifo_create(2*freedv_get_sz_error_pattern(g_pfreedv)+1);
             g_error_hist = new short[FDMDV_NC_MAX*2];
             g_error_histn = new short[FDMDV_NC_MAX*2];
             int i;
@@ -4111,6 +4129,8 @@ void my_put_next_rx_char(void *callback_state, char c) {
 
 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);
+    //fprintf(stderr, "my_freedv_put_error_pattern: sz_error_pattern: %d ret: %d used: %d\n", 
+    //        sz_error_pattern, ret, fifo_used(g_error_pattern_fifo) );
 }
 
 void freq_shift_coh(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, float Fs, COMP *foff_phase_rect, int nin)
index 8df6aadca8f3fe15d60e7d4d31359257bcf66ca4..31cba6181d47f3b737d277682fbc5ed221305fb7 100644 (file)
@@ -298,7 +298,7 @@ class MainApp : public wxApp
         // 700 options
 
         bool       m_FreeDV700txClip;
-        bool       m_FreeDV700scatterCombine;
+        bool       m_FreeDV700Combine;
 
         // Noise simulation