1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-26 17:58:43 -05:00

DSD demod: use settings in demod

This commit is contained in:
f4exb 2017-10-04 00:02:59 +02:00
parent 2bcf9e0933
commit 392f1f43d6
3 changed files with 188 additions and 45 deletions

View File

@ -33,6 +33,7 @@
MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureChannelizer, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureChannelizer, Message)
MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureDSDDemod, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureDSDDemod, Message)
MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureDSDDemodPrivate, Message)
MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureMyPosition, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureMyPosition, Message)
const int DSDDemod::m_udpBlockSize = 512; const int DSDDemod::m_udpBlockSize = 512;
@ -124,7 +125,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
quint16 udpPort, quint16 udpPort,
bool force) bool force)
{ {
Message* cmd = MsgConfigureDSDDemod::create(rfBandwidth, Message* cmd = MsgConfigureDSDDemodPrivate::create(rfBandwidth,
fmDeviation, fmDeviation,
demodGain, demodGain,
volume, volume,
@ -182,7 +183,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_magsqCount++; m_magsqCount++;
Real demod = 32768.0f * m_phaseDiscri.phaseDiscriminator(ci) * m_running.m_demodGain; Real demod = 32768.0f * m_phaseDiscri.phaseDiscriminator(ci) * m_settings.m_demodGain;
m_sampleCount++; m_sampleCount++;
// AF processing // AF processing
@ -219,7 +220,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_dsdDecoder.pushSample(sample); m_dsdDecoder.pushSample(sample);
if (m_running.m_enableCosineFiltering) { // show actual input to FSK demod if (m_settings.m_enableCosineFiltering) { // show actual input to FSK demod
sample = m_dsdDecoder.getFilteredSample(); sample = m_dsdDecoder.getFilteredSample();
} }
@ -237,7 +238,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
delayedSample = m_sampleBuffer[m_sampleBufferIndex - samplesPerSymbol]; delayedSample = m_sampleBuffer[m_sampleBufferIndex - samplesPerSymbol];
} }
if (m_running.m_syncOrConstellation) if (m_settings.m_syncOrConstellation)
{ {
Sample s(sample, m_dsdDecoder.getSymbolSyncSample()); Sample s(sample, m_dsdDecoder.getSymbolSyncSample());
m_scopeSampleBuffer.push_back(s); m_scopeSampleBuffer.push_back(s);
@ -250,30 +251,30 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
if (DSPEngine::instance()->hasDVSerialSupport()) if (DSPEngine::instance()->hasDVSerialSupport())
{ {
if ((m_running.m_slot1On) && m_dsdDecoder.mbeDVReady1()) if ((m_settings.m_slot1On) && m_dsdDecoder.mbeDVReady1())
{ {
if (!m_running.m_audioMute) if (!m_settings.m_audioMute)
{ {
DSPEngine::instance()->pushMbeFrame( DSPEngine::instance()->pushMbeFrame(
m_dsdDecoder.getMbeDVFrame1(), m_dsdDecoder.getMbeDVFrame1(),
m_dsdDecoder.getMbeRateIndex(), m_dsdDecoder.getMbeRateIndex(),
m_running.m_volume, m_settings.m_volume,
m_running.m_tdmaStereo ? 1 : 3, // left or both channels m_settings.m_tdmaStereo ? 1 : 3, // left or both channels
&m_audioFifo1); &m_audioFifo1);
} }
m_dsdDecoder.resetMbeDV1(); m_dsdDecoder.resetMbeDV1();
} }
if ((m_running.m_slot2On) && m_dsdDecoder.mbeDVReady2()) if ((m_settings.m_slot2On) && m_dsdDecoder.mbeDVReady2())
{ {
if (!m_running.m_audioMute) if (!m_settings.m_audioMute)
{ {
DSPEngine::instance()->pushMbeFrame( DSPEngine::instance()->pushMbeFrame(
m_dsdDecoder.getMbeDVFrame2(), m_dsdDecoder.getMbeDVFrame2(),
m_dsdDecoder.getMbeRateIndex(), m_dsdDecoder.getMbeRateIndex(),
m_running.m_volume, m_settings.m_volume,
m_running.m_tdmaStereo ? 2 : 3, // right or both channels m_settings.m_tdmaStereo ? 2 : 3, // right or both channels
&m_audioFifo2); &m_audioFifo2);
} }
@ -283,9 +284,9 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
// if (DSPEngine::instance()->hasDVSerialSupport() && m_dsdDecoder.mbeDVReady1()) // if (DSPEngine::instance()->hasDVSerialSupport() && m_dsdDecoder.mbeDVReady1())
// { // {
// if (!m_running.m_audioMute) // if (!m_settings.m_audioMute)
// { // {
// DSPEngine::instance()->pushMbeFrame(m_dsdDecoder.getMbeDVFrame1(), m_dsdDecoder.getMbeRateIndex(), m_running.m_volume, &m_audioFifo1); // DSPEngine::instance()->pushMbeFrame(m_dsdDecoder.getMbeDVFrame1(), m_dsdDecoder.getMbeRateIndex(), m_settings.m_volume, &m_audioFifo1);
// } // }
// //
// m_dsdDecoder.resetMbeDV1(); // m_dsdDecoder.resetMbeDV1();
@ -297,14 +298,14 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
if (!DSPEngine::instance()->hasDVSerialSupport()) if (!DSPEngine::instance()->hasDVSerialSupport())
{ {
if (m_running.m_slot1On) if (m_settings.m_slot1On)
{ {
int nbAudioSamples; int nbAudioSamples;
short *dsdAudio = m_dsdDecoder.getAudio1(nbAudioSamples); short *dsdAudio = m_dsdDecoder.getAudio1(nbAudioSamples);
if (nbAudioSamples > 0) if (nbAudioSamples > 0)
{ {
if (!m_running.m_audioMute) { if (!m_settings.m_audioMute) {
m_audioFifo1.write((const quint8*) dsdAudio, nbAudioSamples, 10); m_audioFifo1.write((const quint8*) dsdAudio, nbAudioSamples, 10);
} }
@ -312,14 +313,14 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
} }
} }
if (m_running.m_slot2On) if (m_settings.m_slot2On)
{ {
int nbAudioSamples; int nbAudioSamples;
short *dsdAudio = m_dsdDecoder.getAudio2(nbAudioSamples); short *dsdAudio = m_dsdDecoder.getAudio2(nbAudioSamples);
if (nbAudioSamples > 0) if (nbAudioSamples > 0)
{ {
if (!m_running.m_audioMute) { if (!m_settings.m_audioMute) {
m_audioFifo2.write((const quint8*) dsdAudio, nbAudioSamples, 10); m_audioFifo2.write((const quint8*) dsdAudio, nbAudioSamples, 10);
} }
@ -332,7 +333,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
// //
// if (nbAudioSamples > 0) // if (nbAudioSamples > 0)
// { // {
// if (!m_running.m_audioMute) { // if (!m_settings.m_audioMute) {
// uint res = m_audioFifo1.write((const quint8*) dsdAudio, nbAudioSamples, 10); // uint res = m_audioFifo1.write((const quint8*) dsdAudio, nbAudioSamples, 10);
// } // }
// //
@ -392,6 +393,39 @@ bool DSDDemod::handleMessage(const Message& cmd)
{ {
MsgConfigureDSDDemod& cfg = (MsgConfigureDSDDemod&) cmd; MsgConfigureDSDDemod& cfg = (MsgConfigureDSDDemod&) cmd;
DSDDemodSettings settings = cfg.getSettings();
// These settings are set with DownChannelizer::MsgChannelizerNotification
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
applySettings(settings, cfg.getForce());
qDebug() << "DSDDemod::handleMessage: MsgConfigureDSDDemod: m_rfBandwidth: " << m_settings.m_rfBandwidth
<< " m_fmDeviation: " << m_settings.m_fmDeviation
<< " m_demodGain: " << m_settings.m_demodGain
<< " m_volume: " << m_settings.m_volume
<< " m_baudRate: " << m_settings.m_baudRate
<< " m_squelchGate" << m_settings.m_squelchGate
<< " m_squelch: " << m_settings.m_squelch
<< " m_audioMute: " << m_settings.m_audioMute
<< " m_enableCosineFiltering: " << m_settings.m_enableCosineFiltering
<< " m_syncOrConstellation: " << m_settings.m_syncOrConstellation
<< " m_slot1On: " << m_settings.m_slot1On
<< " m_slot2On: " << m_settings.m_slot2On
<< " m_tdmaStereo: " << m_settings.m_tdmaStereo
<< " m_pllLock: " << m_settings.m_pllLock
<< " m_udpCopyAudio: " << m_settings.m_udpCopyAudio
<< " m_udpAddress: " << m_settings.m_udpAddress
<< " m_udpPort: " << m_settings.m_udpPort
<< " force: " << cfg.getForce();
return true;
}
else if (MsgConfigureDSDDemodPrivate::match(cmd))
{
MsgConfigureDSDDemodPrivate& cfg = (MsgConfigureDSDDemodPrivate&) cmd;
m_config.m_rfBandwidth = cfg.getRFBandwidth(); m_config.m_rfBandwidth = cfg.getRFBandwidth();
m_config.m_demodGain = cfg.getDemodGain(); m_config.m_demodGain = cfg.getDemodGain();
m_config.m_fmDeviation = cfg.getFMDeviation(); m_config.m_fmDeviation = cfg.getFMDeviation();
@ -412,7 +446,7 @@ bool DSDDemod::handleMessage(const Message& cmd)
apply(); apply();
qDebug() << "DSDDemod::handleMessage: MsgConfigureDSDDemod: m_rfBandwidth: " << m_config.m_rfBandwidth qDebug() << "DSDDemod::handleMessage: MsgConfigureDSDDemodPrivate: m_rfBandwidth: " << m_config.m_rfBandwidth
<< " m_fmDeviation: " << m_config.m_fmDeviation << " m_fmDeviation: " << m_config.m_fmDeviation
<< " m_demodGain: " << m_config.m_demodGain << " m_demodGain: " << m_config.m_demodGain
<< " m_volume: " << m_config.m_volume << " m_volume: " << m_config.m_volume
@ -523,3 +557,83 @@ void DSDDemod::apply(bool force)
m_running = m_config; m_running = m_config;
} }
void DSDDemod::applySettings(DSDDemodSettings& settings, bool force)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) ||
(settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force)
{
m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate);
}
if ((settings.m_inputSampleRate != m_settings.m_inputSampleRate) ||
(settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
{
m_settingsMutex.lock();
m_interpolator.create(16, settings.m_inputSampleRate, (settings.m_rfBandwidth) / 2.2);
m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate;
m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation);
m_settingsMutex.unlock();
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
{
m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation);
}
if ((settings.m_squelchGate != m_settings.m_squelchGate) || force)
{
m_squelchGate = 480 * settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate
m_squelchCount = 0; // reset squelch open counter
}
if ((settings.m_squelch != m_settings.m_squelch) || force)
{
// input is a value in dB
m_squelchLevel = std::pow(10.0, settings.m_squelch / 10.0);
//m_squelchLevel *= m_squelchLevel;
}
if ((settings.m_volume != m_settings.m_volume) || force)
{
m_dsdDecoder.setAudioGain(settings.m_volume);
}
if ((settings.m_baudRate != m_settings.m_baudRate) || force)
{
m_dsdDecoder.setBaudRate(settings.m_baudRate);
}
if ((settings.m_enableCosineFiltering != m_settings.m_enableCosineFiltering) || force)
{
m_dsdDecoder.enableCosineFiltering(settings.m_enableCosineFiltering);
}
if ((settings.m_tdmaStereo != m_settings.m_tdmaStereo) || force)
{
m_dsdDecoder.setTDMAStereo(settings.m_tdmaStereo);
}
if ((settings.m_pllLock != m_settings.m_pllLock) || force)
{
m_dsdDecoder.setSymbolPLLLock(settings.m_pllLock);
}
if ((settings.m_udpAddress != m_settings.m_udpAddress)
|| (settings.m_udpPort != m_settings.m_udpPort) || force)
{
m_udpBufferAudio->setAddress(settings.m_udpAddress);
m_udpBufferAudio->setPort(settings.m_udpPort);
}
if ((settings.m_udpCopyAudio != m_settings.m_udpCopyAudio)
|| (settings.m_slot1On != m_settings.m_slot1On)
|| (settings.m_slot2On != m_settings.m_slot2On) || force)
{
m_audioFifo1.setCopyToUDP(settings.m_slot1On && settings.m_udpCopyAudio);
m_audioFifo2.setCopyToUDP(settings.m_slot2On && !settings.m_slot1On && settings.m_udpCopyAudio);
}
m_settings = settings;
}

View File

@ -33,6 +33,7 @@
#include "util/message.h" #include "util/message.h"
#include "util/udpsink.h" #include "util/udpsink.h"
#include "dsddemodsettings.h"
#include "dsddecoder.h" #include "dsddecoder.h"
class DeviceSourceAPI; class DeviceSourceAPI;
@ -41,6 +42,29 @@ class DownChannelizer;
class DSDDemod : public BasebandSampleSink { class DSDDemod : public BasebandSampleSink {
public: public:
class MsgConfigureDSDDemod : public Message {
MESSAGE_CLASS_DECLARATION
public:
const DSDDemodSettings& getSettings() const { return m_settings; }
bool getForce() const { return m_force; }
static MsgConfigureDSDDemod* create(const DSDDemodSettings& settings, bool force)
{
return new MsgConfigureDSDDemod(settings, force);
}
private:
DSDDemodSettings m_settings;
bool m_force;
MsgConfigureDSDDemod(const DSDDemodSettings& settings, bool force) :
Message(),
m_settings(settings),
m_force(force)
{ }
};
class MsgConfigureChannelizer : public Message { class MsgConfigureChannelizer : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -135,7 +159,7 @@ private:
{} {}
}; };
class MsgConfigureDSDDemod : public Message { class MsgConfigureDSDDemodPrivate : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
public: public:
@ -157,7 +181,7 @@ private:
const QString& getUDPAddress() const { return m_udpAddress; } const QString& getUDPAddress() const { return m_udpAddress; }
quint16 getUDPPort() const { return m_udpPort; } quint16 getUDPPort() const { return m_udpPort; }
static MsgConfigureDSDDemod* create(Real rfBandwidth, static MsgConfigureDSDDemodPrivate* create(Real rfBandwidth,
Real fmDeviation, Real fmDeviation,
Real demodGain, Real demodGain,
Real volume, Real volume,
@ -176,7 +200,7 @@ private:
quint16 udpPort, quint16 udpPort,
bool force) bool force)
{ {
return new MsgConfigureDSDDemod(rfBandwidth, return new MsgConfigureDSDDemodPrivate(rfBandwidth,
fmDeviation, fmDeviation,
demodGain, demodGain,
volume, volume,
@ -216,7 +240,7 @@ private:
quint16 m_udpPort; quint16 m_udpPort;
bool m_force; bool m_force;
MsgConfigureDSDDemod(Real rfBandwidth, MsgConfigureDSDDemodPrivate(Real rfBandwidth,
Real fmDeviation, Real fmDeviation,
Real demodGain, Real demodGain,
Real volume, Real volume,
@ -309,6 +333,7 @@ private:
Config m_config; Config m_config;
Config m_running; Config m_running;
DSDDemodSettings m_settings;
DeviceSourceAPI *m_deviceAPI; DeviceSourceAPI *m_deviceAPI;
ThreadedBasebandSampleSink* m_threadedChannelizer; ThreadedBasebandSampleSink* m_threadedChannelizer;
@ -354,6 +379,7 @@ private:
static const int m_udpBlockSize; static const int m_udpBlockSize;
void apply(bool force = false); void apply(bool force = false);
void applySettings(DSDDemodSettings& settings, bool force = false);
}; };
#endif // INCLUDE_DSDDEMOD_H #endif // INCLUDE_DSDDEMOD_H

View File

@ -462,6 +462,9 @@ void DSDDemodGUI::applySettings(bool force)
48000, m_channelMarker.getCenterFrequency()); 48000, m_channelMarker.getCenterFrequency());
m_dsdDemod->getInputMessageQueue()->push(channelConfigMsg); m_dsdDemod->getInputMessageQueue()->push(channelConfigMsg);
DSDDemod::MsgConfigureDSDDemod* message = DSDDemod::MsgConfigureDSDDemod::create( m_settings, force);
m_dsdDemod->getInputMessageQueue()->push(message);
// ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); // ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
// ui->rfBWText->setText(QString("%1k").arg(ui->rfBW->value() / 10.0, 0, 'f', 1)); // ui->rfBWText->setText(QString("%1k").arg(ui->rfBW->value() / 10.0, 0, 'f', 1));
// ui->demodGainText->setText(QString("%1").arg(ui->demodGain->value() / 100.0, 0, 'f', 2)); // ui->demodGainText->setText(QString("%1").arg(ui->demodGain->value() / 100.0, 0, 'f', 2));
@ -474,25 +477,25 @@ void DSDDemodGUI::applySettings(bool force)
// ui->slot2On->setChecked(m_slot2On); // ui->slot2On->setChecked(m_slot2On);
// ui->tdmaStereoSplit->setChecked(m_tdmaStereo); // ui->tdmaStereoSplit->setChecked(m_tdmaStereo);
m_dsdDemod->configure(m_dsdDemod->getInputMessageQueue(), // m_dsdDemod->configure(m_dsdDemod->getInputMessageQueue(),
m_settings.m_rfBandwidth, // m_settings.m_rfBandwidth,
m_settings.m_fmDeviation, // m_settings.m_fmDeviation,
m_settings.m_demodGain, // m_settings.m_demodGain,
m_settings.m_volume, // m_settings.m_volume,
DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()), // DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()),
m_settings.m_squelchGate, // in 10ths of ms // m_settings.m_squelchGate, // in 10ths of ms
m_settings.m_squelch, // m_settings.m_squelch,
m_settings.m_audioMute, // m_settings.m_audioMute,
m_settings.m_enableCosineFiltering, // m_settings.m_enableCosineFiltering,
m_settings.m_syncOrConstellation, // m_settings.m_syncOrConstellation,
m_settings.m_slot1On, // m_settings.m_slot1On,
m_settings.m_slot2On, // m_settings.m_slot2On,
m_settings.m_tdmaStereo, // m_settings.m_tdmaStereo,
m_settings.m_pllLock, // m_settings.m_pllLock,
m_settings.m_udpCopyAudio, // m_settings.m_udpCopyAudio,
m_channelMarker.getUDPAddress(), // m_channelMarker.getUDPAddress(),
m_channelMarker.getUDPSendPort(), // m_channelMarker.getUDPSendPort(),
force); // force);
} }
} }