1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-19 14:18:45 -04:00

Demod Analyzer: fixed sample rate handling. Fixes #931

This commit is contained in:
f4exb
2021-06-29 21:47:27 +02:00
parent a57c856a26
commit 0d4da317b3
49 changed files with 667 additions and 49 deletions
+39
View File
@@ -64,6 +64,7 @@ AISDemod::AISDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
AISDemod::~AISDemod()
@@ -180,6 +181,13 @@ bool AISDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "AISDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -279,6 +287,25 @@ bool AISDemod::deserialize(const QByteArray& data)
}
}
void AISDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE
);
(*it)->push(msg);
}
}
}
int AISDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -498,3 +525,15 @@ void AISDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void AISDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2 -1
View File
@@ -165,6 +165,7 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const AISDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AISDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
@@ -175,7 +176,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_AISDEMOD_H
@@ -160,7 +160,7 @@ void AISDemodBaseband::applySettings(const AISDemodSettings& settings, bool forc
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
{
m_channelizer->setChannelization(AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_channelizer->setChannelization(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
@@ -61,6 +61,8 @@ struct AISDemodSettings
int m_messageColumnIndexes[AISDEMOD_MESSAGE_COLUMNS];//!< How the columns are ordered in the table
int m_messageColumnSizes[AISDEMOD_MESSAGE_COLUMNS]; //!< Size of the columns in the table
static const int AISDEMOD_CHANNEL_SAMPLE_RATE = 57600; //!< 6x 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
AISDemodSettings();
void resetToDefaults();
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
+7 -7
View File
@@ -36,7 +36,7 @@
AISDemodSink::AISDemodSink(AISDemod *aisDemod) :
m_scopeSink(nullptr),
m_aisDemod(aisDemod),
m_channelSampleRate(AISDEMOD_CHANNEL_SAMPLE_RATE),
m_channelSampleRate(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE),
m_channelFrequencyOffset(0),
m_magsqSum(0.0f),
m_magsqPeak(0.0f),
@@ -410,13 +410,13 @@ void AISDemodSink::applyChannelSettings(int channelSampleRate, int channelFreque
if ((m_channelSampleRate != channelSampleRate) || force)
{
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) channelSampleRate / (Real) AISDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistance = (Real) channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
}
m_channelSampleRate = channelSampleRate;
m_channelFrequencyOffset = channelFrequencyOffset;
m_samplesPerSymbol = AISDEMOD_CHANNEL_SAMPLE_RATE / m_settings.m_baud;
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / m_settings.m_baud;
qDebug() << "AISDemodSink::applyChannelSettings: m_samplesPerSymbol: " << m_samplesPerSymbol;
}
@@ -428,18 +428,18 @@ void AISDemodSink::applySettings(const AISDemodSettings& settings, bool force)
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
m_lowpass.create(301, AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
m_lowpass.create(301, AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
{
m_phaseDiscri.setFMScaling(AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
m_phaseDiscri.setFMScaling(AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
}
if ((settings.m_baud != m_settings.m_baud) || force)
{
m_samplesPerSymbol = AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
m_samplesPerSymbol = AISDemodSettings::AISDEMOD_CHANNEL_SAMPLE_RATE / settings.m_baud;
qDebug() << "ISDemodSink::applySettings: m_samplesPerSymbol: " << m_samplesPerSymbol << " baud " << settings.m_baud;
m_pulseShape.create(0.5, 3, m_samplesPerSymbol);
@@ -41,9 +41,6 @@
#include <iostream>
#include <fstream>
// 6x 9600 baud rate (use even multiple so Gausian filter has odd number of taps)
#define AISDEMOD_CHANNEL_SAMPLE_RATE 57600
#define AISDEMOD_MAX_BYTES (3+1+126+2+1+1)
class ChannelAPI;
+39
View File
@@ -63,6 +63,7 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
AMDemod::~AMDemod()
@@ -135,6 +136,13 @@ bool AMDemod::handleMessage(const Message& cmd)
m_basebandSink->getInputMessageQueue()->push(rep);
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "AMDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
@@ -258,6 +266,25 @@ bool AMDemod::deserialize(const QByteArray& data)
}
}
void AMDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int AMDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -540,3 +567,15 @@ void AMDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void AMDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2 -1
View File
@@ -140,6 +140,7 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const AMDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMDemodSettings& settings, bool force);
void sendChannelSettings(
@@ -157,7 +158,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_AMDEMOD_H
+39
View File
@@ -74,6 +74,7 @@ DABDemod::DABDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
DABDemod::~DABDemod()
@@ -257,6 +258,13 @@ bool DABDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "DABDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -345,6 +353,25 @@ bool DABDemod::deserialize(const QByteArray& data)
}
}
void DABDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int DABDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -550,3 +577,15 @@ void DABDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void DABDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+3 -1
View File
@@ -369,6 +369,7 @@ public:
}*/
uint32_t getNumberOfDeviceStreams() const;
int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); }
static const char * const m_channelIdURI;
static const char * const m_channelId;
@@ -385,6 +386,7 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const DABDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DABDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
@@ -395,7 +397,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_DABDEMOD_H
@@ -74,6 +74,7 @@ public:
void setChannel(ChannelAPI *channel);
double getMagSq() const { return m_sink.getMagSq(); }
bool isRunning() const { return m_running; }
int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); }
private:
SampleSinkFifo m_sampleFifo;
@@ -640,6 +640,19 @@ void DABDemodSink::applyAudioSampleRate(int sampleRate)
m_audioFifo.setSize(sampleRate);
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(m_channel, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(m_channel, sampleRate);
(*it)->push(msg);
}
}
m_audioSampleRate = sampleRate;
}
+39
View File
@@ -69,6 +69,7 @@ DSDDemod::DSDDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
DSDDemod::~DSDDemod()
@@ -134,6 +135,13 @@ bool DSDDemod::handleMessage(const Message& cmd)
m_basebandSink->getInputMessageQueue()->push(rep);
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "DSDDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
@@ -284,6 +292,25 @@ bool DSDDemod::deserialize(const QByteArray& data)
}
}
void DSDDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int DSDDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -647,3 +674,15 @@ void DSDDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void DSDDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2 -1
View File
@@ -138,6 +138,7 @@ private:
static const int m_udpBlockSize;
void applySettings(const DSDDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DSDDemodSettings& settings, bool force);
void sendChannelSettings(
@@ -155,7 +156,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_DSDDEMOD_H
+39
View File
@@ -68,6 +68,7 @@ NFMDemod::NFMDemod(DeviceAPI *devieAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
NFMDemod::~NFMDemod()
@@ -132,6 +133,13 @@ bool NFMDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "NFMDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -269,6 +277,25 @@ bool NFMDemod::deserialize(const QByteArray& data)
return success;
}
void NFMDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int NFMDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -583,3 +610,15 @@ void NFMDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void NFMDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2
View File
@@ -138,6 +138,7 @@ private:
static const int m_udpBlockSize;
void applySettings(const NFMDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const NFMDemodSettings& settings, bool force);
void sendChannelSettings(
@@ -155,6 +156,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_NFMDEMOD_H
@@ -64,6 +64,7 @@ PacketDemod::PacketDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
PacketDemod::~PacketDemod()
@@ -177,6 +178,13 @@ bool PacketDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "PacketDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -243,6 +251,25 @@ void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force)
m_settings = settings;
}
void PacketDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE
);
(*it)->push(msg);
}
}
}
QByteArray PacketDemod::serialize() const
{
return m_settings.serialize();
@@ -470,3 +497,15 @@ void PacketDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void PacketDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
@@ -138,6 +138,7 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const PacketDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const PacketDemodSettings& settings, bool force);
void webapiFormatChannelSettings(
QList<QString>& channelSettingsKeys,
@@ -148,6 +149,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
@@ -159,7 +159,7 @@ void PacketDemodBaseband::applySettings(const PacketDemodSettings& settings, boo
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
{
m_channelizer->setChannelization(PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_channelizer->setChannelization(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_inputFrequencyOffset);
m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset());
}
@@ -53,6 +53,9 @@ struct PacketDemodSettings
int m_columnIndexes[PACKETDEMOD_COLUMNS];//!< How the columns are ordered in the table
int m_columnSizes[PACKETDEMOD_COLUMNS]; //!< Size of the columns in the table
static const int PACKETDEMOD_CHANNEL_BANDWIDTH = 9600;
static const int PACKETDEMOD_CHANNEL_SAMPLE_RATE = 38400; // Must be integer multiple of m_baud=1200
PacketDemodSettings();
void resetToDefaults();
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
@@ -32,7 +32,7 @@
PacketDemodSink::PacketDemodSink(PacketDemod *packetDemod) :
m_packetDemod(packetDemod),
m_channelSampleRate(PACKETDEMOD_CHANNEL_SAMPLE_RATE),
m_channelSampleRate(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE),
m_channelFrequencyOffset(0),
m_magsqSum(0.0f),
m_magsqPeak(0.0f),
@@ -136,7 +136,7 @@ void PacketDemodSink::processOneSample(Complex &ci)
// Look for edge
if (sample != m_samplePrev)
{
m_syncCount = PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud/2;
m_syncCount = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud/2;
}
else
{
@@ -235,7 +235,7 @@ void PacketDemodSink::processOneSample(Complex &ci)
m_bitCount = 0;
}
}
m_syncCount = PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud;
m_syncCount = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/m_settings.m_baud;
}
}
m_samplePrev = sample;
@@ -277,7 +277,7 @@ void PacketDemodSink::applyChannelSettings(int channelSampleRate, int channelFre
if ((m_channelSampleRate != channelSampleRate) || force)
{
m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) channelSampleRate / (Real) PACKETDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistance = (Real) channelSampleRate / (Real) PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
}
@@ -293,13 +293,13 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force)
{
m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.2);
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PACKETDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistance = (Real) m_channelSampleRate / (Real) PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
m_interpolatorDistanceRemain = m_interpolatorDistance;
m_lowpass.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
m_lowpass.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_rfBandwidth / 2.0f);
}
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force)
{
m_phaseDiscri.setFMScaling(PACKETDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
m_phaseDiscri.setFMScaling(PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE / (2.0f * settings.m_fmDeviation));
}
if (force)
@@ -307,7 +307,7 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
delete[] m_f1;
delete[] m_f0;
delete[] m_corrBuf;
m_correlationLength = PACKETDEMOD_CHANNEL_SAMPLE_RATE/settings.m_baud;
m_correlationLength = PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE/settings.m_baud;
m_f1 = new Complex[m_correlationLength]();
m_f0 = new Complex[m_correlationLength]();
m_corrBuf = new Complex[m_correlationLength]();
@@ -319,12 +319,12 @@ void PacketDemodSink::applySettings(const PacketDemodSettings& settings, bool fo
{
m_f0[i] = Complex(cos(f0), sin(f0));
m_f1[i] = Complex(cos(f1), sin(f1));
f0 += 2.0f*(Real)M_PI*2200.0f/PACKETDEMOD_CHANNEL_SAMPLE_RATE;
f1 += 2.0f*(Real)M_PI*1200.0f/PACKETDEMOD_CHANNEL_SAMPLE_RATE;
f0 += 2.0f*(Real)M_PI*2200.0f/PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
f1 += 2.0f*(Real)M_PI*1200.0f/PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE;
}
m_lowpassF1.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
m_lowpassF0.create(301, PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
m_lowpassF1.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
m_lowpassF0.create(301, PacketDemodSettings::PACKETDEMOD_CHANNEL_SAMPLE_RATE, settings.m_baud * 1.1f);
m_samplePrev = 0;
m_syncCount = 0;
m_symbolPrev = 0;
@@ -37,10 +37,6 @@
#include <iostream>
#include <fstream>
#define PACKETDEMOD_CHANNEL_BANDWIDTH 9600
// Must be integer multiple of m_baud=1200
#define PACKETDEMOD_CHANNEL_SAMPLE_RATE 38400
class ChannelAPI;
class PacketDemod;
+39
View File
@@ -68,6 +68,7 @@ SSBDemod::SSBDemod(DeviceAPI *deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
SSBDemod::~SSBDemod()
@@ -132,6 +133,13 @@ bool SSBDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "SSBDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -280,6 +288,25 @@ bool SSBDemod::deserialize(const QByteArray& data)
}
}
void SSBDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int SSBDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -599,3 +626,15 @@ void SSBDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void SSBDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2
View File
@@ -142,6 +142,7 @@ private:
QNetworkRequest m_networkRequest;
void applySettings(const SSBDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBDemodSettings& settings, bool force);
void sendChannelSettings(
@@ -159,6 +160,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_SSBDEMOD_H
+39
View File
@@ -69,6 +69,7 @@ WFMDemod::WFMDemod(DeviceAPI* deviceAPI) :
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages()));
}
WFMDemod::~WFMDemod()
@@ -134,6 +135,13 @@ bool WFMDemod::handleMessage(const Message& cmd)
return true;
}
else if (MainCore::MsgChannelDemodQuery::match(cmd))
{
qDebug() << "WFMDemod::handleMessage: MsgChannelDemodQuery";
sendSampleRateToDemodAnalyzer();
return true;
}
else
{
return false;
@@ -245,6 +253,25 @@ bool WFMDemod::deserialize(const QByteArray& data)
}
}
void WFMDemod::sendSampleRateToDemodAnalyzer()
{
QList<MessageQueue*> *messageQueues = MainCore::instance()->getMessagePipes().getMessageQueues(this, "reportdemod");
if (messageQueues)
{
QList<MessageQueue*>::iterator it = messageQueues->begin();
for (; it != messageQueues->end(); ++it)
{
MainCore::MsgChannelDemodReport *msg = MainCore::MsgChannelDemodReport::create(
this,
getAudioSampleRate()
);
(*it)->push(msg);
}
}
}
int WFMDemod::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
@@ -507,3 +534,15 @@ void WFMDemod::networkManagerFinished(QNetworkReply *reply)
reply->deleteLater();
}
void WFMDemod::handleChannelMessages()
{
Message* message;
while ((message = m_channelMessageQueue.pop()) != nullptr)
{
if (handleMessage(*message)) {
delete message;
}
}
}
+2 -1
View File
@@ -134,7 +134,7 @@ private:
static const int m_udpBlockSize;
void applySettings(const WFMDemodSettings& settings, bool force = false);
void sendSampleRateToDemodAnalyzer();
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const WFMDemodSettings& settings, bool force);
void sendChannelSettings(
@@ -152,6 +152,7 @@ private:
private slots:
void networkManagerFinished(QNetworkReply *reply);
void handleChannelMessages();
};
#endif // INCLUDE_WFMDEMOD_H