kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			Spectrum averaging: fixed average (1)
							rodzic
							
								
									a23447ed4b
								
							
						
					
					
						commit
						56e49baa3b
					
				| 
						 | 
					@ -359,7 +359,7 @@ BFMDemodGUI::BFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
 | 
				
			||||||
	ui->glSpectrum->setDisplayWaterfall(false);
 | 
						ui->glSpectrum->setDisplayWaterfall(false);
 | 
				
			||||||
	ui->glSpectrum->setDisplayMaxHold(false);
 | 
						ui->glSpectrum->setDisplayMaxHold(false);
 | 
				
			||||||
	ui->glSpectrum->setSsbSpectrum(true);
 | 
						ui->glSpectrum->setSsbSpectrum(true);
 | 
				
			||||||
	m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, FFTWindow::BlackmanHarris);
 | 
						m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, 0, FFTWindow::BlackmanHarris);
 | 
				
			||||||
	connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
						connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_channelMarker.blockSignals(true);
 | 
						m_channelMarker.blockSignals(true);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,7 +187,7 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
 | 
				
			||||||
	ui->glSpectrum->setSampleRate(ui->sampleRate->text().toInt());
 | 
						ui->glSpectrum->setSampleRate(ui->sampleRate->text().toInt());
 | 
				
			||||||
	ui->glSpectrum->setDisplayWaterfall(true);
 | 
						ui->glSpectrum->setDisplayWaterfall(true);
 | 
				
			||||||
	ui->glSpectrum->setDisplayMaxHold(true);
 | 
						ui->glSpectrum->setDisplayMaxHold(true);
 | 
				
			||||||
	m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, FFTWindow::BlackmanHarris);
 | 
						m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, 0, FFTWindow::BlackmanHarris);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
 | 
						ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
 | 
				
			||||||
	connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
						connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,7 +142,7 @@ UDPSinkGUI::UDPSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
 | 
				
			||||||
    ui->glSpectrum->setSampleRate(ui->sampleRate->text().toInt());
 | 
					    ui->glSpectrum->setSampleRate(ui->sampleRate->text().toInt());
 | 
				
			||||||
    ui->glSpectrum->setDisplayWaterfall(true);
 | 
					    ui->glSpectrum->setDisplayWaterfall(true);
 | 
				
			||||||
    ui->glSpectrum->setDisplayMaxHold(true);
 | 
					    ui->glSpectrum->setDisplayMaxHold(true);
 | 
				
			||||||
    m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, FFTWindow::BlackmanHarris);
 | 
					    m_spectrumVis->configure(m_spectrumVis->getInputMessageQueue(), 64, 10, 0, 0, FFTWindow::BlackmanHarris);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
 | 
					    ui->glSpectrum->connectTimer(MainWindow::getInstance()->getMasterTimer());
 | 
				
			||||||
    connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
					    connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,121 @@
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Copyright (C) 2018 F4EXB                                                      //
 | 
				
			||||||
 | 
					// written by Edouard Griffiths                                                  //
 | 
				
			||||||
 | 
					//                                                                               //
 | 
				
			||||||
 | 
					// This program is free software; you can redistribute it and/or modify          //
 | 
				
			||||||
 | 
					// it under the terms of the GNU General Public License as published by          //
 | 
				
			||||||
 | 
					// the Free Software Foundation as version 3 of the License, or                  //
 | 
				
			||||||
 | 
					//                                                                               //
 | 
				
			||||||
 | 
					// This program is distributed in the hope that it will be useful,               //
 | 
				
			||||||
 | 
					// but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
				
			||||||
 | 
					// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
				
			||||||
 | 
					// GNU General Public License V3 for more details.                               //
 | 
				
			||||||
 | 
					//                                                                               //
 | 
				
			||||||
 | 
					// You should have received a copy of the GNU General Public License             //
 | 
				
			||||||
 | 
					// along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SDRBASE_UTIL_FIXEDAVERAGE2D_H_
 | 
				
			||||||
 | 
					#define SDRBASE_UTIL_FIXEDAVERAGE2D_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					class FixedAverage2D
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    FixedAverage2D() : m_sum(0), m_sumSize(0), m_width(0), m_size(0), m_avgIndex(0) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ~FixedAverage2D()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_sum) {
 | 
				
			||||||
 | 
					            delete[] m_sum;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void resize(unsigned int width, unsigned int size)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (width > m_sumSize)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_sumSize = width;
 | 
				
			||||||
 | 
					            if (m_sum) {
 | 
				
			||||||
 | 
					                delete[] m_sum;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            m_sum = new T[m_sumSize];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_width = width;
 | 
				
			||||||
 | 
					        m_size = size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        std::fill(m_sum, m_sum+m_width, 0);
 | 
				
			||||||
 | 
					        m_avgIndex = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool storeAndGetAvg(T& avg, T v, unsigned int index)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_size <= 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            avg = v;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_sum[index] += v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (m_avgIndex == m_size - 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            avg = m_sum[index]/m_size;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool storeAndGetSum(T& sum, T v, unsigned int index)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_size <= 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            sum = v;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        m_sum[index] += v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (m_avgIndex < m_size - 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            sum = m_sum[index];
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool nextAverage()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (m_avgIndex == m_size - 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_avgIndex = 0;
 | 
				
			||||||
 | 
					            std::fill(m_sum, m_sum+m_width, 0);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            m_avgIndex++;
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    T *m_sum;
 | 
				
			||||||
 | 
					    unsigned int m_sumSize;
 | 
				
			||||||
 | 
					    unsigned int m_width;
 | 
				
			||||||
 | 
					    unsigned int m_size;
 | 
				
			||||||
 | 
					    unsigned int m_avgIndex;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* SDRBASE_UTIL_FIXEDAVERAGE2D_H_ */
 | 
				
			||||||
| 
						 | 
					@ -26,11 +26,12 @@ SpectrumVis::SpectrumVis(Real scalef, GLSpectrum* glSpectrum) :
 | 
				
			||||||
	m_scalef(scalef),
 | 
						m_scalef(scalef),
 | 
				
			||||||
	m_glSpectrum(glSpectrum),
 | 
						m_glSpectrum(glSpectrum),
 | 
				
			||||||
	m_averageNb(0),
 | 
						m_averageNb(0),
 | 
				
			||||||
 | 
						m_averagingMode(AvgModeMoving),
 | 
				
			||||||
	m_ofs(0),
 | 
						m_ofs(0),
 | 
				
			||||||
	m_mutex(QMutex::Recursive)
 | 
						m_mutex(QMutex::Recursive)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	setObjectName("SpectrumVis");
 | 
						setObjectName("SpectrumVis");
 | 
				
			||||||
	handleConfigure(1024, 0, 0, FFTWindow::BlackmanHarris);
 | 
						handleConfigure(1024, 0, 0, AvgModeMoving, FFTWindow::BlackmanHarris);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpectrumVis::~SpectrumVis()
 | 
					SpectrumVis::~SpectrumVis()
 | 
				
			||||||
| 
						 | 
					@ -38,9 +39,14 @@ SpectrumVis::~SpectrumVis()
 | 
				
			||||||
	delete m_fft;
 | 
						delete m_fft;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SpectrumVis::configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, unsigned int averagingNb, FFTWindow::Function window)
 | 
					void SpectrumVis::configure(MessageQueue* msgQueue,
 | 
				
			||||||
 | 
					        int fftSize,
 | 
				
			||||||
 | 
					        int overlapPercent,
 | 
				
			||||||
 | 
					        unsigned int averagingNb,
 | 
				
			||||||
 | 
					        int averagingMode,
 | 
				
			||||||
 | 
					        FFTWindow::Function window)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MsgConfigureSpectrumVis* cmd = new MsgConfigureSpectrumVis(fftSize, overlapPercent, averagingNb, window);
 | 
						MsgConfigureSpectrumVis* cmd = new MsgConfigureSpectrumVis(fftSize, overlapPercent, averagingNb, averagingMode, window);
 | 
				
			||||||
	msgQueue->push(cmd);
 | 
						msgQueue->push(cmd);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,13 +111,15 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
 | 
				
			||||||
			Real v;
 | 
								Real v;
 | 
				
			||||||
			std::size_t halfSize = m_fftSize / 2;
 | 
								std::size_t halfSize = m_fftSize / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (m_averagingMode == AvgModeMoving)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
	            if ( positiveOnly )
 | 
						            if ( positiveOnly )
 | 
				
			||||||
	            {
 | 
						            {
 | 
				
			||||||
	                for (std::size_t i = 0; i < halfSize; i++)
 | 
						                for (std::size_t i = 0; i < halfSize; i++)
 | 
				
			||||||
	                {
 | 
						                {
 | 
				
			||||||
	                    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_average.storeAndGetAvg(v, i);
 | 
						                    v = m_movingAverage.storeAndGetAvg(v, i);
 | 
				
			||||||
	                    v = m_mult * log2f(v) + m_ofs;
 | 
						                    v = m_mult * log2f(v) + m_ofs;
 | 
				
			||||||
	                    m_logPowerSpectrum[i * 2] = v;
 | 
						                    m_logPowerSpectrum[i * 2] = v;
 | 
				
			||||||
	                    m_logPowerSpectrum[i * 2 + 1] = v;
 | 
						                    m_logPowerSpectrum[i * 2 + 1] = v;
 | 
				
			||||||
| 
						 | 
					@ -123,13 +131,13 @@ 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_average.storeAndGetAvg(v, i+halfSize);
 | 
						                    v = m_movingAverage.storeAndGetAvg(v, i+halfSize);
 | 
				
			||||||
	                    v = m_mult * log2f(v) + m_ofs;
 | 
						                    v = m_mult * log2f(v) + m_ofs;
 | 
				
			||||||
	                    m_logPowerSpectrum[i] = v;
 | 
						                    m_logPowerSpectrum[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_average.storeAndGetAvg(v, i);
 | 
						                    v = m_movingAverage.storeAndGetAvg(v, i);
 | 
				
			||||||
	                    v = m_mult * log2f(v) + m_ofs;
 | 
						                    v = m_mult * log2f(v) + m_ofs;
 | 
				
			||||||
	                    m_logPowerSpectrum[i + halfSize] = v;
 | 
						                    m_logPowerSpectrum[i + halfSize] = v;
 | 
				
			||||||
	                }
 | 
						                }
 | 
				
			||||||
| 
						 | 
					@ -137,7 +145,57 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	            // send new data to visualisation
 | 
						            // send new data to visualisation
 | 
				
			||||||
	            m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
 | 
						            m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
 | 
				
			||||||
			m_average.nextAverage();
 | 
						            m_movingAverage.nextAverage();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (m_averagingMode == AvgModeFixed)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								    double avg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ( positiveOnly )
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (std::size_t i = 0; i < halfSize; i++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        c = fftOut[i];
 | 
				
			||||||
 | 
					                        v = c.real() * c.real() + c.imag() * c.imag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (m_fixedAverage.storeAndGetAvg(avg, v, i))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            avg = m_mult * log2f(avg) + m_ofs;
 | 
				
			||||||
 | 
					                            m_logPowerSpectrum[i * 2] = avg;
 | 
				
			||||||
 | 
					                            m_logPowerSpectrum[i * 2 + 1] = avg;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (std::size_t i = 0; i < halfSize; i++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        c = fftOut[i + halfSize];
 | 
				
			||||||
 | 
					                        v = c.real() * c.real() + c.imag() * c.imag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (m_fixedAverage.storeAndGetAvg(avg, v, i+halfSize))
 | 
				
			||||||
 | 
					                        { // result available
 | 
				
			||||||
 | 
					                            avg = m_mult * log2f(avg) + m_ofs;
 | 
				
			||||||
 | 
					                            m_logPowerSpectrum[i] = avg;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        c = fftOut[i];
 | 
				
			||||||
 | 
					                        v = c.real() * c.real() + c.imag() * c.imag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (m_fixedAverage.storeAndGetAvg(avg, v, i))
 | 
				
			||||||
 | 
					                        { // result available
 | 
				
			||||||
 | 
					                            avg = m_mult * log2f(avg) + m_ofs;
 | 
				
			||||||
 | 
					                            m_logPowerSpectrum[i + halfSize] = avg;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (m_fixedAverage.nextAverage())
 | 
				
			||||||
 | 
					                { // result available
 | 
				
			||||||
 | 
					                    // send new data to visualisation
 | 
				
			||||||
 | 
					                    m_glSpectrum->newSpectrum(m_logPowerSpectrum, m_fftSize);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// advance buffer respecting the fft overlap factor
 | 
								// advance buffer respecting the fft overlap factor
 | 
				
			||||||
			std::copy(m_fftBuffer.begin() + m_refillSize, m_fftBuffer.end(), m_fftBuffer.begin());
 | 
								std::copy(m_fftBuffer.begin() + m_refillSize, m_fftBuffer.end(), m_fftBuffer.begin());
 | 
				
			||||||
| 
						 | 
					@ -173,7 +231,11 @@ bool SpectrumVis::handleMessage(const Message& message)
 | 
				
			||||||
	if (MsgConfigureSpectrumVis::match(message))
 | 
						if (MsgConfigureSpectrumVis::match(message))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		MsgConfigureSpectrumVis& conf = (MsgConfigureSpectrumVis&) message;
 | 
							MsgConfigureSpectrumVis& conf = (MsgConfigureSpectrumVis&) message;
 | 
				
			||||||
		handleConfigure(conf.getFFTSize(), conf.getOverlapPercent(), conf.getAverageNb(), conf.getWindow());
 | 
							handleConfigure(conf.getFFTSize(),
 | 
				
			||||||
 | 
							        conf.getOverlapPercent(),
 | 
				
			||||||
 | 
							        conf.getAverageNb(),
 | 
				
			||||||
 | 
							        conf.getAveragingMode(),
 | 
				
			||||||
 | 
							        conf.getWindow());
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
| 
						 | 
					@ -182,7 +244,11 @@ bool SpectrumVis::handleMessage(const Message& message)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SpectrumVis::handleConfigure(int fftSize, int overlapPercent, unsigned int averageNb, FFTWindow::Function window)
 | 
					void SpectrumVis::handleConfigure(int fftSize,
 | 
				
			||||||
 | 
					        int overlapPercent,
 | 
				
			||||||
 | 
					        unsigned int averageNb,
 | 
				
			||||||
 | 
					        AveragingMode averagingMode,
 | 
				
			||||||
 | 
					        FFTWindow::Function window)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	QMutexLocker mutexLocker(&m_mutex);
 | 
						QMutexLocker mutexLocker(&m_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,7 +280,9 @@ void SpectrumVis::handleConfigure(int fftSize, int overlapPercent, unsigned int
 | 
				
			||||||
	m_overlapSize = (m_fftSize * m_overlapPercent) / 100;
 | 
						m_overlapSize = (m_fftSize * m_overlapPercent) / 100;
 | 
				
			||||||
	m_refillSize = m_fftSize - m_overlapSize;
 | 
						m_refillSize = m_fftSize - m_overlapSize;
 | 
				
			||||||
	m_fftBufferFill = m_overlapSize;
 | 
						m_fftBufferFill = m_overlapSize;
 | 
				
			||||||
	m_average.resize(fftSize, averageNb);
 | 
						m_movingAverage.resize(fftSize, averageNb);
 | 
				
			||||||
 | 
						m_fixedAverage.resize(fftSize, averageNb);
 | 
				
			||||||
	m_averageNb = averageNb;
 | 
						m_averageNb = averageNb;
 | 
				
			||||||
 | 
						m_averagingMode = averagingMode;
 | 
				
			||||||
	m_ofs = 20.0f * log10f(1.0f / m_fftSize);
 | 
						m_ofs = 20.0f * log10f(1.0f / m_fftSize);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@
 | 
				
			||||||
#include "export.h"
 | 
					#include "export.h"
 | 
				
			||||||
#include "util/message.h"
 | 
					#include "util/message.h"
 | 
				
			||||||
#include "util/movingaverage2d.h"
 | 
					#include "util/movingaverage2d.h"
 | 
				
			||||||
 | 
					#include "util/fixedaverage2d.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GLSpectrum;
 | 
					class GLSpectrum;
 | 
				
			||||||
class MessageQueue;
 | 
					class MessageQueue;
 | 
				
			||||||
| 
						 | 
					@ -15,34 +16,49 @@ class MessageQueue;
 | 
				
			||||||
class SDRGUI_API SpectrumVis : public BasebandSampleSink {
 | 
					class SDRGUI_API SpectrumVis : public BasebandSampleSink {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
					    enum AveragingMode
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        AvgModeMoving,
 | 
				
			||||||
 | 
					        AvgModeFixed
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class MsgConfigureSpectrumVis : public Message {
 | 
						class MsgConfigureSpectrumVis : public Message {
 | 
				
			||||||
		MESSAGE_CLASS_DECLARATION
 | 
							MESSAGE_CLASS_DECLARATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		MsgConfigureSpectrumVis(int fftSize, int overlapPercent, unsigned int averageNb, FFTWindow::Function window) :
 | 
							MsgConfigureSpectrumVis(int fftSize, int overlapPercent, unsigned int averageNb, int averagingMode, FFTWindow::Function window) :
 | 
				
			||||||
			Message(),
 | 
								Message(),
 | 
				
			||||||
			m_fftSize(fftSize),
 | 
								m_fftSize(fftSize),
 | 
				
			||||||
			m_overlapPercent(overlapPercent),
 | 
								m_overlapPercent(overlapPercent),
 | 
				
			||||||
			m_averageNb(averageNb),
 | 
								m_averageNb(averageNb),
 | 
				
			||||||
			m_window(window)
 | 
								m_window(window)
 | 
				
			||||||
		{ }
 | 
							{
 | 
				
			||||||
 | 
							    m_averagingMode = averagingMode < 0 ? AvgModeMoving : averagingMode > 1 ? AvgModeFixed : (SpectrumVis::AveragingMode) averagingMode;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int getFFTSize() const { return m_fftSize; }
 | 
							int getFFTSize() const { return m_fftSize; }
 | 
				
			||||||
		int getOverlapPercent() const { return m_overlapPercent; }
 | 
							int getOverlapPercent() const { return m_overlapPercent; }
 | 
				
			||||||
		unsigned int getAverageNb() const { return m_averageNb; }
 | 
							unsigned int getAverageNb() const { return m_averageNb; }
 | 
				
			||||||
 | 
							SpectrumVis::AveragingMode getAveragingMode() const { return m_averagingMode; }
 | 
				
			||||||
		FFTWindow::Function getWindow() const { return m_window; }
 | 
							FFTWindow::Function getWindow() const { return m_window; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		int m_fftSize;
 | 
							int m_fftSize;
 | 
				
			||||||
		int m_overlapPercent;
 | 
							int m_overlapPercent;
 | 
				
			||||||
		unsigned int m_averageNb;
 | 
							unsigned int m_averageNb;
 | 
				
			||||||
 | 
							SpectrumVis::AveragingMode m_averagingMode;
 | 
				
			||||||
		FFTWindow::Function m_window;
 | 
							FFTWindow::Function m_window;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SpectrumVis(Real scalef, GLSpectrum* glSpectrum = 0);
 | 
						SpectrumVis(Real scalef, GLSpectrum* glSpectrum = 0);
 | 
				
			||||||
	virtual ~SpectrumVis();
 | 
						virtual ~SpectrumVis();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, unsigned int averagingNb, FFTWindow::Function window);
 | 
						void configure(MessageQueue* msgQueue,
 | 
				
			||||||
 | 
						        int fftSize,
 | 
				
			||||||
 | 
						        int overlapPercent,
 | 
				
			||||||
 | 
						        unsigned int averagingNb,
 | 
				
			||||||
 | 
						        int averagingMode,
 | 
				
			||||||
 | 
						        FFTWindow::Function window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
 | 
						virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly);
 | 
				
			||||||
	void feedTriggered(const SampleVector::const_iterator& triggerPoint, const SampleVector::const_iterator& end, bool positiveOnly);
 | 
						void feedTriggered(const SampleVector::const_iterator& triggerPoint, const SampleVector::const_iterator& end, bool positiveOnly);
 | 
				
			||||||
| 
						 | 
					@ -66,15 +82,21 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Real m_scalef;
 | 
						Real m_scalef;
 | 
				
			||||||
	GLSpectrum* m_glSpectrum;
 | 
						GLSpectrum* m_glSpectrum;
 | 
				
			||||||
	MovingAverage2D<double> m_average;
 | 
						MovingAverage2D<double> m_movingAverage;
 | 
				
			||||||
 | 
						FixedAverage2D<double> m_fixedAverage;
 | 
				
			||||||
	unsigned int m_averageNb;
 | 
						unsigned int m_averageNb;
 | 
				
			||||||
 | 
						AveragingMode m_averagingMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Real m_ofs;
 | 
						Real m_ofs;
 | 
				
			||||||
	static const Real m_mult;
 | 
						static const Real m_mult;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	QMutex m_mutex;
 | 
						QMutex m_mutex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void handleConfigure(int fftSize, int overlapPercent, unsigned int averageNb, FFTWindow::Function window);
 | 
						void handleConfigure(int fftSize,
 | 
				
			||||||
 | 
						        int overlapPercent,
 | 
				
			||||||
 | 
						        unsigned int averageNb,
 | 
				
			||||||
 | 
						        AveragingMode averagingMode,
 | 
				
			||||||
 | 
						        FFTWindow::Function window);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // INCLUDE_SPECTRUMVIS_H
 | 
					#endif // INCLUDE_SPECTRUMVIS_H
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,12 @@ void GLSpectrumGUI::applySettings()
 | 
				
			||||||
	m_glSpectrum->setDisplayGridIntensity(m_displayGridIntensity);
 | 
						m_glSpectrum->setDisplayGridIntensity(m_displayGridIntensity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (m_spectrumVis) {
 | 
						if (m_spectrumVis) {
 | 
				
			||||||
	    m_spectrumVis->configure(m_messageQueue, m_fftSize, m_fftOverlap, m_averagingNb, (FFTWindow::Function)m_fftWindow);
 | 
						    m_spectrumVis->configure(m_messageQueue,
 | 
				
			||||||
 | 
						            m_fftSize,
 | 
				
			||||||
 | 
						            m_fftOverlap,
 | 
				
			||||||
 | 
						            m_averagingNb,
 | 
				
			||||||
 | 
						            m_averagingMode,
 | 
				
			||||||
 | 
						            (FFTWindow::Function)m_fftWindow);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,7 +204,12 @@ void GLSpectrumGUI::on_fftWindow_currentIndexChanged(int index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_fftWindow = index;
 | 
						m_fftWindow = index;
 | 
				
			||||||
	if(m_spectrumVis != 0) {
 | 
						if(m_spectrumVis != 0) {
 | 
				
			||||||
        m_spectrumVis->configure(m_messageQueue, m_fftSize, m_fftOverlap, m_averagingNb, (FFTWindow::Function)m_fftWindow);
 | 
					        m_spectrumVis->configure(m_messageQueue,
 | 
				
			||||||
 | 
					                m_fftSize,
 | 
				
			||||||
 | 
					                m_fftOverlap,
 | 
				
			||||||
 | 
					                m_averagingNb,
 | 
				
			||||||
 | 
					                m_averagingMode,
 | 
				
			||||||
 | 
					                (FFTWindow::Function)m_fftWindow);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,12 +217,26 @@ void GLSpectrumGUI::on_fftSize_currentIndexChanged(int index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_fftSize = 1 << (7 + index);
 | 
						m_fftSize = 1 << (7 + index);
 | 
				
			||||||
	if(m_spectrumVis != 0) {
 | 
						if(m_spectrumVis != 0) {
 | 
				
			||||||
	    m_spectrumVis->configure(m_messageQueue, m_fftSize, m_fftOverlap, m_averagingNb, (FFTWindow::Function)m_fftWindow);
 | 
						    m_spectrumVis->configure(m_messageQueue,
 | 
				
			||||||
 | 
						            m_fftSize,
 | 
				
			||||||
 | 
						            m_fftOverlap,
 | 
				
			||||||
 | 
						            m_averagingNb,
 | 
				
			||||||
 | 
					                m_averagingMode,
 | 
				
			||||||
 | 
						            (FFTWindow::Function)m_fftWindow);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLSpectrumGUI::on_averagingMode_currentIndexChanged(int index __attribute__((unused)))
 | 
					void GLSpectrumGUI::on_averagingMode_currentIndexChanged(int index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    m_averagingMode = index < 0 ? AvgModeMoving : index > 1 ? AvgModeFixed : (AveragingMode) index;
 | 
				
			||||||
 | 
					    if(m_spectrumVis != 0) {
 | 
				
			||||||
 | 
					        m_spectrumVis->configure(m_messageQueue,
 | 
				
			||||||
 | 
					                m_fftSize,
 | 
				
			||||||
 | 
					                m_fftOverlap,
 | 
				
			||||||
 | 
					                m_averagingNb,
 | 
				
			||||||
 | 
					                m_averagingMode,
 | 
				
			||||||
 | 
					                (FFTWindow::Function)m_fftWindow);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GLSpectrumGUI::on_averaging_currentIndexChanged(int index)
 | 
					void GLSpectrumGUI::on_averaging_currentIndexChanged(int index)
 | 
				
			||||||
| 
						 | 
					@ -220,7 +244,12 @@ void GLSpectrumGUI::on_averaging_currentIndexChanged(int index)
 | 
				
			||||||
    m_averagingIndex = index;
 | 
					    m_averagingIndex = index;
 | 
				
			||||||
    m_averagingNb = getAveragingValue(index);
 | 
					    m_averagingNb = getAveragingValue(index);
 | 
				
			||||||
    if(m_spectrumVis != 0) {
 | 
					    if(m_spectrumVis != 0) {
 | 
				
			||||||
        m_spectrumVis->configure(m_messageQueue, m_fftSize, m_fftOverlap, m_averagingNb, (FFTWindow::Function)m_fftWindow);
 | 
					        m_spectrumVis->configure(m_messageQueue,
 | 
				
			||||||
 | 
					                m_fftSize,
 | 
				
			||||||
 | 
					                m_fftOverlap,
 | 
				
			||||||
 | 
					                m_averagingNb,
 | 
				
			||||||
 | 
					                m_averagingMode,
 | 
				
			||||||
 | 
					                (FFTWindow::Function)m_fftWindow);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue