From a86cc5394584f965a382bfea53b283e4e659c980 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 28 Jan 2023 08:58:50 +0100 Subject: [PATCH] FT8 demod: make OSD optional and log OSD information --- doc/img/FT8Demod_plugin_C1.png | Bin 29827 -> 34652 bytes doc/img/FT8Demod_plugin_C1.xcf | Bin 108924 -> 198968 bytes ft8/ft8.cpp | 114 ++++++++++----- ft8/ft8.h | 4 +- ft8/osd.cpp | 61 ++++---- ft8/osd.h | 18 ++- .../channelrx/demodft8/ft8demodbaseband.cpp | 12 ++ .../demodft8/ft8demodfilterproxy.cpp | 30 +++- .../channelrx/demodft8/ft8demodfilterproxy.h | 5 +- plugins/channelrx/demodft8/ft8demodgui.cpp | 20 +++ plugins/channelrx/demodft8/ft8demodgui.ui | 2 +- .../channelrx/demodft8/ft8demodsettings.cpp | 9 ++ plugins/channelrx/demodft8/ft8demodsettings.h | 3 + .../demodft8/ft8demodsettingsdialog.cpp | 34 +++++ .../demodft8/ft8demodsettingsdialog.h | 3 + .../demodft8/ft8demodsettingsdialog.ui | 134 +++++++++++++++++- plugins/channelrx/demodft8/ft8demodworker.cpp | 11 +- plugins/channelrx/demodft8/ft8demodworker.h | 6 + plugins/channelrx/demodft8/readme.md | 56 ++++++-- sdrbench/test_ft8.cpp | 1 + 20 files changed, 429 insertions(+), 94 deletions(-) diff --git a/doc/img/FT8Demod_plugin_C1.png b/doc/img/FT8Demod_plugin_C1.png index a887f7a1374e8959940444053a0353cd5206a7d7..38b2d1b710a8dee9020df95956425a56d0336921 100644 GIT binary patch literal 34652 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 C#{F0T literal 29827 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�O2Dw^I_C^@dQu874T%1y)qYe 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 diff --git a/doc/img/FT8Demod_plugin_C1.xcf b/doc/img/FT8Demod_plugin_C1.xcf index 25e6589319cc735f1d0319be96a72b863bb2d388..61a9d0f1e1ae60ae082a5d02929e7b9f6a3313c2 100644 GIT binary patch literal 198968 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 Ya)MH$V-+H>DxCY<=l31d=H9jLA9vQ8 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 ok_thresh) { // plain[] is 91 systematic data bits, 83 parity bits. - for (int i = 0; i < 174; i++) - { + for (int i = 0; i < 174; i++) { a174[i] = plain[i]; } - if (check_crc(a174)) - { + + if (OSD::check_crc(a174)) { // success! return 1; } @@ -2512,17 +2511,15 @@ int FT8::decode(const float ll174[], int a174[], int use_osd, std::string &comme if (use_osd && params.osd_depth >= 0 && ldpc_ok >= params.osd_ldpc_thresh) { - extern int osd_decode(float codeword[174], int depth, int out[91], int *); - extern void ldpc_encode(int plain[91], int codeword[174]); - int oplain[91]; int got_depth = -1; - int osd_ok = osd_decode((float *)ll174, params.osd_depth, oplain, &got_depth); + int osd_ok = OSD::osd_decode((float *)ll174, params.osd_depth, oplain, &got_depth); + if (osd_ok) { // reconstruct all 174. comment += "OSD-" + std::to_string(got_depth) + "-" + std::to_string(ldpc_ok); - ldpc_encode(oplain, a174); + OSD::ldpc_encode(oplain, a174); return 1; } } @@ -2669,7 +2666,7 @@ std::vector FT8::down_v7_f(const std::vector> &bins, // // XXX merge with one_iter(). // -int FT8::one(const std::vector> &bins, int len, float hz, int off) +int FT8::one_merge(const std::vector> &bins, int len, float hz, int off) { // // set up to search for best frequency and time offset. @@ -3018,38 +3015,69 @@ int FT8::one_iter1( if (params.soft_ones) { - if (params.soft_ones == 1) - { + if (params.soft_ones == 1) { soft_decode(m79, ll174); - } - else - { + } else { c_soft_decode(m79, ll174); } - int ret = try_decode(samples200, ll174, best_hz, best_off, - hz0_for_cb, hz1_for_cb, 1, "", m79); - if (ret) + + int ret = try_decode( + samples200, + ll174, + best_hz, + best_off, + hz0_for_cb, + hz1_for_cb, + params.use_osd, + "", + m79 + ); + + if (ret) { return ret; + } } if (params.soft_pairs) { float p174[174]; soft_decode_pairs(m79, p174); - int ret = try_decode(samples200, p174, best_hz, best_off, - hz0_for_cb, hz1_for_cb, 1, "", m79); - if (ret) + int ret = try_decode( + samples200, + p174, + best_hz, + best_off, + hz0_for_cb, + hz1_for_cb, + params.use_osd, + "", + m79 + ); + + if (ret) { return ret; - if (params.soft_ones == 0) + } + + if (params.soft_ones == 0) { std::copy(p174, p174 + 174, ll174); + } } if (params.soft_triples) { float p174[174]; soft_decode_triples(m79, p174); - int ret = try_decode(samples200, p174, best_hz, best_off, - hz0_for_cb, hz1_for_cb, 1, "", m79); + int ret = try_decode( + samples200, + p174, + best_hz, + best_off, + hz0_for_cb, + hz1_for_cb, + params.use_osd, + "", + m79 + ); if (ret) return ret; } @@ -3085,10 +3113,20 @@ int FT8::one_iter1( n174[i] = ll174[i]; } } - int ret = try_decode(samples200, n174, best_hz, best_off, - hz0_for_cb, hz1_for_cb, 0, "hint1", m79); - if (ret) - { + + int ret = try_decode( + samples200, + n174, + best_hz, + best_off, + hz0_for_cb, + hz1_for_cb, + 0, + "hint1", + m79 + ); + + if (ret) { return ret; } } @@ -3120,10 +3158,20 @@ int FT8::one_iter1( n174[i] = ll174[i]; } } - int ret = try_decode(samples200, n174, best_hz, best_off, - hz0_for_cb, hz1_for_cb, 0, "hint2", m79); - if (ret) - { + + int ret = try_decode( + samples200, + n174, + best_hz, + best_off, + hz0_for_cb, + hz1_for_cb, + 0, + "hint2", + m79 + ); + + if (ret) { return ret; } } diff --git a/ft8/ft8.h b/ft8/ft8.h index 047ce6afb..0b9f90be1 100644 --- a/ft8/ft8.h +++ b/ft8/ft8.h @@ -154,6 +154,7 @@ struct FT8_API FT8Params int use_apriori; int use_hints; // 1 means use all hints, 2 means just CQ hints int win_type; + int use_osd; int osd_depth; // 6; // don't increase beyond 6, produces too much garbage int osd_ldpc_thresh; // demand this many correct LDPC parity bits before OSD int ncoarse; // number of offsets per hz produced by coarse() @@ -222,6 +223,7 @@ struct FT8_API FT8Params use_apriori = 1; use_hints = 2; // 1 means use all hints, 2 means just CQ hints win_type = 1; + use_osd = 1; osd_depth = 0; // 6; // don't increase beyond 6, produces too much garbage osd_ldpc_thresh = 70; // demand this many correct LDPC parity bits before OSD ncoarse = 1; // number of offsets per hz produced by coarse() @@ -563,7 +565,7 @@ public: // // XXX merge with one_iter(). // - int one(const std::vector> &bins, int len, float hz, int off); + int one_merge(const std::vector> &bins, int len, float hz, int off); // return 2 if it decodes to a brand-new message. // return 1 if it decodes but we've already seen it, // perhaps in a different pass. diff --git a/ft8/osd.cpp b/ft8/osd.cpp index 1fd016178..e178a0e40 100644 --- a/ft8/osd.cpp +++ b/ft8/osd.cpp @@ -34,7 +34,7 @@ namespace FT8 { // // check the FT8 CRC-14 // -int check_crc(const int a91[91]) +int OSD::check_crc(const int a91[91]) { int aa[91]; int non_zero = 0; @@ -73,7 +73,7 @@ int check_crc(const int a91[91]) // plain is 91 bits of plain-text. // returns a 174-bit codeword. // mimics wsjt-x's encode174_91.f90. -void ldpc_encode(int plain[91], int codeword[174]) +void OSD::ldpc_encode(int plain[91], int codeword[174]) { // the systematic 91 bits. for (int i = 0; i < 91; i++) @@ -97,7 +97,7 @@ void ldpc_encode(int plain[91], int codeword[174]) // ll174 is what was received. // ldpc-encode xplain; how close is the // result to what we received? -float osd_score(int xplain[91], float ll174[174]) +float OSD::osd_score(int xplain[91], float ll174[174]) { int xcode[174]; ldpc_encode(xplain, xcode); @@ -121,7 +121,7 @@ float osd_score(int xplain[91], float ll174[174]) } // does a decode look plausible? -int osd_check(const int plain[91]) +int OSD::osd_check(const int plain[91]) { int allzero = 1; for (int i = 0; i < 91; i++) @@ -144,7 +144,7 @@ int osd_check(const int plain[91]) return 1; } -void matmul(int a[91][91], int b[91], int c[91]) +void OSD::matmul(int a[91][91], int b[91], int c[91]) { for (int i = 0; i < 91; i++) { @@ -164,10 +164,11 @@ void matmul(int a[91][91], int b[91], int c[91]) // first 91 bits are plaintext, remaining 83 are parity. // returns 0 or 1, with decoded plain bits in out91[]. // and actual depth used in *out_depth. -int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) +int OSD::osd_decode(float codeword[174], int depth, int out[91], int *out_depth) { // strength = abs(codeword) float strength[174]; + for (int i = 0; i < 174; i++) { float x = codeword[i]; @@ -176,58 +177,62 @@ int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) // sort, strongest first; we'll use strongest 91. std::vector which(174); - for (int i = 0; i < 174; i++) + + for (int i = 0; i < 174; i++) { which[i] = i; - std::sort(which.begin(), - which.end(), - [=](int a, int b) - { - return strength[a] > strength[b]; - }); + } + + std::sort( + which.begin(), + which.end(), + [=](int a, int b) { + return strength[a] > strength[b]; + } + ); // gen_sys[174 rows][91 cols] has a row per each of the 174 codeword bits, // indicating how to generate it by xor with each of the 91 plain bits. // generator matrix, reordered strongest codeword bit first. int b[174][91 * 2]; + for (int i = 0; i < 174; i++) { int ii = which[i]; + for (int j = 0; j < 91 * 2; j++) { - if (j < 91) - { + if (j < 91) { b[i][j] = gen_sys[ii][j]; - } - else - { + } else { b[i][j] = 0; } } } int xwhich[174]; - for (int i = 0; i < 174; i++) + + for (int i = 0; i < 174; i++) { xwhich[i] = which[i]; + } int ok = 0; gauss_jordan(91, 174, b, xwhich, &ok); - if (ok == 0) - { + + if (ok == 0) { fprintf(stderr, "gauss_jordan failed\n"); } int gen1_inv[91][91]; + for (int i = 0; i < 91; i++) { - for (int j = 0; j < 91; j++) - { + for (int j = 0; j < 91; j++) { gen1_inv[i][j] = b[i][91 + j]; } } - for (int i = 0; i < 174; i++) - { + for (int i = 0; i < 174; i++) { which[i] = xwhich[i]; } @@ -235,6 +240,7 @@ int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) // more or less strongest-first, converted from // log-likihood to 0/1. int y1[91]; + for (int i = 0; i < 91; i++) { int j = which[i]; @@ -251,9 +257,9 @@ int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) matmul(gen1_inv, y1, xplain); // also does mod 2 int osd_thresh = -500; - float xscore = osd_score(xplain, codeword); int ch = osd_check(xplain); + if (xscore < osd_thresh && ch) { if (got_a_best == 0 || xscore < best_score) @@ -284,6 +290,7 @@ int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) y1[i] ^= 1; float xscore = osd_score(xplain, codeword); int ch = osd_check(xplain); + if (xscore < osd_thresh && ch) { if (got_a_best == 0 || xscore < best_score) @@ -308,7 +315,7 @@ int osd_decode(float codeword[174], int depth, int out[91], int *out_depth) } } -int gen_sys[174][91] = { +const int OSD::gen_sys[174][91] = { { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, diff --git a/ft8/osd.h b/ft8/osd.h index db408fc99..5f78fc0c2 100644 --- a/ft8/osd.h +++ b/ft8/osd.h @@ -23,13 +23,17 @@ namespace FT8 { -extern int gen_sys[174][91]; -int check_crc(const int a91[91]); -void ldpc_encode(int plain[91], int codeword[174]); -float osd_score(int xplain[91], float ll174[174]); -int osd_check(const int plain[91]); -void matmul(int a[91][91], int b[91], int c[91]); -int osd_decode(float codeword[174], int depth, int out[91], int *out_depth); +class OSD +{ +public: + static const int gen_sys[174][91]; + static int check_crc(const int a91[91]); + static void ldpc_encode(int plain[91], int codeword[174]); + static float osd_score(int xplain[91], float ll174[174]); + static int osd_check(const int plain[91]); + static void matmul(int a[91][91], int b[91], int c[91]); + static int osd_decode(float codeword[174], int depth, int out[91], int *out_depth); +}; } // namepsace FT8 diff --git a/plugins/channelrx/demodft8/ft8demodbaseband.cpp b/plugins/channelrx/demodft8/ft8demodbaseband.cpp index b8345696d..b6fe2a23d 100644 --- a/plugins/channelrx/demodft8/ft8demodbaseband.cpp +++ b/plugins/channelrx/demodft8/ft8demodbaseband.cpp @@ -245,6 +245,18 @@ void FT8DemodBaseband::applySettings(const FT8DemodSettings& settings, bool forc m_ft8DemodWorker->setDecoderTimeBudget(settings.m_decoderTimeBudget); } + if ((settings.m_useOSD != m_settings.m_useOSD) || force) { + m_ft8DemodWorker->setUseOSD(settings.m_useOSD); + } + + if ((settings.m_osdDepth != m_settings.m_osdDepth) || force) { + m_ft8DemodWorker->setOSDDepth(settings.m_osdDepth); + } + + if ((settings.m_osdLDPCThreshold != m_settings.m_osdLDPCThreshold) || force) { + m_ft8DemodWorker->setOSDLDPCThreshold(settings.m_osdLDPCThreshold); + } + m_sink.applySettings(settings, force); m_settings = settings; } diff --git a/plugins/channelrx/demodft8/ft8demodfilterproxy.cpp b/plugins/channelrx/demodft8/ft8demodfilterproxy.cpp index ead8183f4..05c28922e 100644 --- a/plugins/channelrx/demodft8/ft8demodfilterproxy.cpp +++ b/plugins/channelrx/demodft8/ft8demodfilterproxy.cpp @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// +#include "ft8demodsettings.h" #include "ft8demodfilterproxy.h" FT8DemodFilterProxy::FT8DemodFilterProxy(QObject *parent) : @@ -56,6 +57,13 @@ void FT8DemodFilterProxy::setFilterLoc(const QString& locString) invalidateFilter(); } +void FT8DemodFilterProxy::setFilterInfo(const QString& infoString) +{ + m_filterActive = FILTER_INFO; + m_info= infoString; + invalidateFilter(); +} + bool FT8DemodFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { if (m_filterActive == FILTER_NONE) { @@ -64,30 +72,42 @@ bool FT8DemodFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sou if (m_filterActive == FILTER_UTC) { - QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_UTC, sourceParent); return sourceModel()->data(index).toString() == m_utc; } if (m_filterActive == FILTER_DF) { - QModelIndex index = sourceModel()->index(sourceRow, 4, sourceParent); + QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_DF, sourceParent); int df = sourceModel()->data(index).toInt(); return (df >= m_df - 4) && (df <= m_df + 4); // +/- 4 Hz tolerance which is about one symbol width } if (m_filterActive == FILTER_CALL) { - QModelIndex indexCall1 = sourceModel()->index(sourceRow, 6, sourceParent); - QModelIndex indexCall2 = sourceModel()->index(sourceRow, 7, sourceParent); + QModelIndex indexCall1 = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_CALL1, sourceParent); + QModelIndex indexCall2 = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_CALL2, sourceParent); return (sourceModel()->data(indexCall1).toString() == m_call) || (sourceModel()->data(indexCall2).toString() == m_call); } if (m_filterActive == FILTER_LOC) { - QModelIndex index = sourceModel()->index(sourceRow, 8, sourceParent); + QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_LOC, sourceParent); return sourceModel()->data(index).toString() == m_loc; } + if (m_filterActive == FILTER_INFO) + { + QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_INFO, sourceParent); + const QString& content = sourceModel()->data(index).toString(); + + if (m_info.startsWith("OSD")) { + return content.startsWith("OSD"); + } else { + return !content.startsWith("OSD"); + } + } + return true; } diff --git a/plugins/channelrx/demodft8/ft8demodfilterproxy.h b/plugins/channelrx/demodft8/ft8demodfilterproxy.h index e51f29148..fb5496cb8 100644 --- a/plugins/channelrx/demodft8/ft8demodfilterproxy.h +++ b/plugins/channelrx/demodft8/ft8demodfilterproxy.h @@ -30,6 +30,7 @@ public: void setFilterDf(int df); void setFilterCall(const QString& utcString); void setFilterLoc(const QString& utcString); + void setFilterInfo(const QString& infoString); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; @@ -41,7 +42,8 @@ private: FILTER_UTC, FILTER_DF, FILTER_CALL, - FILTER_LOC + FILTER_LOC, + FILTER_INFO }; bool dfInRange(int df) const; @@ -50,6 +52,7 @@ private: int m_df; QString m_call; QString m_loc; + QString m_info; }; #endif // INCLUDE_FT8DEMODFILTERPROXY_H diff --git a/plugins/channelrx/demodft8/ft8demodgui.cpp b/plugins/channelrx/demodft8/ft8demodgui.cpp index ab5101973..d94aec581 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.cpp +++ b/plugins/channelrx/demodft8/ft8demodgui.cpp @@ -475,6 +475,24 @@ void FT8DemodGUI::on_settings_clicked() changed = true; } + if (settingsKeys.contains("useOSD")) + { + m_settings.m_useOSD = settings.m_useOSD; + changed = true; + } + + if (settingsKeys.contains("osdDepth")) + { + m_settings.m_osdDepth = settings.m_osdDepth; + changed = true; + } + + if (settingsKeys.contains("osdLDPCThreshold")) + { + m_settings.m_osdLDPCThreshold = settings.m_osdLDPCThreshold; + changed = true; + } + if (settingsKeys.contains("bandPresets")) { m_settings.m_bandPresets = settings.m_bandPresets; @@ -907,6 +925,8 @@ void FT8DemodGUI::filterMessages() m_messagesFilterProxy.setFilterUTC(m_selectedData.toString()); } else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_DF) { m_messagesFilterProxy.setFilterDf(m_selectedData.toInt()); + } else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_INFO) { + m_messagesFilterProxy.setFilterInfo(m_selectedData.toString()); } } diff --git a/plugins/channelrx/demodft8/ft8demodgui.ui b/plugins/channelrx/demodft8/ft8demodgui.ui index 6210e1ba0..ef87a048b 100644 --- a/plugins/channelrx/demodft8/ft8demodgui.ui +++ b/plugins/channelrx/demodft8/ft8demodgui.ui @@ -823,7 +823,7 @@ - Total number of decodes displayed + Total number of decodes since start 0 diff --git a/plugins/channelrx/demodft8/ft8demodsettings.cpp b/plugins/channelrx/demodft8/ft8demodsettings.cpp index 7c7d599fd..aa00e07b9 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettings.cpp @@ -47,6 +47,9 @@ void FT8DemodSettings::resetToDefaults() m_logMessages = false; m_nbDecoderThreads = 3; m_decoderTimeBudget = 0.5; + m_useOSD = false; + m_osdDepth = 0; + m_osdLDPCThreshold = 70; m_volume = 1.0; m_inputFrequencyOffset = 0; m_rgbColor = QColor(0, 192, 255).rgb(); @@ -107,6 +110,9 @@ QByteArray FT8DemodSettings::serialize() const s.writeS32(8, m_nbDecoderThreads); s.writeFloat(9, m_decoderTimeBudget); s.writeBool(11, m_agc); + s.writeBool(12, m_useOSD); + s.writeS32(13, m_osdDepth); + s.writeS32(14, m_osdLDPCThreshold); s.writeString(16, m_title); s.writeBool(18, m_useReverseAPI); s.writeString(19, m_reverseAPIAddress); @@ -172,6 +178,9 @@ bool FT8DemodSettings::deserialize(const QByteArray& data) d.readS32(8, &m_nbDecoderThreads, 3); d.readFloat(9, &m_decoderTimeBudget, 0.5); d.readBool(11, &m_agc, false); + d.readBool(12, &m_useOSD, false); + d.readS32(13, &m_osdDepth, 0); + d.readS32(14, &m_osdLDPCThreshold, 70); d.readString(16, &m_title, "SSB Demodulator"); d.readBool(18, &m_useReverseAPI, false); d.readString(19, &m_reverseAPIAddress, "127.0.0.1"); diff --git a/plugins/channelrx/demodft8/ft8demodsettings.h b/plugins/channelrx/demodft8/ft8demodsettings.h index edf07297a..d6b13d014 100644 --- a/plugins/channelrx/demodft8/ft8demodsettings.h +++ b/plugins/channelrx/demodft8/ft8demodsettings.h @@ -72,6 +72,9 @@ struct FT8DemodSettings bool m_logMessages; int m_nbDecoderThreads; float m_decoderTimeBudget; + bool m_useOSD; + int m_osdDepth; + int m_osdLDPCThreshold; quint32 m_rgbColor; QString m_title; int m_streamIndex; //!< MIMO channel. Not relevant when connected to SI (single Rx). diff --git a/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp b/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp index bd9e9d6c1..62e2e6151 100644 --- a/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp +++ b/plugins/channelrx/demodft8/ft8demodsettingsdialog.cpp @@ -29,6 +29,11 @@ FT8DemodSettingsDialog::FT8DemodSettingsDialog(FT8DemodSettings& settings, QStri ui->setupUi(this); ui->decoderNbThreads->setValue(m_settings.m_nbDecoderThreads); ui->decoderTimeBudget->setValue(m_settings.m_decoderTimeBudget); + ui->osdEnable->setChecked(m_settings.m_useOSD); + ui->osdDepth->setValue(m_settings.m_osdDepth); + ui->osdDepthText->setText(tr("%1").arg(m_settings.m_osdDepth)); + ui->osdLDPCThreshold->setValue(m_settings.m_osdLDPCThreshold); + ui->osdLDPCThresholdText->setText(tr("%1").arg(m_settings.m_osdLDPCThreshold)); resizeBandsTable(); populateBandsTable(); connect(ui->bands, &QTableWidget::cellChanged, this, &FT8DemodSettingsDialog::textCellChanged); @@ -118,6 +123,35 @@ void FT8DemodSettingsDialog::on_decoderTimeBudget_valueChanged(double value) } } +void FT8DemodSettingsDialog::on_osdEnable_toggled(bool checked) +{ + m_settings.m_useOSD = checked; + + if (!m_settingsKeys.contains("useOSD")) { + m_settingsKeys.append("useOSD"); + } +} + +void FT8DemodSettingsDialog::on_osdDepth_valueChanged(int value) +{ + m_settings.m_osdDepth = value; + ui->osdDepthText->setText(tr("%1").arg(m_settings.m_osdDepth)); + + if (!m_settingsKeys.contains("osdDepth")) { + m_settingsKeys.append("osdDepth"); + } +} + +void FT8DemodSettingsDialog::on_osdLDPCThreshold_valueChanged(int value) +{ + m_settings.m_osdLDPCThreshold = value; + ui->osdLDPCThresholdText->setText(tr("%1").arg(m_settings.m_osdLDPCThreshold)); + + if (!m_settingsKeys.contains("osdLDPCThreshold")) { + m_settingsKeys.append("osdLDPCThreshold"); + } +} + void FT8DemodSettingsDialog::on_addBand_clicked() { int currentRow = ui->bands->currentRow(); diff --git a/plugins/channelrx/demodft8/ft8demodsettingsdialog.h b/plugins/channelrx/demodft8/ft8demodsettingsdialog.h index c59ac0b6f..931955e93 100644 --- a/plugins/channelrx/demodft8/ft8demodsettingsdialog.h +++ b/plugins/channelrx/demodft8/ft8demodsettingsdialog.h @@ -51,6 +51,9 @@ private slots: void reject(); void on_decoderNbThreads_valueChanged(int value); void on_decoderTimeBudget_valueChanged(double value); + void on_osdEnable_toggled(bool checked); + void on_osdDepth_valueChanged(int value); + void on_osdLDPCThreshold_valueChanged(int value); void on_addBand_clicked(); void on_deleteBand_clicked(); void on_moveBandUp_clicked(); diff --git a/plugins/channelrx/demodft8/ft8demodsettingsdialog.ui b/plugins/channelrx/demodft8/ft8demodsettingsdialog.ui index d3a83db7e..e55a833fa 100644 --- a/plugins/channelrx/demodft8/ft8demodsettingsdialog.ui +++ b/plugins/channelrx/demodft8/ft8demodsettingsdialog.ui @@ -7,7 +7,7 @@ 0 0 349 - 316 + 333 @@ -25,11 +25,8 @@ Decoder - - - 2 - - + + @@ -98,6 +95,124 @@ + + + + 2 + + + + + Toggle Ordered Statistics Decoding + + + OSD + + + true + + + + + + + Depth + + + + + + + + 24 + 24 + + + + Order Statistics Decoding depth + + + 0 + + + 6 + + + 1 + + + 0 + + + + + + + 0 + + + + + + + Qt::Vertical + + + + + + + LDPC Thr + + + + + + + + 24 + 24 + + + + Number of correct LDPC bits required to activate OSD + + + 60 + + + 83 + + + 1 + + + 70 + + + + + + + 60 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -282,6 +397,13 @@ + + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
+
diff --git a/plugins/channelrx/demodft8/ft8demodworker.cpp b/plugins/channelrx/demodft8/ft8demodworker.cpp index 8d5ae3ea1..99edd8eda 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.cpp +++ b/plugins/channelrx/demodft8/ft8demodworker.cpp @@ -110,6 +110,9 @@ FT8DemodWorker::FT8DemodWorker() : m_recordSamples(false), m_nbDecoderThreads(6), m_decoderTimeBudget(0.5), + m_useOSD(false), + m_osdDepth(0), + m_osdLDPCThreshold(70), m_lowFreq(200), m_highFreq(3000), m_invalidSequence(true), @@ -157,6 +160,9 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS) int hints[2] = { 2, 0 }; // CQ FT8Callback ft8Callback(periodTS, m_baseFrequency, m_packing, channelReference); m_ft8Decoder.getParams().nthreads = m_nbDecoderThreads; + 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 samples(15*FT8DemodSettings::m_ft8SampleRate); std::transform( @@ -217,7 +223,7 @@ 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 FT8 %3 %4 %5 %6 %7 %8 %9") .arg(periodTS.toString("yyyyMMdd_HHmmss")) .arg(baseFrequencyMHz, 9, 'f', 3) .arg(ft8Message.snr, 6) @@ -225,7 +231,8 @@ void FT8DemodWorker::processBuffer(int16_t *buffer, QDateTime periodTS) .arg(ft8Message.df, 4, 'f', 0) .arg(ft8Message.call1) .arg(ft8Message.call2) - .arg(ft8Message.loc); + .arg(ft8Message.loc) + .arg(ft8Message.decoderInfo); logMessage.remove(0, 2); logFile << logMessage.toStdString() << std::endl; } diff --git a/plugins/channelrx/demodft8/ft8demodworker.h b/plugins/channelrx/demodft8/ft8demodworker.h index 4bcc34ff9..71e362f1b 100644 --- a/plugins/channelrx/demodft8/ft8demodworker.h +++ b/plugins/channelrx/demodft8/ft8demodworker.h @@ -40,6 +40,9 @@ public: void setLogMessages(bool logMessages) { m_logMessages = logMessages; } void setNbDecoderThreads(int nbDecoderThreads) { m_nbDecoderThreads = nbDecoderThreads; } void setDecoderTimeBudget(float decoderTimeBudget) { m_decoderTimeBudget = decoderTimeBudget; } + void setUseOSD(bool useOSD) { m_useOSD = useOSD; } + void setOSDDepth(int osdDepth) { m_osdDepth = osdDepth; } + void setOSDLDPCThreshold(int osdLDPCThreshold) { m_osdLDPCThreshold = osdLDPCThreshold; } void setLowFrequency(int lowFreq) { m_lowFreq = lowFreq; } void setHighFrequency(int highFreq) { m_highFreq = highFreq; } void setReportingMessageQueue(MessageQueue *messageQueue) { m_reportingMessageQueue = messageQueue; } @@ -86,6 +89,9 @@ private: bool m_logMessages; int m_nbDecoderThreads; float m_decoderTimeBudget; + bool m_useOSD; + int m_osdDepth; + int m_osdLDPCThreshold; int m_lowFreq; int m_highFreq; bool m_invalidSequence; diff --git a/plugins/channelrx/demodft8/readme.md b/plugins/channelrx/demodft8/readme.md index 5dd2e37ce..e111f4e12 100644 --- a/plugins/channelrx/demodft8/readme.md +++ b/plugins/channelrx/demodft8/readme.md @@ -2,7 +2,7 @@

