mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-10-01 01:06:35 -04:00
Spectrum: implemented linear scale mode
This commit is contained in:
parent
d5f153ff75
commit
f6c596d55a
@ -20,18 +20,20 @@ SpectrumVis::SpectrumVis(Real scalef, GLSpectrum* glSpectrum) :
|
|||||||
BasebandSampleSink(),
|
BasebandSampleSink(),
|
||||||
m_fft(FFTEngine::create()),
|
m_fft(FFTEngine::create()),
|
||||||
m_fftBuffer(MAX_FFT_SIZE),
|
m_fftBuffer(MAX_FFT_SIZE),
|
||||||
m_logPowerSpectrum(MAX_FFT_SIZE),
|
m_powerSpectrum(MAX_FFT_SIZE),
|
||||||
m_fftBufferFill(0),
|
m_fftBufferFill(0),
|
||||||
m_needMoreSamples(false),
|
m_needMoreSamples(false),
|
||||||
m_scalef(scalef),
|
m_scalef(scalef),
|
||||||
m_glSpectrum(glSpectrum),
|
m_glSpectrum(glSpectrum),
|
||||||
m_averageNb(0),
|
m_averageNb(0),
|
||||||
m_averagingMode(AvgModeNone),
|
m_averagingMode(AvgModeNone),
|
||||||
|
m_linear(false),
|
||||||
m_ofs(0),
|
m_ofs(0),
|
||||||
|
m_powFFTDiv(1.0),
|
||||||
m_mutex(QMutex::Recursive)
|
m_mutex(QMutex::Recursive)
|
||||||
{
|
{
|
||||||
setObjectName("SpectrumVis");
|
setObjectName("SpectrumVis");
|
||||||
handleConfigure(1024, 0, 0, AvgModeNone, FFTWindow::BlackmanHarris);
|
handleConfigure(1024, 0, 0, AvgModeNone, FFTWindow::BlackmanHarris, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
SpectrumVis::~SpectrumVis()
|
SpectrumVis::~SpectrumVis()
|
||||||
@ -120,9 +122,9 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
{
|
{
|
||||||
c = fftOut[i];
|
c = fftOut[i];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i * 2] = v;
|
m_powerSpectrum[i * 2] = v;
|
||||||
m_logPowerSpectrum[i * 2 + 1] = v;
|
m_powerSpectrum[i * 2 + 1] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -131,18 +133,18 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
{
|
{
|
||||||
c = fftOut[i + halfSize];
|
c = fftOut[i + halfSize];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i] = v;
|
m_powerSpectrum[i] = v;
|
||||||
|
|
||||||
c = fftOut[i];
|
c = fftOut[i];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i + halfSize] = v;
|
m_powerSpectrum[i + halfSize] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// send new data to visualisation
|
// send new data to visualisation
|
||||||
m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
|
m_glSpectrum->newSpectrum(m_powerSpectrum, m_fftSize);
|
||||||
}
|
}
|
||||||
else if (m_averagingMode == AvgModeMoving)
|
else if (m_averagingMode == AvgModeMoving)
|
||||||
{
|
{
|
||||||
@ -153,9 +155,9 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
c = fftOut[i];
|
c = fftOut[i];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_movingAverage.storeAndGetAvg(v, i);
|
v = m_movingAverage.storeAndGetAvg(v, i);
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i * 2] = v;
|
m_powerSpectrum[i * 2] = v;
|
||||||
m_logPowerSpectrum[i * 2 + 1] = v;
|
m_powerSpectrum[i * 2 + 1] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -165,19 +167,19 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
c = fftOut[i + halfSize];
|
c = fftOut[i + halfSize];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_movingAverage.storeAndGetAvg(v, i+halfSize);
|
v = m_movingAverage.storeAndGetAvg(v, i+halfSize);
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i] = v;
|
m_powerSpectrum[i] = v;
|
||||||
|
|
||||||
c = fftOut[i];
|
c = fftOut[i];
|
||||||
v = c.real() * c.real() + c.imag() * c.imag();
|
v = c.real() * c.real() + c.imag() * c.imag();
|
||||||
v = m_movingAverage.storeAndGetAvg(v, i);
|
v = m_movingAverage.storeAndGetAvg(v, i);
|
||||||
v = m_mult * log2f(v) + m_ofs;
|
v = m_linear ? v/m_powFFTDiv : m_mult * log2f(v) + m_ofs;
|
||||||
m_logPowerSpectrum[i + halfSize] = v;
|
m_powerSpectrum[i + halfSize] = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// send new data to visualisation
|
// send new data to visualisation
|
||||||
m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
|
m_glSpectrum->newSpectrum(m_powerSpectrum, m_fftSize);
|
||||||
m_movingAverage.nextAverage();
|
m_movingAverage.nextAverage();
|
||||||
}
|
}
|
||||||
else if (m_averagingMode == AvgModeFixed)
|
else if (m_averagingMode == AvgModeFixed)
|
||||||
@ -193,9 +195,9 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
|
|
||||||
if (m_fixedAverage.storeAndGetAvg(avg, v, i))
|
if (m_fixedAverage.storeAndGetAvg(avg, v, i))
|
||||||
{
|
{
|
||||||
avg = m_mult * log2f(avg) + m_ofs;
|
avg = m_linear ? v/m_powFFTDiv : m_mult * log2f(avg) + m_ofs;
|
||||||
m_logPowerSpectrum[i * 2] = avg;
|
m_powerSpectrum[i * 2] = avg;
|
||||||
m_logPowerSpectrum[i * 2 + 1] = avg;
|
m_powerSpectrum[i * 2 + 1] = avg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,8 +210,8 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
|
|
||||||
if (m_fixedAverage.storeAndGetAvg(avg, v, i+halfSize))
|
if (m_fixedAverage.storeAndGetAvg(avg, v, i+halfSize))
|
||||||
{ // result available
|
{ // result available
|
||||||
avg = m_mult * log2f(avg) + m_ofs;
|
avg = m_linear ? v/m_powFFTDiv : m_mult * log2f(avg) + m_ofs;
|
||||||
m_logPowerSpectrum[i] = avg;
|
m_powerSpectrum[i] = avg;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = fftOut[i];
|
c = fftOut[i];
|
||||||
@ -217,8 +219,8 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
|
|
||||||
if (m_fixedAverage.storeAndGetAvg(avg, v, i))
|
if (m_fixedAverage.storeAndGetAvg(avg, v, i))
|
||||||
{ // result available
|
{ // result available
|
||||||
avg = m_mult * log2f(avg) + m_ofs;
|
avg = m_linear ? v/m_powFFTDiv : m_mult * log2f(avg) + m_ofs;
|
||||||
m_logPowerSpectrum[i + halfSize] = avg;
|
m_powerSpectrum[i + halfSize] = avg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,7 +228,7 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
|
|||||||
if (m_fixedAverage.nextAverage())
|
if (m_fixedAverage.nextAverage())
|
||||||
{ // result available
|
{ // result available
|
||||||
// send new data to visualisation
|
// send new data to visualisation
|
||||||
m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
|
m_glSpectrum->newSpectrum(m_powerSpectrum, m_fftSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,7 +270,8 @@ bool SpectrumVis::handleMessage(const Message& message)
|
|||||||
conf.getOverlapPercent(),
|
conf.getOverlapPercent(),
|
||||||
conf.getAverageNb(),
|
conf.getAverageNb(),
|
||||||
conf.getAveragingMode(),
|
conf.getAveragingMode(),
|
||||||
conf.getWindow());
|
conf.getWindow(),
|
||||||
|
conf.getLinear());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -281,7 +284,8 @@ void SpectrumVis::handleConfigure(int fftSize,
|
|||||||
int overlapPercent,
|
int overlapPercent,
|
||||||
unsigned int averageNb,
|
unsigned int averageNb,
|
||||||
AveragingMode averagingMode,
|
AveragingMode averagingMode,
|
||||||
FFTWindow::Function window)
|
FFTWindow::Function window,
|
||||||
|
bool linear)
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
|
||||||
@ -317,5 +321,7 @@ void SpectrumVis::handleConfigure(int fftSize,
|
|||||||
m_fixedAverage.resize(fftSize, averageNb);
|
m_fixedAverage.resize(fftSize, averageNb);
|
||||||
m_averageNb = averageNb;
|
m_averageNb = averageNb;
|
||||||
m_averagingMode = averagingMode;
|
m_averagingMode = averagingMode;
|
||||||
|
m_linear = linear;
|
||||||
m_ofs = 20.0f * log10f(1.0f / m_fftSize);
|
m_ofs = 20.0f * log10f(1.0f / m_fftSize);
|
||||||
|
m_powFFTDiv = m_fftSize*m_fftSize;
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ private:
|
|||||||
FFTWindow m_window;
|
FFTWindow m_window;
|
||||||
|
|
||||||
std::vector<Complex> m_fftBuffer;
|
std::vector<Complex> m_fftBuffer;
|
||||||
std::vector<Real> m_logPowerSpectrum;
|
std::vector<Real> m_powerSpectrum;
|
||||||
|
|
||||||
std::size_t m_fftSize;
|
std::size_t m_fftSize;
|
||||||
std::size_t m_overlapPercent;
|
std::size_t m_overlapPercent;
|
||||||
@ -97,8 +97,10 @@ private:
|
|||||||
FixedAverage2D<double> m_fixedAverage;
|
FixedAverage2D<double> m_fixedAverage;
|
||||||
unsigned int m_averageNb;
|
unsigned int m_averageNb;
|
||||||
AveragingMode m_averagingMode;
|
AveragingMode m_averagingMode;
|
||||||
|
bool m_linear;
|
||||||
|
|
||||||
Real m_ofs;
|
Real m_ofs;
|
||||||
|
Real m_powFFTDiv;
|
||||||
static const Real m_mult;
|
static const Real m_mult;
|
||||||
|
|
||||||
QMutex m_mutex;
|
QMutex m_mutex;
|
||||||
@ -107,7 +109,8 @@ private:
|
|||||||
int overlapPercent,
|
int overlapPercent,
|
||||||
unsigned int averageNb,
|
unsigned int averageNb,
|
||||||
AveragingMode averagingMode,
|
AveragingMode averagingMode,
|
||||||
FFTWindow::Function window);
|
FFTWindow::Function window,
|
||||||
|
bool linear);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_SPECTRUMVIS_H
|
#endif // INCLUDE_SPECTRUMVIS_H
|
||||||
|
@ -39,6 +39,7 @@ GLSpectrum::GLSpectrum(QWidget* parent) :
|
|||||||
m_centerFrequency(100000000),
|
m_centerFrequency(100000000),
|
||||||
m_referenceLevel(0),
|
m_referenceLevel(0),
|
||||||
m_powerRange(100),
|
m_powerRange(100),
|
||||||
|
m_linear(false),
|
||||||
m_decay(0),
|
m_decay(0),
|
||||||
m_sampleRate(500000),
|
m_sampleRate(500000),
|
||||||
m_timingRate(1),
|
m_timingRate(1),
|
||||||
@ -291,6 +292,13 @@ void GLSpectrum::setDisplayTraceIntensity(int intensity)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLSpectrum::setLinear(bool linear)
|
||||||
|
{
|
||||||
|
m_linear = linear;
|
||||||
|
m_changesPending = true;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
void GLSpectrum::addChannelMarker(ChannelMarker* channelMarker)
|
void GLSpectrum::addChannelMarker(ChannelMarker* channelMarker)
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
@ -1075,7 +1083,13 @@ void GLSpectrum::applyChanges()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_powerScale.setSize(histogramHeight);
|
m_powerScale.setSize(histogramHeight);
|
||||||
|
|
||||||
|
if (m_linear) {
|
||||||
|
m_powerScale.setRange(Unit::Scientific, m_referenceLevel - m_powerRange, m_referenceLevel);
|
||||||
|
} else {
|
||||||
m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel);
|
m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel);
|
||||||
|
}
|
||||||
|
|
||||||
leftMargin = m_timeScale.getScaleWidth();
|
leftMargin = m_timeScale.getScaleWidth();
|
||||||
|
|
||||||
if(m_powerScale.getScaleWidth() > leftMargin)
|
if(m_powerScale.getScaleWidth() > leftMargin)
|
||||||
|
@ -81,6 +81,7 @@ public:
|
|||||||
void setDisplayGrid(bool display);
|
void setDisplayGrid(bool display);
|
||||||
void setDisplayGridIntensity(int intensity);
|
void setDisplayGridIntensity(int intensity);
|
||||||
void setDisplayTraceIntensity(int intensity);
|
void setDisplayTraceIntensity(int intensity);
|
||||||
|
void setLinear(bool linear);
|
||||||
qint32 getSampleRate() const { return m_sampleRate; }
|
qint32 getSampleRate() const { return m_sampleRate; }
|
||||||
|
|
||||||
void addChannelMarker(ChannelMarker* channelMarker);
|
void addChannelMarker(ChannelMarker* channelMarker);
|
||||||
@ -130,6 +131,7 @@ private:
|
|||||||
qint64 m_centerFrequency;
|
qint64 m_centerFrequency;
|
||||||
Real m_referenceLevel;
|
Real m_referenceLevel;
|
||||||
Real m_powerRange;
|
Real m_powerRange;
|
||||||
|
bool m_linear;
|
||||||
int m_decay;
|
int m_decay;
|
||||||
quint32 m_sampleRate;
|
quint32 m_sampleRate;
|
||||||
quint32 m_timingRate;
|
quint32 m_timingRate;
|
||||||
|
@ -77,6 +77,7 @@ void GLSpectrumGUI::resetToDefaults()
|
|||||||
m_invert = true;
|
m_invert = true;
|
||||||
m_averagingMode = AvgModeNone;
|
m_averagingMode = AvgModeNone;
|
||||||
m_averagingIndex = 0;
|
m_averagingIndex = 0;
|
||||||
|
m_linear = false;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +104,7 @@ QByteArray GLSpectrumGUI::serialize() const
|
|||||||
s.writeReal(18, m_glSpectrum->getWaterfallShare());
|
s.writeReal(18, m_glSpectrum->getWaterfallShare());
|
||||||
s.writeS32(19, (int) m_averagingMode);
|
s.writeS32(19, (int) m_averagingMode);
|
||||||
s.writeS32(20, (qint32) getAveragingValue(m_averagingIndex));
|
s.writeS32(20, (qint32) getAveragingValue(m_averagingIndex));
|
||||||
|
s.writeBool(21, m_linear);
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +144,7 @@ bool GLSpectrumGUI::deserialize(const QByteArray& data)
|
|||||||
d.readS32(20, &tmp, 0);
|
d.readS32(20, &tmp, 0);
|
||||||
m_averagingIndex = getAveragingIndex(tmp);
|
m_averagingIndex = getAveragingIndex(tmp);
|
||||||
m_averagingNb = getAveragingValue(m_averagingIndex);
|
m_averagingNb = getAveragingValue(m_averagingIndex);
|
||||||
|
d.readBool(21, &m_linear, false);
|
||||||
|
|
||||||
m_glSpectrum->setWaterfallShare(waterfallShare);
|
m_glSpectrum->setWaterfallShare(waterfallShare);
|
||||||
applySettings();
|
applySettings();
|
||||||
@ -165,6 +168,7 @@ void GLSpectrumGUI::applySettings()
|
|||||||
ui->levelRange->setCurrentIndex((100 - m_powerRange) / 5);
|
ui->levelRange->setCurrentIndex((100 - m_powerRange) / 5);
|
||||||
ui->averaging->setCurrentIndex(m_averagingIndex);
|
ui->averaging->setCurrentIndex(m_averagingIndex);
|
||||||
ui->averagingMode->setCurrentIndex((int) m_averagingMode);
|
ui->averagingMode->setCurrentIndex((int) m_averagingMode);
|
||||||
|
ui->linscale->setChecked(m_linear);
|
||||||
ui->decay->setSliderPosition(m_decay);
|
ui->decay->setSliderPosition(m_decay);
|
||||||
ui->holdoff->setSliderPosition(m_histogramLateHoldoff);
|
ui->holdoff->setSliderPosition(m_histogramLateHoldoff);
|
||||||
ui->stroke->setSliderPosition(m_histogramStroke);
|
ui->stroke->setSliderPosition(m_histogramStroke);
|
||||||
@ -193,6 +197,7 @@ void GLSpectrumGUI::applySettings()
|
|||||||
m_glSpectrum->setInvertedWaterfall(m_invert);
|
m_glSpectrum->setInvertedWaterfall(m_invert);
|
||||||
m_glSpectrum->setDisplayGrid(m_displayGrid);
|
m_glSpectrum->setDisplayGrid(m_displayGrid);
|
||||||
m_glSpectrum->setDisplayGridIntensity(m_displayGridIntensity);
|
m_glSpectrum->setDisplayGridIntensity(m_displayGridIntensity);
|
||||||
|
m_glSpectrum->setLinear(m_linear);
|
||||||
|
|
||||||
if (m_spectrumVis) {
|
if (m_spectrumVis) {
|
||||||
m_spectrumVis->configure(m_messageQueueToVis,
|
m_spectrumVis->configure(m_messageQueueToVis,
|
||||||
@ -298,21 +303,43 @@ void GLSpectrumGUI::on_linscale_toggled(bool checked)
|
|||||||
(FFTWindow::Function)m_fftWindow,
|
(FFTWindow::Function)m_fftWindow,
|
||||||
m_linear);
|
m_linear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(m_glSpectrum != 0)
|
||||||
|
{
|
||||||
|
Real refLevel = m_linear ? pow(10.0, m_refLevel/10.0) : m_refLevel;
|
||||||
|
Real powerRange = m_linear ? pow(10.0, m_refLevel/10.0) : m_powerRange;
|
||||||
|
qDebug("GLSpectrumGUI::on_linscale_toggled: refLevel: %e powerRange: %e", refLevel, powerRange);
|
||||||
|
m_glSpectrum->setReferenceLevel(refLevel);
|
||||||
|
m_glSpectrum->setPowerRange(powerRange);
|
||||||
|
m_glSpectrum->setLinear(m_linear);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSpectrumGUI::on_refLevel_currentIndexChanged(int index)
|
void GLSpectrumGUI::on_refLevel_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
m_refLevel = 0 - index * 5;
|
m_refLevel = 0 - index * 5;
|
||||||
if(m_glSpectrum != 0) {
|
|
||||||
m_glSpectrum->setReferenceLevel(m_refLevel);
|
if(m_glSpectrum != 0)
|
||||||
|
{
|
||||||
|
Real refLevel = m_linear ? pow(10.0, m_refLevel/10.0) : m_refLevel;
|
||||||
|
Real powerRange = m_linear ? pow(10.0, m_refLevel/10.0) : m_powerRange;
|
||||||
|
qDebug("GLSpectrumGUI::on_refLevel_currentIndexChanged: refLevel: %e ", refLevel);
|
||||||
|
m_glSpectrum->setReferenceLevel(refLevel);
|
||||||
|
m_glSpectrum->setPowerRange(powerRange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSpectrumGUI::on_levelRange_currentIndexChanged(int index)
|
void GLSpectrumGUI::on_levelRange_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
m_powerRange = 100 - index * 5;
|
m_powerRange = 100 - index * 5;
|
||||||
if(m_glSpectrum != 0) {
|
|
||||||
m_glSpectrum->setPowerRange(m_powerRange);
|
if(m_glSpectrum != 0)
|
||||||
|
{
|
||||||
|
Real refLevel = m_linear ? pow(10.0, m_refLevel/10.0) : m_refLevel;
|
||||||
|
Real powerRange = m_linear ? pow(10.0, m_refLevel/10.0) : m_powerRange;
|
||||||
|
qDebug("GLSpectrumGUI::on_levelRange_currentIndexChanged: powerRange: %e", powerRange);
|
||||||
|
m_glSpectrum->setReferenceLevel(refLevel);
|
||||||
|
m_glSpectrum->setPowerRange(powerRange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,8 @@ namespace Unit {
|
|||||||
AngleDegrees,
|
AngleDegrees,
|
||||||
Time,
|
Time,
|
||||||
TimeHMS,
|
TimeHMS,
|
||||||
Volt
|
Volt,
|
||||||
|
Scientific
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,8 +31,12 @@ QString ScaleEngine::formatTick(double value, int decimalPlaces)
|
|||||||
{
|
{
|
||||||
if (m_physicalUnit != Unit::TimeHMS)
|
if (m_physicalUnit != Unit::TimeHMS)
|
||||||
{
|
{
|
||||||
|
if (m_physicalUnit == Unit::Scientific) {
|
||||||
|
return QString("%1").arg(m_makeOpposite ? -value : value, 0, 'e', 2);
|
||||||
|
} else {
|
||||||
return QString("%1").arg(m_makeOpposite ? -value : value, 0, 'f', decimalPlaces);
|
return QString("%1").arg(m_makeOpposite ? -value : value, 0, 'f', decimalPlaces);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_scale < 1.0f) { // sub second prints just as is
|
if (m_scale < 1.0f) { // sub second prints just as is
|
||||||
@ -106,6 +110,7 @@ void ScaleEngine::calcScaleFactor()
|
|||||||
|
|
||||||
switch(m_physicalUnit) {
|
switch(m_physicalUnit) {
|
||||||
case Unit::None:
|
case Unit::None:
|
||||||
|
case Unit::Scientific:
|
||||||
m_unitStr.clear();
|
m_unitStr.clear();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user