This commit is contained in:
Hexameron 2014-05-22 12:58:17 +01:00
parent c5fc860be9
commit d84f9a6da5
3 changed files with 19 additions and 17 deletions

View File

@ -28,17 +28,17 @@ SSBDemod::SSBDemod(AudioFifo* audioFifo, SampleSink* sampleSink) :
m_sampleSink(sampleSink), m_sampleSink(sampleSink),
m_audioFifo(audioFifo) m_audioFifo(audioFifo)
{ {
m_Bandwidth = 10000; m_Bandwidth = 5000;
m_volume = 2.0; m_volume = 2.0;
m_sampleRate = 96000; m_sampleRate = 96000;
m_frequency = 0; m_frequency = 0;
m_nco.setFreq(m_frequency, m_sampleRate); m_nco.setFreq(m_frequency, m_sampleRate);
m_interpolator.create(16, m_sampleRate, 10000); m_interpolator.create(16, m_sampleRate, 5000);
m_sampleDistanceRemain = (Real)m_sampleRate / 48000.0; m_sampleDistanceRemain = (Real)m_sampleRate / 48000.0;
m_lowpass.create(21, 48000, 10000); m_lowpass.create(21, 48000, 5000);
m_audioBuffer.resize(256); m_audioBuffer.resize(512);
m_audioBufferFill = 0; m_audioBufferFill = 0;
} }
@ -52,6 +52,7 @@ void SSBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real volume
cmd->submit(messageQueue, this); cmd->submit(messageQueue, this);
} }
int undersamplecount = 0;
void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst) void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
{ {
Complex ci; Complex ci;
@ -65,12 +66,13 @@ void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
// could squelch audio if RTL_SDR samplerate is not being fully decimated. // could squelch audio if RTL_SDR samplerate is not being fully decimated.
if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &consumed, &ci)) { if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &consumed, &ci)) {
Real demod = ci.imag() + ci.real(); Real demod = ci.imag() + ci.real();
demod = m_lowpass.filter(demod * 0.5); demod = 32768.0 * m_lowpass.filter(demod * 0.7);
m_sampleBuffer.push_back(Sample(demod * 32768.0, demod * 32768.0));
demod *= m_volume; // Downsample by 4x for audio display
qint16 sample = demod * 16384; if (!(undersamplecount++ & 3))
m_sampleBuffer.push_back(Sample(demod, 0.0));
qint16 sample = (qint16)(demod * m_volume);
m_audioBuffer[m_audioBufferFill].l = sample; m_audioBuffer[m_audioBufferFill].l = sample;
m_audioBuffer[m_audioBufferFill].r = sample; m_audioBuffer[m_audioBufferFill].r = sample;
++m_audioBufferFill; ++m_audioBufferFill;

View File

@ -91,7 +91,7 @@ void SSBDemodGUI::viewChanged()
void SSBDemodGUI::on_BW_valueChanged(int value) void SSBDemodGUI::on_BW_valueChanged(int value)
{ {
ui->BWText->setText(QString("%1 kHz").arg(value)); ui->BWText->setText(QString("%1 kHz").arg(value));
m_channelMarker->setBandwidth(value * 1000); m_channelMarker->setBandwidth(value * 1000 * 2);
applySettings(); applySettings();
} }
@ -138,14 +138,14 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
m_pluginAPI->addSampleSink(m_threadedSampleSink); m_pluginAPI->addSampleSink(m_threadedSampleSink);
ui->glSpectrum->setCenterFrequency(0); ui->glSpectrum->setCenterFrequency(0);
ui->glSpectrum->setSampleRate(48000); ui->glSpectrum->setSampleRate(12000);
ui->glSpectrum->setDisplayWaterfall(true); ui->glSpectrum->setDisplayWaterfall(true);
ui->glSpectrum->setDisplayMaxHold(true); ui->glSpectrum->setDisplayMaxHold(false);
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris); 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);
m_channelMarker->setBandwidth(4000); m_channelMarker->setBandwidth(8000);
m_channelMarker->setCenterFrequency(0); m_channelMarker->setCenterFrequency(0);
m_channelMarker->setVisible(true); m_channelMarker->setVisible(true);
connect(m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged())); connect(m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged()));

View File

@ -140,12 +140,12 @@ void RTLSDRThread::decimate2(SampleVector::iterator* it, const quint8* buf, qint
for (int pos = 0; pos < len + 7; pos += 8) { for (int pos = 0; pos < len + 7; pos += 8) {
xreal = buf[pos+0] - buf[pos+3]; xreal = buf[pos+0] - buf[pos+3];
yimag = buf[pos+1] + buf[pos+2] - 255; yimag = buf[pos+1] + buf[pos+2] - 255;
Sample s( xreal << 5, yimag << 5 ); Sample s( xreal << 6, yimag << 6 );
**it = s; **it = s;
(*it)++; (*it)++;
xreal = buf[pos+7] - buf[pos+4]; xreal = buf[pos+7] - buf[pos+4];
yimag = 255 - buf[pos+5] - buf[pos+6]; yimag = 255 - buf[pos+5] - buf[pos+6];
Sample t( xreal << 5, yimag << 5 ); Sample t( xreal << 6, yimag << 6 );
**it = t; **it = t;
(*it)++; (*it)++;
} }
@ -189,7 +189,7 @@ void RTLSDRThread::decimate16(SampleVector::iterator* it, const quint8* buf, qin
xreal += buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4]; xreal += buf[pos+0] - buf[pos+3] + buf[pos+7] - buf[pos+4];
yimag += buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6]; yimag += buf[pos+1] - buf[pos+5] + buf[pos+2] - buf[pos+6];
} }
Sample s( xreal << 4, yimag << 4 ); Sample s( xreal << 3, yimag << 3 );
**it = s; **it = s;
(*it)++; (*it)++;
} }
@ -209,10 +209,10 @@ void RTLSDRThread::callback(const quint8* buf, qint32 len)
phase *= -1; phase *= -1;
xreal = phase * (buf[pos+0] - 127); xreal = phase * (buf[pos+0] - 127);
yimag = phase * (buf[pos+1] - 127); yimag = phase * (buf[pos+1] - 127);
*it++ = Sample( xreal<<6,yimag<<6); *it++ = Sample( xreal<<7,yimag<<7);
xreal = phase * (128 - buf[pos+3]); xreal = phase * (128 - buf[pos+3]);
yimag = phase * (buf[pos+2] - 127); yimag = phase * (buf[pos+2] - 127);
*it++ = Sample( xreal<<6,yimag<<6); *it++ = Sample( xreal<<7,yimag<<7);
} }
break; break;
case 1: // 1:2 case 1: // 1:2