experimental speex noise canc
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 8 Jul 2014 21:58:47 +0000 (21:58 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 8 Jul 2014 21:58:47 +0000 (21:58 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1744 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2-dev/src/dlg_filter.cpp
fdmdv2-dev/src/dlg_filter.h
fdmdv2-dev/src/fdmdv2_main.cpp
fdmdv2-dev/src/fdmdv2_main.h

index 879373ddc2375de8de5b0b5c8340e992613bde05..80a7cb0933389a74a2df146ec638c65e047827d1 100644 (file)
@@ -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();
 }
index 037ba24f08abeea6aeaf2cc2adc7695ccecdbc94..82c43df8476a2c085a5239d7ac0cb529347a8ee0 100644 (file)
@@ -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;
index 83d8b20641e57c62db5962ab5bd830c4df350532..6b28cb0ae3247d7f78fc7c70885d29091e69e176 100644 (file)
@@ -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);
index e85df4889472d113d5e692ca66324d0b2e6c1639..c7d1f7dc94554cd5918d35fbf58869aba9019eea 100644 (file)
@@ -54,6 +54,8 @@
 #include <samplerate.h>
 
 #include <hamlib.h> 
+#include <speex/speex_preprocess.h>
+
 #ifdef _WIN32
 #include <windows.h>
 #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;