Center audio spectrum.

This commit is contained in:
Hexameron 2014-06-17 20:13:49 +01:00
parent fa780d9134
commit 960700249c
4 changed files with 27 additions and 16 deletions

View File

@ -80,7 +80,8 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
demod = m_volume * m_lowpass.filter(demod); demod = m_volume * m_lowpass.filter(demod);
sample = demod * 32767; sample = demod * 32767;
if (!(framedrop & 3)) // Display audio spectrum to 12kHz
if (!(framedrop & 1))
m_sampleBuffer.push_back(Sample(sample, sample)); m_sampleBuffer.push_back(Sample(sample, sample));
if(m_squelchState > 0) if(m_squelchState > 0)

View File

@ -163,7 +163,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
m_pluginAPI->addAudioSource(m_audioFifo); m_pluginAPI->addAudioSource(m_audioFifo);
m_pluginAPI->addSampleSink(m_threadedSampleSink); m_pluginAPI->addSampleSink(m_threadedSampleSink);
ui->glSpectrum->setCenterFrequency(0); ui->glSpectrum->setCenterFrequency(6000);
ui->glSpectrum->setSampleRate(12000); ui->glSpectrum->setSampleRate(12000);
ui->glSpectrum->setDisplayWaterfall(true); ui->glSpectrum->setDisplayWaterfall(true);
ui->glSpectrum->setDisplayMaxHold(true); ui->glSpectrum->setDisplayMaxHold(true);

View File

@ -137,11 +137,10 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
m_pluginAPI->addAudioSource(m_audioFifo); m_pluginAPI->addAudioSource(m_audioFifo);
m_pluginAPI->addSampleSink(m_threadedSampleSink); m_pluginAPI->addSampleSink(m_threadedSampleSink);
ui->glSpectrum->setCenterFrequency(0); ui->glSpectrum->setCenterFrequency(3000);
ui->glSpectrum->setSampleRate(12000); ui->glSpectrum->setSampleRate(6000);
ui->glSpectrum->setDisplayWaterfall(true); ui->glSpectrum->setDisplayWaterfall(true);
ui->glSpectrum->setDisplayMaxHold(true); ui->glSpectrum->setDisplayMaxHold(true);
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
m_channelMarker = new ChannelMarker(this); m_channelMarker = new ChannelMarker(this);
m_channelMarker->setColor(Qt::red); m_channelMarker->setColor(Qt::red);

View File

@ -60,19 +60,30 @@ void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_i
Real ofs = 20.0f * log10f(1.0f / m_fftSize); Real ofs = 20.0f * log10f(1.0f / m_fftSize);
Real mult = (10.0f / log2f(10.0f)); Real mult = (10.0f / log2f(10.0f));
const Complex* fftOut = m_fft->out(); const Complex* fftOut = m_fft->out();
size_t spectrumStart = 0; Complex c;
Real v;
size_t halfSize = m_fftSize / 2;
if ( positiveOnly ) { if ( positiveOnly ) {
Real logZero = ofs + mult * log2f( 0 ); for(size_t i = 0; i < halfSize; i++) {
for(size_t i = 0; i < m_fftSize / 2; i++) c = fftOut[i];
m_logPowerSpectrum[i] = logZero; v = c.real() * c.real() + c.imag() * c.imag();
spectrumStart = m_fftSize / 2; v = mult * log2f(v) + ofs;
} m_logPowerSpectrum[i * 2] = v;
for(size_t i = spectrumStart; i < m_fftSize; i++) { m_logPowerSpectrum[i * 2 + 1] = v;
Complex c = fftOut[((i + (m_fftSize >> 1)) & (m_fftSize - 1))]; }
Real v = c.real() * c.real() + c.imag() * c.imag(); } else {
v = mult * log2f(v) + ofs; for(size_t i = 0; i < halfSize; i++) {
m_logPowerSpectrum[i] = v; c = fftOut[i + halfSize];
v = c.real() * c.real() + c.imag() * c.imag();
v = mult * log2f(v) + ofs;
m_logPowerSpectrum[i] = v;
c = fftOut[i];
v = c.real() * c.real() + c.imag() * c.imag();
v = mult * log2f(v) + ofs;
m_logPowerSpectrum[i + halfSize] = v;
}
} }
// send new data to visualisation // send new data to visualisation