added FreeDV GUI support for attenuating one carrier, tested OK, and mapping of carri...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 24 Feb 2017 04:44:56 +0000 (04:44 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 24 Feb 2017 04:44:56 +0000 (04:44 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3051 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 c28b2aacc555454435594153876e02e238e2c8ea..27e1b0d0d6d5badfba1412a98edb6142f2c95ce4 100644 (file)
@@ -20,7 +20,9 @@
 //==========================================================================
 
 #include "dlg_options.h"
-extern bool g_modal;
+
+extern bool                g_modal;
+extern struct freedv      *g_pfreedv;
 
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
 // Class OptionsDlg
@@ -34,23 +36,26 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
     bSizer30 = new wxBoxSizer(wxVERTICAL);
 
     //------------------------------
-    // Test Frames check box
+    // Test Frames/Channel simulation check box
     //------------------------------
 
     wxStaticBoxSizer* sbSizer_testFrames;
-    wxStaticBox *sb_testFrames = new wxStaticBox(this, wxID_ANY, _("Test Frames"));
+    wxStaticBox *sb_testFrames = new wxStaticBox(this, wxID_ANY, _("Testing and Channel Simulation"));
     sbSizer_testFrames = new wxStaticBoxSizer(sb_testFrames, wxHORIZONTAL);
 
-    m_ckboxTestFrame = new wxCheckBox(this, wxID_ANY, _("Enable"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
-    m_ckboxTestFrame->SetToolTip(_("Send frames of known bits instead of compressed voice"));
+    m_ckboxTestFrame = new wxCheckBox(this, wxID_ANY, _("Test Frames"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
     sbSizer_testFrames->Add(m_ckboxTestFrame, 0, wxALIGN_LEFT, 0);
 
-    m_ckboxChannelNoise = new wxCheckBox(this, wxID_ANY, _("Channel Noise SNR (dB):"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
-    m_ckboxChannelNoise->SetToolTip(_("Add simulated AWGN channel noise to received signal"));
+    m_ckboxChannelNoise = new wxCheckBox(this, wxID_ANY, _("Channel Noise   SNR (dB):"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
     sbSizer_testFrames->Add(m_ckboxChannelNoise, 0, wxALIGN_LEFT, 0);
-    m_txtNoiseSNR = new wxTextCtrl(this, wxID_ANY,  wxEmptyString, wxDefaultPosition, wxSize(50,-1), 0, wxTextValidator(wxFILTER_DIGITS));
+    m_txtNoiseSNR = new wxTextCtrl(this, wxID_ANY,  wxEmptyString, wxDefaultPosition, wxSize(30,-1), 0, wxTextValidator(wxFILTER_DIGITS));
     sbSizer_testFrames->Add(m_txtNoiseSNR, 0, wxALIGN_LEFT, 0);
 
+    m_ckboxAttnCarrierEn = new wxCheckBox(this, wxID_ANY, _("Attn Carrier  Carrier:"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
+    sbSizer_testFrames->Add(m_ckboxAttnCarrierEn, 0, wxALIGN_LEFT, 0);
+    m_txtAttnCarrier = new wxTextCtrl(this, wxID_ANY,  wxEmptyString, wxDefaultPosition, wxSize(30,-1), 0, wxTextValidator(wxFILTER_DIGITS));
+    sbSizer_testFrames->Add(m_txtAttnCarrier, 0, wxALIGN_LEFT, 0);
+
     bSizer30->Add(sbSizer_testFrames,0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 3);
 
     //------------------------------
@@ -62,10 +67,8 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
     sbSizer_freedv700 = new wxStaticBoxSizer(sb_freedv700, wxHORIZONTAL);
 
     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_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);
@@ -199,6 +202,8 @@ 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_ckboxAttnCarrierEn->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnAttnCarrierEn), NULL, this);
+
     m_ckboxFreeDV700txClip->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700txClip), NULL, this);
     m_ckboxFreeDV700Combine->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700Combine), NULL, this);
 
@@ -222,6 +227,8 @@ 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_ckboxAttnCarrierEn->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnAttnCarrierEn), NULL, this);
+
     m_ckboxFreeDV700txClip->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700txClip), NULL, this);
     m_ckboxFreeDV700Combine->Disconnect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(OptionsDlg::OnFreeDV700Combine), NULL, this);
 }
