From 1acfbdab9a0c9c1d8c85ce9d289b23764f21f6ae Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sun, 2 Dec 2012 00:01:07 +0000 Subject: [PATCH] 3 band equaliser for Mic In working on dialog, not connected to actual real time speech yet git-svn-id: https://svn.code.sf.net/p/freetel/code@1107 01035d8c-6547-0410-b346-abe4f91aad63 --- fdmdv2/src/dlg_filter.cpp | 210 +++++++++++++++++++++++----- fdmdv2/src/dlg_filter.h | 21 ++- fdmdv2/src/fdmdv2_main.cpp | 6 + fdmdv2/src/fdmdv2_main.h | 9 +- fdmdv2/src/fdmdv2_plot_spectrum.cpp | 15 +- fdmdv2/src/fdmdv2_plot_spectrum.h | 6 +- 6 files changed, 217 insertions(+), 50 deletions(-) diff --git a/fdmdv2/src/dlg_filter.cpp b/fdmdv2/src/dlg_filter.cpp index eba53af2..f0a03c96 100644 --- a/fdmdv2/src/dlg_filter.cpp +++ b/fdmdv2/src/dlg_filter.cpp @@ -28,9 +28,19 @@ #define FILTER_MAX_MAG_DB 20.0 #define MAX_FREQ_BASS 600.00 +#define MAX_FREQ_TREBLE 3900.00 #define MAX_FREQ_DEF 3000.00 +#define MIN_GAIN -20 +#define MAX_GAIN 20 + +#define MAX_LOG10_Q 1.0 +#define MIN_LOG10_Q -1.0 + +// DFT parameters + #define IMP_AMP 2000.0 +#define NIMP 50 #define F_STEP_DFT 50.0 #define F_MAG_N (int)(MAX_F_HZ/F_STEP_DFT) @@ -93,7 +103,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, wxWindowID id, const wxStri wxBoxSizer* eqMicInSizer1 = new wxBoxSizer(wxHORIZONTAL); m_MicInBass = newEQ(eqMicInSizer1, "Bass" , MAX_FREQ_BASS, disableQ); - m_MicInTreble = newEQ(eqMicInSizer1, "Treble", MAX_FREQ_DEF, disableQ); + m_MicInTreble = newEQ(eqMicInSizer1, "Treble", MAX_FREQ_TREBLE, disableQ); eqMicInSizer->Add(eqMicInSizer1); m_MicInMid = newEQ(eqMicInSizer, "Mid" , MAX_FREQ_DEF, enableQ); @@ -101,13 +111,23 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, wxWindowID id, const wxStri wxBoxSizer* eqSpkOutSizer1 = new wxBoxSizer(wxHORIZONTAL); m_SpkOutBass = newEQ(eqSpkOutSizer1, "Bass" , MAX_FREQ_BASS, disableQ); - m_SpkOutTreble = newEQ(eqSpkOutSizer1, "Treble", MAX_FREQ_DEF, disableQ); + m_SpkOutTreble = newEQ(eqSpkOutSizer1, "Treble", MAX_FREQ_TREBLE, disableQ); eqSpkOutSizer->Add(eqSpkOutSizer1); m_SpkOutMid = newEQ(eqSpkOutSizer, "Mid" , MAX_FREQ_DEF, enableQ); bSizer30->Add(eqMicInSizer, 0, wxALL, 0); bSizer30->Add(eqSpkOutSizer, 0, wxALL, 0); + // Storgage for spectrum magnitude plots ------------------------------------ + + m_MicInMagdB = new float[F_MAG_N]; + for(int i=0; iAdd(m_auiNotebook, 0, wxEXPAND|wxALL, 3); - m_MicInMagdB = new float[F_MAG_N]; - for(int i=0; iAddPage(m_MicInFreqRespPlot, _("Microphone In Equaliser")); - m_SpkOutMagdB = new float[F_MAG_N]; - for(int i=0; iAddPage(m_SpkOutFreqRespPlot, _("Speaker Out Equaliser")); @@ -155,6 +169,12 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, wxWindowID id, const wxStri m_codec2LPCPostFilterGamma->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnGammaScroll), 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); + m_MicInTreble.sliderGain->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInTrebleGainScroll), NULL, this); + m_MicInMid.sliderFreq->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidFreqScroll), NULL, this); + m_MicInMid.sliderGain->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidGainScroll), NULL, this); + m_MicInMid.sliderQ->Connect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidQScroll), NULL, this); m_sdbSizer5Cancel->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnCancel), NULL, this); m_sdbSizer5Default->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnDefault), NULL, this); @@ -182,6 +202,12 @@ FilterDlg::~FilterDlg() m_codec2LPCPostFilterGamma->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnGammaScroll), NULL, this); m_MicInBass.sliderFreq->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassFreqScroll), NULL, this); + m_MicInBass.sliderGain->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInBassGainScroll), NULL, this); + m_MicInTreble.sliderFreq->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInTrebleFreqScroll), NULL, this); + m_MicInTreble.sliderGain->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInTrebleGainScroll), NULL, this); + m_MicInMid.sliderFreq->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidFreqScroll), NULL, this); + m_MicInMid.sliderGain->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidGainScroll), NULL, this); + m_MicInMid.sliderQ->Disconnect(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(FilterDlg::OnMicInMidQScroll), NULL, this); m_sdbSizer5Cancel->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnCancel), NULL, this); m_sdbSizer5Default->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FilterDlg::OnDefault), NULL, this); @@ -212,8 +238,8 @@ void FilterDlg::newEQControl(wxSlider** slider, wxStaticText** value, wxStaticBo *slider = new wxSlider(this, wxID_ANY, 0, 0, SLIDER_MAX, wxDefaultPosition, wxSize(SLIDER_LENGTH,wxDefaultCoord)); bs->Add(*slider, 1, wxALIGN_CENTER_VERTICAL|wxALL, 0); - *value = new wxStaticText(this, wxID_ANY, wxT("100"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); - bs->Add(*value, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 0); + *value = new wxStaticText(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(40,-1), wxALIGN_LEFT); + bs->Add(*value, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5); } EQ FilterDlg::newEQ(wxSizer *bs, wxString eqName, float maxFreqHz, bool enableQ) @@ -252,14 +278,26 @@ void FilterDlg::ExchangeData(int inout) m_beta = wxGetApp().m_codec2LPCPostFilterBeta; setBeta(); m_gamma = wxGetApp().m_codec2LPCPostFilterGamma; setGamma(); - // Mic In Equaliser + // Mic In Equaliser m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz; setFreq(&m_MicInBass); m_MicInBass.freqHz = limit(m_MicInBass.freqHz, 1.0, MAX_FREQ_BASS); - - calcFilterSpectrum(&m_MicInBass, m_MicInMagdB); - m_MicInFreqRespPlot->m_newdata = true; - m_MicInFreqRespPlot->Refresh(); + m_MicInBass.gaindB = wxGetApp().m_MicInBassGaindB; setGain(&m_MicInBass); + m_MicInBass.gaindB = limit(m_MicInBass.gaindB, MIN_GAIN, MAX_GAIN); + + m_MicInTreble.freqHz = wxGetApp().m_MicInTrebleFreqHz; setFreq(&m_MicInTreble); + m_MicInTreble.freqHz = limit(m_MicInTreble.freqHz, 1.0, MAX_FREQ_TREBLE); + m_MicInTreble.gaindB = wxGetApp().m_MicInTrebleGaindB; setGain(&m_MicInTreble); + m_MicInTreble.gaindB = limit(m_MicInTreble.gaindB, MIN_GAIN, MAX_GAIN); + + m_MicInMid.freqHz = wxGetApp().m_MicInMidFreqHz; setFreq(&m_MicInMid); + m_MicInMid.freqHz = limit(m_MicInMid.freqHz, 1.0, MAX_FREQ_TREBLE); + m_MicInMid.gaindB = wxGetApp().m_MicInMidGaindB; setGain(&m_MicInMid); + m_MicInMid.gaindB = limit(m_MicInMid.gaindB, MIN_GAIN, MAX_GAIN); + m_MicInMid.Q = wxGetApp().m_MicInMidQ; setQ(&m_MicInMid); + m_MicInMid.Q = limit(m_MicInMid.Q, pow(10.0,MIN_LOG10_Q), pow(10.0, MAX_LOG10_Q)); + + setFreq(&m_MicInBass); setGain(&m_MicInBass); plotMicInFilterSpectrum(); } if(inout == EXCHANGE_DATA_OUT) { @@ -279,6 +317,20 @@ void FilterDlg::ExchangeData(int inout) wxGetApp().m_MicInBassFreqHz = m_MicInBass.freqHz; pConfig->Write(wxT("/Filter/MicInBassFreqHz"), (int)m_MicInBass.freqHz); + wxGetApp().m_MicInBassGaindB = m_MicInBass.gaindB; + pConfig->Write(wxT("/Filter/MicInBassGaindB"), (int)(10.0*m_MicInBass.gaindB)); + + wxGetApp().m_MicInTrebleFreqHz = m_MicInTreble.freqHz; + pConfig->Write(wxT("/Filter/MicInTrebleFreqHz"), (int)m_MicInTreble.freqHz); + wxGetApp().m_MicInTrebleGaindB = m_MicInTreble.gaindB; + pConfig->Write(wxT("/Filter/MicInTrebleGaindB"), (int)(10.0*m_MicInTreble.gaindB)); + + wxGetApp().m_MicInMidFreqHz = m_MicInMid.freqHz; + pConfig->Write(wxT("/Filter/MicInMidFreqHz"), (int)m_MicInMid.freqHz); + wxGetApp().m_MicInMidGaindB = m_MicInMid.gaindB; + pConfig->Write(wxT("/Filter/MicInMidGaindB"), (int)(10.0*m_MicInMid.gaindB)); + wxGetApp().m_MicInMidQ = m_MicInMid.Q; + pConfig->Write(wxT("/Filter/MicInMidQ"), (int)(100.0*m_MicInMid.Q)); pConfig->Flush(); } @@ -309,8 +361,19 @@ void FilterDlg::OnDefault(wxCommandEvent& event) m_codec2LPCPostFilterEnable->SetValue(true); m_codec2LPCPostFilterBassBoost->SetValue(true); - m_MicInBass.freqHz = 1.0; + m_MicInBass.freqHz = 100.0; + m_MicInBass.gaindB = 0.0; + setFreq(&m_MicInBass); setGain(&m_MicInBass); + m_MicInTreble.freqHz = 3000.0; + m_MicInTreble.gaindB = 0.0; + setFreq(&m_MicInTreble); setGain(&m_MicInTreble); + + m_MicInMid.freqHz = 1500.0; + m_MicInMid.gaindB = 0.0; + setFreq(&m_MicInMid); setGain(&m_MicInMid); + + plotMicInFilterSpectrum(); } //------------------------------------------------------------------------- @@ -396,33 +459,111 @@ void FilterDlg::setFreq(EQ *eq) eq->sliderFreq->SetValue(slider); } -void FilterDlg::sliderToFreq(EQ *eq) +void FilterDlg::sliderToFreq(EQ *eq, bool micIn) { eq->freqHz = ((float)eq->sliderFreq->GetValue()/SLIDER_MAX)*eq->maxFreqHz; - if (eq->freqHz < 1.0) eq->freqHz = 1.0; // sox deosn't like 0 Hz; - setFreq(&m_MicInBass); - calcFilterSpectrum(eq, m_MicInMagdB); - m_MicInFreqRespPlot->m_newdata = true; - m_MicInFreqRespPlot->Refresh(); + if (eq->freqHz < 1.0) eq->freqHz = 1.0; // sox doesn't like 0 Hz; + setFreq(eq); + if (micIn) + plotMicInFilterSpectrum(); } -void FilterDlg::OnMicInBassFreqScroll(wxScrollEvent& event) +void FilterDlg::setGain(EQ *eq) { - sliderToFreq(&m_MicInBass); + wxString buf; + buf.Printf(wxT("%3.0f"), eq->gaindB); + eq->valueGain->SetLabel(buf); + int slider = (int)(((eq->gaindB-MIN_GAIN)/(MAX_GAIN-MIN_GAIN))*SLIDER_MAX + 0.5); + eq->sliderGain->SetValue(slider); } -#define NIMP 50 +void FilterDlg::sliderToGain(EQ *eq, bool micIn) +{ + float range = MAX_GAIN-MIN_GAIN; + + eq->gaindB = MIN_GAIN + range*((float)eq->sliderGain->GetValue()/SLIDER_MAX); + //printf("gaindB: %f\n", eq->gaindB); + setGain(eq); + if (micIn) + plotMicInFilterSpectrum(); +} + +void FilterDlg::setQ(EQ *eq) +{ + wxString buf; + buf.Printf(wxT("%3.0f"), eq->Q); + eq->valueQ->SetLabel(buf); + + float log10_range = MAX_LOG10_Q - MIN_LOG10_Q; + + int slider = (int)(((log10(eq->Q+1E-6)-MIN_LOG10_Q)/log10_range)*SLIDER_MAX + 0.5); + eq->sliderQ->SetValue(slider); +} + +void FilterDlg::sliderToQ(EQ *eq, bool micIn) +{ + float log10_range = MAX_LOG10_Q - MIN_LOG10_Q; + + float sliderNorm = (float)eq->sliderQ->GetValue()/SLIDER_MAX; + float log10Q = MIN_LOG10_Q + sliderNorm*(log10_range); + eq->Q = pow(10.0, log10Q); + printf("log10Q: %f eq->Q: %f\n", log10Q, eq->Q); + setQ(eq); + if (micIn) + plotMicInFilterSpectrum(); +} + +void FilterDlg::plotMicInFilterSpectrum(void) { + plotFilterSpectrum(&m_MicInBass, &m_MicInMid, &m_MicInTreble, m_MicInFreqRespPlot, m_MicInMagdB); +} + +void FilterDlg::plotFilterSpectrum(EQ *eqBass, EQ *eqMid, EQ *eqTreble, PlotSpectrum* freqRespPlot, float *magdB) { + char *argBass[10]; + char *argTreble[10]; + char *argMid[10]; + char argstorage[10][80]; + float magBass[F_MAG_N]; + float magTreble[F_MAG_N]; + float magMid[F_MAG_N]; + int i; + + for(i=0; i<10; i++) { + argBass[i] = &argstorage[i][0]; + argTreble[i] = &argstorage[i][0]; + argMid[i] = &argstorage[i][0]; + } + sprintf(argBass[0], "bass"); + sprintf(argBass[1], "%f", eqBass->gaindB+1E-6); + sprintf(argBass[2], "%f", eqBass->freqHz); + + calcFilterSpectrum(magBass, 2, argBass); + + sprintf(argTreble[0], "treble"); + sprintf(argTreble[1], "%f", eqTreble->gaindB+1E-6); + sprintf(argTreble[2], "%f", eqTreble->freqHz); + + calcFilterSpectrum(magTreble, 2, argTreble); + + sprintf(argTreble[0], "equalizer"); + sprintf(argTreble[1], "%f", eqMid->freqHz); + sprintf(argTreble[2], "%f", eqMid->Q); + sprintf(argTreble[3], "%f", eqMid->gaindB+1E-6); + + calcFilterSpectrum(magMid, 3, argMid); + + for(i=0; im_newdata = true; + freqRespPlot->Refresh(); +} -void FilterDlg::calcFilterSpectrum(EQ *eq, float magdB[]) { +void FilterDlg::calcFilterSpectrum(float magdB[], int argc, char *argv[]) { void *sbq; - const char *argv[10]; - char highpass[80]; - char freq[80]; short in[NIMP]; short out[NIMP]; - COMP X[(int)(MAX_F_HZ/F_STEP_DFT)]; - float f,w; - int i, k, argc; + COMP X[F_MAG_N]; + float f, w; + int i, k; // find impulse response ----------------------------------- @@ -430,11 +571,8 @@ void FilterDlg::calcFilterSpectrum(EQ *eq, float magdB[]) { in[i] = 0; in[0] = IMP_AMP; - sprintf(highpass, "highpass"); argv[0] = highpass; - sprintf(freq, "%f", eq->freqHz); argv[1] = freq; - argc=1; //printf("argv[0]: %s argv[1]: %s\n", argv[0], argv[1]); - sbq = sox_biquad_create(argc, argv); + sbq = sox_biquad_create(argc, (const char **)argv); sox_biquad_filter(sbq, out, in, NIMP); //for(i=0; iRead(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); + wxGetApp().m_MicInTrebleGaindB = (float)pConfig->Read(wxT("/Filter/MicInTrebleGaindB"), (long)0)/10.0; + wxGetApp().m_MicInMidFreqHz = (float)pConfig->Read(wxT("/Filter/MicInMidFreqHz"), 1); + wxGetApp().m_MicInMidGaindB = (float)pConfig->Read(wxT("/Filter/MicInMidGaindB"), (long)0)/10.0; + wxGetApp().m_MicInMidQ = (float)pConfig->Read(wxT("/Filter/MicInMidQ"), (long)100)/100.0; wxGetApp().m_callSign = pConfig->Read("/Data/CallSign", wxT("")); diff --git a/fdmdv2/src/fdmdv2_main.h b/fdmdv2/src/fdmdv2_main.h index 3a51f15a..6a06c825 100644 --- a/fdmdv2/src/fdmdv2_main.h +++ b/fdmdv2/src/fdmdv2_main.h @@ -154,7 +154,14 @@ class MainApp : public wxApp // Mic In Equaliser float m_MicInBassFreqHz; - + float m_MicInBassGaindB; + float m_MicInTrebleFreqHz; + float m_MicInTrebleGaindB; + float m_MicInMidFreqHz; + float m_MicInMidGaindB; + float m_MicInMidQ; + + // Flags for displaying windows int m_show_wf; int m_show_spect; int m_show_scatter; diff --git a/fdmdv2/src/fdmdv2_plot_spectrum.cpp b/fdmdv2/src/fdmdv2_plot_spectrum.cpp index 2ea8a7ce..843beea1 100644 --- a/fdmdv2/src/fdmdv2_plot_spectrum.cpp +++ b/fdmdv2/src/fdmdv2_plot_spectrum.cpp @@ -45,7 +45,8 @@ END_EVENT_TABLE() // @brief // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= -PlotSpectrum::PlotSpectrum(wxFrame* parent, float *magdB, int n_magdB, float min_mag_db, float max_mag_db): PlotPanel(parent) +PlotSpectrum::PlotSpectrum(wxFrame* parent, float *magdB, int n_magdB, + float min_mag_db, float max_mag_db, bool clickTune): PlotPanel(parent) { m_greyscale = 0; m_Bufsz = GetMaxClientSize(); @@ -59,6 +60,7 @@ PlotSpectrum::PlotSpectrum(wxFrame* parent, float *magdB, int n_magdB, float min m_max_mag_db = max_mag_db; m_min_mag_db = min_mag_db; m_rxFreq = 0.0; + m_clickTune = clickTune; } //---------------------------------------------------------------- @@ -134,9 +136,9 @@ void PlotSpectrum::draw(wxAutoBufferedPaintDC& dc) mag_dB_to_py = (float)m_rGrid.GetHeight()/(m_max_mag_db - m_min_mag_db); int last_index = ((float)MAX_F_HZ/(float)FDMDV_MAX_F_HZ)*FDMDV_NSPEC; - prev_x = PLOT_BORDER + XLEFT_OFFSET; - prev_y = PLOT_BORDER; - for(index = 0; index < last_index; index++) + //prev_x = PLOT_BORDER + XLEFT_OFFSET; + //prev_y = PLOT_BORDER; + for(index = 0; index < m_n_magdB; index++) { x = index*index_to_px; mag = m_magdB[index]; @@ -147,7 +149,8 @@ void PlotSpectrum::draw(wxAutoBufferedPaintDC& dc) x += PLOT_BORDER + XLEFT_OFFSET; y += PLOT_BORDER; - dc.DrawLine(x, y, prev_x, prev_y); + if (index) + dc.DrawLine(x, y, prev_x, prev_y); prev_x = x; prev_y = y; } } @@ -245,7 +248,7 @@ void PlotSpectrum::OnMouseLeftDown(wxMouseEvent& event) pt.y -= PLOT_BORDER; // valid click if inside of plot - if ((pt.x >= 0) && (pt.x <= m_rGrid.GetWidth()) && (pt.y >=0)) { + if ((pt.x >= 0) && (pt.x <= m_rGrid.GetWidth()) && (pt.y >=0) && m_clickTune) { float freq_hz_to_px = (float)m_rGrid.GetWidth()/(MAX_F_HZ-MIN_F_HZ); float clickFreq = (float)pt.x/freq_hz_to_px; diff --git a/fdmdv2/src/fdmdv2_plot_spectrum.h b/fdmdv2/src/fdmdv2_plot_spectrum.h index 94a04ce0..d3d579c5 100644 --- a/fdmdv2/src/fdmdv2_plot_spectrum.h +++ b/fdmdv2/src/fdmdv2_plot_spectrum.h @@ -30,7 +30,8 @@ class PlotSpectrum : public PlotPanel { public: - PlotSpectrum(wxFrame* parent, float *magdB, int n_magdB, float min_mag_db=MIN_MAG_DB, float max_mag_db=MAX_MAG_DB); + PlotSpectrum(wxFrame* parent, float *magdB, int n_magdB, + float min_mag_db=MIN_MAG_DB, float max_mag_db=MAX_MAG_DB, bool clickTune=true); ~PlotSpectrum(); void setRxFreq(float rxFreq) { m_rxFreq = rxFreq; } @@ -47,7 +48,8 @@ class PlotSpectrum : public PlotPanel float m_max_mag_db; float m_min_mag_db; float *m_magdB; - int m_n_magdB; + int m_n_magdB; + bool m_clickTune; DECLARE_EVENT_TABLE() }; -- 2.25.1