mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-03-28 07:08:38 -04:00
This commit is contained in:
parent
16db72658b
commit
f2b2fa1425
@ -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());
|
||||||
}
|
}
|
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user