From: drowe67 Date: Thu, 23 Feb 2017 03:36:56 +0000 (+0000) Subject: GUI support for bit error plot/historam before diversity combination, working OK... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=2c9ac5fbb717e179883ec03fcec1f88113114ba1;p=freetel-svn-tracking.git GUI support for bit error plot/historam before diversity combination, working OK on test using alsa loopback, part of 700C instrumentation git-svn-id: https://svn.code.sf.net/p/freetel/code@3048 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/freedv-dev/src/dlg_options.cpp b/freedv-dev/src/dlg_options.cpp index 817027ec..c28b2aac 100644 --- a/freedv-dev/src/dlg_options.cpp +++ b/freedv-dev/src/dlg_options.cpp @@ -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) { diff --git a/freedv-dev/src/dlg_options.h b/freedv-dev/src/dlg_options.h index 6c83fef6..0e4f358f 100644 --- a/freedv-dev/src/dlg_options.h +++ b/freedv-dev/src/dlg_options.h @@ -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; diff --git a/freedv-dev/src/fdmdv2_main.cpp b/freedv-dev/src/fdmdv2_main.cpp index 27bb3d09..7321b10a 100644 --- a/freedv-dev/src/fdmdv2_main.cpp +++ b/freedv-dev/src/fdmdv2_main.cpp @@ -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; 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); } /* 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; badd_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) diff --git a/freedv-dev/src/fdmdv2_main.h b/freedv-dev/src/fdmdv2_main.h index 8df6aadc..31cba618 100644 --- a/freedv-dev/src/fdmdv2_main.h +++ b/freedv-dev/src/fdmdv2_main.h @@ -298,7 +298,7 @@ class MainApp : public wxApp // 700 options bool m_FreeDV700txClip; - bool m_FreeDV700scatterCombine; + bool m_FreeDV700Combine; // Noise simulation