Introduction

-This plugin can be used to demodulate and decode FT8 signals. FT8 is used by amateur radio to perform contacts (QSOs) with very weak signals. It is used mostly but not limited to HF bands. The protocol and modulation details are described [here](http://www.rtmrtm.org/basicft8/) +This plugin can be used to demodulate and decode FT8 signals. FT8 is used by amateur radio to perform contacts (QSOs) with very weak signals. It is used mostly but not limited to HF bands. The protocol and modulation details are described in [QEX July/August 2020 article](https://www.iz3mez.it/wp-content/library/appunti/Protocols%20FT4%20FT8%20QEX.pdf) The decoder code is based on [ft8mon](https://github.com/rtmrtmrtmrtm/ft8mon) code written by Robert Morris, AB1HL. The core of the decoder is stored in a separate `libft8` library in the `ft8` folder of this repository and is placed under the `FT8` namespace. @@ -124,6 +124,7 @@ Toggles the filtering of messages. Messages are filtered based on the selected c - **Call1**: will filter messages matching the call1 area value either in the call1 or call2 areas - **Call2**: same as above but taking the call2 value - **Loc**: will filter messages matching the value in the locator (loc) area + - **Info**: will filter values starting with "OSD" or not starting with "OSD" thus filter messages decoded via OSD or not

C.5: Band preset selection

@@ -139,7 +140,26 @@ Empties the message table (C.10)

C.8: Log messages

-Toggles the logging of messages. Messages will be logged in the same format as the original WSJT-X format. The splitting and naming of files is different however. +Toggles the logging of messages. Messages will be logged in the same format as the original WSJT-X format except if the message has decoder information in which case this information is appended at the end of the line. + +Example: + +
+230128_003030    10.136 Rx FT8    -22  0.1 2049 KE0DKZ W2ZI EL99 OSD-0-71
+---- 1 ------    --2---           -3-  -4- --5- --6--- --7- --8- ---9----
+
+ + - **1**: Date and time of decoder slot in YYMMDD_HHmmss fomat + - **2**: Base frequency in MHz + - **3**: SNR in 2.5 kHz bandwidth + - **4**: Message start delay in seconds from standard sequence start + - **5**: Message carrier shift from base frequency in Hz + - **6**: First callsign area. May contain spaces (ex: "CQ DX") + - **7**: Second callsign area + - **8**: Locator area + - **9**: Decoder information if any + +The splitting and naming of files is different from WSJT-X scheme. The file name is constructed as follows where date is the day date in YYYYMMDD format: @@ -171,7 +191,7 @@ Displays the received messages in a table which columns are the following: - **Call1**: This is the first call area and may contain the caller callsign, a CQ or a custom 13 character message in which case the second call and locator areas are empty - **Call2**: This is the second call area and will contain the callsign of the responding station - **Loc**: Locator area which contains the 4 character Maidenhead locator, a report, an acknowledgement (RRR) or a greetings (73 or RR73) - - **Info**: FT8 decoder information if any. This comes from he original `ft8mon` code + - **Info**: FT8 decoder information if any. If OSD is active (see C.1.3) and OSD was activated it reports the OSD decoder status as `OSD-N-MM` where N is the OSD depth reached and MM is the number of correct LDPC bits.

C.1: More FT8 decoder settings

@@ -187,7 +207,21 @@ When processing the audio baseband several instances of the core decoder will be This is the time in seconds after which the decoder threads will be prompted to stop. It can be varied from 0.1 to 5 seconds. You can imagine that the longer the decoder runs the more messages it will harvest however the default of 0.5s will be enough in most cases. You can still experiment with it to find what value is the best in your own case. -

C.1.3: Band presets table

+

C.1.3: Toggle Ordered Statistics Decoding

+ +This toggles the Ordered Statistics Decoding (OSD). OSD is used if the CRC check fails after LDPC processing. Be careful with OSD as it will try to find solutions that validate the CRC but these solutions can be wrong and thus yield false messages. When post processing the results it is recommended to check against a database of valid callsigns. At least you should use a list of valid country prefixes and test the locator against the country prefix. + +With reasonable depth (C.1.4) and minimum correct LDPC bits (C.1.5) values the amount of false messages should be low so OSD may still be interesting. However if you require best accuracy you should filter messages in a post processing step as suggested above. + +

C.1.4: Ordered Statistics Decoding depth

+ +Sets the maximum depth of OSD search. + +

C.1.5: LDPC correct bits threshold

+ +Sets the minimum number of correct LDPC bits (out of 83) necessary to trigger OSD. + +

C.1.6: Band presets table

This table shows the band presets values that will appear in (C.5) @@ -197,23 +231,23 @@ This table shows the band presets values that will appear in (C.5) You can edit these values by clicking on the cell in the table. -

C.1.4: Add preset

+

C.1.7: Add preset

Use this button to create a new preset. It will take the values from the row of the selected cell in the table (if selected) and put the new preset at the bottom of the table -

C.1.5: Delete preset

+

C.1.8: Delete preset

Delete the preset designated by the selected cell in the table. -

C.1.6: Move up preset

+

C.1.9: Move up preset

Move up the preset designated by the selected cell in the table. -

C.1.7: Move down preset

+

C.1.10: Move down preset

Move down the preset designated by the selected cell in the table. -

C.1.8: Restore defaults

+

C.1.11: Restore defaults

This restores the default band preset values: @@ -235,10 +269,10 @@ This restores the default band preset values: Channel offsets are all set to 0 kHz. -

C.1.9 Commit changes

+

C.1.12 Commit changes

Click on the "OK" button to commit changes and close dialog. -

C.1.9 Cancel changes

+

C.1.13 Cancel changes

Click on the "Cancel" button to close dialog without making changes. diff --git a/sdrbench/test_ft8.cpp b/sdrbench/test_ft8.cpp index 1a1d0e2bf..b8c627da5 100644 --- a/sdrbench/test_ft8.cpp +++ b/sdrbench/test_ft8.cpp @@ -205,6 +205,7 @@ void MainBench::testFT8(const QString& wavFile, const QString& argsStr) FT8::FT8Decoder decoder; decoder.getParams().nthreads = nthreads; + decoder.getParams().use_osd = 0; decoder.entry( samples.data(),