1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-10-01 17:26:40 -04:00

SSB demod: implemented interpolator for audio

This commit is contained in:
f4exb 2019-05-28 18:36:18 +02:00
parent 1e3980c5e0
commit e7215b54da
2 changed files with 110 additions and 100 deletions

View File

@ -158,35 +158,45 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
{ {
(void) positiveOnly; (void) positiveOnly;
Complex ci; Complex ci;
fftfilt::cmplx *sideband;
int n_out;
m_settingsMutex.lock(); m_settingsMutex.lock();
int decim = 1<<(m_spanLog2 - 1);
unsigned char decim_mask = decim - 1; // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
for(SampleVector::const_iterator it = begin; it < end; ++it) for(SampleVector::const_iterator it = begin; it < end; ++it)
{ {
Complex c(it->real(), it->imag()); Complex c(it->real(), it->imag());
c *= m_nco.nextIQ(); c *= m_nco.nextIQ();
if(m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci)) if (m_interpolatorDistance < 1.0f) // interpolate
{ {
if (m_dsb) while (!m_interpolator.interpolate(&m_interpolatorDistanceRemain, c, &ci))
{ {
n_out = DSBFilter->runDSB(ci, &sideband); processOneSample(ci);
}
else
{
n_out = SSBFilter->runSSB(ci, &sideband, m_usb);
}
m_interpolatorDistanceRemain += m_interpolatorDistance; m_interpolatorDistanceRemain += m_interpolatorDistance;
} }
}
else else
{ {
n_out = 0; if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci))
{
processOneSample(ci);
m_interpolatorDistanceRemain += m_interpolatorDistance;
}
}
}
m_settingsMutex.unlock();
}
void SSBDemod::processOneSample(Complex &ci)
{
fftfilt::cmplx *sideband;
int n_out = 0;
int decim = 1<<(m_spanLog2 - 1);
unsigned char decim_mask = decim - 1; // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
if (m_dsb) {
n_out = DSBFilter->runDSB(ci, &sideband);
} else {
n_out = SSBFilter->runSSB(ci, &sideband, m_usb);
} }
for (int i = 0; i < n_out; i++) for (int i = 0; i < n_out; i++)
@ -274,7 +284,6 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_audioBufferFill = 0; m_audioBufferFill = 0;
} }
} }
}
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill); uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill);
@ -292,7 +301,6 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_sampleBuffer.clear(); m_sampleBuffer.clear();
m_settingsMutex.unlock();
} }
void SSBDemod::start() void SSBDemod::start()

View File

@ -338,6 +338,8 @@ private:
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response); void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBDemodSettings& settings, bool force); void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBDemodSettings& settings, bool force);
void processOneSample(Complex &ci);
private slots: private slots:
void networkManagerFinished(QNetworkReply *reply); void networkManagerFinished(QNetworkReply *reply);
}; };