1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-07-29 13:34:13 -04:00

FT8 demod: FT4 support (1)

This commit is contained in:
f4exb
2026-03-01 22:21:16 +01:00
parent 39374ce0b8
commit 9bb9493afd
13 changed files with 264 additions and 40 deletions
+46 -6
View File
@@ -145,12 +145,14 @@ FT8DemodWorker::FT8DemodWorker() :
m_enablePskReporter(false),
m_nbDecoderThreads(6),
m_decoderTimeBudget(0.5),
m_decoderMode(FT8DemodSettings::DecoderModeFT8),
m_useOSD(false),
m_osdDepth(0),
m_osdLDPCThreshold(70),
m_verifyOSD(false),
m_lowFreq(200),
m_highFreq(3000),
m_unsupportedModeWarningPending(true),
m_invalidSequence(true),
m_baseFrequency(0),
m_guiReportingMessageQueue(nullptr),
@@ -180,11 +182,21 @@ FT8DemodWorker::FT8DemodWorker() :
FT8DemodWorker::~FT8DemodWorker()
{}
void FT8DemodWorker::setDecoderMode(int decoderMode)
{
m_decoderMode = decoderMode;
m_unsupportedModeWarningPending = true;
}
void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
{
qDebug("FT8DemodWorker::processBuffer: %6.3f %s %d:%f [%d:%d]",
const int frameSampleCount = FT8DemodSettings::getDecoderFrameSamples(m_decoderMode);
const QString decoderMode = FT8DemodSettings::getDecoderModeString(m_decoderMode);
qDebug("FT8DemodWorker::processBuffer: %6.3f %s mode:%s %d:%f [%d:%d]",
m_baseFrequency / 1000000.0,
qPrintable(periodTS.toString("yyyy-MM-dd HH:mm:ss")),
qPrintable(decoderMode),
m_nbDecoderThreads,
m_decoderTimeBudget,
m_lowFreq,
@@ -198,6 +210,32 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
return;
}
if (m_decoderMode != FT8DemodSettings::DecoderModeFT8)
{
if (m_unsupportedModeWarningPending)
{
qWarning("FT8DemodWorker::processBuffer: %s decoding is not implemented yet", qPrintable(decoderMode));
m_unsupportedModeWarningPending = false;
}
if (m_recordSamples)
{
WavFileRecord *wavFileRecord = new WavFileRecord(FT8DemodSettings::m_ft8SampleRate);
QFileInfo wfi(QDir(m_samplesPath), periodTS.toString("yyyyMMdd_HHmmss"));
QString wpath = wfi.absoluteFilePath();
qDebug("FT8DemodWorker::processBuffer: WAV file: %s.wav", qPrintable(wpath));
wavFileRecord->setFileName(wpath);
wavFileRecord->setFileBaseIsFileName(true);
wavFileRecord->setMono(true);
wavFileRecord->startRecording();
wavFileRecord->writeMono(buffer, frameSampleCount);
wavFileRecord->stopRecording();
delete wavFileRecord;
}
return;
}
QString channelReference = "d0c0"; // default
if (m_channel) {
@@ -211,11 +249,11 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
m_ft8Decoder.getParams().use_osd = m_useOSD ? 1 : 0;
m_ft8Decoder.getParams().osd_depth = m_osdDepth;
m_ft8Decoder.getParams().osd_ldpc_thresh = m_osdLDPCThreshold;
std::vector<float> samples(15*FT8DemodSettings::m_ft8SampleRate);
std::vector<float> samples(frameSampleCount);
std::transform(
buffer,
buffer + (15*FT8DemodSettings::m_ft8SampleRate),
buffer + frameSampleCount,
samples.begin(),
[](const int16_t& s) -> float { return s / 32768.0f; }
);
@@ -275,9 +313,10 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
continue;
}
QString logMessage = QString("%1 %2 Rx FT8 %3 %4 %5 %6 %7 %8")
QString logMessage = QString("%1 %2 Rx %3 %4 %5 %6 %7 %8 %9")
.arg(periodTS.toString("yyyyMMdd_HHmmss"))
.arg(baseFrequencyMHz, 9, 'f', 3)
.arg(decoderMode)
.arg(ft8Message.snr, 6)
.arg(ft8Message.dt, 4, 'f', 1)
.arg(ft8Message.df, 4, 'f', 0)
@@ -301,8 +340,9 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
if ((ft8Message.loc.size() == 4) && (ft8Message.loc != "RR73") && Maidenhead::fromMaidenhead(ft8Message.loc, latitude, longitude))
{
QString text = QString("%1\nMode: FT8\nFrequency: %2 Hz\nLocator: %3\nSNR: %4\nLast heard: %5")
QString text = QString("%1\nMode: %2\nFrequency: %3 Hz\nLocator: %4\nSNR: %5\nLast heard: %6")
.arg(ft8Message.call2)
.arg(decoderMode)
.arg(baseFrequencyMHz*1000000 + ft8Message.df)
.arg(ft8Message.loc)
.arg(ft8Message.snr)
@@ -361,7 +401,7 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS)
wavFileRecord->setFileBaseIsFileName(true);
wavFileRecord->setMono(true);
wavFileRecord->startRecording();
wavFileRecord->writeMono(buffer, 15*FT8DemodSettings::m_ft8SampleRate);
wavFileRecord->writeMono(buffer, frameSampleCount);
wavFileRecord->stopRecording();
delete wavFileRecord;
}