@@ -238,9 +245,13 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
     {
         m_txtCtrlCallSign->SetValue(wxGetApp().m_callSign);
         m_ckboxTestFrame->SetValue(wxGetApp().m_testFrames);
+
         m_ckboxChannelNoise->SetValue(wxGetApp().m_channel_noise);
         m_txtNoiseSNR->SetValue(wxString::Format(wxT("%i"),wxGetApp().m_noise_snr));
 
+        m_ckboxAttnCarrierEn->SetValue(wxGetApp().m_attn_carrier_en);
+        m_txtAttnCarrier->SetValue(wxString::Format(wxT("%i"),wxGetApp().m_attn_carrier));
+
         m_ckbox_events->SetValue(wxGetApp().m_events);
         m_txt_spam_timer->SetValue(wxString::Format(wxT("%i"),wxGetApp().m_events_spam_timer));
 
@@ -265,12 +276,19 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
     if(inout == EXCHANGE_DATA_OUT)
     {
         wxGetApp().m_callSign      = m_txtCtrlCallSign->GetValue();
+
         wxGetApp().m_testFrames    = m_ckboxTestFrame->GetValue();
+
         wxGetApp().m_channel_noise = m_ckboxChannelNoise->GetValue();
         long noise_snr;
         m_txtNoiseSNR->GetValue().ToLong(&noise_snr);
         wxGetApp().m_noise_snr = (int)noise_snr;
 
+        wxGetApp().m_attn_carrier_en = m_ckboxAttnCarrierEn->GetValue();
+        long attn_carrier;
+        m_txtAttnCarrier->GetValue().ToLong(&attn_carrier);
+        wxGetApp().m_attn_carrier = (int)attn_carrier;
+
         wxGetApp().m_events        = m_ckbox_events->GetValue();
         long spam_timer;
         m_txt_spam_timer->GetValue().ToLong(&spam_timer);
@@ -367,16 +385,38 @@ void OptionsDlg::OnInitDialog(wxInitDialogEvent& event)
     ExchangeData(EXCHANGE_DATA_IN, false);
 }
 
+// immediately change flags rather using ExchangeData() so we can switch on and off at run time
+
 void OptionsDlg::OnTestFrame(wxScrollEvent& event) {
     wxGetApp().m_testFrames    = m_ckboxTestFrame->GetValue();
 }
 
-// immediately change flags rather using ExchangeData() so we can switch on and off at run time
-
 void OptionsDlg::OnChannelNoise(wxScrollEvent& event) {
     wxGetApp().m_channel_noise = m_ckboxChannelNoise->GetValue();
 }
 
+//  Run time update of carrier amplitude attenuation
+
+void OptionsDlg::OnAttnCarrierEn(wxScrollEvent& event) {
+    long attn_carrier;
+    m_txtAttnCarrier->GetValue().ToLong(&attn_carrier);
+    wxGetApp().m_attn_carrier = (int)attn_carrier;
+
+    /* uncheck -> checked, attenuate selected carrier */
+
+    if (m_ckboxAttnCarrierEn->GetValue() && !wxGetApp().m_attn_carrier_en) {
+        freedv_set_carrier_ampl(g_pfreedv, wxGetApp().m_attn_carrier, 0.25);
+    }
+
+    /* checked -> unchecked, reset selected carrier */
+
+    if (!m_ckboxAttnCarrierEn->GetValue() && wxGetApp().m_attn_carrier_en) {
+        freedv_set_carrier_ampl(g_pfreedv, wxGetApp().m_attn_carrier, 1.0);
+    }
+        
+    wxGetApp().m_attn_carrier_en = m_ckboxAttnCarrierEn->GetValue();    
+}
+
 void OptionsDlg::OnFreeDV700txClip(wxScrollEvent& event) {
     wxGetApp().m_FreeDV700txClip = m_ckboxFreeDV700txClip->GetValue();
 }
index 0e4f358ff1c223f6cb62ff503a7975dc21aa9f5e..1724a2f1a380c3fd2f1265d4a0e9141826e6c2b3 100644 (file)
@@ -67,6 +67,7 @@ class OptionsDlg : public wxDialog
  
         void    OnTestFrame(wxScrollEvent& event);
         void    OnChannelNoise(wxScrollEvent& event);
+        void    OnAttnCarrierEn(wxScrollEvent& event);
         void    OnFreeDV700txClip(wxScrollEvent& event);
         void    OnFreeDV700Combine(wxScrollEvent& event);
 
@@ -74,6 +75,9 @@ class OptionsDlg : public wxDialog
         wxCheckBox   *m_ckboxTestFrame;
         wxCheckBox   *m_ckboxChannelNoise;
         wxTextCtrl   *m_txtNoiseSNR;
+        wxCheckBox   *m_ckboxAttnCarrierEn;
+        wxTextCtrl   *m_txtAttnCarrier;
+
         wxCheckBox   *m_ckboxFreeDV700txClip;
         wxCheckBox   *m_ckboxFreeDV700Combine;
 
index 3ca8db1a03b4e229dc1fc30a1ac50702049373bb..e91e14c2d2f93be7c048acf925c65a27dacd5d65 100644 (file)
@@ -502,6 +502,9 @@ MainFrame::MainFrame(wxString plugInName, wxWindow *parent) : TopFrame(plugInNam
     wxGetApp().m_FreeDV700Combine = 1;
     wxGetApp().m_noise_snr = (float)pConfig->Read(wxT("/Noise/noise_snr"), 2);
 
+    wxGetApp().m_attn_carrier_en = 0;
+    wxGetApp().m_attn_carrier    = 0;
+
     int mode  = pConfig->Read(wxT("/Audio/mode"), (long)0);
     if (mode == 0)
         m_rb1600->SetValue(1);
@@ -1242,7 +1245,9 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         }
     }
 
