From d8317dd2a57432bc1049ceb150ec1dc4a5465f0f Mon Sep 17 00:00:00 2001 From: Teuniz Date: Wed, 6 Jan 2016 19:36:52 +0100 Subject: [PATCH] FFT partly works. In logarithmic mode (dB) it's ready. Vrms mode needs still some work. --- global.h | 2 +- interface.cpp | 133 +++++++++++++++++++++++++++++++++++++++++- mainwindow.cpp | 152 ++++++++++++++++++++++++++++++++++++++++++++++-- mainwindow.h | 9 +++ signalcurve.cpp | 16 ++--- 5 files changed, 296 insertions(+), 16 deletions(-) diff --git a/global.h b/global.h index 293b1dd..bd9d686 100644 --- a/global.h +++ b/global.h @@ -35,7 +35,7 @@ #define PROGRAM_NAME "DSRemote" -#define PROGRAM_VERSION "0.31_1601061154" +#define PROGRAM_VERSION "0.31_1601061935" #define MAX_PATHLEN 4096 diff --git a/interface.cpp b/interface.cpp index 7354b47..94aec03 100644 --- a/interface.cpp +++ b/interface.cpp @@ -2184,7 +2184,8 @@ void UI_Mainwindow::math_menu() submenufftctr, submenuffthzdiv, submenufftsrc, - submenufftvscale; + submenufftvscale, + submenufftoffset; QList actionList; @@ -2254,6 +2255,26 @@ void UI_Mainwindow::math_menu() strcat(str, "Hz/Div"); submenuffthzdiv.addAction(str, this, SLOT(select_fft_hzdiv_200())); + submenufftoffset.setTitle("Offset"); + sprintf(str, "%+.0fdB", devparms.fft_vscale * 4.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetp4())); + sprintf(str, "%+.0fdB", devparms.fft_vscale * 3.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetp3())); + sprintf(str, "%+.0fdB", devparms.fft_vscale * 2.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetp2())); + sprintf(str, "%+.0fdB", devparms.fft_vscale); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetp1())); + strcpy(str, "0dB"); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffset0())); + sprintf(str, "%.0fdB", devparms.fft_vscale * -1.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetm1())); + sprintf(str, "%.0fdB", devparms.fft_vscale * -2.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetm2())); + sprintf(str, "%.0fdB", devparms.fft_vscale * -3.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetm3())); + sprintf(str, "%.0fdB", devparms.fft_vscale * -4.0); + submenufftoffset.addAction(str, this, SLOT(select_fft_voffsetm4())); + submenufftvscale.setTitle("Scale"); submenufftvscale.addAction("2dB/Div", this, SLOT(select_fft_vscale2())); submenufftvscale.addAction("5dB/Div", this, SLOT(select_fft_vscale5())); @@ -2300,6 +2321,7 @@ void UI_Mainwindow::math_menu() submenufft.addMenu(&submenufftsrc); submenufft.addMenu(&submenufftctr); submenufft.addMenu(&submenuffthzdiv); + submenufft.addMenu(&submenufftoffset); submenufft.addMenu(&submenufftvscale); actionList = submenufft.actions(); if(devparms.math_fft == 1) @@ -3613,6 +3635,115 @@ void UI_Mainwindow::select_fft_vscale20() } +void UI_Mainwindow::select_fft_voffsetp4() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * 4.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetp3() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * 3.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetp2() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * 2.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetp1() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffset0() +{ + char str[512]; + + devparms.fft_voffset = 0.0; + + sprintf(str, "FFT offset: %.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetm1() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * -1.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetm2() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * -2.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetm3() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * -3.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + +void UI_Mainwindow::select_fft_voffsetm4() +{ + char str[512]; + + devparms.fft_voffset = devparms.fft_vscale * -4.0; + + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); +} + + + diff --git a/mainwindow.cpp b/mainwindow.cpp index ef5d50b..e6f0314 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2244,7 +2244,17 @@ void UI_Mainwindow::former_page() { char str[256]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.activechannel < 0) { return; } @@ -2311,7 +2321,17 @@ void UI_Mainwindow::next_page() { char str[256]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.activechannel < 0) { return; } @@ -2378,7 +2398,22 @@ void UI_Mainwindow::shift_page_left() { char str[256]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.math_fft && devparms.math_fft_split) + { + return; + } + + if(devparms.activechannel < 0) { return; } @@ -2445,7 +2480,22 @@ void UI_Mainwindow::shift_page_right() { char str[256]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.math_fft && devparms.math_fft_split) + { + return; + } + + if(devparms.activechannel < 0) { return; } @@ -2699,7 +2749,48 @@ void UI_Mainwindow::chan_scale_plus() char str[512]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.math_fft && devparms.math_fft_split) + { + if(devparms.math_fft_unit == 1) + { + devparms.fft_vscale = round_up_step125(devparms.fft_vscale, NULL); + + if(devparms.fft_vscale > 20.0) + { + devparms.fft_vscale = 20.0; + } + + sprintf(str, "FFT scale: %.1fdB/Div", devparms.fft_vscale); + + statusLabel->setText(str); + } + + if(devparms.fft_voffset > (devparms.fft_vscale * 4.0)) + { + devparms.fft_voffset = (devparms.fft_vscale * 4.0); + } + + if(devparms.fft_voffset < (devparms.fft_vscale * -4.0)) + { + devparms.fft_voffset = (devparms.fft_vscale * -4.0); + } + + waveForm->update(); + + return; + } + + if(devparms.activechannel < 0) { return; } @@ -2773,6 +2864,10 @@ void UI_Mainwindow::shift_trace_up() devparms.fft_voffset = (devparms.fft_vscale * 4.0); } + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); + waveForm->label_active = LABEL_ACTIVE_FFT; label_timer->start(LABEL_TIMER_IVAL); @@ -2841,6 +2936,10 @@ void UI_Mainwindow::shift_trace_down() devparms.fft_voffset = (devparms.fft_vscale * -4.0); } + sprintf(str, "FFT offset: %+.0fdB", devparms.fft_voffset); + + statusLabel->setText(str); + waveForm->label_active = LABEL_ACTIVE_FFT; label_timer->start(LABEL_TIMER_IVAL); @@ -2892,7 +2991,48 @@ void UI_Mainwindow::chan_scale_minus() char str[512]; - if((device == NULL) || (!devparms.connected) || (devparms.activechannel < 0)) + if(device == NULL) + { + return; + } + + if(!devparms.connected) + { + return; + } + + if(devparms.math_fft && devparms.math_fft_split) + { + if(devparms.math_fft_unit == 1) + { + devparms.fft_vscale = round_down_step125(devparms.fft_vscale, NULL); + + if(devparms.fft_vscale < 2.0) + { + devparms.fft_vscale = 2.0; + } + + sprintf(str, "FFT scale: %.1fdB/Div", devparms.fft_vscale); + + statusLabel->setText(str); + } + + if(devparms.fft_voffset > (devparms.fft_vscale * 4.0)) + { + devparms.fft_voffset = (devparms.fft_vscale * 4.0); + } + + if(devparms.fft_voffset < (devparms.fft_vscale * -4.0)) + { + devparms.fft_voffset = (devparms.fft_vscale * -4.0); + } + + waveForm->update(); + + return; + } + + if(devparms.activechannel < 0) { return; } diff --git a/mainwindow.h b/mainwindow.h index 60ad761..6053ff8 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -412,6 +412,15 @@ private slots: void select_fft_vscale5(); void select_fft_vscale10(); void select_fft_vscale20(); + void select_fft_voffsetp4(); + void select_fft_voffsetp3(); + void select_fft_voffsetp2(); + void select_fft_voffsetp1(); + void select_fft_voffset0(); + void select_fft_voffsetm1(); + void select_fft_voffsetm2(); + void select_fft_voffsetm3(); + void select_fft_voffsetm4(); protected: void closeEvent(QCloseEvent *); diff --git a/signalcurve.cpp b/signalcurve.cpp index be22699..6113b95 100644 --- a/signalcurve.cpp +++ b/signalcurve.cpp @@ -572,7 +572,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { sprintf(str, "%.1fdB", devparms->fft_voffset); - paintLabel(painter, 20, curve_h * 1.85 - 50.0, 100, 20, str, QColor(128, 0, 255)); + paintLabel(painter, 20, curve_h * 1.85 - 50.0, 100, 20, str, QColor(128, 64, 255)); } } @@ -718,7 +718,7 @@ void SignalCurve::drawFFT(QPainter *painter, int curve_h_b, int curve_w_b) fft_arrow_pos = (curve_h / 2.0) - (((double)curve_h / (8.0 * devparms->fft_vscale)) * devparms->fft_voffset); - drawArrow(painter, 0, fft_arrow_pos, 0, QColor(128, 0, 255), 'M'); + drawArrow(painter, 0, fft_arrow_pos, 0, QColor(128, 64, 255), 'M'); } /////////////////////////////////// FFT: draw the curve /////////////////////////////////////////// @@ -747,7 +747,7 @@ void SignalCurve::drawFFT(QPainter *painter, int curve_h_b, int curve_w_b) fft_h_offset = (curve_w / 2) - ((devparms->math_fft_hcenter / devparms->math_fft_hscale) * curve_w / devparms->hordivisions); - painter->setPen(QPen(QBrush(QColor(128, 0, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)); + painter->setPen(QPen(QBrush(QColor(128, 64, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)); for(i=0; ifftbufsz; i++) { @@ -775,19 +775,19 @@ void SignalCurve::drawFFT(QPainter *painter, int curve_h_b, int curve_w_b) } } - sprintf(str, "FFT: CH%i ", devparms->math_fft_src + 1); + sprintf(str, "FFT: CH%i ", devparms->math_fft_src + 1); convert_to_metric_suffix(str + strlen(str), devparms->fft_vscale, 2); - strcat(str, "dBV/Div Center "); + strcat(str, "dBV/Div Center "); convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hcenter, 1); - strcat(str, "Hz "); + strcat(str, "Hz "); convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hscale, 2); - strcat(str, "Hz/Div "); + strcat(str, "Hz/Div "); if(devparms->timebasedelayenable) { @@ -806,7 +806,7 @@ void SignalCurve::drawFFT(QPainter *painter, int curve_h_b, int curve_w_b) } else { - painter->setPen(QPen(QBrush(QColor(128, 0, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)); + painter->setPen(QPen(QBrush(QColor(128, 64, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin)); sprintf(str, "FFT: CH%i Data Invalid!", devparms->math_fft_src + 1);