1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-27 15:26:33 -04:00

Channel Analyzer: fixed sink apply channel settings. Fixes #569 and #570

This commit is contained in:
f4exb 2020-07-13 22:00:15 +02:00
parent 16db72658b
commit f2b2fa1425
4 changed files with 31 additions and 35 deletions

View File

@ -137,9 +137,9 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
qDebug() << "ChannelAnalyzerBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate(); qDebug() << "ChannelAnalyzerBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate();
m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(notif.getSampleRate())); m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(notif.getSampleRate()));
m_channelizer->setBasebandSampleRate(notif.getSampleRate()); m_channelizer->setBasebandSampleRate(notif.getSampleRate());
unsigned int desiredSampleRate = notif.getSampleRate() / (1<<m_settings.m_log2Decim); int desiredSampleRate = getSinkSampleRate(m_settings);
m_channelizer->setChannelization(desiredSampleRate, m_settings.m_inputFrequencyOffset); m_channelizer->setChannelization(desiredSampleRate, m_settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset());
return true; return true;
} }
@ -152,17 +152,25 @@ bool ChannelAnalyzerBaseband::handleMessage(const Message& cmd)
void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force) void ChannelAnalyzerBaseband::applySettings(const ChannelAnalyzerSettings& settings, bool force)
{ {
if ((settings.m_log2Decim != m_settings.m_log2Decim) if ((settings.m_log2Decim != m_settings.m_log2Decim)
|| (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)|| force) || (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset)
|| (settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate)
|| (settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force)
{ {
unsigned int desiredSampleRate = m_channelizer->getBasebandSampleRate() / (1<<settings.m_log2Decim); int desiredSampleRate = getSinkSampleRate(settings);
m_channelizer->setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset); m_channelizer->setChannelization(desiredSampleRate, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset());
} }
m_sink.applySettings(settings, force); m_sink.applySettings(settings, force);
m_settings = settings; m_settings = settings;
} }
int ChannelAnalyzerBaseband::getSinkSampleRate(ChannelAnalyzerSettings settings)
{
int normalSinkSampleRate = m_channelizer->getBasebandSampleRate() / (1<<settings.m_log2Decim);
return settings.m_rationalDownSample ? settings.m_rationalDownSamplerRate : normalSinkSampleRate;
}
int ChannelAnalyzerBaseband::getChannelSampleRate() const int ChannelAnalyzerBaseband::getChannelSampleRate() const
{ {
return m_channelizer->getChannelSampleRate(); return m_channelizer->getChannelSampleRate();
@ -172,5 +180,6 @@ int ChannelAnalyzerBaseband::getChannelSampleRate() const
void ChannelAnalyzerBaseband::setBasebandSampleRate(int sampleRate) void ChannelAnalyzerBaseband::setBasebandSampleRate(int sampleRate)
{ {
m_channelizer->setBasebandSampleRate(sampleRate); m_channelizer->setBasebandSampleRate(sampleRate);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); int desiredSampleRate = getSinkSampleRate(m_settings);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), desiredSampleRate, m_channelizer->getChannelFrequencyOffset());
} }

View File

@ -85,6 +85,7 @@ private:
bool handleMessage(const Message& cmd); bool handleMessage(const Message& cmd);
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
int getSinkSampleRate(ChannelAnalyzerSettings settngs);
private slots: private slots:
void handleInputMessages(); void handleInputMessages();

View File