+
     // Run time update of EQ filters -----------------------------------
+
     if (m_newMicInFilter || m_newSpkOutFilter) {
         g_mutexProtectingCallbackData.Lock();
         deleteEQFilters(g_rxUserdata);
@@ -1259,7 +1264,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         // Run time update of FreeDV 700 tx clipper
 
         freedv_set_clip(g_pfreedv, (int)wxGetApp().m_FreeDV700txClip);
-
+        
         // Test Frame Bit Error Updates ------------------------------------
 
         // Toggle test frame mode at run time
@@ -1326,7 +1331,7 @@ 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");
+                        //fprintf(stderr, "after g_error_pattern_fifo read 2\n");
                         
                         /* 
                            FreeDV 700 mapping from error pattern to bit on each carrier, see 
@@ -1339,7 +1344,7 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
                         */
 
                         int hist_Nc = sz_error_pattern/4;
-                        fprintf(stderr, "hist_Nc: %d\n", hist_Nc);
+                        //fprintf(stderr, "hist_Nc: %d\n", hist_Nc);
 
                         for(i=0; i<sz_error_pattern; i++) {
                             /* maps to IQ bits from each symbol to a "carrier" (actually one line for each IQ bit in carrier order) */
@@ -1348,12 +1353,12 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
                             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);
+                            //printf("i: %d c: %d\n", i, c);
                         }
 
                         /* calculate BERs and send to plot */
index 31cba6181d47f3b737d277682fbc5ed221305fb7..c958d2961c56c6e7df5fc90ea6c86f99d9087d07 100644 (file)
@@ -304,6 +304,11 @@ class MainApp : public wxApp
 
         int        m_noise_snr;
 
+        // carrier attenuation
+
+        bool       m_attn_carrier_en;
+        int        m_attn_carrier;
+
     protected:
 };