From 91604220d3afa5a286f3172d263bf36965940ba5 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Fri, 24 Feb 2017 04:44:56 +0000 Subject: [PATCH] added FreeDV GUI support for attenuating one carrier, tested OK, and mapping of carriers to bit error plots and histograms checkes out git-svn-id: https://svn.code.sf.net/p/freetel/code@3051 01035d8c-6547-0410-b346-abe4f91aad63 --- freedv-dev/src/dlg_options.cpp | 64 +++++++++++++++++++++++++++------- freedv-dev/src/dlg_options.h | 4 +++ freedv-dev/src/fdmdv2_main.cpp | 15 +++++--- freedv-dev/src/fdmdv2_main.h | 5 +++ 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/freedv-dev/src/dlg_options.cpp b/freedv-dev/src/dlg_options.cpp index c28b2aac..27e1b0d0 100644 --- a/freedv-dev/src/dlg_options.cpp +++ b/freedv-dev/src/dlg_options.cpp @@ -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(); } diff --git a/freedv-dev/src/dlg_options.h b/freedv-dev/src/dlg_options.h index 0e4f358f..1724a2f1 100644 --- a/freedv-dev/src/dlg_options.h +++ b/freedv-dev/src/dlg_options.h @@ -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; diff --git a/freedv-dev/src/fdmdv2_main.cpp b/freedv-dev/src/fdmdv2_main.cpp index 3ca8db1a..e91e14c2 100644 --- a/freedv-dev/src/fdmdv2_main.cpp +++ b/freedv-dev/src/fdmdv2_main.cpp @@ -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; iadd_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 */ diff --git a/freedv-dev/src/fdmdv2_main.h b/freedv-dev/src/fdmdv2_main.h index 31cba618..c958d296 100644 --- a/freedv-dev/src/fdmdv2_main.h +++ b/freedv-dev/src/fdmdv2_main.h @@ -304,6 +304,11 @@ class MainApp : public wxApp int m_noise_snr; + // carrier attenuation + + bool m_attn_carrier_en; + int m_attn_carrier; + protected: }; -- 2.25.1