@ -63,7 +63,11 @@ void ChannelAnalyzerSink::feed(const SampleVector::const_iterator& begin, const
Complex c(it->real(), it->imag()); Complex c(it->real(), it->imag());
c *= m_nco.nextIQ(); c *= m_nco.nextIQ();
if (m_settings.m_rationalDownSample) if (m_interpolatorDistance == 1)
{
processOneSample(c, sideband);
}
else
{ {
if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci)) if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci))
{ {
@ -71,10 +75,6 @@ void ChannelAnalyzerSink::feed(const SampleVector::const_iterator& begin, const
m_interpolatorDistanceRemain += m_interpolatorDistance; m_interpolatorDistanceRemain += m_interpolatorDistance;
} }
} }
else
{
processOneSample(c, sideband);
}
} }
if (m_sampleSink) { if (m_sampleSink) {
@ -130,10 +130,11 @@ void ChannelAnalyzerSink::processOneSample(Complex& c, fftfilt::cmplx *sideband)
} }
} }
void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force)
{ {
qDebug() << "ChannelAnalyzerSink::applyChannelSettings:" qDebug() << "ChannelAnalyzerSink::applyChannelSettings:"
<< " channelSampleRate: " << channelSampleRate << " channelSampleRate: " << channelSampleRate
<< " sinkSampleRate: " << sinkSampleRate
<< " channelFrequencyOffset: " << channelFrequencyOffset; << " channelFrequencyOffset: " << channelFrequencyOffset;
if ((m_channelFrequencyOffset != channelFrequencyOffset) || if ((m_channelFrequencyOffset != channelFrequencyOffset) ||
@ -142,13 +143,13 @@ void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channe
m_nco.setFreq(-channelFrequencyOffset, channelSampleRate); m_nco.setFreq(-channelFrequencyOffset, channelSampleRate);
} }
if ((m_channelSampleRate != channelSampleRate) || force) if ((m_channelSampleRate != channelSampleRate)
|| (m_sinkSampleRate != sinkSampleRate) || force)
{ {
m_interpolator.create(16, channelSampleRate, channelSampleRate / 2.2f); m_interpolator.create(16, channelSampleRate, channelSampleRate / 2.2f);
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) channelSampleRate / (Real) m_settings.m_rationalDownSamplerRate; m_interpolatorDistance = (Real) channelSampleRate / (Real) sinkSampleRate;
int sinkSampleRate = m_settings.m_rationalDownSample ? m_settings.m_rationalDownSamplerRate : channelSampleRate;
setFilters(sinkSampleRate, m_settings.m_bandwidth, m_settings.m_lowCutoff); setFilters(sinkSampleRate, m_settings.m_bandwidth, m_settings.m_lowCutoff);
m_pll.setSampleRate(sinkSampleRate); m_pll.setSampleRate(sinkSampleRate);
m_fll.setSampleRate(sinkSampleRate); m_fll.setSampleRate(sinkSampleRate);
@ -156,6 +157,7 @@ void ChannelAnalyzerSink::applyChannelSettings(int channelSampleRate, int channe
m_channelSampleRate = channelSampleRate; m_channelSampleRate = channelSampleRate;
m_channelFrequencyOffset = channelFrequencyOffset; m_channelFrequencyOffset = channelFrequencyOffset;
m_sinkSampleRate = sinkSampleRate;
} }
void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowCutoff) void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowCutoff)
@ -202,32 +204,15 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings,
<< " m_pllPskOrder: " << settings.m_pllPskOrder << " m_pllPskOrder: " << settings.m_pllPskOrder
<< " m_inputType: " << (int) settings.m_inputType; << " m_inputType: " << (int) settings.m_inputType;
if ((settings.m_rationalDownSamplerRate != m_settings.m_rationalDownSamplerRate) || force)
{
m_interpolator.create(16, m_channelSampleRate, m_channelSampleRate / 2.2);
m_interpolatorDistanceRemain = 0.0f;
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) settings.m_rationalDownSamplerRate;
}
if ((settings.m_rationalDownSample != m_settings.m_rationalDownSample) || force)
{
int sinkSampleRate = settings.m_rationalDownSample ? settings.m_rationalDownSamplerRate : m_channelSampleRate;
setFilters(sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff);
m_pll.setSampleRate(sinkSampleRate);
m_fll.setSampleRate(sinkSampleRate);
}
if ((settings.m_bandwidth != m_settings.m_bandwidth) || if ((settings.m_bandwidth != m_settings.m_bandwidth) ||
(settings.m_lowCutoff != m_settings.m_lowCutoff)|| force) (settings.m_lowCutoff != m_settings.m_lowCutoff)|| force)
{ {
int sinkSampleRate = settings.m_rationalDownSample ? settings.m_rationalDownSamplerRate : m_channelSampleRate; setFilters(m_sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff);
setFilters(sinkSampleRate, settings.m_bandwidth, settings.m_lowCutoff);
} }
if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force) if ((settings.m_rrcRolloff != m_settings.m_rrcRolloff) || force)
{ {
float sinkSampleRate = settings.m_rationalDownSample ? (float) settings.m_rationalDownSamplerRate : (float) m_channelSampleRate; float sinkSampleRate = (float) m_sinkSampleRate;
RRCFilter->create_rrc_filter(settings.m_bandwidth / sinkSampleRate, settings.m_rrcRolloff / 100.0); RRCFilter->create_rrc_filter(settings.m_bandwidth / sinkSampleRate, settings.m_rrcRolloff / 100.0);
} }

View File

@ -40,7 +40,7 @@ public:
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); void applyChannelSettings(int channelSampleRate, int sinkSampleRate, int channelFrequencyOffset, bool force = false);
void applySettings(const ChannelAnalyzerSettings& settings, bool force = false); void applySettings(const ChannelAnalyzerSettings& settings, bool force = false);
double getMagSq() const { return m_magsq; } double getMagSq() const { return m_magsq; }
@ -57,6 +57,7 @@ public:
private: private:
int m_channelSampleRate; int m_channelSampleRate;
int m_channelFrequencyOffset; int m_channelFrequencyOffset;
int m_sinkSampleRate;
ChannelAnalyzerSettings m_settings; ChannelAnalyzerSettings m_settings;
bool m_usb; bool m_usb;