FFT partly works. In logarithmic mode (dB) it's ready.

Vrms mode needs still some work.
merge-requests/1/head
Teuniz 2016-01-06 19:36:52 +01:00
rodzic 9afc59deae
commit d8317dd2a5
5 zmienionych plików z 296 dodań i 16 usunięć

Wyświetl plik

@ -35,7 +35,7 @@
#define PROGRAM_NAME "DSRemote"
#define PROGRAM_VERSION "0.31_1601061154"
#define PROGRAM_VERSION "0.31_1601061935"
#define MAX_PATHLEN 4096

Wyświetl plik

@ -2184,7 +2184,8 @@ void UI_Mainwindow::math_menu()
submenufftctr,
submenuffthzdiv,
submenufftsrc,
submenufftvscale;
submenufftvscale,
submenufftoffset;
QList<QAction *> 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);
}

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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 *);

Wyświetl plik

@ -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; i<devparms->fftbufsz; 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);