FT8 demod: make FT8::FFTEngine a singleton. Name worker threads for debugging

This commit is contained in:
f4exb 2023-01-21 12:22:05 +01:00
parent 6c15a0ffd2
commit 2b5078e000
10 changed files with 101 additions and 19 deletions

View File

@ -28,6 +28,17 @@
namespace FT8 {
FFTEngine* FFTEngine::m_instance= nullptr;;
FFTEngine *FFTEngine::GetInstance()
{
if (!m_instance) {
m_instance = new FFTEngine();
}
return m_instance;
}
FFTEngine::Plan *FFTEngine::get_plan(int n, const char *why)
{
// cache fftw plans in the parent process,

View File

@ -67,8 +67,9 @@ public:
int uses_;
}; // Plan
FFTEngine() : m_nplans(0)
{}
FFTEngine(FFTEngine& other) = delete;
void operator=(const FFTEngine &) = delete;
static FFTEngine *GetInstance();
Plan *get_plan(int n, const char *why);
@ -82,6 +83,12 @@ public:
std::vector<std::complex<float>> analytic(const std::vector<float> &x, const char *why);
std::vector<float> hilbert_shift(const std::vector<float> &x, float hz0, float hz1, int rate);
protected:
FFTEngine() :
m_nplans(0)
{}
static FFTEngine *m_instance;
private:
void fft_stats();
QMutex m_plansmu;

View File

@ -3533,13 +3533,14 @@ void FT8Decoder::entry(
final_deadline,
cb,
prevdecs,
&fftEngine
FFTEngine::GetInstance()
);
ft8->getParams() = getParams(); // transfer parameters
int npasses = nprevdecs > 0 ? params.npasses_two : params.npasses_one;
ft8->set_npasses(npasses);
QThread *th = new QThread();
th->setObjectName(tr("ft8:%1:%2").arg(cb->get_name()).arg(i));
threads.push_back(th);
// std::thread *th = new std::thread([ft8, npasses] () { ft8->go(npasses); });
// thv.push_back(std::pair<FT8*, std::thread*>(ft8, th));

View File

@ -25,6 +25,7 @@
#include <QObject>
#include <QMutex>
#include <QString>
#include "fft.h"
#include "export.h"
@ -45,6 +46,7 @@ public:
int pass,
int correct_bits
) = 0; //!< virtual nathod called each time there is a result
virtual QString get_name() = 0;
};
//
@ -684,7 +686,6 @@ public:
void forceQuit(); //!< force quit all threads
FT8Params& getParams() { return params; }
private:
FFTEngine fftEngine;
FT8Params params;
std::vector<QThread*> threads;
}; // FT8Decoder

View File

@ -214,6 +214,7 @@ void FT8DemodGUI::on_filterIndex_valueChanged(int value)
void FT8DemodGUI::on_clearMessages_clicked()
{
ui->messages->setRowCount(0);
ui->nbDecodesInTable->setText("0");
}
void FT8DemodGUI::on_recordWav_toggled(bool checked)
@ -621,7 +622,7 @@ void FT8DemodGUI::resizeMessageTable()
ui->messages->setItem(row, MESSAGE_COL_DEC, new QTableWidgetItem("174"));
ui->messages->setItem(row, MESSAGE_COL_DT, new QTableWidgetItem("-0.0"));
ui->messages->setItem(row, MESSAGE_COL_DF, new QTableWidgetItem("0000"));
ui->messages->setItem(row, MESSAGE_COL_CALL1, new QTableWidgetItem("123456789ABCD"));
ui->messages->setItem(row, MESSAGE_COL_CALL1, new QTableWidgetItem("CQ PA900RAALTE"));
ui->messages->setItem(row, MESSAGE_COL_CALL2, new QTableWidgetItem("PA900RAALTE"));
ui->messages->setItem(row, MESSAGE_COL_LOC, new QTableWidgetItem("JN000"));
ui->messages->setItem(row, MESSAGE_COL_INFO, new QTableWidgetItem("OSD-0-73"));
@ -680,6 +681,8 @@ void FT8DemodGUI::messagesReceived(const QList<FT8Message>& messages)
row++;
}
ui->nbDecodesInTable->setText(tr("%1").arg(row));
if (scrollToBottom) {
ui->messages->scrollToBottom();
}

View File

@ -886,11 +886,43 @@
</item>
<item>
<widget class="QLabel" name="nbDecodesText">
<property name="minimumSize">
<size>
<width>15</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Number of messages decoded in the last sequence</string>
</property>
<property name="text">
<string>00</string>
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>/</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="nbDecodesInTable">
<property name="minimumSize">
<size>
<width>45</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
@ -977,6 +1009,9 @@
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderMinimumSectionSize">
<number>15</number>
</attribute>

View File

