Right drag spectrum vertically to adjust scale

This commit is contained in:
Charles J. Cliffe 2015-10-25 00:07:01 -04:00
parent 010d899895
commit 11aa8e9b05
7 changed files with 103 additions and 6 deletions

View File

@ -977,3 +977,8 @@ bool AppFrame::loadSession(std::string fileName) {
return true; return true;
} }
FFTVisualDataThread *AppFrame::getWaterfallDataThread() {
return waterfallDataThread;
}

View File

@ -54,6 +54,8 @@ public:
void saveSession(std::string fileName); void saveSession(std::string fileName);
bool loadSession(std::string fileName); bool loadSession(std::string fileName);
FFTVisualDataThread *getWaterfallDataThread();
private: private:
void OnMenu(wxCommandEvent& event); void OnMenu(wxCommandEvent& event);
void OnClose(wxCloseEvent& event); void OnClose(wxCloseEvent& event);

View File

@ -17,6 +17,7 @@ SpectrumVisualProcessor::SpectrumVisualProcessor() : lastInputBandwidth(0), last
fft_floor_ma = fft_floor_maa = 0.0; fft_floor_ma = fft_floor_maa = 0.0;
desiredInputSize.store(0); desiredInputSize.store(0);
fft_average_rate = 0.65; fft_average_rate = 0.65;
scaleFactor.store(1.0);
} }
SpectrumVisualProcessor::~SpectrumVisualProcessor() { SpectrumVisualProcessor::~SpectrumVisualProcessor() {
@ -307,10 +308,12 @@ void SpectrumVisualProcessor::process() {
fft_floor_ma = fft_floor_ma + (fft_floor - fft_floor_ma) * 0.05; fft_floor_ma = fft_floor_ma + (fft_floor - fft_floor_ma) * 0.05;
fft_floor_maa = fft_floor_maa + (fft_floor_ma - fft_floor_maa) * 0.05; fft_floor_maa = fft_floor_maa + (fft_floor_ma - fft_floor_maa) * 0.05;
float sf = scaleFactor.load();
for (int i = 0, iMax = fftSize; i < iMax; i++) { for (int i = 0, iMax = fftSize; i < iMax; i++) {
float v = (log10(fft_result_maa[i]+0.25 - (fft_floor_maa-0.75)) / log10((fft_ceil_maa+0.25) - (fft_floor_maa-0.75))); float v = (log10(fft_result_maa[i]+0.25 - (fft_floor_maa-0.75)) / log10((fft_ceil_maa+0.25) - (fft_floor_maa-0.75)));
output->spectrum_points[i * 2] = ((float) i / (float) iMax); output->spectrum_points[i * 2] = ((float) i / (float) iMax);
output->spectrum_points[i * 2 + 1] = v; output->spectrum_points[i * 2 + 1] = v*sf;
} }
if (hideDC.load()) { // DC-spike removal if (hideDC.load()) { // DC-spike removal
@ -349,7 +352,7 @@ void SpectrumVisualProcessor::process() {
} }
} }
output->fft_ceiling = fft_ceil_maa; output->fft_ceiling = fft_ceil_maa/sf;
output->fft_floor = fft_floor_maa; output->fft_floor = fft_floor_maa;
} }
@ -361,3 +364,13 @@ void SpectrumVisualProcessor::process() {
busy_run.unlock(); busy_run.unlock();
} }
void SpectrumVisualProcessor::setScaleFactor(float sf) {
scaleFactor.store(sf);
}
float SpectrumVisualProcessor::getScaleFactor() {
return scaleFactor.load();
}

View File

@ -35,6 +35,9 @@ public:
void setup(int fftSize); void setup(int fftSize);
void setHideDC(bool hideDC); void setHideDC(bool hideDC);
void setScaleFactor(float sf);
float getScaleFactor();
protected: protected:
void process(); void process();
@ -70,4 +73,5 @@ private:
std::atomic_int desiredInputSize; std::atomic_int desiredInputSize;
std::mutex busy_run; std::mutex busy_run;
std::atomic_bool hideDC; std::atomic_bool hideDC;
std::atomic<float> scaleFactor;
}; };

View File

@ -13,8 +13,8 @@ public:
long long getFrequencyAt(float x); long long getFrequencyAt(float x);
void setView(long long center_freq_in, int bandwidth_in); virtual void setView(long long center_freq_in, int bandwidth_in);
void disableView(); virtual void disableView();
bool getViewState(); bool getViewState();
void setCenterFrequency(long long center_freq_in); void setCenterFrequency(long long center_freq_in);

View File

