From 604f116d7b37c3811d94117fd2fde484f01d4289 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Tue, 8 Jul 2014 21:58:47 +0000 Subject: [PATCH] experimental speex noise canc git-svn-id: https://svn.code.sf.net/p/freetel/code@1744 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2-dev/src/dlg_filter.cpp | 28 ++++++++++++++++++++++++++++ fdmdv2-dev/src/dlg_filter.h | 6 +++++- fdmdv2-dev/src/fdmdv2_main.cpp | 19 +++++++++++++++++++ fdmdv2-dev/src/fdmdv2_main.h | 5 +++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/fdmdv2-dev/src/dlg_filter.cpp b/fdmdv2-dev/src/dlg_filter.cpp index 879373dd..80a7cb09 100644 --- a/fdmdv2-dev/src/dlg_filter.cpp +++ b/fdmdv2-dev/src/dlg_filter.cpp @@ -81,6 +81,18 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool bSizer30->Add(lpcpfs, 0, wxALL, 0); + // Speex pre-processor -------------------------------------------------- + + wxStaticBoxSizer* sbSizer_speexpp; + wxStaticBox *sb_speexpp = new wxStaticBox(this, wxID_ANY, _("Speex Mic Audio Pre-Processor")); + sbSizer_speexpp = new wxStaticBoxSizer(sb_speexpp, wxVERTICAL); + + m_ckboxSpeexpp = new wxCheckBox(this, wxID_ANY, _("Enable"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE); + sb_speexpp->SetToolTip(_("Enable noise supression, dereverberation, AGC of mic signal")); + sbSizer_speexpp->Add(m_ckboxSpeexpp, wxALIGN_LEFT, 2); + + bSizer30->Add(sbSizer_speexpp, 0, wxALL, 0); + // EQ Filters ----------------------------------------------------------- wxStaticBoxSizer* eqMicInSizer = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Mic In Equaliser")), wxVERTICAL); @@ -167,6 +179,8 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool m_codec2LPCPostFilterGamma->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnGammaScroll), NULL, this); m_LPCPostFilterDefault->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnLPCPostFilterDefault), NULL, this); + m_ckboxSpeexpp->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxScrollEventHandler(FilterDlg::OnSpeexppEnable), NULL, this); + m_MicInBass.sliderFreq->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassFreqScroll), NULL, this); m_MicInBass.sliderGain->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassGainScroll), NULL, this); m_MicInTreble.sliderFreq->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInTrebleFreqScroll), NULL, this); @@ -298,6 +312,10 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent) m_beta = wxGetApp().m_codec2LPCPostFilterBeta; setBeta(); m_gamma = wxGetApp().m_codec2LPCPostFilterGamma; setGamma(); + // Speex Pre-Processor + + m_ckboxSpeexpp->SetValue(wxGetApp().m_speexpp_enable); + // Mic In Equaliser m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz; @@ -367,6 +385,10 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent) wxGetApp().m_codec2LPCPostFilterBeta = m_beta; wxGetApp().m_codec2LPCPostFilterGamma = m_gamma; + // Speex Pre-Processor + + wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue(); + // Mic In Equaliser wxGetApp().m_MicInBassFreqHz = m_MicInBass.freqHz; @@ -397,6 +419,8 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent) pConfig->Write(wxT("/Filter/codec2LPCPostFilterBeta"), (int)(m_beta*100.0)); pConfig->Write(wxT("/Filter/codec2LPCPostFilterGamma"), (int)(m_gamma*100.0)); + pConfig->Write(wxT("/Filter/speexpp_enable"), wxGetApp().m_speexpp_enable); + pConfig->Write(wxT("/Filter/MicInBassFreqHz"), (int)m_MicInBass.freqHz); pConfig->Write(wxT("/Filter/MicInBassGaindB"), (int)(10.0*m_MicInBass.gaindB)); pConfig->Write(wxT("/Filter/MicInTrebleFreqHz"), (int)m_MicInTreble.freqHz); @@ -557,6 +581,10 @@ void FilterDlg::OnGammaScroll(wxScrollEvent& event) { // immediately change enable flags rather using ExchangeData() so we can switch on and off at run time +void FilterDlg::OnSpeexppEnable(wxScrollEvent& event) { + wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue(); +} + void FilterDlg::OnMicInEnable(wxScrollEvent& event) { wxGetApp().m_MicInEQEnable = m_MicInEnable->GetValue(); } diff --git a/fdmdv2-dev/src/dlg_filter.h b/fdmdv2-dev/src/dlg_filter.h index 037ba24f..82c43df8 100644 --- a/fdmdv2-dev/src/dlg_filter.h +++ b/fdmdv2-dev/src/dlg_filter.h @@ -53,7 +53,7 @@ class FilterDlg : public wxDialog public: FilterDlg( wxWindow* parent, bool running, bool *newMicInFilter, bool *newSpkOutFilter, wxWindowID id = wxID_ANY, const wxString& title = _("Filter"), - const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800, 600 ), + const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800, 630 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); ~FilterDlg(); @@ -72,6 +72,8 @@ class FilterDlg : public wxDialog void OnEnable(wxScrollEvent& event); void OnBassBoost(wxScrollEvent& event); + void OnSpeexppEnable(wxScrollEvent& event); + void OnMicInBassFreqScroll(wxScrollEvent& event) { sliderToFreq(&m_MicInBass, true); } void OnMicInBassGainScroll(wxScrollEvent& event) { sliderToGain(&m_MicInBass, true); } void OnMicInTrebleFreqScroll(wxScrollEvent& event) { sliderToFreq(&m_MicInTreble, true); } @@ -104,6 +106,8 @@ class FilterDlg : public wxDialog wxStaticText* m_staticTextGamma; wxButton* m_LPCPostFilterDefault; + wxCheckBox* m_ckboxSpeexpp; + wxStdDialogButtonSizer* m_sdbSizer5; wxButton* m_sdbSizer5OK; wxButton* m_sdbSizer5Cancel; diff --git a/fdmdv2-dev/src/fdmdv2_main.cpp b/fdmdv2-dev/src/fdmdv2_main.cpp index 83d8b206..6b28cb0a 100644 --- a/fdmdv2-dev/src/fdmdv2_main.cpp +++ b/fdmdv2-dev/src/fdmdv2_main.cpp @@ -120,6 +120,10 @@ COMP g_TxFreqOffsetPhaseRect; wxMutex g_mutexProtectingCallbackData; +// Speex pre-processor states + +SpeexPreprocessState *g_speex_st; + // WxWidgets - initialize the application IMPLEMENT_APP(MainApp); @@ -348,6 +352,8 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) wxGetApp().m_codec2LPCPostFilterBeta = (float)pConfig->Read(wxT("/Filter/codec2LPCPostFilterBeta"), CODEC2_LPC_PF_BETA*100)/100.0; //printf("main(): m_codec2LPCPostFilterBeta: %f\n", wxGetApp().m_codec2LPCPostFilterBeta); + wxGetApp().m_speexpp_enable = pConfig->Read(wxT("/Filter/speexpp_enable"), t); + wxGetApp().m_MicInBassFreqHz = (float)pConfig->Read(wxT("/Filter/MicInBassFreqHz"), 1); wxGetApp().m_MicInBassGaindB = (float)pConfig->Read(wxT("/Filter/MicInBassGaindB"), (long)0)/10.0; wxGetApp().m_MicInTrebleFreqHz = (float)pConfig->Read(wxT("/Filter/MicInTrebleFreqHz"), 1); @@ -480,6 +486,12 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent) optionsDlg = new OptionsDlg(NULL); m_schedule_restore = false; + + // Init Speex pre-processor states + // by inspecting Speex source it seems that only denoiser is on be default + + g_speex_st = speex_preprocess_state_init(2*N8, FS); + } //------------------------------------------------------------------------- @@ -2963,7 +2975,14 @@ void txRxProcessing() } g_mutexProtectingCallbackData.Unlock(); + // Optional Speex pre-perocessor + + if (wxGetApp().m_speexpp_enable) { + speex_preprocess_run(g_speex_st, in8k_short); + } + // Optional Mic In EQ Filtering, need mutex as filter can change at run time + g_mutexProtectingCallbackData.Lock(); if (cbData->micInEQEnable) { sox_biquad_filter(cbData->sbqMicInBass, in8k_short, in8k_short, nout); diff --git a/fdmdv2-dev/src/fdmdv2_main.h b/fdmdv2-dev/src/fdmdv2_main.h index e85df488..c7d1f7dc 100644 --- a/fdmdv2-dev/src/fdmdv2_main.h +++ b/fdmdv2-dev/src/fdmdv2_main.h @@ -54,6 +54,8 @@ #include #include +#include + #ifdef _WIN32 #include #else @@ -188,6 +190,9 @@ class MainApp : public wxApp float m_codec2LPCPostFilterGamma; float m_codec2LPCPostFilterBeta; + // Speex Pre-Processor + bool m_speexpp_enable; + // Mic In Equaliser float m_MicInBassFreqHz; float m_MicInBassGaindB; -- 2.25.1