@ -45,7 +45,7 @@ void FT8DemodSettings::resetToDefaults()
m_agc = false;
m_recordWav = false;
m_logMessages = false;
m_nbDecoderThreads = 6;
m_nbDecoderThreads = 3;
m_decoderTimeBudget = 0.5;
m_volume = 1.0;
m_inputFrequencyOffset = 0;
@ -136,7 +136,7 @@ bool FT8DemodSettings::deserialize(const QByteArray& data)
d.readU32(5, &m_rgbColor);
d.readBool(6, &m_recordWav, false);
d.readBool(7, &m_logMessages, false);
d.readS32(8, &m_nbDecoderThreads, 6);
d.readS32(8, &m_nbDecoderThreads, 3);
d.readFloat(9, &m_decoderTimeBudget, 0.5);
d.readBool(11, &m_agc, false);
d.readString(16, &m_title, "SSB Demodulator");

View File

@ -27,10 +27,16 @@
#include "ft8demodsettings.h"
#include "ft8demodworker.h"
FT8DemodWorker::FT8Callback::FT8Callback(const QDateTime& periodTS, qint64 baseFrequency, FT8::Packing& packing) :
FT8DemodWorker::FT8Callback::FT8Callback(
const QDateTime& periodTS,
qint64 baseFrequency,
FT8::Packing& packing,
const QString& name
) :
m_packing(packing),
m_periodTS(periodTS),
m_baseFrequency(baseFrequency)
m_baseFrequency(baseFrequency),
m_name(name)
{
m_msgReportFT8Messages = MsgReportFT8Messages::create();
m_msgReportFT8Messages->setBaseFrequency(baseFrequency);
@ -92,6 +98,11 @@ int FT8DemodWorker::FT8Callback::hcb(
return 2; // 2 => new decode, do subtract.
}
QString FT8DemodWorker::FT8Callback::get_name()
{
return m_name;
}
FT8DemodWorker::FT8DemodWorker() :
m_recordSamples(false),
m_nbDecoderThreads(6),
@ -108,7 +119,7 @@ FT8DemodWorker::FT8DemodWorker() :
dir.mkpath(relPath);
m_samplesPath = dir.absolutePath() + "/" + relPath;
qDebug("FT8DemodWorker::FT8DemodWorker: samples path: %s", qPrintable(m_samplesPath));
relPath = "sdrangel/ft8";
relPath = "sdrangel/ft8/logs";
m_logsPath = dir.absolutePath() + "/" + relPath;
qDebug("FT8DemodWorker::FT8DemodWorker: logs path: %s", qPrintable(m_logsPath));
}
@ -134,8 +145,14 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
return;
}
QString channelReference = "d0c0"; // default
if (m_channel) {
channelReference = tr("d%1c%2").arg(m_channel->getDeviceSetIndex()).arg(m_channel->getIndexInDeviceSet());
}
int hints[2] = { 2, 0 }; // CQ
FT8Callback ft8Callback(periodTS, m_baseFrequency, m_packing);
FT8Callback ft8Callback(periodTS, m_baseFrequency, m_packing, channelReference);
m_ft8Decoder.getParams().nthreads = m_nbDecoderThreads;
std::vector<float> samples(15*FT8DemodSettings::m_ft8SampleRate);
@ -180,12 +197,6 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
{
if (!logFile.is_open())
{
QString channelReference = "d0c0"; // default
if (m_channel) {
channelReference = tr("d%1c%2").arg(m_channel->getDeviceSetIndex()).arg(m_channel->getIndexInDeviceSet());
}
QString logFileName(tr("%1_%2.txt").arg(periodTS.toString("yyyyMMdd")).arg(channelReference));
QFileInfo lfi(QDir(m_logsPath), logFileName);
QString logFilePath = lfi.absoluteFilePath();

View File

@ -51,7 +51,12 @@ private:
class FT8Callback : public FT8::CallbackInterface
{
public:
FT8Callback(const QDateTime& periodTS, qint64 baseFrequency, FT8::Packing& packing);
FT8Callback
(const QDateTime& periodTS,
qint64 baseFrequency,
FT8::Packing& packing,
const QString& name
);
virtual int hcb(
int *a91,
float hz0,
@ -61,6 +66,7 @@ private:
int pass,
int correct_bits
);
virtual QString get_name();
const std::map<std::string, bool>& getMsgMap() { return cycle_already; }
MsgReportFT8Messages *getReportMessage() { return m_msgReportFT8Messages; }
@ -71,6 +77,7 @@ private:
MsgReportFT8Messages *m_msgReportFT8Messages;
const QDateTime& m_periodTS;
qint64 m_baseFrequency;
QString m_name;
};
QString m_samplesPath;

View File

@ -47,6 +47,7 @@ public:
int pass,
int correct_bits
);
virtual QString get_name();
const std::map<std::string, bool>& getMsgMap() {
return cycle_already;
}
@ -102,6 +103,11 @@ int TestFT8Callback::hcb(
return 2; // 2 => new decode, do subtract.
}
QString TestFT8Callback::get_name()
{
return "test";
}
void MainBench::testFT8(const QString& wavFile, const QString& argsStr)
{
int nthreads = 8; // number of threads (default)