@ -25,6 +25,8 @@ EVT_LEFT_UP(SpectrumCanvas::OnMouseReleased)
EVT_ENTER_WINDOW(SpectrumCanvas::OnMouseEnterWindow) EVT_ENTER_WINDOW(SpectrumCanvas::OnMouseEnterWindow)
EVT_LEAVE_WINDOW(SpectrumCanvas::OnMouseLeftWindow) EVT_LEAVE_WINDOW(SpectrumCanvas::OnMouseLeftWindow)
EVT_MOUSEWHEEL(SpectrumCanvas::OnMouseWheelMoved) EVT_MOUSEWHEEL(SpectrumCanvas::OnMouseWheelMoved)
EVT_RIGHT_DOWN(SpectrumCanvas::OnMouseRightDown)
EVT_RIGHT_UP(SpectrumCanvas::OnMouseRightReleased)
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
SpectrumCanvas::SpectrumCanvas(wxWindow *parent, int *attribList) : SpectrumCanvas::SpectrumCanvas(wxWindow *parent, int *attribList) :
@ -36,6 +38,9 @@ SpectrumCanvas::SpectrumCanvas(wxWindow *parent, int *attribList) :
visualDataQueue.set_max_num_items(1); visualDataQueue.set_max_num_items(1);
SetCursor(wxCURSOR_SIZEWE); SetCursor(wxCURSOR_SIZEWE);
scaleFactor = 1.0;
resetScaleFactor = false;
bwChange = 0.0;
} }
SpectrumCanvas::~SpectrumCanvas() { SpectrumCanvas::~SpectrumCanvas() {
@ -59,6 +64,15 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) {
} }
} }
if (resetScaleFactor) {
scaleFactor += (1.0-scaleFactor)*0.05;
if (fabs(scaleFactor-1.0) < 0.01) {
scaleFactor = 1.0;
resetScaleFactor = false;
}
updateScaleFactor(scaleFactor);
}
glContext->SetCurrent(*this); glContext->SetCurrent(*this);
initGLExtensions(); initGLExtensions();
@ -137,6 +151,29 @@ bool SpectrumCanvas::getShowDb() {
return spectrumPanel.getShowDb(); return spectrumPanel.getShowDb();
} }
void SpectrumCanvas::setView(long long center_freq_in, int bandwidth_in) {
bwChange += bandwidth_in-bandwidth;
#define BW_RESET_TH 400000
if (bwChange > BW_RESET_TH || bwChange < -BW_RESET_TH) {
resetScaleFactor = true;
bwChange = 0;
}
InteractiveCanvas::setView(center_freq_in, bandwidth_in);
}
void SpectrumCanvas::disableView() {
InteractiveCanvas::disableView();
}
void SpectrumCanvas::updateScaleFactor(float factor) {
SpectrumVisualProcessor *sp = wxGetApp().getSpectrumProcessor();
FFTVisualDataThread *wdt = wxGetApp().getAppFrame()->getWaterfallDataThread();
SpectrumVisualProcessor *wp = wdt->getProcessor();
scaleFactor = factor;
sp->setScaleFactor(factor);
wp->setScaleFactor(factor);
}
void SpectrumCanvas::OnMouseMoved(wxMouseEvent& event) { void SpectrumCanvas::OnMouseMoved(wxMouseEvent& event) {
InteractiveCanvas::OnMouseMoved(event); InteractiveCanvas::OnMouseMoved(event);
@ -146,8 +183,23 @@ void SpectrumCanvas::OnMouseMoved(wxMouseEvent& event) {
if (freqChange != 0) { if (freqChange != 0) {
moveCenterFrequency(freqChange); moveCenterFrequency(freqChange);
} }
}
else if (mouseTracker.mouseRightDown()) {
float yDelta = mouseTracker.getDeltaMouseY();
scaleFactor += yDelta*2.0;
if (scaleFactor < 0.25) {
scaleFactor = 0.25;
}
if (scaleFactor > 10.0) {
scaleFactor = 10.0;
}
resetScaleFactor = false;
updateScaleFactor(scaleFactor);
} else { } else {
setStatusText("Click and drag to adjust center frequency. 'B' to toggle decibels display."); setStatusText("Drag horitontal to adjust center frequency. Right-drag to adjust vertical scale, click to reset. 'B' to toggle decibels display.");
} }
} }
@ -182,3 +234,14 @@ void SpectrumCanvas::attachWaterfallCanvas(WaterfallCanvas* canvas_in) {
SpectrumVisualDataQueue *SpectrumCanvas::getVisualDataQueue() { SpectrumVisualDataQueue *SpectrumCanvas::getVisualDataQueue() {
return &visualDataQueue; return &visualDataQueue;
} }
void SpectrumCanvas::OnMouseRightDown(wxMouseEvent& event) {
mouseTracker.OnMouseRightDown(event);
}
void SpectrumCanvas::OnMouseRightReleased(wxMouseEvent& event) {
if (!mouseTracker.getOriginDeltaMouseY()) {
resetScaleFactor = true;
}
mouseTracker.OnMouseRightReleased(event);
}

View File

@ -22,6 +22,9 @@ public:
void setShowDb(bool showDb); void setShowDb(bool showDb);
bool getShowDb(); bool getShowDb();
void setView(long long center_freq_in, int bandwidth_in);
void disableView();
SpectrumVisualDataQueue *getVisualDataQueue(); SpectrumVisualDataQueue *getVisualDataQueue();
private: private:
@ -35,10 +38,17 @@ private:
void OnMouseReleased(wxMouseEvent& event); void OnMouseReleased(wxMouseEvent& event);
void OnMouseEnterWindow(wxMouseEvent& event); void OnMouseEnterWindow(wxMouseEvent& event);
void OnMouseLeftWindow(wxMouseEvent& event); void OnMouseLeftWindow(wxMouseEvent& event);
void OnMouseRightDown(wxMouseEvent& event);
void OnMouseRightReleased(wxMouseEvent& event);
void updateScaleFactor(float factor);
PrimaryGLContext *glContext; PrimaryGLContext *glContext;
WaterfallCanvas *waterfallCanvas; WaterfallCanvas *waterfallCanvas;
SpectrumPanel spectrumPanel; SpectrumPanel spectrumPanel;
float scaleFactor;
int bwChange;
bool resetScaleFactor;
SpectrumVisualDataQueue visualDataQueue; SpectrumVisualDataQueue visualDataQueue;