diff --git a/CMakeLists.txt b/CMakeLists.txt index c3a24ef23..6dfd87cde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -424,7 +424,6 @@ set (wsjt_FSRCS lib/gen4.f90 lib/gen65.f90 lib/gen9.f90 - lib/geniscat.f90 lib/genwave.f90 lib/ft8/genft8.f90 lib/qra/q65/genq65.f90 @@ -456,7 +455,6 @@ set (wsjt_FSRCS lib/interleave63.f90 lib/interleave9.f90 lib/inter_wspr.f90 - lib/iscat.f90 lib/jplsubs.f lib/jt9fano.f90 lib/jtmsg.f90 @@ -538,7 +536,6 @@ set (wsjt_FSRCS lib/sync9.f90 lib/sync9f.f90 lib/sync9w.f90 - lib/synciscat.f90 lib/timf2.f90 lib/tweak1.f90 lib/twkfreq.f90 diff --git a/Darwin/ReadMe.txt b/Darwin/ReadMe.txt index 78c092ca4..7bb73d262 100644 --- a/Darwin/ReadMe.txt +++ b/Darwin/ReadMe.txt @@ -21,7 +21,7 @@ There are two system variables that must be set manually since the M1 Macs do no automatic parameter settings by means of the sysctl.conf file present in the download. Type these commands - you will be asked for your password which will not be echoed: - sudo sysctl -w kern.sysv.shmmax=104857600 + sudo sysctl -w kern.sysv.shmmax=52428800 sudo sysctl -w kern.sysv.shmall=25600 It is important to note that these parameter settings will not survive a reboot. If you @@ -46,7 +46,7 @@ change has been made by typing: sysctl -a | grep sysv.shm -If shmmax is not shown as 104857600 then contact me since WSJT-X will fail to load with +If shmmax is not shown as 52428800 then contact me since WSJT-X will fail to load with an error message: "Unable to create shared memory segment". You can now close the Terminal window. It will not be necessary to repeat this procedure @@ -105,10 +105,23 @@ would probably be corrupted.) It is possible to run two instances of WSJT-X simultaneously. See "Section 16.2 Frequently asked Questions" in the User Guide. If you wish to run more than two instances -simultaneously, the sysctl.conf file needs to be modified. Please email me with your -requirements and I will provide a replacement sysctl.conf to suit. +simultaneously, the shmall parameter in the sysctl.conf file needs to be modified as follows. + +The shmall parameter determines the amount of shared memory which is allocated in 4096 byte pages +with 50MB (52428800) required for each instance. The shmall parameter is calculated as: +(n * 52428800)/4096 where 'n' is the number of instances required to run simultaneously. If +you are using an Intel Mac, modify the shmall parameter in the sysctl.conf file using a Mac editor +and then install in the /etc directory using the installation procedure described above for an +Intel Mac. Remember to reboot your Mac afterwards. + +If you are using an M1 Mac, then simply issue the sudo sysctl -w kern.sysv.shmall=xxx command where +xxx is the new value of shmall that is required. + +Note that the shmmax parameter remains unchanged. This is the maximum amount of shared memory that +any one instance is allowed to request from the total shared memory allocation and should not +be changed. If two instances of WSJT-X are running, it is likely that you might need additional audio devices, from two rigs for example. Visit Audio MIDI Setup and create an Aggregate Device -which will allow you to specific more than one interface. I recommend you consult Apple's guide +which will allow you to specify more than one interface. I recommend you consult Apple's guide on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000. diff --git a/Darwin/sysctl.conf b/Darwin/sysctl.conf index 4d6cf69e0..09ab36540 100644 --- a/Darwin/sysctl.conf +++ b/Darwin/sysctl.conf @@ -1,4 +1,4 @@ -kern.sysv.shmmax=104857600 +kern.sysv.shmmax=52428800 kern.sysv.shmmin=1 kern.sysv.shmmni=128 kern.sysv.shmseg=32 diff --git a/Decoder/decodedtext.cpp b/Decoder/decodedtext.cpp index 04a5cc87e..ccbf56621 100644 --- a/Decoder/decodedtext.cpp +++ b/Decoder/decodedtext.cpp @@ -16,11 +16,15 @@ namespace DecodedText::DecodedText (QString const& the_string) : string_ {the_string.left (the_string.indexOf (QChar::Nbsp))} // discard appended info + , clean_string_ {string_} , padding_ {string_.indexOf (" ") > 4 ? 2 : 0} // allow for // seconds , message_ {string_.mid (column_qsoText + padding_).trimmed ()} , is_standard_ {false} { + // discard appended AP info + clean_string_.replace (QRegularExpression {R"(^(.*)(?:(?:\?\s)?a[0-9].*)$)"}, "\\1"); + // qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp); if (message_.length() >= 1) { diff --git a/Decoder/decodedtext.h b/Decoder/decodedtext.h index b228f921b..1e6706b53 100644 --- a/Decoder/decodedtext.h +++ b/Decoder/decodedtext.h @@ -32,6 +32,7 @@ public: explicit DecodedText (QString const& message); QString string() const { return string_; }; + QString clean_string() const { return clean_string_; }; QStringList messageWords () const; int indexOf(QString s) const { return string_.indexOf(s); }; int indexOf(QString s, int i) const { return string_.indexOf(s,i); }; @@ -76,6 +77,7 @@ private: column_qsoText = 22 }; QString string_; + QString clean_string_; int padding_; QString message_; QString message0_; diff --git a/MultiSettings.cpp b/MultiSettings.cpp index 29c686d3d..55bad6f44 100644 --- a/MultiSettings.cpp +++ b/MultiSettings.cpp @@ -576,20 +576,28 @@ void MultiSettings::impl::select_configuration (QString const& target_name) { if (main_window_ && target_name != current_) { + bool changed {false}; { auto const& current_group = settings_.group (); if (current_group.size ()) settings_.endGroup (); // position to the alternative settings SettingsGroup alternatives {&settings_, multi_settings_root_group}; - // save the target settings - SettingsGroup target_group {&settings_, target_name}; - new_settings_ = get_settings (); + if (settings_.childGroups ().contains (target_name)) + { + changed = true; + // save the target settings + SettingsGroup target_group {&settings_, target_name}; + new_settings_ = get_settings (); + } if (current_group.size ()) settings_.beginGroup (current_group); } - // and set up the restart - current_ = target_name; - Q_EMIT parent_->configurationNameChanged (unescape_ampersands (current_)); - restart (RepositionType::save_and_replace); + if (changed) + { + // and set up the restart + current_ = target_name; + Q_EMIT parent_->configurationNameChanged (unescape_ampersands (current_)); + restart (RepositionType::save_and_replace); + } } } diff --git a/NEWS b/NEWS index c9acdcef8..7402d4013 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,3 @@ - __ __ ______ _____ ________ __ __ | \ _ | \ / \ | \| \ | \ | \ | $$ / \ | $$| $$$$$$\ \$$$$$ \$$$$$$$$ | $$ | $$ @@ -13,6 +12,91 @@ Copyright 2001 - 2021 by Joe Taylor, K1JT. + Release: WSJT-X 2.4.0-rc2 + Mar 6, 2021 + ------------------------- + +WSJT-X 2.4.0 Release Candidate 2 adds new Q65 mode functionality and +decoder optimizations; repairs defects and regressions discovered in +the RC1 release. + + - Q65 sample .WAV files added. + + - Repair a defect that caused WSJT-X to crash when launched from an + icon on macOS. + + - Repair a crash when using the JT4 mode. + + - Sequencing improvements to hold transmitted signal report fixed + during a QSO. + + - UI translation updates tnx to Sze-to, VR2UPU, and Michael, 5P1KZX. + + - Enable the "Call 1st" option for Q65. + + - Improved Q65 message averaging that linearly averages the first 4 + sequences and averages exponentially thereafter using a + time-constant of 4 sequences. + + - Improved macOS post-install instructions, tnx to John, G4KLA. + + - Enhanced Q65 simulator that generates file names compatible with + message averaging, tnx Charlie, G3WDG. + + - Q65 simulator option to generate single tone waveforms, tnx to + Charlie, G3WDG. + + - Better suppression of birdies in the Q65 decoder. + + - Blank Q65 decode messages removed. + + - Automatic low Tx audio offset for the widest Q65 modes to keep Tx + signal in transmitter passband, tnx to Charlie, G3WDG. + + - Improved SNR estimates for Q65 mode. + + - Decode depths Fast/Normal/Deep are now identical in Q65 mode. + + - "Save decoded" is now enabled for Q65 mode. + + - The obsolete ISCAT mode has been removed. + + + Release: WSJT-X 2.3.1 + Mar 8, 2021 + --------------------- + +WSJT-X 2.3.1 General Availability release updates the User Guide to +cover the new modes FST4 and FST4W along with sample .WAV files and +decoding tutorials. This release also repairs a number of defects and +regressions discovered since the v2.3.0 release, including those +below. + + - When sending traffic to a multicast UDP server ensure that the + local loop-back interface is used if no others are selected. + + - Repair a defect in instance lock file handling that causes an + infinite loop on start up. + + - Invert the PTT serial port sharing default behaviour, and enable + sharing when non-Hamlib CAT control is combined with direct serial + port PTT control. + + - Allow the FST4 and FST4W decoders to continue after the first + successful decode when using negative NB values to try multiple NB + values. + + - Repair defects in auto-sequencing, particularly with responding to + a repeated final message. In general a double-click of the repeated + message now does the right thing. + + - Repair a regression that had inadvertently disabled EU VHF Contest + mode when using the MSK144 mode. + + - Repair a defect that could caused incorrect log entry fields when + using FT4 mode and a priori (AP) decoding. + + Release: WSJT-X 2.4.0-rc1 Feb 3, 2021 ------------------------- @@ -351,7 +435,7 @@ prior v2.2.0 release. Here is a brief summary; - Italian UI translation, tnx Marco, PY1ZRJ. - - Updated Spanish UI translation, tnx Cdric, EA4AC. + - Updated Spanish UI translation, tnx Cédric, EA4AC. Release: WSJT-X 2.2 diff --git a/Release_Notes.txt b/Release_Notes.txt index a06d781da..3d3361e11 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -9,10 +9,94 @@ \$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$ - Copyright 2001 - 2021 by Joe Taylor, K1JT. + Release: WSJT-X 2.4.0-rc2 + Mar 6, 2021 + ------------------------- + +WSJT-X 2.4.0 Release Candidate 2 adds new Q65 mode functionality and +decoder optimizations; repairs defects and regressions discovered in +the RC1 release. + + - Q65 sample .WAV files added. + + - Repair a defect that caused WSJT-X to crash when launched from an + icon on macOS. + + - Repair a crash when using the JT4 mode. + + - Sequencing improvements to hold transmitted signal report fixed + during a QSO. + + - UI translation updates tnx to Sze-to, VR2UPU, and Michael, 5P1KZX. + + - Enable the "Call 1st" option for Q65. + + - Improved Q65 message averaging that linearly averages the first 4 + sequences and averages exponentially thereafter using a + time-constant of 4 sequences. + + - Improved macOS post-install instructions, tnx to John, G4KLA. + + - Enhanced Q65 simulator that generates file names compatible with + message averaging, tnx Charlie, G3WDG. + + - Q65 simulator option to generate single tone waveforms, tnx to + Charlie, G3WDG. + + - Better suppression of birdies in the Q65 decoder. + + - Blank Q65 decode messages removed. + + - Automatic low Tx audio offset for the widest Q65 modes to keep Tx + signal in transmitter passband, tnx to Charlie, G3WDG. + + - Improved SNR estimates for Q65 mode. + + - Decode depths Fast/Normal/Deep are now identical in Q65 mode. + + - "Save decoded" is now enabled for Q65 mode. + + - The obsolete ISCAT mode has been removed. + + + Release: WSJT-X 2.3.1 + Mar 8, 2021 + --------------------- + +WSJT-X 2.3.1 General Availability release updates the User Guide to +cover the new modes FST4 and FST4W along with sample .WAV files and +decoding tutorials. This release also repairs a number of defects and +regressions discovered since the v2.3.0 release, including those +below. + + - When sending traffic to a multicast UDP server ensure that the + local loop-back interface is used if no others are selected. + + - Repair a defect in instance lock file handling that causes an + infinite loop on start up. + + - Invert the PTT serial port sharing default behaviour, and enable + sharing when non-Hamlib CAT control is combined with direct serial + port PTT control. + + - Allow the FST4 and FST4W decoders to continue after the first + successful decode when using negative NB values to try multiple NB + values. + + - Repair defects in auto-sequencing, particularly with responding to + a repeated final message. In general a double-click of the repeated + message now does the right thing. + + - Repair a regression that had inadvertently disabled EU VHF Contest + mode when using the MSK144 mode. + + - Repair a defect that could caused incorrect log entry fields when + using FT4 mode and a priori (AP) decoding. + + Release: WSJT-X 2.4.0-rc1 Feb 3, 2021 ------------------------- @@ -352,7 +436,7 @@ prior v2.2.0 release. Here is a brief summary; - Italian UI translation, tnx Marco, PY1ZRJ. - - Updated Spanish UI translation, tnx Cdric, EA4AC. + - Updated Spanish UI translation, tnx Cédric, EA4AC. Release: WSJT-X 2.2 diff --git a/SampleDownloader.cpp b/SampleDownloader.cpp index a6f5174f6..16913685f 100644 --- a/SampleDownloader.cpp +++ b/SampleDownloader.cpp @@ -117,7 +117,7 @@ SampleDownloader::impl::impl (QSettings * settings main_layout_.addLayout (&left_layout_, 0, 0); main_layout_.addWidget (&button_box_, 0, 1); main_layout_.addWidget (&details_widget_, 1, 0, 1, 2); - main_layout_.setRowStretch (1, 2); + main_layout_.setRowStretch (0, 2); setLayout (&main_layout_); connect (&button_box_, &QDialogButtonBox::clicked, this, &SampleDownloader::impl::button_clicked); diff --git a/SampleDownloader/Directory.cpp b/SampleDownloader/Directory.cpp index 19169e117..45ebe6b5f 100644 --- a/SampleDownloader/Directory.cpp +++ b/SampleDownloader/Directory.cpp @@ -49,6 +49,8 @@ Directory::Directory (Configuration const * configuration setColumnCount (2); setHeaderLabels ({tr ("File"), tr ("Progress")}); + headerItem ()->setTextAlignment (0, Qt::AlignHCenter); + headerItem ()->setTextAlignment (1, Qt::AlignHCenter); header ()->setSectionResizeMode (QHeaderView::ResizeToContents); setItemDelegate (&item_delegate_); @@ -294,14 +296,15 @@ void Directory::update (QTreeWidgetItem * item) int counted {0}; // get the count, progress and size of children - int items {recurse_children (item, &counted, &bytes, &max)}; + // int items {recurse_children (item, &counted, &bytes, &max)}; + recurse_children (item, &counted, &bytes, &max); // estimate size of items not yet downloaded as average of // those actually present - if (counted) - { - max += (items - counted) * max / counted; - } + // if (counted) + // { + // max += (items - counted) * max / counted; + // } // save as our progress item->setData (1, Qt::UserRole, max); diff --git a/SampleDownloader/DirectoryDelegate.cpp b/SampleDownloader/DirectoryDelegate.cpp index f64e98703..f2589165d 100644 --- a/SampleDownloader/DirectoryDelegate.cpp +++ b/SampleDownloader/DirectoryDelegate.cpp @@ -14,28 +14,42 @@ void DirectoryDelegate::paint (QPainter * painter, QStyleOptionViewItem const& o { if (1 == index.column ()) { - QStyleOptionProgressBar progress_bar_option; - progress_bar_option.rect = option.rect; - progress_bar_option.state = QStyle::State_Enabled; - progress_bar_option.direction = QApplication::layoutDirection (); - progress_bar_option.fontMetrics = QApplication::fontMetrics (); - progress_bar_option.minimum = 0; - progress_bar_option.maximum = 100; auto progress = index.data ().toLongLong (); + qint64 percent; if (progress > 0) { - auto percent = int (progress * 100 / index.data (Qt::UserRole).toLongLong ()); - progress_bar_option.progress = percent; - progress_bar_option.text = QString::number (percent) + '%'; - progress_bar_option.textVisible = true; - progress_bar_option.textAlignment = Qt::AlignCenter; + percent = int (progress * 100 / index.data (Qt::UserRole).toLongLong ()); + } +#if !defined (Q_OS_DARWIN) + QStyleOptionProgressBar progress_option; + auto control_element = QStyle::CE_ProgressBar; + progress_option.minimum = 0; + progress_option.maximum = 100; + progress_option.textAlignment = Qt::AlignCenter; + if (progress > 0) + { + progress_option.progress = percent; + progress_option.textVisible = true; } else { // not started - progress_bar_option.progress = -1; + progress_option.progress = -1; } - QApplication::style ()->drawControl (QStyle::CE_ProgressBar, &progress_bar_option, painter); +#else + // workaround for broken QProgressBar item delegates on macOS + QStyleOptionViewItem progress_option; + auto control_element = QStyle::CE_ItemViewItem; + progress_option.displayAlignment = Qt::AlignHCenter; + progress_option.index = index; + progress_option.features = QStyleOptionViewItem::HasDisplay; +#endif + progress_option.rect = option.rect; + progress_option.state = QStyle::State_Enabled; + progress_option.direction = QApplication::layoutDirection (); + progress_option.fontMetrics = QApplication::fontMetrics (); + progress_option.text = QString::number (progress > 0 ? percent : 0) + '%'; + QApplication::style ()->drawControl (control_element, &progress_option, painter); } else { diff --git a/SampleDownloader/FileNode.cpp b/SampleDownloader/FileNode.cpp index 66864287a..e274dc5a7 100644 --- a/SampleDownloader/FileNode.cpp +++ b/SampleDownloader/FileNode.cpp @@ -27,7 +27,12 @@ FileNode::FileNode (QTreeWidgetItem * parent void FileNode::error (QString const& title, QString const& message) { - MessageBox::warning_message (treeWidget (), title, message); + if (MessageBox::Retry == MessageBox::warning_message (treeWidget (), title, message + , QString {}, MessageBox::Cancel | MessageBox::Retry + , MessageBox::Cancel)) + { + sync (true); + } } bool FileNode::sync (bool local) diff --git a/Transceiver/HamlibTransceiver.cpp b/Transceiver/HamlibTransceiver.cpp index 27fe16a64..77979edb8 100644 --- a/Transceiver/HamlibTransceiver.cpp +++ b/Transceiver/HamlibTransceiver.cpp @@ -436,7 +436,11 @@ HamlibTransceiver::HamlibTransceiver (logger_type * logger, { m_->set_conf ("ptt_type", "RTS"); } + m_->set_conf ("ptt_share", "1"); } + + // do this late to allow any configuration option to be overriden + load_user_settings (); } HamlibTransceiver::HamlibTransceiver (logger_type * logger, @@ -453,51 +457,6 @@ HamlibTransceiver::HamlibTransceiver (logger_type * logger, // m_->rig_->state.obj = this; - // - // user defined Hamlib settings - // - auto settings_file_name = QStandardPaths::locate (QStandardPaths::AppConfigLocation - , "hamlib_settings.json"); - if (!settings_file_name.isEmpty ()) - { - QFile settings_file {settings_file_name}; - qDebug () << "Using Hamlib settings file:" << settings_file_name; - if (settings_file.open (QFile::ReadOnly)) - { - QJsonParseError status; - auto settings_doc = QJsonDocument::fromJson (settings_file.readAll (), &status); - if (status.error) - { - throw error {tr ("Hamlib settings file error: %1 at character offset %2") - .arg (status.errorString ()).arg (status.offset)}; - } - qDebug () << "Hamlib settings JSON:" << settings_doc.toJson (); - if (!settings_doc.isObject ()) - { - throw error {tr ("Hamlib settings file error: top level must be a JSON object")}; - } - auto const& settings = settings_doc.object (); - - // - // configuration settings - // - auto const& config = settings["config"]; - if (!config.isUndefined ()) - { - if (!config.isObject ()) - { - throw error {tr ("Hamlib settings file error: config must be a JSON object")}; - } - auto const& config_list = config.toObject (); - for (auto item = config_list.constBegin (); item != config_list.constEnd (); ++item) - { - m_->set_conf (item.key ().toLocal8Bit ().constData () - , (*item).toVariant ().toString ().toLocal8Bit ().constData ()); - } - } - } - } - if (!m_->is_dummy_) { switch (rig_get_caps_int (m_->model_, RIG_CAPS_PORT_TYPE)) @@ -592,17 +551,69 @@ HamlibTransceiver::HamlibTransceiver (logger_type * logger, { m_->set_conf ("ptt_type", "RTS"); } + m_->set_conf ("ptt_share", "1"); } // Make Icom CAT split commands less glitchy m_->set_conf ("no_xchg", "1"); + // do this late to allow any configuration option to be overriden + load_user_settings (); + // would be nice to get events but not supported on Windows and also not on a lot of rigs // rig_set_freq_callback (m_->rig_.data (), &frequency_change_callback, this); } HamlibTransceiver::~HamlibTransceiver () = default; +void HamlibTransceiver::load_user_settings () +{ + // + // user defined Hamlib settings + // + auto settings_file_name = QStandardPaths::locate (QStandardPaths::AppConfigLocation + , "hamlib_settings.json"); + if (!settings_file_name.isEmpty ()) + { + QFile settings_file {settings_file_name}; + qDebug () << "Using Hamlib settings file:" << settings_file_name; + if (settings_file.open (QFile::ReadOnly)) + { + QJsonParseError status; + auto settings_doc = QJsonDocument::fromJson (settings_file.readAll (), &status); + if (status.error) + { + throw error {tr ("Hamlib settings file error: %1 at character offset %2") + .arg (status.errorString ()).arg (status.offset)}; + } + qDebug () << "Hamlib settings JSON:" << settings_doc.toJson (); + if (!settings_doc.isObject ()) + { + throw error {tr ("Hamlib settings file error: top level must be a JSON object")}; + } + auto const& settings = settings_doc.object (); + + // + // configuration settings + // + auto const& config = settings["config"]; + if (!config.isUndefined ()) + { + if (!config.isObject ()) + { + throw error {tr ("Hamlib settings file error: config must be a JSON object")}; + } + auto const& config_list = config.toObject (); + for (auto item = config_list.constBegin (); item != config_list.constEnd (); ++item) + { + m_->set_conf (item.key ().toLocal8Bit ().constData () + , (*item).toVariant ().toString ().toLocal8Bit ().constData ()); + } + } + } + } +} + int HamlibTransceiver::do_start () { CAT_TRACE ("starting: " << rig_get_caps_cptr (m_->model_, RIG_CAPS_MFG_NAME_CPTR) diff --git a/Transceiver/HamlibTransceiver.hpp b/Transceiver/HamlibTransceiver.hpp index 9548fe65c..37765785f 100644 --- a/Transceiver/HamlibTransceiver.hpp +++ b/Transceiver/HamlibTransceiver.hpp @@ -24,6 +24,7 @@ public: ~HamlibTransceiver (); private: + void load_user_settings (); int do_start () override; void do_stop () override; void do_frequency (Frequency, MODE, bool no_ignore) override; diff --git a/UnitTests.txt b/UnitTests.txt index f199243bd..749ac9ca3 100644 --- a/UnitTests.txt +++ b/UnitTests.txt @@ -5,23 +5,37 @@ RxFreq: 1000/10 Commit No_AP MyCall BothCalls ----------------------------------------------- -ef4787: 3 10 6 14 30 33 -ada5a6: 3 6 6 10 29 36 -10f574: 2 7 97.6 6 10 95.4 21 33 80.7 -b8ea4c: 2 7 100.5 6 10 96.9 21 33 81.0 +767f53: 1 1 5 116 6 10 85 21 32 59 RC1 +767f53: 2 2 7 301 6 10 241 21 33 168 +767f53: 3 2 7 334 6 10 283 21 33 194 + +94c315: 1 1 5 61 6 10 56 21 33 39 +94c315: 2 2 7 205 6 12 183 21 34 126 +94c315: 3 2 7 234 6 12 209 21 34 152 + +7ad881: 1 2 7 69 6 12 61 21 33 46 +7ad881: 2 2 7 184 6 12 188 21 34 128 +7ad881: 3 2 7 244 6 12 216 21 34 148 Mode: Q65-30A Data: 30A_N0AN_6m_Ionoscatter (69 files, 6m ionoscatter) Message: "N0AN K1JT -19" RxFreq: 1500/10 -Commit No_AP MyCall BothCalls ------------------------------------------------- -ef4787: 7 14 16 22 38 40 -70a348: 38 43 -ada5a6: 10 17 11 23 40 46 -10f574: 8 16 99.4 15 24 91.8 34 44 68.8 -b8ea4c: 8 16 96.0 15 23 92.4 34 44 68.8 +Commit No_AP MyCall BothCalls +----------------------------------------------- +767f53: 1 8 16 76 15 23 70 33 42 48 +767f53: 2 10 16 225 15 24 217 34 44 134 +767f53: 3 10 16 266 15 24 260 34 44 155 + +94c315: 1 8 16 45 16 23 43 33 42 32 +94c315: 2 11 17 163 16 23 159 34 44 101 +94c315: 3 11 17 241 16 23 184 34 44 117 + +7ad881: 1 10 18 94 17 24 101 35 45 90 +7ad881: 2 12 18 259 17 24 279 35 45 244 +7ad881: 3 12 18 299 17 24 322 35 45 284 + Mode: Q65-60B Data: 60B_1296_Troposcatter (75 files) @@ -30,10 +44,18 @@ RxFreq: 1000/10 Commit No_AP MyCall BothCalls -------------------------------------------------- -ef4787: 1 2 11 23 64 67 -ada5a6: 1 5 14 28 64 67 -10f574: 1 5 142.7 11 27 129.8 65 67 36.8 -b8ea4c: 1 5 144.3 11 27 132.2 65 67 39.3 +767f53: 1 1 5 115 12 27 105 68 69 22 RC1 +767f53: 2 1 5 322 12 28 304 65 67 53 +767f53: 3 1 5 401 12 28 354 65 67 63 + +94c315: 1 1 8 81 12 26 71 68 69 19 +94c315: 2 1 8 249 14 28 235 68 69 36 +94c315: 3 1 8 283 14 28 270 68 69 39 + +7ad881: 1 1 8 97 12 27 90 68 69 24 +7ad881: 2 1 8 253 14 28 238 68 69 47 +7ad881: 3 1 8 274 14 28 263 69 69 52 + Mode: Q65-60D Data: MsgAvg (22 files, simulated fDop = 50 Hz) @@ -42,10 +64,17 @@ RxFreq: 1000/10 Commit No_AP MyCall BothCalls ------------------------------------------------ -ef4787: 0 10 21 21 22 22 -ada5a6 0 11 21 21 22 22 -10f574: 0 11 47.7 21 21 33.9 22 22 11.6 -b8ea4c: 0 11 46.4 21 21 33.8 22 22 11.9 +767f53: 1 0 11 39 19 19 28 22 22 7 +767f53: 2 0 11 103 21 21 70 22 22 7 +767f53: 3 0 11 106 21 21 73 22 22 7 + +94c315: 1 0 11 27 19 19 20 22 22 7 +94c315: 2 0 11 83 21 21 57 22 22 7 +94c315: 3 0 11 92 21 21 64 22 22 7 + +7ad881: 1 0 11 32 21 21 23 22 22 7 +7ad881: 2 0 11 77 21 21 53 22 22 7 +7ad881: 3 0 11 86 21 21 63 22 22 11 Mode: Q65-60D Data: 60D_2 (21 files, 1296 troposcatter) @@ -54,18 +83,36 @@ RxFreq: 1000/20 Commit No_AP MyCall BothCalls ---------------------------------------------- -10f574: 5 5 33.6 7 8 31.8 12 14 25.1 -b8ea4v: 5 5 39.1 7 8 38.0 13 14 30.8 +767f53: 1 2 4 36 6 8 35 13 14 22 +767f53: 2 5 5 84 9 10 78 13 14 47 +767f53: 3 5 5 85 9 10 83 13 14 50 + +94c315: 1 2 4 27 6 8 25 13 15 17 +94c315: 2 5 5 67 7 8 65 13 15 39 +94c315: 3 5 5 76 9 10 71 13 15 44 + +7ad881: 1 +7ad881: 2 +7ad881: 3 Mode: Q65-120D Data: 120D (14 files, 10 GHz troposcatter) -Message: "VK7MO VK3WE QF32" +Message: "VK7MO VK3WE QF32", "VK7MO VK3WE R-18" RxFreq: 1000/20 Commit No_AP MyCall BothCalls ---------------------------------------------- -10f574: 0 0 24.9 0 0 25.0 1 4 25.0 -b8ea4v: 0 0 39.1 0 0 25.4 1 5 40.1 +767f53: 1 0 0 33 0 0 34 1 5 31 RC1 +767f53: 2 0 0 83 0 0 80 1 5 74 +767f53: 3 0 0 89 0 0 89 1 5 83 + +94c315: 1 0 0 26 0 0 26 1 5 25 +94c315: 2 0 0 66 0 0 66 1 5 61 +94c315: 3 0 0 72 0 0 72 1 5 67 + +7ad881: 1 +7ad881: 2 +7ad881: 3 Mode: Q65-60D Data: 60D_10_GHz_EME (14 files) @@ -74,5 +121,14 @@ RxFreq: 1000/50 Commit No_AP MyCall BothCalls ---------------------------------------------- -10f574: 9 10 13.6 10 11 12.7 14 14 7.1 -b8ea4v: 9 10 13.7 10 11 12.6 14 14 7.5 +767f53: 1 8 9 13 9 10 12 14 14 6 RC1 +767f53: 2 9 10 26 10 11 25 14 14 6 +767f53: 3 9 10 27 10 11 26 14 14 6 + +94c315: 1 8 9 11 9 10 10 14 14 6 +94c315: 2 9 10 22 10 11 20 14 14 6 +94c315: 3 9 10 24 10 11 23 14 14 6 + +7ad881: 1 +7ad881: 2 +7ad881: 3 diff --git a/WSJTXLogging.cpp b/WSJTXLogging.cpp index d18d938ae..93bcb833b 100644 --- a/WSJTXLogging.cpp +++ b/WSJTXLogging.cpp @@ -192,7 +192,7 @@ WSJTXLogging::WSJTXLogging () ( sinks::file::make_collector ( - keywords::max_size = 40 * 1024 * 1024 + keywords::max_size = 5 * 1024 * 1024 , keywords::min_free_space = 1024 * 1024 * 1024 , keywords::max_files = 12 , keywords::target = app_data.absoluteFilePath ("logs").toStdWString () diff --git a/cty.dat b/cty.dat index ec0852e44..1756085dc 100644 --- a/cty.dat +++ b/cty.dat @@ -74,7 +74,7 @@ Mauritania: 35: 46: AF: 20.60: 10.50: 0.0: 5T: Niger: 35: 46: AF: 17.63: -9.43: -1.0: 5U: 5U; Togo: 35: 46: AF: 8.40: -1.28: 0.0: 5V: - 5V; + 5V,=VERSION; Samoa: 32: 62: OC: -13.93: 171.70: -13.0: 5W: 5W; Uganda: 37: 48: AF: 1.92: -32.60: -3.0: 5X: @@ -167,7 +167,7 @@ Pakistan: 21: 41: AS: 30.00: -70.00: -5.0: AP: Scarborough Reef: 27: 50: AS: 15.08: -117.72: -8.0: BS7: =BS7H; Taiwan: 24: 44: AS: 23.72: -120.88: -8.0: BV: - BM,BN,BO,BP,BQ,BU,BV,BW,BX,=VERSION; + BM,BN,BO,BP,BQ,BU,BV,BW,BX; Pratas Island: 24: 44: AS: 20.70: -116.70: -8.0: BV9P: BM9P,BN9P,BO9P,BP9P,BQ9P,BU9P,BV9P,BW9P,BX9P; China: 24: 44: AS: 36.00: -102.00: -8.0: BY: @@ -694,11 +694,11 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: =EG90IARU/3, =EA4AAQ/O,=EA4RCH/CIE,=EA6AFU/4,=EA6RC/4,=EA8BFH/4,=EA8BY/4,=EA9CI/4,=EA9CP/4,=EG8AOP/4, =EG90IARU/4, - =EA5/ON4LO/LH,=EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5EZ/P,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P, - =EA5KB/LH,=EA5ND/D,=EA5RCK/CDI,=EA5RKD/PAZ,=EA5TOM/AVW,=EA5URE/IVA,=EA5URM/C,=EA5URM/F,=EA5URM/G, - =EA5URM/H,=EA5URM/I,=EA5URM/L,=EA5URR/PAZ,=EA5URV/CAC,=EA5ZD/URE,=EA6AKN/5,=EA8BFH/5,=EA8CWF/5, - =EA9BLJ/5,=EA9CI/5,=EA9CP/5,=EA9PD/5,=EC5EA/VIC,=EC5K/VIC,=ED5MFP/C,=ED5MFP/G,=ED5MFP/H,=ED5MFP/I, - =ED5MFP/K,=ED5MFP/Q,=ED5MFP/R,=ED5MFP/S,=ED5URD/LH,=EG5FOM/LH,=EG90IARU/5,=EH5FL/LH, + =EA5/ON4LO/LH,=EA5ADM/P,=EA5CC/P,=EA5EQ/N,=EA5FL/LH,=EA5GVT/AVW,=EA5HCC/P,=EA5IKT/P,=EA5KB/LH, + =EA5ND/D,=EA5RCK/CDI,=EA5RKD/PAZ,=EA5TOM/AVW,=EA5URE/IVA,=EA5URM/C,=EA5URM/F,=EA5URM/G,=EA5URM/H, + =EA5URM/I,=EA5URM/L,=EA5URR/PAZ,=EA5URV/CAC,=EA5ZD/URE,=EA6AKN/5,=EA8BFH/5,=EA8CWF/5,=EA9BLJ/5, + =EA9CI/5,=EA9CP/5,=EA9PD/5,=EC5EA/VIC,=EC5K/VIC,=ED5MFP/C,=ED5MFP/G,=ED5MFP/H,=ED5MFP/I,=ED5MFP/K, + =ED5MFP/Q,=ED5MFP/R,=ED5MFP/S,=ED5URD/LH,=EG5FOM/LH,=EG90IARU/5,=EH5FL/LH, =AO7WRD/MA,=EA6SK/7,=EA7CFU/U,=EA7FC/FCJ,=EA7HZ/F,=EA7OBH/LH,=EA7URA/GET,=EA7URA/PAZ,=EA7URA/SG, =EA7URA/YOTA,=EA7URE/PAZ,=EA7URF/PAZ,=EA7URI/MDL,=EA7URJ/CPM,=EA7URL/FSV,=EA7URM/PAZ,=EA7URP/LAI, =EA9AA/7,=EA9CP/7,=EA9FN/7,=EA9HU,=EA9HU/7,=EA9JS/7,=EA9LZ/7,=EA9PD/7,=EA9QD/7,=EA9UL/7,=EA9UV/7, @@ -706,10 +706,10 @@ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA: Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6: AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6,=AM70URE/6,=EA1QE/6,=EA1YO/6,=EA2EZ/6,=EA2SG/6, =EA2TW/6,=EA3BT/6,=EA3CBH/6,=EA3ERT/6,=EA3HSD/6,=EA3HUX/6,=EA3HZX/6,=EA3HZX/P,=EA3RKM/6,=EA4LO/6, - =EA5ADM/6,=EA5BB/6,=EA5BK/6,=EA5BTL/6,=EA5EOR/6,=EA5ER/6,=EA5EZ/6,=EA5FL/P,=EA5HCC/6,=EA5IIG/6, - =EA5IKT/6,=EA5RKB/6,=EA6/DJ5AA/LH,=EA6/DJ7AO/LH,=EA6/G0SGB/LH,=EA6HP/J,=EA6LU/P,=EA6URI/PAZ, - =EA6URL/IF,=EA7DUT/6,=EA9CI/6,=EA9CP/6,=EB1BRH/6,=EB2GKK/6,=EB3CW/6,=EC5AC/6,=EC5BME/6,=EC5EA/P, - =EC5EC/6,=EC6TV/N,=EC7AT/6,=ED3T/6,=ED4SHF/6,=ED5ON/6,=EH90IARU/6; + =EA5ADM/6,=EA5BB/6,=EA5BK/6,=EA5BTL/6,=EA5EOR/6,=EA5ER/6,=EA5EZ,=EA5EZ/6,=EA5EZ/P,=EA5FL/P, + =EA5HCC/6,=EA5IIG/6,=EA5IKT/6,=EA5RKB/6,=EA6/DJ5AA/LH,=EA6/DJ7AO/LH,=EA6/G0SGB/LH,=EA6HP/J, + =EA6LU/P,=EA6URI/PAZ,=EA6URL/IF,=EA7DUT/6,=EA9CI/6,=EA9CP/6,=EB1BRH/6,=EB2GKK/6,=EB3CW/6,=EC5AC/6, + =EC5BME/6,=EC5EA/P,=EC5EC/6,=EC6TV/N,=EC7AT/6,=ED3T/6,=ED4SHF/6,=ED5ON/6,=EH90IARU/6; Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8: AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=AM70URE/8,=AN400L,=AN400U,=AO150ITU/8,=AO150U, =AO4AAA/8,=AO5DXX/8,=EA1AK/8,=EA1AP/8,=EA1EHW/8,=EA1YO/8,=EA2EJO/8,=EA3RKB/8,=EA4BQ/8,=EA4ESI/8, @@ -819,14 +819,14 @@ Wallis & Futuna Islands: 32: 62: OC: -13.30: 176.20: -12.0: FW: French Guiana: 09: 12: SA: 4.00: 53.00: 3.0: FY: FY,=TO1A,=TO2A,=TO2BC,=TO5BR,=TO5G,=TO5NED,=TO7C,=TO7IR,=TO7R; England: 14: 27: EU: 52.77: 1.47: 0.0: G: - 2E,G,M,NHS,=2E0GWD/P/LH,=2MT,=2O0YYY/P,=2Q0XYL/P,=2Q0YYY/P,=2SZ,=G0IBN/LH,=G0IBN/LV,=G0IBN/P/LV, - =G0SGB/LH,=G0VML/LV,=G3PRC/LH,=G6HH/LH,=GB0BLL/LH,=GB0BMB/LH,=GB0HLH/LH,=GB0NCI/LH,=GB0PL/LH, - =GB0SLH/LH,=GB0WPS/JOTA,=GB1PBL/LH,=GB2APL/LH,=GB2BML/LGT,=GB2BML/LH,=GB2LZL/LH,=GB2PLH/LH, - =GB2SCA/LH,=GB2SJ/LH,=GB2SML/LH,=GB2SNM/MILL,=GB3HQ/YOTA,=GB4CWM/YL,=GB4LL/LH,=GB4WL/LH,=GB5PW/LH, - =GB6MD/IMD,=GB6MW/MILL,=GB8SL/LH,=GO4ONL/P,=GX0MWT/IMD,=GX3PRC/LH,=GX3SDS/LH,=M0DXT/LH, - =M0HAZ/A/TCM,=M0TXS/YL,=M0WDC/LH,=M1MJT/YL,=M2000Y/21B,=M2000Y/21F,=M2000Y/28B,=M2000Y/29C, - =M2000Y/71B,=M2001Y/21F,=M2001Y/71B,=M2001Y/97A,=M3AFR/LH,=M3MJT/YL,=M3ZKT/YL,=M6AIG/YL,=M6SUS/YL, - =MQ6BWA/P; + 2E,G,M,=2E0CVN/NHS,=2E0GWD/P/LH,=2MT,=2O0YYY/P,=2Q0XYL/P,=2Q0YYY/P,=2SZ,=G0IBN/LH,=G0IBN/LV, + =G0IBN/P/LV,=G0SGB/LH,=G0VML/LV,=G3PRC/LH,=G6HH/LH,=GB0BLL/LH,=GB0BMB/LH,=GB0HLH/LH,=GB0NCI/LH, + =GB0PL/LH,=GB0SLH/LH,=GB0WPS/JOTA,=GB1PBL/LH,=GB2APL/LH,=GB2BML/LGT,=GB2BML/LH,=GB2LZL/LH, + =GB2PLH/LH,=GB2SCA/LH,=GB2SJ/LH,=GB2SML/LH,=GB2SNM/MILL,=GB3HQ/YOTA,=GB4CWM/YL,=GB4LL/LH, + =GB4WL/LH,=GB5PW/LH,=GB6MD/IMD,=GB6MW/MILL,=GB8SL/LH,=GO4ONL/P,=GX0MWT/IMD,=GX3PRC/LH,=GX3SDS/LH, + =M0DXT/LH,=M0HAZ/A/TCM,=M0TXS/YL,=M0WDC/LH,=M1MJT/YL,=M2000Y/21B,=M2000Y/21F,=M2000Y/28B, + =M2000Y/29C,=M2000Y/71B,=M2001Y/21F,=M2001Y/71B,=M2001Y/97A,=M3AFR/LH,=M3MJT/YL,=M3ZKT/YL, + =M6AIG/YL,=M6SUS/YL,=MQ6BWA/P; Isle of Man: 14: 27: EU: 54.20: 4.53: 0.0: GD: 2D,GD,GT,MD,MT,=2O0YLX,=2Q0YLX,=2R0IOM,=2V0IOM,=2V0YLX,=GB0AOA,=GB0BEA,=GB0IOM,=GB0MST,=GB100TT, =GB19CIM,=GB1MSG,=GB1RT,=GB1SOI,=GB2IOM,=GB2MAD,=GB2RT,=GB2WB,=GB4COM,=GB4IOM,=GB4JDF,=GB4MGR, @@ -847,24 +847,25 @@ Northern Ireland: 14: 27: EU: 54.73: 6.68: 0.0: GI: =GB2PDY,=GB2PP,=GB2PSW,=GB2REL,=GB2SDD,=GB2SPD,=GB2SPR,=GB2STI,=GB2STP,=GB2SW,=GB2UAS,=GB3NGI, =GB4AFD,=GB4CSC,=GB4CTL,=GB4NHS,=GB4ONI,=GB4PS,=GB4SOS,=GB4SPD,=GB4UAS,=GB50AAD,=GB50CSC,=GB5AFD, =GB5BIG,=GB5BL,=GB5BL/LH,=GB5DPR,=GB5NHS,=GB5OMU,=GB5SPD,=GB6EPC,=GB6SPD,=GB6VCB,=GB75VEC,=GB8BKY, - =GB8BRM,=GB8DS,=GB8EGT,=GB8GLM,=GB8LWF,=GB8NHS,=GB8NIC,=GB8ROC,=GB8SJA,=GB8SPD,=GB90RSGB/82, - =GB90SOM,=GB9AFD,=GB9LQV,=GB9RAF,=GB9SPD,=GN0LIX/LH,=GN4GTY/LH,=GO0AQD,=GO0BJH,=GO0DUP,=GO3KVD, - =GO3MMF,=GO3SG,=GO4DOH,=GO4GID,=GO4GUH,=GO4LKG,=GO4NKB,=GO4ONL,=GO4OYM,=GO4SRQ,=GO4SZW,=GO6MTL, - =GO7AXB,=GO7KMC,=GO8YYM,=GQ0AQD,=GQ0BJG,=GQ0NCA,=GQ0RQK,=GQ0TJV,=GQ0UVD,=GQ1CET,=GQ3KVD,=GQ3MMF, - =GQ3SG,=GQ3UZJ,=GQ3XRQ,=GQ4DOH,=GQ4GID,=GQ4GUH,=GQ4JTF,=GQ4LKG,=GQ4LXL,=GQ4NKB,=GQ4ONL,=GQ4OYM, - =GQ4SZW,=GQ6JPO,=GQ6MTL,=GQ7AXB,=GQ7JYK,=GQ7KMC,=GQ8RQI,=GQ8YYM,=GR0BJH,=GR0BRO,=GR0DVU,=GR0RQK, - =GR0RWO,=GR0UVD,=GR1CET,=GR3GTR,=GR3KDR,=GR3SG,=GR3WEM,=GR4AAM,=GR4DHW,=GR4DOH,=GR4FUE,=GR4FUM, - =GR4GID,=GR4GOS,=GR4GUH,=GR4KQU,=GR4LXL,=GR4NKB,=GR6JPO,=GR7AXB,=GR7KMC,=GR8RKC,=GR8RQI,=GR8YYM, - =GV1BZT,=GV3KVD,=GV3SG,=GV4FUE,=GV4GUH,=GV4JTF,=GV4LXL,=GV4SRQ,=GV4WVN,=GV7AXB,=GV7THH,=MI5AFK/2K, - =MN0NID/LH,=MO0ALS,=MO0BDZ,=MO0CBH,=MO0IOU,=MO0IRZ,=MO0JFC,=MO0JFC/P,=MO0JML,=MO0JST,=MO0KYE, - =MO0LPO,=MO0MOD,=MO0MOD/P,=MO0MSR,=MO0MVP,=MO0RRE,=MO0RUC,=MO0RYL,=MO0TGO,=MO0VAX,=MO0ZXZ,=MO3RLA, - =MO6AOX,=MO6NIR,=MO6TUM,=MO6WAG,=MO6WDB,=MO6YDR,=MQ0ALS,=MQ0BDZ,=MQ0BPB,=MQ0GGB,=MQ0IRZ,=MQ0JFC, - =MQ0JST,=MQ0KAM,=MQ0KYE,=MQ0MOD,=MQ0MSR,=MQ0MVP,=MQ0RMD,=MQ0RRE,=MQ0RUC,=MQ0RYL,=MQ0TGO,=MQ0VAX, - =MQ0ZXZ,=MQ3GHW,=MQ3RLA,=MQ3STV,=MQ5AFK,=MQ6AOX,=MQ6BJG,=MQ6GDN,=MQ6WAG,=MQ6WDB,=MQ6WGM,=MR0GDO, - =MR0GGB,=MR0JFC,=MR0KQU,=MR0LPO,=MR0MOD,=MR0MSR,=MR0MVP,=MR0RUC,=MR0SAI,=MR0SMK,=MR0TFK,=MR0TLG, - =MR0TMW,=MR0VAX,=MR0WWB,=MR1CCU,=MR3RLA,=MR3TFF,=MR3WHM,=MR5AMO,=MR6CCU,=MR6CWC,=MR6GDN,=MR6MME, - =MR6MRJ,=MR6OKS,=MR6OLA,=MR6PUX,=MR6WAG,=MR6XGZ,=MV0ALS,=MV0GGB,=MV0IOU,=MV0JFC,=MV0JLC,=MV0MOD, - =MV0MSR,=MV0MVP,=MV0TGO,=MV0VAX,=MV0WGM,=MV0ZAO,=MV1VOX,=MV6DTE,=MV6GTY,=MV6NIR,=MV6TLG; + =GB8BRM,=GB8DS,=GB8EGT,=GB8GLM,=GB8LWF,=GB8NHS,=GB8NIC,=GB8ROC,=GB8SJA,=GB8SPD,=GB8STM, + =GB90RSGB/82,=GB90SOM,=GB9AFD,=GB9LQV,=GB9RAF,=GB9SPD,=GN0LIX/LH,=GN4GTY/LH,=GO0AQD,=GO0BJH, + =GO0DUP,=GO3KVD,=GO3MMF,=GO3SG,=GO4DOH,=GO4GID,=GO4GUH,=GO4LKG,=GO4NKB,=GO4ONL,=GO4OYM,=GO4SRQ, + =GO4SZW,=GO6MTL,=GO7AXB,=GO7KMC,=GO8YYM,=GQ0AQD,=GQ0BJG,=GQ0NCA,=GQ0RQK,=GQ0TJV,=GQ0UVD,=GQ1CET, + =GQ3KVD,=GQ3MMF,=GQ3SG,=GQ3UZJ,=GQ3XRQ,=GQ4DOH,=GQ4GID,=GQ4GUH,=GQ4JTF,=GQ4LKG,=GQ4LXL,=GQ4NKB, + =GQ4ONL,=GQ4OYM,=GQ4SZW,=GQ6JPO,=GQ6MTL,=GQ7AXB,=GQ7JYK,=GQ7KMC,=GQ8RQI,=GQ8YYM,=GR0BJH,=GR0BRO, + =GR0DVU,=GR0RQK,=GR0RWO,=GR0UVD,=GR1CET,=GR3GTR,=GR3KDR,=GR3SG,=GR3WEM,=GR4AAM,=GR4DHW,=GR4DOH, + =GR4FUE,=GR4FUM,=GR4GID,=GR4GOS,=GR4GUH,=GR4KQU,=GR4LXL,=GR4NKB,=GR6JPO,=GR7AXB,=GR7KMC,=GR8RKC, + =GR8RQI,=GR8YYM,=GV1BZT,=GV3KVD,=GV3SG,=GV4FUE,=GV4GUH,=GV4JTF,=GV4LXL,=GV4SRQ,=GV4WVN,=GV7AXB, + =GV7THH,=MI5AFK/2K,=MN0NID/LH,=MO0ALS,=MO0BDZ,=MO0CBH,=MO0IOU,=MO0IRZ,=MO0JFC,=MO0JFC/P,=MO0JML, + =MO0JST,=MO0KYE,=MO0LPO,=MO0MOD,=MO0MOD/P,=MO0MSR,=MO0MVP,=MO0RRE,=MO0RUC,=MO0RYL,=MO0TGO,=MO0VAX, + =MO0ZXZ,=MO3RLA,=MO6AOX,=MO6NIR,=MO6TUM,=MO6WAG,=MO6WDB,=MO6YDR,=MQ0ALS,=MQ0BDZ,=MQ0BPB,=MQ0GGB, + =MQ0IRZ,=MQ0JFC,=MQ0JST,=MQ0KAM,=MQ0KYE,=MQ0MOD,=MQ0MSR,=MQ0MVP,=MQ0RMD,=MQ0RRE,=MQ0RUC,=MQ0RYL, + =MQ0TGO,=MQ0VAX,=MQ0ZXZ,=MQ3GHW,=MQ3RLA,=MQ3STV,=MQ5AFK,=MQ6AOX,=MQ6BJG,=MQ6GDN,=MQ6WAG,=MQ6WDB, + =MQ6WGM,=MR0GDO,=MR0GGB,=MR0JFC,=MR0KQU,=MR0LPO,=MR0MOD,=MR0MSR,=MR0MVP,=MR0RUC,=MR0SAI,=MR0SMK, + =MR0TFK,=MR0TLG,=MR0TMW,=MR0VAX,=MR0WWB,=MR1CCU,=MR3RLA,=MR3TFF,=MR3WHM,=MR5AMO,=MR6CCU,=MR6CWC, + =MR6GDN,=MR6MME,=MR6MRJ,=MR6OKS,=MR6OLA,=MR6PUX,=MR6WAG,=MR6XGZ,=MV0ALS,=MV0GGB,=MV0IOU,=MV0JFC, + =MV0JLC,=MV0MOD,=MV0MSR,=MV0MVP,=MV0TGO,=MV0VAX,=MV0WGM,=MV0ZAO,=MV1VOX,=MV6DTE,=MV6GTY,=MV6NIR, + =MV6TLG; Jersey: 14: 27: EU: 49.22: 2.18: 0.0: GJ: 2J,GH,GJ,MH,MJ,=2R0ODX,=GB0JSA,=GB19CJ,=GB2BYL,=GB2JSA,=GB50JSA,=GB5OJR,=GB8LMI,=GH5DX/NHS, =GJ3DVC/L,=GJ6WRI/LH,=GJ8PVL/LH,=GO8PVL,=GQ8PVL,=GR6TMM,=MO0ASP,=MQ0ASP,=MR0ASP,=MR0RZD,=MV0ASP; @@ -899,35 +900,35 @@ Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM: =GB100MAS,=GB100MUC,=GB100ZET,=GB10SP,=GB150NRL,=GB18FIFA,=GB19CGM,=GB19CS,=GB1AJ,=GB1ASC,=GB1ASH, =GB1BD,=GB1BOL,=GB1CFL,=GB1COR,=GB1DHL,=GB1FB,=GB1FRS,=GB1FVS,=GB1FVT,=GB1GEO,=GB1GND,=GB1HRS, =GB1KGG,=GB1KLD,=GB1LAY,=GB1LGG,=GB1LL,=GB1MAY,=GB1NHL,=GB1OL,=GB1OL/LH,=GB1PC,=GB1RB,=GB1RHU, - =GB1RST,=GB1SLH,=GB1TAY,=GB1WLG,=GB20YOTA,=GB250RB,=GB2AES,=GB2AGG,=GB2AL,=GB2AMS,=GB2AST,=GB2ATC, - =GB2AYR,=GB2BAJ,=GB2BHM,=GB2BHS,=GB2BMJ,=GB2BOL,=GB2CAS,=GB2CHC,=GB2CM,=GB2CMA,=GB2CVL,=GB2CWR, - =GB2DAS,=GB2DAW,=GB2DHS,=GB2DL,=GB2DRC,=GB2DT,=GB2DTM,=GB2ELH,=GB2ELH/LH,=GB2EPC,=GB2FBM,=GB2FEA, - =GB2FSM,=GB2FSW,=GB2GEO,=GB2GKR,=GB2GNL,=GB2GNL/LH,=GB2GTM,=GB2GVC,=GB2HLB,=GB2HMC,=GB2HRH, - =GB2IGB,=GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB,=GB2KW,=GB2LBN,=GB2LBN/LH, - =GB2LCL,=GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LG/P,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH,=GB2LMG,=GB2LP, - =GB2LS,=GB2LS/LH,=GB2LSS,=GB2LT,=GB2LT/LH,=GB2LXX,=GB2M,=GB2MAS,=GB2MBB,=GB2MDG,=GB2MN,=GB2MOF, - =GB2MSL,=GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2NMM,=GB2OL,=GB2OWM,=GB2PBF,=GB2PG,=GB2QM, - =GB2RB,=GB2RDR,=GB2ROC,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SBS,=GB2SHL/LH, - =GB2SKG,=GB2SLH,=GB2SMM,=GB2SOH,=GB2SQN,=GB2SR,=GB2SSB,=GB2SUM,=GB2SWF,=GB2TDS,=GB2THL,=GB2THL/LH, - =GB2TNL,=GB2VCB,=GB2VEF,=GB2WAM,=GB2WBF,=GB2WG,=GB2WLS,=GB2YLS,=GB2ZE,=GB3ANG,=GB3GKR,=GB3LER, - =GB3LER/B,=GB3ORK,=GB3ORK/B,=GB3SWF,=GB3WOI,=GB4AAS,=GB4AST,=GB4BBR,=GB4BG,=GB4CGS,=GB4CMA, - =GB4DAS,=GB4DHX,=GB4DTD,=GB4DUK,=GB4EPC,=GB4FFS,=GB4GD,=GB4GDS,=GB4GS,=GB4IE,=GB4JCM,=GB4JOA, - =GB4JPJ,=GB4JYS,=GB4LER,=GB4MSE,=GB4NFE,=GB4PAS,=GB4SK,=GB4SKO,=GB4SLH,=GB4SMM,=GB4SRO,=GB4SWF, - =GB50FVS,=GB50GDS,=GB50GT,=GB50JS,=GB5AG,=GB5AST,=GB5BBS,=GB5BOH,=GB5C,=GB5CS,=GB5CWL,=GB5DHL, - =GB5DX,=GB5EMF,=GB5FHC,=GB5FLM,=GB5JS,=GB5LTH,=GB5RO,=GB5RO/LH,=GB5RR,=GB5SI,=GB5TAM,=GB5TI, - =GB60CRB,=GB6BEN,=GB6TAA,=GB6WW,=GB75CC,=GB75GD,=GB7SRW,=GB80GD,=GB8AYR,=GB8CSL,=GB8FSG,=GB8RU, - =GB8RUM,=GB90RSGB/11,=GB90RSGB/12,=GB90RSGB/21,=GB90RSGB/22,=GB90RSGB/23,=GB999SPC,=GB9UL, - =GG100AGG,=GG100GA,=GG100GCC,=GG100GGP,=GG100GGR,=GG100GLD,=GG100SBG,=GM/DL5SE/LH,=GM0AZC/2K, - =GM0DHZ/P,=GM0GFL/P,=GM0KTO/2K,=GM0MUN/2K,=GM0SGB/M,=GM0SGB/P,=GM0WED/NHS,=GM0WUX/2K,=GM3JIJ/2K, - =GM3OFT/P,=GM3TKV/LH,=GM3TTC/P,=GM3TXF/P,=GM3USR/P,=GM3VLB/P,=GM3WFK/P,=GM3YDN/NHS,=GM4AFF/P, - =GM4CHX/2K,=GM4CHX/P,=GM4SQM/NHS,=GM4SQN/NHS,=GM4WSB/M,=GM4WSB/P,=GM4ZVD/P,=GM6JNJ/NHS,=GM6WRW/P, - =GO0AEG,=GO0AIR,=GO0BKC,=GO0DBW,=GO0DBW/M,=GO0DEQ,=GO0GMN,=GO0OGN,=GO0SYY,=GO0TUB,=GO0VRP,=GO0WEZ, - =GO1BAN,=GO1BKF,=GO1MQE,=GO1TBW,=GO2MP,=GO3HVK,=GO3JIJ,=GO3NIG,=GO3VTB,=GO4BLO,=GO4CAU,=GO4CFS, - =GO4CHX,=GO4CXM,=GO4DLG,=GO4EMX,=GO4FAM,=GO4FAU,=GO4JOJ,=GO4JPZ,=GO4JR,=GO4MOX,=GO4MSL,=GO4PRB, - =GO4UBJ,=GO4VTB,=GO4WZG,=GO4XQJ,=GO6JEP,=GO6JRX,=GO6KON,=GO6LYJ,=GO6VCV,=GO7GAX,=GO7GDE,=GO7HUD, - =GO7TUD,=GO7WEF,=GO8CBQ,=GO8MHU,=GO8SVB,=GO8TTD,=GQ0AEG,=GQ0AIR,=GQ0BKC,=GQ0BWR,=GQ0DBW,=GQ0DEQ, - =GQ0DUX,=GQ0FNE,=GQ0GMN,=GQ0HUO,=GQ0KWL,=GQ0MUN,=GQ0NTL,=GQ0OGN,=GQ0RNR,=GQ0TKV/P,=GQ0VRP,=GQ0WEZ, - =GQ0WNR,=GQ1BAN,=GQ1BKF,=GQ1MQE,=GQ1TBW,=GQ3JIJ,=GQ3JQJ,=GQ3NIG,=GQ3NTL,=GQ3TKP,=GQ3TKP/P,=GQ3TKV, + =GB1RST,=GB1SLH,=GB1TAY,=GB1WLG,=GB20YOTA,=GB250RB,=GB2AES,=GB2AGG,=GB2AL,=GB2AMS,=GB2AST,=GB2AYR, + =GB2BAJ,=GB2BHM,=GB2BHS,=GB2BMJ,=GB2BOL,=GB2CAS,=GB2CHC,=GB2CM,=GB2CMA,=GB2CVL,=GB2CWR,=GB2DAS, + =GB2DAW,=GB2DHS,=GB2DL,=GB2DRC,=GB2DT,=GB2DTM,=GB2ELH,=GB2ELH/LH,=GB2EPC,=GB2FBM,=GB2FEA,=GB2FSM, + =GB2FSW,=GB2GEO,=GB2GKR,=GB2GNL,=GB2GNL/LH,=GB2GTM,=GB2GVC,=GB2HLB,=GB2HMC,=GB2HRH,=GB2IGB, + =GB2IGS,=GB2IMG,=GB2IMM,=GB2INV,=GB2IOT,=GB2JCM,=GB2KDR,=GB2KGB,=GB2KW,=GB2LBN,=GB2LBN/LH,=GB2LCL, + =GB2LCP,=GB2LCT,=GB2LDG,=GB2LG,=GB2LG/P,=GB2LGB,=GB2LHI,=GB2LK,=GB2LK/LH,=GB2LMG,=GB2LP,=GB2LS, + =GB2LS/LH,=GB2LSS,=GB2LT,=GB2LT/LH,=GB2LXX,=GB2M,=GB2MAS,=GB2MBB,=GB2MDG,=GB2MN,=GB2MOF,=GB2MSL, + =GB2MUC,=GB2MUL,=GB2NBC,=GB2NEF,=GB2NL,=GB2NMM,=GB2OL,=GB2OWM,=GB2PBF,=GB2PG,=GB2QM,=GB2RB, + =GB2RDR,=GB2ROC,=GB2RRL,=GB2RWW,=GB2SAA,=GB2SAM,=GB2SAS,=GB2SB,=GB2SBG,=GB2SBS,=GB2SHL/LH,=GB2SKG, + =GB2SLH,=GB2SMM,=GB2SOH,=GB2SQN,=GB2SR,=GB2SSB,=GB2SUM,=GB2SWF,=GB2TDS,=GB2THL,=GB2THL/LH,=GB2TNL, + =GB2VCB,=GB2VEF,=GB2WAM,=GB2WBF,=GB2WG,=GB2WLS,=GB2YLS,=GB2ZE,=GB3ANG,=GB3GKR,=GB3LER,=GB3LER/B, + =GB3ORK,=GB3ORK/B,=GB3SWF,=GB3WOI,=GB4AAS,=GB4AST,=GB4BBR,=GB4BG,=GB4CGS,=GB4CMA,=GB4DAS,=GB4DHX, + =GB4DTD,=GB4DUK,=GB4EPC,=GB4FFS,=GB4GD,=GB4GDS,=GB4GS,=GB4IE,=GB4JCM,=GB4JOA,=GB4JPJ,=GB4JYS, + =GB4LER,=GB4MSE,=GB4NFE,=GB4PAS,=GB4SK,=GB4SKO,=GB4SLH,=GB4SMM,=GB4SRO,=GB4SWF,=GB50FVS,=GB50GDS, + =GB50GT,=GB50JS,=GB5AG,=GB5AST,=GB5BBS,=GB5BOH,=GB5C,=GB5CS,=GB5CWL,=GB5DHL,=GB5DX,=GB5EMF, + =GB5FHC,=GB5FLM,=GB5JS,=GB5LTH,=GB5RO,=GB5RO/LH,=GB5RR,=GB5SI,=GB5TAM,=GB5TI,=GB60CRB,=GB6BEN, + =GB6TAA,=GB6WW,=GB75CC,=GB75GD,=GB7SRW,=GB80GD,=GB8AYR,=GB8CSL,=GB8FSG,=GB8RU,=GB8RUM, + =GB90RSGB/11,=GB90RSGB/12,=GB90RSGB/21,=GB90RSGB/22,=GB90RSGB/23,=GB999SPC,=GB9UL,=GG100AGG, + =GG100GA,=GG100GCC,=GG100GGP,=GG100GGR,=GG100GLD,=GG100SBG,=GM/DL5SE/LH,=GM0AZC/2K,=GM0DHZ/P, + =GM0GFL/P,=GM0KTO/2K,=GM0MUN/2K,=GM0SGB/M,=GM0SGB/P,=GM0WED/NHS,=GM0WUX/2K,=GM3JIJ/2K,=GM3OFT/P, + =GM3TKV/LH,=GM3TTC/P,=GM3TXF/P,=GM3USR/P,=GM3VLB/P,=GM3WFK/P,=GM3YDN/NHS,=GM4AFF/P,=GM4CHX/2K, + =GM4CHX/P,=GM4SQM/NHS,=GM4SQN/NHS,=GM4WSB/M,=GM4WSB/P,=GM4ZVD/P,=GM6JNJ/NHS,=GM6WRW/P,=GO0AEG, + =GO0AIR,=GO0BKC,=GO0DBW,=GO0DBW/M,=GO0DEQ,=GO0GMN,=GO0OGN,=GO0SYY,=GO0TUB,=GO0VRP,=GO0WEZ,=GO1BAN, + =GO1BKF,=GO1MQE,=GO1TBW,=GO2MP,=GO3HVK,=GO3JIJ,=GO3NIG,=GO3VTB,=GO4BLO,=GO4CAU,=GO4CFS,=GO4CHX, + =GO4CXM,=GO4DLG,=GO4EMX,=GO4FAM,=GO4FAU,=GO4JOJ,=GO4JPZ,=GO4JR,=GO4MOX,=GO4MSL,=GO4PRB,=GO4UBJ, + =GO4VTB,=GO4WZG,=GO4XQJ,=GO6JEP,=GO6JRX,=GO6KON,=GO6LYJ,=GO6VCV,=GO7GAX,=GO7GDE,=GO7HUD,=GO7TUD, + =GO7WEF,=GO8CBQ,=GO8MHU,=GO8SVB,=GO8TTD,=GQ0AEG,=GQ0AIR,=GQ0BKC,=GQ0BWR,=GQ0DBW,=GQ0DEQ,=GQ0DUX, + =GQ0FNE,=GQ0GMN,=GQ0HUO,=GQ0KWL,=GQ0MUN,=GQ0NTL,=GQ0OGN,=GQ0RNR,=GQ0TKV/P,=GQ0VRP,=GQ0WEZ,=GQ0WNR, + =GQ1BAN,=GQ1BKF,=GQ1MQE,=GQ1TBW,=GQ3JIJ,=GQ3JQJ,=GQ3NIG,=GQ3NTL,=GQ3TKP,=GQ3TKP/P,=GQ3TKV, =GQ3TKV/P,=GQ3VTB,=GQ3WUX,=GQ3ZBE,=GQ4AGG,=GQ4BAE,=GQ4BLO,=GQ4CAU,=GQ4CFS,=GQ4CHX,=GQ4CHX/P, =GQ4CXM,=GQ4DLG,=GQ4ELV,=GQ4EMX,=GQ4FAU,=GQ4JOJ,=GQ4JPZ,=GQ4JR,=GQ4MSL,=GQ4OBG,=GQ4PRB,=GQ4UIB, =GQ4UPL,=GQ4VTB,=GQ4WZG,=GQ4XQJ,=GQ4YMM,=GQ6JEP,=GQ6JRX,=GQ6KON,=GQ6LYJ,=GQ7GAX,=GQ7GDE,=GQ7HUD, @@ -981,56 +982,56 @@ Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW: =GB100TMD,=GB10SOTA,=GB19CGW,=GB19CW,=GB19SG,=GB1AD,=GB1ATC,=GB1BAF,=GB1BGS,=GB1BPL,=GB1BSW, =GB1BW,=GB1CCC,=GB1CDS,=GB1CPG,=GB1CR,=GB1DS,=GB1FHS,=GB1HAS,=GB1HTW,=GB1JC,=GB1KEY,=GB1LSG, =GB1LW,=GB1LWF,=GB1OOC,=GB1ORM,=GB1PCA,=GB1PCS,=GB1PD,=GB1PGW,=GB1PJ,=GB1PLL,=GB1RTF,=GB1SDD, - =GB1SEA,=GB1SL,=GB1SPN,=GB1SSL,=GB1STC,=GB1TDS,=GB1WAA,=GB1WIW,=GB1WSM,=GB2000SET,=GB2003SET, - =GB200HNT,=GB200TT,=GB250TMB,=GB250TT,=GB2ADU,=GB2BEF,=GB2BGG,=GB2BOM,=GB2BOW,=GB2BPM,=GB2BYF, - =GB2CC,=GB2CI,=GB2COB,=GB2CR,=GB2CRS,=GB2DWR,=GB2EI,=GB2FC,=GB2FLB,=GB2GGM,=GB2GLS,=GB2GOL, - =GB2GSG,=GB2GVA,=GB2HDG,=GB2HMM,=GB2IMD,=GB2LBR,=GB2LM,=GB2LNP,=GB2LSA,=GB2LSA/LH,=GB2LSH,=GB2MD, - =GB2MGY,=GB2MIL,=GB2MLM,=GB2MMC,=GB2MOP,=GB2NF,=GB2NPH,=GB2NPL,=GB2OOA,=GB2ORM,=GB2PRC,=GB2RFS, - =GB2RSG,=GB2RTB,=GB2SAC,=GB2SCC,=GB2SCD,=GB2SCP,=GB2SFM,=GB2SIP,=GB2SLA,=GB2TD,=GB2TD/LH,=GB2TTA, - =GB2VK,=GB2WAA,=GB2WHO,=GB2WIW,=GB2WNA,=GB2WSF,=GB2WT,=GB3HLS,=GB3LMW,=GB4ADU,=GB4AFS,=GB4AOS, - =GB4BB,=GB4BIT,=GB4BOJ,=GB4BPL,=GB4BPL/LH,=GB4BPL/P,=GB4BPR,=GB4BRS/P,=GB4BSG,=GB4CI,=GB4CTC, - =GB4EUL,=GB4FAA,=GB4GM,=GB4GSS,=GB4HFH,=GB4HI,=GB4HLB,=GB4HMD,=GB4HMM,=GB4LRG,=GB4MBC,=GB4MD, - =GB4MDH,=GB4MDI,=GB4MJS,=GB4MPI,=GB4MUU,=GB4NDG,=GB4NPL,=GB4NTB,=GB4ON,=GB4OST,=GB4PAT,=GB4PCS, - =GB4PD,=GB4POW,=GB4RC,=GB4RME,=GB4RSL,=GB4SDD,=GB4SLC,=GB4SSP,=GB4SUB,=GB4TMS,=GB4UKG,=GB4WT, - =GB4WWI,=GB4XT,=GB50ABS,=GB50EVS,=GB50RSC,=GB50SGP,=GB5AC,=GB5FI,=GB5GEO,=GB5MD,=GB5ONG,=GB5PSJ, - =GB5SIP,=GB5VEP,=GB5WT,=GB60DITP,=GB60ER,=GB60PW,=GB60SPS,=GB60VLY,=GB65BTF,=GB6AC,=GB6BLB, - =GB6CRI,=GB6GGM,=GB6OQA,=GB6ORA,=GB6PLB,=GB6RNLI,=GB6TS,=GB6TSG,=GB6WT,=GB6WWT,=GB70BTF,=GB750CC, - =GB75ATC,=GB75BB,=GB8CCC,=GB8HI,=GB8MD,=GB8MG,=GB8ND,=GB8OAE,=GB8OQE,=GB8RAF,=GB8WOW,=GB8WT, - =GB90RSGB/62,=GB90RSGB/72,=GB9GGM,=GC4BRS/LH,=GG100ACD,=GG100ANG,=GG100CPG,=GG100RGG,=GG100SG, - =GO0DIV,=GO0EZQ,=GO0EZY,=GO0JEQ,=GO0MNP,=GO0MNP/P,=GO0NPL,=GO0PLB,=GO0PNI,=GO0PUP,=GO0VKW,=GO0VML, - =GO0VSW,=GO1DPL,=GO1IOT,=GO1JFV,=GO1MVL,=GO1PKM,=GO3PLB,=GO3UOF,=GO3UOF/M,=GO3XJQ,=GO4BKG,=GO4BLE, - =GO4CQZ,=GO4DTQ,=GO4GTI,=GO4JKR,=GO4JUN,=GO4JUW,=GO4MVA,=GO4NOO,=GO4OKT,=GO4SUE,=GO4SUE/P,=GO4TNZ, - =GO4WXM,=GO6IMS,=GO6NKG,=GO6UKO,=GO7DWR,=GO7SBO,=GO7VJK,=GO7VQD,=GO8BQK,=GO8IQC,=GO8JOY,=GO8OKR, - =GQ0ANA,=GQ0DIV,=GQ0JEQ,=GQ0JRF,=GQ0MNO,=GQ0MNP,=GQ0NPL,=GQ0PUP,=GQ0RYT,=GQ0SLM,=GQ0TQM,=GQ0VKW, - =GQ0VML,=GQ0VSW,=GQ0WVL,=GQ1FKY,=GQ1FOA/P,=GQ1IOT,=GQ1JFV,=GQ1MVL,=GQ1NRS,=GQ1WRV,=GQ1ZKN,=GQ3IRK, - =GQ3PLB,=GQ3SB,=GQ3UOF,=GQ3VEN,=GQ3VKL,=GQ3WSU,=GQ3XJA,=GQ3XJQ,=GQ4BKG,=GQ4BLE,=GQ4CQZ,=GQ4EZW, - =GQ4GSH,=GQ4GTI,=GQ4IIL,=GQ4JKR,=GQ4JUN,=GQ4JUW,=GQ4LZP,=GQ4MVA,=GQ4NOO,=GQ4OKT,=GQ4SUE,=GQ4VNS, - =GQ4VZJ,=GQ4WXM,=GQ4WXM/P,=GQ6IMS,=GQ6ITJ,=GQ6NKG,=GQ6UKO,=GQ7BQK,=GQ7DWR,=GQ7FBV,=GQ7SBO,=GQ7UNJ, - =GQ7UNV,=GQ7VJK,=GQ7VQD,=GQ8BQK,=GQ8IQC,=GQ8JOY,=GQ8OKR,=GR0ANA,=GR0DIV,=GR0DSP,=GR0HUS,=GR0JEQ, - =GR0MYY,=GR0NPL,=GR0PSV,=GR0RYT,=GR0SYN,=GR0TKX,=GR0VKW,=GR0WGK,=GR1FJI,=GR1HNG,=GR1LFX,=GR1LHV, - =GR1MCD,=GR1SGG,=GR1WVY,=GR1YQM,=GR3SB,=GR3SFC,=GR3TKH,=GR3UOF,=GR3XJQ,=GR4BKG,=GR4BLE,=GR4CQZ, - =GR4GNY,=GR4GTI,=GR4HZA,=GR4JUN,=GR4JUW,=GR4OGO,=GR4SUE,=GR4VSS/P,=GR4XXJ,=GR4ZOM,=GR5PH,=GR6NKG, - =GR6SIX,=GR6STK,=GR6UKO,=GR6ZDH,=GR7AAV,=GR7HOC,=GR7NAU,=GR7TKZ,=GR7UNV,=GR7VQD,=GR8BQK,=GR8IQC, - =GR8OGI,=GR8TRO,=GV0ANA,=GV0DCK,=GV0DIV,=GV0EME,=GV0FRE,=GV0MNP,=GV0NPL,=GV1FKY,=GV1IOT,=GV1JFV, - =GV1NBW,=GV1YQM,=GV3ATZ,=GV3TJE/P,=GV3UOF,=GV3WEZ,=GV3XJQ,=GV4BKG,=GV4BRS,=GV4CQZ,=GV4JKR,=GV4JQP, - =GV4NQJ,=GV4PUC,=GV6BRC,=GV6JPC,=GV6NKG,=GV7UNV,=GV7VJK,=GV8IQC,=GW0AWT/2K,=GW0GEI/2K,=GW0GIH/2K, - =GW0MNO/2K,=GW0VSW/2K,=GW3JXN/2K,=GW3KJN/2K,=GW4IIL/2K,=GW4VHP/2K,=M2000Y/97A,=MO0AQZ,=MO0ATI, - =MO0COE,=MO0CVT,=MO0EQL,=MO0EZQ,=MO0GXE,=MO0HCX,=MO0IBZ,=MO0IML,=MO0KLW,=MO0LDJ,=MO0LLK,=MO0LUK, - =MO0LZZ,=MO0MAU,=MO0MUM,=MO0MWZ,=MO0OWW,=MO0SGD,=MO0SGR,=MO0TBB,=MO0TMI,=MO0TTU,=MO0UPH,=MO0VVO, - =MO1CFA,=MO1CFN,=MO3DAO,=MO3DQB,=MO3GKI,=MO3OJA,=MO3PUU,=MO3RNI,=MO3UEZ,=MO3WPH,=MO3YVO,=MO3ZCO, - =MO6DVP,=MO6GWK,=MO6GWR,=MO6GWR/P,=MO6MAU,=MO6PAM,=MO6PLC,=MO6PUT,=MO6SEF,=MO6TBD,=MO6TBP,=MO6WLB, - =MQ0AQZ,=MQ0ATI,=MQ0AWW,=MQ0CDO,=MQ0CNA,=MQ0CVT,=MQ0DHF,=MQ0EQL,=MQ0GXE,=MQ0GYV,=MQ0HCX,=MQ0IBZ, - =MQ0IML,=MQ0LDJ,=MQ0LLK,=MQ0LUK,=MQ0LZZ,=MQ0MAU,=MQ0MUM,=MQ0MWA,=MQ0MWZ,=MQ0OWW,=MQ0PAD,=MQ0RHD, - =MQ0SGD,=MQ0SGR,=MQ0TBB,=MQ0TMI,=MQ0TTU,=MQ0UPH,=MQ0UPH/P,=MQ0VVO,=MQ0XMC/P,=MQ1CFA,=MQ1CFN, - =MQ1EYO/P,=MQ1LCR,=MQ3DAO,=MQ3EPA,=MQ3GKI,=MQ3JAT,=MQ3NDB,=MQ3OJA,=MQ3USK,=MQ3WPH,=MQ3ZCB/P, - =MQ5AND,=MQ5EPA,=MQ5VZW,=MQ6DVP,=MQ6KLL,=MQ6MAU,=MQ6PAM,=MQ6PLC,=MQ6RHD,=MQ6SEF,=MQ6TBD,=MQ6TBP, - =MR0AQZ,=MR0BXJ,=MR0CVT,=MR0GUK,=MR0GXE,=MR0IDX,=MR0JGE,=MR0LAO,=MR0LDJ,=MR0MAU,=MR0RLD,=MR0TTR, - =MR0TTU,=MR0YAD,=MR0ZAP,=MR1CFN,=MR1EAA,=MR1LCR,=MR1MAJ/P,=MR1MDH,=MR3AVB,=MR3AVC,=MR3CBF,=MR3NYR, - =MR3OBL,=MR3SET/P,=MR3UFN,=MR3XZP,=MR3YKL,=MR3YLO,=MR3YVO,=MR3ZCB/P,=MR5HOC,=MR6ADZ,=MR6KDA, - =MR6VHF,=MR6YDP,=MV0AEL,=MV0BLM,=MV0EDX,=MV0GWT,=MV0GXE,=MV0HGY/P,=MV0IML,=MV0LLK,=MV0PJJ, - =MV0PJJ/P,=MV0RRD,=MV0SGD,=MV0SGR,=MV0TBB,=MV0TDQ,=MV0UAA,=MV0USK,=MV0VRQ,=MV0WYN,=MV1CFA,=MV1CFN, - =MV1EYP/P,=MV3RNI,=MV6CQN,=MV6GWR,=MV6GWR/P,=MV6URC,=MV6ZOL,=MW0CND/2K,=MW0DHF/LH,=MW5AAM/2K, - =MW5GOL/LH; + =GB1SEA,=GB1SL,=GB1SPN,=GB1SSL,=GB1STC,=GB1STM,=GB1TDS,=GB1WAA,=GB1WIW,=GB1WSM,=GB2000SET, + =GB2003SET,=GB200HNT,=GB200TT,=GB250TMB,=GB250TT,=GB2ADU,=GB2BEF,=GB2BGG,=GB2BOM,=GB2BOW,=GB2BPM, + =GB2BYF,=GB2CC,=GB2CI,=GB2COB,=GB2CR,=GB2CRS,=GB2DWR,=GB2EI,=GB2FC,=GB2FLB,=GB2GGM,=GB2GLS, + =GB2GOL,=GB2GSG,=GB2GVA,=GB2HDG,=GB2HMM,=GB2IMD,=GB2LBR,=GB2LM,=GB2LNP,=GB2LSA,=GB2LSA/LH,=GB2LSH, + =GB2MD,=GB2MGY,=GB2MIL,=GB2MLM,=GB2MMC,=GB2MOP,=GB2NF,=GB2NPH,=GB2NPL,=GB2OOA,=GB2ORM,=GB2PRC, + =GB2RFS,=GB2RSG,=GB2RTB,=GB2SAC,=GB2SCC,=GB2SCD,=GB2SCP,=GB2SFM,=GB2SIP,=GB2SLA,=GB2TD,=GB2TD/LH, + =GB2TTA,=GB2VK,=GB2WAA,=GB2WHO,=GB2WIW,=GB2WNA,=GB2WSF,=GB2WT,=GB3HLS,=GB3LMW,=GB4ADU,=GB4AFS, + =GB4AOS,=GB4BB,=GB4BIT,=GB4BOJ,=GB4BPL,=GB4BPL/LH,=GB4BPL/P,=GB4BPR,=GB4BRS/P,=GB4BSG,=GB4CI, + =GB4CTC,=GB4EUL,=GB4FAA,=GB4FTS,=GB4GM,=GB4GSS,=GB4HFH,=GB4HI,=GB4HLB,=GB4HMD,=GB4HMM,=GB4LRG, + =GB4MBC,=GB4MD,=GB4MDH,=GB4MDI,=GB4MJS,=GB4MPI,=GB4MUU,=GB4NDG,=GB4NPL,=GB4NTB,=GB4ON,=GB4OST, + =GB4PAT,=GB4PCS,=GB4PD,=GB4POW,=GB4RC,=GB4RME,=GB4RSL,=GB4SDD,=GB4SLC,=GB4SSP,=GB4SUB,=GB4TMS, + =GB4UKG,=GB4WT,=GB4WWI,=GB4XT,=GB50ABS,=GB50EVS,=GB50RSC,=GB50SGP,=GB5AC,=GB5FI,=GB5GEO,=GB5MD, + =GB5ONG,=GB5PSJ,=GB5SIP,=GB5VEP,=GB5WT,=GB60DITP,=GB60ER,=GB60PW,=GB60SPS,=GB60VLY,=GB65BTF, + =GB6AC,=GB6BLB,=GB6CRI,=GB6GGM,=GB6OQA,=GB6ORA,=GB6PLB,=GB6RNLI,=GB6TS,=GB6TSG,=GB6WT,=GB6WWT, + =GB70BTF,=GB750CC,=GB75ATC,=GB75BB,=GB8CCC,=GB8HI,=GB8MD,=GB8MG,=GB8ND,=GB8OAE,=GB8OQE,=GB8RAF, + =GB8WOW,=GB8WT,=GB90RSGB/62,=GB90RSGB/72,=GB9GGM,=GC4BRS/LH,=GG100ACD,=GG100ANG,=GG100CPG, + =GG100RGG,=GG100SG,=GO0DIV,=GO0EZQ,=GO0EZY,=GO0JEQ,=GO0MNP,=GO0MNP/P,=GO0NPL,=GO0PLB,=GO0PNI, + =GO0PUP,=GO0VKW,=GO0VML,=GO0VSW,=GO1DPL,=GO1IOT,=GO1JFV,=GO1MVL,=GO1PKM,=GO3PLB,=GO3UOF,=GO3UOF/M, + =GO3XJQ,=GO4BKG,=GO4BLE,=GO4CQZ,=GO4DTQ,=GO4GTI,=GO4JKR,=GO4JUN,=GO4JUW,=GO4MVA,=GO4NOO,=GO4OKT, + =GO4SUE,=GO4SUE/P,=GO4TNZ,=GO4WXM,=GO6IMS,=GO6NKG,=GO6UKO,=GO7DWR,=GO7SBO,=GO7VJK,=GO7VQD,=GO8BQK, + =GO8IQC,=GO8JOY,=GO8OKR,=GQ0ANA,=GQ0DIV,=GQ0JEQ,=GQ0JRF,=GQ0MNO,=GQ0MNP,=GQ0NPL,=GQ0PUP,=GQ0RYT, + =GQ0SLM,=GQ0TQM,=GQ0VKW,=GQ0VML,=GQ0VSW,=GQ0WVL,=GQ1FKY,=GQ1FOA/P,=GQ1IOT,=GQ1JFV,=GQ1MVL,=GQ1NRS, + =GQ1WRV,=GQ1ZKN,=GQ3IRK,=GQ3PLB,=GQ3SB,=GQ3UOF,=GQ3VEN,=GQ3VKL,=GQ3WSU,=GQ3XJA,=GQ3XJQ,=GQ4BKG, + =GQ4BLE,=GQ4CQZ,=GQ4EZW,=GQ4GSH,=GQ4GTI,=GQ4IIL,=GQ4JKR,=GQ4JUN,=GQ4JUW,=GQ4LZP,=GQ4MVA,=GQ4NOO, + =GQ4OKT,=GQ4SUE,=GQ4VNS,=GQ4VZJ,=GQ4WXM,=GQ4WXM/P,=GQ6IMS,=GQ6ITJ,=GQ6NKG,=GQ6UKO,=GQ7BQK,=GQ7DWR, + =GQ7FBV,=GQ7SBO,=GQ7UNJ,=GQ7UNV,=GQ7VJK,=GQ7VQD,=GQ8BQK,=GQ8IQC,=GQ8JOY,=GQ8OKR,=GR0ANA,=GR0DIV, + =GR0DSP,=GR0HUS,=GR0JEQ,=GR0MYY,=GR0NPL,=GR0PSV,=GR0RYT,=GR0SYN,=GR0TKX,=GR0VKW,=GR0WGK,=GR1FJI, + =GR1HNG,=GR1LFX,=GR1LHV,=GR1MCD,=GR1SGG,=GR1WVY,=GR1YQM,=GR3SB,=GR3SFC,=GR3TKH,=GR3UOF,=GR3XJQ, + =GR4BKG,=GR4BLE,=GR4CQZ,=GR4GNY,=GR4GTI,=GR4HZA,=GR4JUN,=GR4JUW,=GR4OGO,=GR4SUE,=GR4VSS/P,=GR4XXJ, + =GR4ZOM,=GR5PH,=GR6NKG,=GR6SIX,=GR6STK,=GR6UKO,=GR6ZDH,=GR7AAV,=GR7HOC,=GR7NAU,=GR7TKZ,=GR7UNV, + =GR7VQD,=GR8BQK,=GR8IQC,=GR8OGI,=GR8TRO,=GV0ANA,=GV0DCK,=GV0DIV,=GV0EME,=GV0FRE,=GV0MNP,=GV0NPL, + =GV1FKY,=GV1IOT,=GV1JFV,=GV1NBW,=GV1YQM,=GV3ATZ,=GV3TJE/P,=GV3UOF,=GV3WEZ,=GV3XJQ,=GV4BKG,=GV4BRS, + =GV4CQZ,=GV4JKR,=GV4JQP,=GV4NQJ,=GV4PUC,=GV6BRC,=GV6JPC,=GV6NKG,=GV7UNV,=GV7VJK,=GV8IQC, + =GW0AWT/2K,=GW0GEI/2K,=GW0GIH/2K,=GW0MNO/2K,=GW0VSW/2K,=GW3JXN/2K,=GW3KJN/2K,=GW4IIL/2K, + =GW4VHP/2K,=M2000Y/97A,=MO0AQZ,=MO0ATI,=MO0COE,=MO0CVT,=MO0EQL,=MO0EZQ,=MO0GXE,=MO0HCX,=MO0IBZ, + =MO0IML,=MO0KLW,=MO0LDJ,=MO0LLK,=MO0LUK,=MO0LZZ,=MO0MAU,=MO0MUM,=MO0MWZ,=MO0OWW,=MO0SGD,=MO0SGR, + =MO0TBB,=MO0TMI,=MO0TTU,=MO0UPH,=MO0VVO,=MO1CFA,=MO1CFN,=MO3DAO,=MO3DQB,=MO3GKI,=MO3OJA,=MO3PUU, + =MO3RNI,=MO3UEZ,=MO3WPH,=MO3YVO,=MO3ZCO,=MO6DVP,=MO6GWK,=MO6GWR,=MO6GWR/P,=MO6MAU,=MO6PAM,=MO6PLC, + =MO6PUT,=MO6SEF,=MO6TBD,=MO6TBP,=MO6WLB,=MQ0AQZ,=MQ0ATI,=MQ0AWW,=MQ0CDO,=MQ0CNA,=MQ0CVT,=MQ0DHF, + =MQ0EQL,=MQ0GXE,=MQ0GYV,=MQ0HCX,=MQ0IBZ,=MQ0IML,=MQ0LDJ,=MQ0LLK,=MQ0LUK,=MQ0LZZ,=MQ0MAU,=MQ0MUM, + =MQ0MWA,=MQ0MWZ,=MQ0OWW,=MQ0PAD,=MQ0RHD,=MQ0SGD,=MQ0SGR,=MQ0TBB,=MQ0TMI,=MQ0TTU,=MQ0UPH,=MQ0UPH/P, + =MQ0VVO,=MQ0XMC/P,=MQ1CFA,=MQ1CFN,=MQ1EYO/P,=MQ1LCR,=MQ3DAO,=MQ3EPA,=MQ3GKI,=MQ3JAT,=MQ3NDB, + =MQ3OJA,=MQ3USK,=MQ3WPH,=MQ3ZCB/P,=MQ5AND,=MQ5EPA,=MQ5VZW,=MQ6DVP,=MQ6KLL,=MQ6MAU,=MQ6PAM,=MQ6PLC, + =MQ6RHD,=MQ6SEF,=MQ6TBD,=MQ6TBP,=MR0AQZ,=MR0BXJ,=MR0CVT,=MR0GUK,=MR0GXE,=MR0IDX,=MR0JGE,=MR0LAO, + =MR0LDJ,=MR0MAU,=MR0RLD,=MR0TTR,=MR0TTU,=MR0YAD,=MR0ZAP,=MR1CFN,=MR1EAA,=MR1LCR,=MR1MAJ/P,=MR1MDH, + =MR3AVB,=MR3AVC,=MR3CBF,=MR3NYR,=MR3OBL,=MR3SET/P,=MR3UFN,=MR3XZP,=MR3YKL,=MR3YLO,=MR3YVO, + =MR3ZCB/P,=MR5HOC,=MR6ADZ,=MR6KDA,=MR6VHF,=MR6YDP,=MV0AEL,=MV0BLM,=MV0EDX,=MV0GWT,=MV0GXE, + =MV0HGY/P,=MV0IML,=MV0LLK,=MV0PJJ,=MV0PJJ/P,=MV0RRD,=MV0SGD,=MV0SGR,=MV0TBB,=MV0TDQ,=MV0UAA, + =MV0USK,=MV0VRQ,=MV0WYN,=MV1CFA,=MV1CFN,=MV1EYP/P,=MV3RNI,=MV6CQN,=MV6GWR,=MV6GWR/P,=MV6URC, + =MV6ZOL,=MW0CND/2K,=MW0DHF/LH,=MW5AAM/2K,=MW5GOL/LH; Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4: H4,=H40/H44RK; Temotu Province: 32: 51: OC: -10.72: -165.80: -11.0: H40: @@ -1200,15 +1201,16 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL7ZT(4)[7],=KP2X(4)[7],=KP2Y(4)[7],=KP4ATV(4)[7],=KP4MLF(4)[7],=KP4XZ(4)[7],=NH0AD(4)[7], =NH2LH(4)[7],=NH6CF(4)[7],=NH6EU(4)[7],=NH6LR(4)[7],=NH6WF(4)[7],=NH7CY(4)[7],=NH7FI(4)[7], =NH7XM(4)[7],=NH7ZH(4)[7],=NL7AS(4)[7],=NL7BU(4)[7],=NL7CO/M(4)[7],=NL7CQ(4)[7],=NL7CQ/0(4)[7], - =NL7FF(4)[7],=NL7FU(4)[7],=NL7SB(4)[7],=NL7XT(4)[7],=NL7XU(4)[7],=NP3XP(4)[7],=NP4AI(4)[7], - =NP4AI/0(4)[7],=VE4AGT/M(4)[7],=VE4XC/M(4)[7],=WH2S(4)[7],=WH2Z(4)[7],=WH6AKZ(4)[7],=WH6ANH(4)[7], - =WH6BLT(4)[7],=WH6BUL(4)[7],=WH6BXD(4)[7],=WH6CTU(4)[7],=WH6CUE(4)[7],=WH6CYM(4)[7],=WH6CZI(4)[7], - =WH6CZU(4)[7],=WH6DCJ(4)[7],=WH6DUV(4)[7],=WH6DXA(4)[7],=WH6EAA(4)[7],=WH6EAE(4)[7],=WH6ENX(4)[7], - =WH6FBM(4)[7],=WH6LR(4)[7],=WH6MS(4)[7],=WH6QS(4)[7],=WH7IR(4)[7],=WH7MZ(4)[7],=WH9AAH(4)[7], - =WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7],=WL7ANY(4)[7],=WL7ATK(4)[7],=WL7BRV(4)[7], - =WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7],=WL7CQF(4)[7],=WL7CRT(4)[7],=WL7CY(4)[7], - =WL7J(4)[7],=WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7],=WL7RV(4)[7],=WL7S(4)[7],=WL7YM(4)[7], - =WP2B/0(4)[7],=WP3QH(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4LC(4)[7],=WP4NPV(4)[7], + =NL7FF(4)[7],=NL7FU(4)[7],=NL7SB(4)[7],=NL7T(4)[7],=NL7XT(4)[7],=NL7XU(4)[7],=NL7ZG(4)[7], + =NP3XP(4)[7],=NP4AI(4)[7],=NP4AI/0(4)[7],=VE4AGT/M(4)[7],=VE4XC/M(4)[7],=WH2S(4)[7],=WH2Z(4)[7], + =WH6AKZ(4)[7],=WH6ANH(4)[7],=WH6BLT(4)[7],=WH6BUL(4)[7],=WH6BXD(4)[7],=WH6CTU(4)[7],=WH6CUE(4)[7], + =WH6CYM(4)[7],=WH6CZI(4)[7],=WH6CZU(4)[7],=WH6DCJ(4)[7],=WH6DUV(4)[7],=WH6DXA(4)[7],=WH6EAA(4)[7], + =WH6EAE(4)[7],=WH6ENX(4)[7],=WH6FBM(4)[7],=WH6LR(4)[7],=WH6MS(4)[7],=WH6QS(4)[7],=WH7IR(4)[7], + =WH7MZ(4)[7],=WH9AAH(4)[7],=WL0JF(4)[7],=WL1ON(4)[7],=WL7AEC(4)[7],=WL7AJA(4)[7],=WL7ANY(4)[7], + =WL7ATK(4)[7],=WL7BRV(4)[7],=WL7BT(4)[7],=WL7CEG(4)[7],=WL7CLI(4)[7],=WL7CPW(4)[7],=WL7CQF(4)[7], + =WL7CRT(4)[7],=WL7CY(4)[7],=WL7J(4)[7],=WL7JB(4)[7],=WL7LZ(4)[7],=WL7LZ/M(4)[7],=WL7RV(4)[7], + =WL7S(4)[7],=WL7YM(4)[7],=WP2B/0(4)[7],=WP3QH(4)[7],=WP4BTQ(4)[7],=WP4GQR(4)[7],=WP4LC(4)[7], + =WP4LEY(4)[7],=WP4NPV(4)[7], =AH2V(5)[8],=AH2W(5)[8],=AH6BV(5)[8],=AL0A(5)[8],=AL1K(5)[8],=AL1O(5)[8],=AL4V(5)[8],=AL6L(5)[8], =AL6M(5)[8],=AL7GD(5)[8],=AL7LV(5)[8],=AL7QS(5)[8],=AL8A(5)[8],=AL8E(5)[8],=KH2AB(5)[8], =KH2AK(5)[8],=KH2BA(5)[8],=KH2EH(5)[8],=KH6GR(5)[8],=KH6HZ(5)[8],=KH6IKI(5)[8],=KH6JKQ(5)[8], @@ -1219,10 +1221,10 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL7JR/1(5)[8],=KL7JT(5)[8],=KL7USI/1(5)[8],=KL8DX(5)[8],=KP4AMC(5)[8],=KP4BLS(5)[8], =KP4BPR(5)[8],=KP4DGF(5)[8],=KP4EC/1(5)[8],=KP4G(5)[8],=KP4GVT(5)[8],=KP4JLD(5)[8],=KP4KWB(5)[8], =KP4MHG(5)[8],=KP4MR(5)[8],=KP4NBI(5)[8],=KP4NPL(5)[8],=KP4NW(5)[8],=KP4R(5)[8],=KP4RCD(5)[8], - =KP4RMM(5)[8],=KP4ZEM(5)[8],=NH0H(5)[8],=NH6IH(5)[8],=NH6XW(5)[8],=NH6ZB(5)[8],=NL7AK(5)[8], - =NL7FJ(5)[8],=NL7FJ/1(5)[8],=NL7MO(5)[8],=NL7NJ(5)[8],=NL7OI(5)[8],=NL7OT(5)[8],=NL7SH(5)[8], - =NL9H(5)[8],=NP2FZ(5)[8],=NP2FZ/1(5)[8],=NP2GG(5)[8],=NP2PN(5)[8],=NP3IV(5)[8],=NP3LN(5)[8], - =NP3WX(5)[8],=NP4AO(5)[8],=NP4AZ(5)[8],=NP4ER(5)[8],=VE1BES/M(5)[8],=VE3CMB/M(5)[8], + =KP4RMM(5)[8],=KP4WPD(5)[8],=KP4ZEM(5)[8],=NH0H(5)[8],=NH6IH(5)[8],=NH6XW(5)[8],=NH6ZB(5)[8], + =NL7AK(5)[8],=NL7FJ(5)[8],=NL7FJ/1(5)[8],=NL7MO(5)[8],=NL7NJ(5)[8],=NL7OI(5)[8],=NL7OT(5)[8], + =NL7SH(5)[8],=NL9H(5)[8],=NP2FZ(5)[8],=NP2FZ/1(5)[8],=NP2GG(5)[8],=NP2PN(5)[8],=NP3IV(5)[8], + =NP3LN(5)[8],=NP3WX(5)[8],=NP4AO(5)[8],=NP4AZ(5)[8],=NP4ER(5)[8],=VE1BES/M(5)[8],=VE3CMB/M(5)[8], =VE4CCN/M(5)[8],=WH0EWX(5)[8],=WH2B(5)[8],=WH6CT(5)[8],=WH6DSN(5)[8],=WH6EI(5)[8],=WH6FBH(5)[8], =WH6MY(5)[8],=WH6SW(5)[8],=WH6SW/1(5)[8],=WH7TP(5)[8],=WH7YQ(5)[8],=WH7YR(5)[8],=WL1B(5)[8], =WL7B(5)[8],=WL7CC(5)[8],=WL7CUP(5)[8],=WL7CVD(5)[8],=WL7WO(5)[8],=WL7WO/1(5)[8],=WL7Z/1(5)[8], @@ -1250,127 +1252,127 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =4U1WB(5)[8],=AH6AX(5)[8],=AH6FF/3(5)[8],=AH6R(5)[8],=AH6Z(5)[8],=AH7J(5)[8],=AH8P(5)[8], =AL1B(5)[8],=AL1B/M(5)[8],=AL2G(5)[8],=AL3C(5)[8],=AL7AB(5)[8],=AL7NN(5)[8],=AL7NN/3(5)[8], =AL7RS(5)[8],=KH2EI(5)[8],=KH2JH(5)[8],=KH2JX(5)[8],=KH2SX(5)[8],=KH6CUJ(5)[8],=KH6GRG(5)[8], - =KH6ILR/3(5)[8],=KH6JGA(5)[8],=KH6LDO(5)[8],=KH6PX(5)[8],=KH6RE(5)[8],=KH8CN(5)[8],=KL1HA(5)[8], - =KL1KM(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2UR(5)[8],=KL2XF(5)[8],=KL7FD(5)[8],=KL7GLK/3(5)[8], - =KL7HR/3(5)[8],=KL7IUI(5)[8],=KL7IUI/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8],=KL7OQ(5)[8], - =KL9A/3(5)[8],=KP3M(5)[8],=KP3N(5)[8],=KP4BEP(5)[8],=KP4CAM(5)[8],=KP4FCF(5)[8],=KP4GB/3(5)[8], - =KP4IP(5)[8],=KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8],=KP4UV(5)[8],=KP4VW(5)[8], - =KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8],=KP4YH(5)[8],=NH2CW(5)[8],=NH2LA(5)[8],=NH6BD(5)[8], - =NH6BK(5)[8],=NH7C(5)[8],=NH7CC(5)[8],=NH7TV(5)[8],=NH7YK(5)[8],=NL7CK(5)[8],=NL7PJ(5)[8], - =NL7V/3(5)[8],=NL7WA(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8],=NP2EP(5)[8],=NP2G(5)[8],=NP2NC(5)[8], - =NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8],=NP4YZ(5)[8],=WH6ADS(5)[8],=WH6AWO(5)[8], - =WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8],=WH6ECO(5)[8],=WH6EEL(5)[8],=WH6EEN(5)[8], - =WH6EIJ(5)[8],=WH6FPS(5)[8],=WH6GEU(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH6RN(5)[8],=WH7F(5)[8], - =WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8],=WP3EC(5)[8], - =WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8],=WP4HSZ(5)[8], - =WP4IYE(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8],=WP4KTU(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8],=WP4LTI(5)[8], - =WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4NXG(5)[8],=WP4OSQ(5)[8],=WP4PPH(5)[8],=WP4PQN(5)[8], - =WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYU(5)[8],=WP4PYV(5)[8],=WP4PYZ(5)[8],=WP4PZA(5)[8], + =KH6ILR/3(5)[8],=KH6JGA(5)[8],=KH6LDO(5)[8],=KH6PX(5)[8],=KH6RE(5)[8],=KH8CN(5)[8],=KL1CNN(5)[8], + =KL1HA(5)[8],=KL1KM(5)[8],=KL2A/3(5)[8],=KL2BV(5)[8],=KL2UR(5)[8],=KL2XF(5)[8],=KL7FD(5)[8], + =KL7GLK/3(5)[8],=KL7HR/3(5)[8],=KL7IUI(5)[8],=KL7IUI/3(5)[8],=KL7JO(5)[8],=KL7OF/3(5)[8], + =KL7OQ(5)[8],=KL9A/3(5)[8],=KP3M(5)[8],=KP3N(5)[8],=KP4BEP(5)[8],=KP4CAM(5)[8],=KP4FCF(5)[8], + =KP4GB/3(5)[8],=KP4IP(5)[8],=KP4JB(5)[8],=KP4N(5)[8],=KP4N/3(5)[8],=KP4PRI(5)[8],=KP4UV(5)[8], + =KP4VW(5)[8],=KP4WR(5)[8],=KP4XO(5)[8],=KP4XX(5)[8],=KP4YH(5)[8],=NH2CW(5)[8],=NH2LA(5)[8], + =NH6BD(5)[8],=NH6BK(5)[8],=NH7C(5)[8],=NH7CC(5)[8],=NH7TV(5)[8],=NH7YK(5)[8],=NL7CK(5)[8], + =NL7PJ(5)[8],=NL7V/3(5)[8],=NL7WA(5)[8],=NL7XM(5)[8],=NL7XM/B(5)[8],=NP2EP(5)[8],=NP2G(5)[8], + =NP2NC(5)[8],=NP3ES(5)[8],=NP3IP(5)[8],=NP3YN(5)[8],=NP4RH(5)[8],=NP4YZ(5)[8],=WH6ADS(5)[8], + =WH6AWO(5)[8],=WH6AZN(5)[8],=WH6CE(5)[8],=WH6CTO(5)[8],=WH6DOA(5)[8],=WH6ECO(5)[8],=WH6EEL(5)[8], + =WH6EEN(5)[8],=WH6EIJ(5)[8],=WH6FPS(5)[8],=WH6GEU(5)[8],=WH6IO(5)[8],=WH6OB(5)[8],=WH6RN(5)[8], + =WH7F(5)[8],=WH7USA(5)[8],=WL7AF(5)[8],=WL7L(5)[8],=WP2XX(5)[8],=WP3BX(5)[8],=WP3CC(5)[8], + =WP3EC(5)[8],=WP3FK(5)[8],=WP4DA(5)[8],=WP4DCK(5)[8],=WP4EDM(5)[8],=WP4GJL(5)[8],=WP4HRK(5)[8], + =WP4HSZ(5)[8],=WP4IYE(5)[8],=WP4KDN(5)[8],=WP4KKX(5)[8],=WP4KTU(5)[8],=WP4LEM(5)[8],=WP4LNP(5)[8], + =WP4LTI(5)[8],=WP4MNV(5)[8],=WP4MSX(5)[8],=WP4MYN(5)[8],=WP4NXG(5)[8],=WP4OSQ(5)[8],=WP4PPH(5)[8], + =WP4PQN(5)[8],=WP4PUR(5)[8],=WP4PYL(5)[8],=WP4PYM(5)[8],=WP4PYU(5)[8],=WP4PYV(5)[8],=WP4PYZ(5)[8], + =WP4PZA(5)[8], =AH0BV(5)[8],=AH0BZ(5)[8],=AH0G(5)[8],=AH2AJ(5)[8],=AH2AM(5)[8],=AH2AV/4(5)[8],=AH2DF(5)[8], =AH2EB(5)[8],=AH2X(5)[8],=AH3B(5)[8],=AH6AL(5)[8],=AH6AT(5)[8],=AH6AU(5)[8],=AH6BJ(5)[8], - =AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IJ(5)[8],=AH6IW(5)[8], - =AH6JH(5)[8],=AH6JN/4(5)[8],=AH6JN/M(5)[8],=AH6KS(5)[8],=AH6KT(5)[8],=AH6KT/4(5)[8],=AH6LQ(5)[8], - =AH6LS(5)[8],=AH6OB(5)[8],=AH6TI(5)[8],=AH7DN(5)[8],=AH7I(5)[8],=AH7I/4(5)[8],=AH7MI(5)[8], - =AH8B(5)[8],=AH8M(5)[8],=AH8M/M(5)[8],=AH8R(5)[8],=AH8T(5)[8],=AL0I(5)[8],=AL1A(5)[8],=AL3G(5)[8], - =AL3M(5)[8],=AL4T(5)[8],=AL4T/4(5)[8],=AL4U(5)[8],=AL4X(5)[8],=AL5A(5)[8],=AL7AL(5)[8], - =AL7AM(5)[8],=AL7BA(5)[8],=AL7FR(5)[8],=AL7GF(5)[8],=AL7GK(5)[8],=AL7HG(5)[8],=AL7HW(5)[8], - =AL7HW/4(5)[8],=AL7IS(5)[8],=AL7KT(5)[8],=AL7LH(5)[8],=AL7LJ(5)[8],=AL7NL(5)[8],=AL7NM(5)[8], - =AL7NS(5)[8],=AL7NS/140(5)[8],=AL7PL(5)[8],=AL7QI(5)[8],=AL7RE(5)[8],=AL7RL(5)[8],=G8ERJ(5)[8], - =GO4AZM(5)[8],=GQ4AZM(5)[8],=GR4AZM(5)[8],=KH0CW(5)[8],=KH0G(5)[8],=KH0HR(5)[8],=KH0NI(5)[8], - =KH0ZZ(5)[8],=KH2BX(5)[8],=KH2D(5)[8],=KH2D/4(5)[8],=KH2GUM/P(5)[8],=KH2HB(5)[8],=KH2KD(5)[8], - =KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8],=KH2UG(5)[8],=KH2UV(5)[8],=KH2UZ(5)[8], - =KH2VB(5)[8],=KH2VM(5)[8],=KH3AC(5)[8],=KH3AG(5)[8],=KH6AE(5)[8],=KH6AME(5)[8],=KH6CG(5)[8], - =KH6CG/4(5)[8],=KH6CT(5)[8],=KH6ED(5)[8],=KH6HHS(5)[8],=KH6HHS/4(5)[8],=KH6HOW(5)[8], - =KH6ILR(5)[8],=KH6ILR/4(5)[8],=KH6ITI(5)[8],=KH6JAU(5)[8],=KH6JJD(5)[8],=KH6JNW(5)[8], - =KH6JUA(5)[8],=KH6KZ(5)[8],=KH6M(5)[8],=KH6M/4(5)[8],=KH6M/M(5)[8],=KH6MT(5)[8],=KH6MT/4(5)[8], - =KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8],=KH6PU(5)[8],=KH6RP(5)[8],=KH6TY(5)[8], - =KH6TY/R(5)[8],=KH6UN(5)[8],=KH6WE(5)[8],=KH6XH(5)[8],=KH7DA(5)[8],=KH7DM(5)[8],=KH7DY(5)[8], - =KH7FC(5)[8],=KH7FU(5)[8],=KH7GM(5)[8],=KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8],=KH7OV(5)[8], - =KH7WK(5)[8],=KH7WU(5)[8],=KH7XS/4(5)[8],=KH7XT(5)[8],=KH7ZC(5)[8],=KH8DO(5)[8],=KH8U(5)[8], - =KL0AG(5)[8],=KL0BG(5)[8],=KL0IP(5)[8],=KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8],=KL0MG(5)[8], - =KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8],=KL0ST(5)[8],=KL0TY(5)[8],=KL0UA(5)[8],=KL0UD(5)[8], - =KL0VU(5)[8],=KL0WF(5)[8],=KL1AN(5)[8],=KL1AV(5)[8],=KL1KP(5)[8],=KL1NK(5)[8],=KL1NS(5)[8], - =KL1OK(5)[8],=KL1PA(5)[8],=KL1SS(5)[8],=KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8],=KL2GG(5)[8], - =KL2GP(5)[8],=KL2HV(5)[8],=KL2MQ(5)[8],=KL2NN(5)[8],=KL2UM(5)[8],=KL2UQ(5)[8],=KL2XI(5)[8], - =KL3BG(5)[8],=KL3EV(5)[8],=KL3FA(5)[8],=KL3HG(5)[8],=KL3IA(5)[8],=KL3KB(5)[8],=KL3KG(5)[8], - =KL3NR(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8],=KL4DD(5)[8],=KL4H(5)[8], - =KL4J(5)[8],=KL4XR(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8],=KL7AF(5)[8],=KL7DA(5)[8], - =KL7DA/4(5)[8],=KL7EA(5)[8],=KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8],=KL7HIM(5)[8],=KL7HJZ(5)[8], - =KL7HNY(5)[8],=KL7HOT(5)[8],=KL7HQW(5)[8],=KL7HV(5)[8],=KL7HX(5)[8],=KL7I(5)[8],=KL7IEK(5)[8], - =KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8],=KL7JDS(5)[8],=KL7JR(5)[8],=KL7LS(5)[8], - =KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8],=KL7NT(5)[8],=KL7OO(5)[8],=KL7P/4(5)[8], - =KL7PS(5)[8],=KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7TZ(5)[8],=KL7USI/4(5)[8],=KL7XA(5)[8], - =KL9A/1(5)[8],=KP2AF(5)[8],=KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8],=KP2CR(5)[8],=KP2L(5)[8], - =KP2L/4(5)[8],=KP2N(5)[8],=KP2QL(5)[8],=KP2R(5)[8],=KP2U(5)[8],=KP2US(5)[8],=KP2V(5)[8], - =KP3AMG(5)[8],=KP3BL(5)[8],=KP3BP(5)[8],=KP3SK(5)[8],=KP3U(5)[8],=KP4AD(5)[8],=KP4AOD(5)[8], - =KP4AOD/4(5)[8],=KP4AYI(5)[8],=KP4BBN(5)[8],=KP4BEC(5)[8],=KP4BM(5)[8],=KP4BOB(5)[8], - =KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8],=KP4CPP(5)[8],=KP4CSJ(5)[8],=KP4CSZ(5)[8],=KP4CW(5)[8], - =KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8],=KP4DPQ(5)[8],=KP4DQS(5)[8],=KP4EDL(5)[8],=KP4EF(5)[8], - =KP4EH(5)[8],=KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8],=KP4EOR/4(5)[8], + =AH6C(5)[8],=AH6EZ/4(5)[8],=AH6FX(5)[8],=AH6FX/4(5)[8],=AH6IC(5)[8],=AH6IW(5)[8],=AH6JH(5)[8], + =AH6JN/4(5)[8],=AH6JN/M(5)[8],=AH6KS(5)[8],=AH6KT(5)[8],=AH6KT/4(5)[8],=AH6LQ(5)[8],=AH6LS(5)[8], + =AH6OB(5)[8],=AH6TI(5)[8],=AH7DN(5)[8],=AH7I(5)[8],=AH7I/4(5)[8],=AH7MI(5)[8],=AH8B(5)[8], + =AH8M(5)[8],=AH8M/M(5)[8],=AH8R(5)[8],=AH8T(5)[8],=AL0I(5)[8],=AL1A(5)[8],=AL3G(5)[8],=AL3M(5)[8], + =AL4T(5)[8],=AL4T/4(5)[8],=AL4U(5)[8],=AL4X(5)[8],=AL5A(5)[8],=AL7AL(5)[8],=AL7AM(5)[8], + =AL7BA(5)[8],=AL7FR(5)[8],=AL7GF(5)[8],=AL7GK(5)[8],=AL7HG(5)[8],=AL7HW(5)[8],=AL7HW/4(5)[8], + =AL7IS(5)[8],=AL7KI(5)[8],=AL7KT(5)[8],=AL7LH(5)[8],=AL7LJ(5)[8],=AL7NL(5)[8],=AL7NM(5)[8], + =AL7NS(5)[8],=AL7NS/140(5)[8],=AL7PL(5)[8],=AL7QI(5)[8],=AL7RB(5)[8],=AL7RE(5)[8],=AL7RL(5)[8], + =G8ERJ(5)[8],=GO4AZM(5)[8],=GQ4AZM(5)[8],=GR4AZM(5)[8],=KH0CW(5)[8],=KH0G(5)[8],=KH0HR(5)[8], + =KH0NI(5)[8],=KH0ZZ(5)[8],=KH2BX(5)[8],=KH2D(5)[8],=KH2D/4(5)[8],=KH2GUM/P(5)[8],=KH2HB(5)[8], + =KH2KD(5)[8],=KH2NC(5)[8],=KH2PM(5)[8],=KH2RL(5)[8],=KH2TI(5)[8],=KH2UG(5)[8],=KH2UV(5)[8], + =KH2UY(5)[8],=KH2UZ(5)[8],=KH2VB(5)[8],=KH2VM(5)[8],=KH3AC(5)[8],=KH3AG(5)[8],=KH6AE(5)[8], + =KH6AME(5)[8],=KH6CG(5)[8],=KH6CG/4(5)[8],=KH6CT(5)[8],=KH6ED(5)[8],=KH6HHS(5)[8],=KH6HHS/4(5)[8], + =KH6HOW(5)[8],=KH6ILR(5)[8],=KH6ILR/4(5)[8],=KH6ITI(5)[8],=KH6JAU(5)[8],=KH6JJD(5)[8], + =KH6JNW(5)[8],=KH6JUA(5)[8],=KH6KZ(5)[8],=KH6M(5)[8],=KH6M/4(5)[8],=KH6M/M(5)[8],=KH6MT(5)[8], + =KH6MT/4(5)[8],=KH6NC(5)[8],=KH6NI(5)[8],=KH6OU(5)[8],=KH6POI(5)[8],=KH6PU(5)[8],=KH6RP(5)[8], + =KH6TY(5)[8],=KH6TY/R(5)[8],=KH6UN(5)[8],=KH6WE(5)[8],=KH6XH(5)[8],=KH7DA(5)[8],=KH7DM(5)[8], + =KH7DY(5)[8],=KH7FC(5)[8],=KH7FU(5)[8],=KH7GM(5)[8],=KH7GZ(5)[8],=KH7HJ/4(5)[8],=KH7OC(5)[8], + =KH7OV(5)[8],=KH7WK(5)[8],=KH7WU(5)[8],=KH7XS/4(5)[8],=KH7XT(5)[8],=KH7ZC(5)[8],=KH8DO(5)[8], + =KH8U(5)[8],=KL0AG(5)[8],=KL0BG(5)[8],=KL0IP(5)[8],=KL0KC(5)[8],=KL0KE/4(5)[8],=KL0L(5)[8], + =KL0MG(5)[8],=KL0MP(5)[8],=KL0S(5)[8],=KL0SS(5)[8],=KL0ST(5)[8],=KL0TY(5)[8],=KL0UA(5)[8], + =KL0UD(5)[8],=KL0VU(5)[8],=KL0WF(5)[8],=KL1AN(5)[8],=KL1AV(5)[8],=KL1KP(5)[8],=KL1NK(5)[8], + =KL1NS(5)[8],=KL1OK(5)[8],=KL1PA(5)[8],=KL1SS(5)[8],=KL2AK(5)[8],=KL2CX(5)[8],=KL2EY(5)[8], + =KL2GG(5)[8],=KL2GP(5)[8],=KL2HV(5)[8],=KL2MQ(5)[8],=KL2NN(5)[8],=KL2UM(5)[8],=KL2UQ(5)[8], + =KL2XI(5)[8],=KL3BG(5)[8],=KL3EV(5)[8],=KL3FA(5)[8],=KL3HG(5)[8],=KL3IA(5)[8],=KL3KB(5)[8], + =KL3KG(5)[8],=KL3NR(5)[8],=KL3SH(5)[8],=KL3WM(5)[8],=KL3X(5)[8],=KL3XB(5)[8],=KL4CO(5)[8], + =KL4DD(5)[8],=KL4H(5)[8],=KL4J(5)[8],=KL4XR(5)[8],=KL5X(5)[8],=KL5YJ(5)[8],=KL7A(5)[8], + =KL7AF(5)[8],=KL7DA(5)[8],=KL7DA/4(5)[8],=KL7EA(5)[8],=KL7FO(5)[8],=KL7GLL(5)[8],=KL7H(5)[8], + =KL7HIM(5)[8],=KL7HJZ(5)[8],=KL7HNY(5)[8],=KL7HOT(5)[8],=KL7HQW(5)[8],=KL7HV(5)[8],=KL7HX(5)[8], + =KL7I(5)[8],=KL7IEK(5)[8],=KL7IKZ(5)[8],=KL7IV(5)[8],=KL7IVY(5)[8],=KL7IWF(5)[8],=KL7JDS(5)[8], + =KL7JR(5)[8],=KL7LS(5)[8],=KL7MJ(5)[8],=KL7NCO(5)[8],=KL7NL(5)[8],=KL7NL/4(5)[8],=KL7NT(5)[8], + =KL7OO(5)[8],=KL7P/4(5)[8],=KL7PS(5)[8],=KL7QH(5)[8],=KL7QU(5)[8],=KL7SR(5)[8],=KL7TZ(5)[8], + =KL7USI/4(5)[8],=KL7XA(5)[8],=KL9A/1(5)[8],=KP2AF(5)[8],=KP2AV(5)[8],=KP2AV/4(5)[8],=KP2CH(5)[8], + =KP2CR(5)[8],=KP2L(5)[8],=KP2L/4(5)[8],=KP2N(5)[8],=KP2QL(5)[8],=KP2R(5)[8],=KP2U(5)[8], + =KP2US(5)[8],=KP2V(5)[8],=KP3AMG(5)[8],=KP3BL(5)[8],=KP3BP(5)[8],=KP3SK(5)[8],=KP3U(5)[8], + =KP4AD(5)[8],=KP4AOD(5)[8],=KP4AOD/4(5)[8],=KP4AYI(5)[8],=KP4BBN(5)[8],=KP4BEC(5)[8],=KP4BM(5)[8], + =KP4BOB(5)[8],=KP4CBP(5)[8],=KP4CEL(5)[8],=KP4CH(5)[8],=KP4CPP(5)[8],=KP4CSJ(5)[8],=KP4CSZ(5)[8], + =KP4CW(5)[8],=KP4CZ(5)[8],=KP4DAC(5)[8],=KP4DDS(5)[8],=KP4DPQ(5)[8],=KP4DQS(5)[8],=KP4EDL(5)[8], + =KP4EF(5)[8],=KP4EH(5)[8],=KP4EIA(5)[8],=KP4EMY(5)[8],=KP4ENK(5)[8],=KP4EOR(5)[8],=KP4EOR/4(5)[8], =KP4ERT(5)[8],=KP4ESC(5)[8],=KP4FBS(5)[8],=KP4FGI(5)[8],=KP4FIR(5)[8],=KP4FJE(5)[8],=KP4FLP(5)[8], =KP4FOF(5)[8],=KP4GW(5)[8],=KP4HE(5)[8],=KP4HN(5)[8],=KP4II(5)[8],=KP4IRI(5)[8],=KP4IT(5)[8], =KP4JC(5)[8],=KP4JCC(5)[8],=KP4JOS(5)[8],=KP4JVD(5)[8],=KP4JWR(5)[8],=KP4KA(5)[8],=KP4KD(5)[8], =KP4KD/4(5)[8],=KP4KE/4(5)[8],=KP4KF(5)[8],=KP4LEU(5)[8],=KP4LF(5)[8],=KP4LMD(5)[8],=KP4LQ(5)[8], - =KP4LUV(5)[8],=KP4LX(5)[8],=KP4MA(5)[8],=KP4MHC(5)[8],=KP4MMG(5)[8],=KP4MPR(5)[8],=KP4MSP(5)[8], - =KP4ND(5)[8],=KP4NI(5)[8],=KP4OO(5)[8],=KP4PC(5)[8],=KP4PEC(5)[8],=KP4PF(5)[8],=KP4PM(5)[8], - =KP4PMD(5)[8],=KP4Q(5)[8],=KP4QT(5)[8],=KP4QT/4(5)[8],=KP4REY(5)[8],=KP4RGD(5)[8],=KP4RGT(5)[8], - =KP4ROP(5)[8],=KP4RRC(5)[8],=KP4RT(5)[8],=KP4RZ(5)[8],=KP4SU(5)[8],=KP4SWR(5)[8],=KP4TL(5)[8], - =KP4TR(5)[8],=KP4UFO(5)[8],=KP4USA(5)[8],=KP4VMR(5)[8],=KP4VO(5)[8],=KP4WK(5)[8],=KP4WW(5)[8], - =KP4WY(5)[8],=KP4XP(5)[8],=KP4Y(5)[8],=KP4YLV(5)[8],=KP4ZV(5)[8],=KP4ZX(5)[8],=NH2A(5)[8], - =NH2BQ(5)[8],=NH2DB(5)[8],=NH2F(5)[8],=NH2GY(5)[8],=NH2KW(5)[8],=NH2NG(5)[8],=NH6AU(5)[8], - =NH6AX(5)[8],=NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8],=NH6GR(5)[8],=NH6HX(5)[8],=NH6HX/4(5)[8], - =NH6JX(5)[8],=NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8],=NH6SZ(5)[8],=NH6T(5)[8],=NH6TL(5)[8], - =NH7AA(5)[8],=NH7AQ(5)[8],=NH7AR(5)[8],=NH7FG(5)[8],=NH7FV(5)[8],=NH7OI(5)[8],=NH7P(5)[8], - =NH7T/4(5)[8],=NH7UN(5)[8],=NH7XN(5)[8],=NH7YL(5)[8],=NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8], - =NL7BV(5)[8],=NL7KL(5)[8],=NL7KX(5)[8],=NL7LO(5)[8],=NL7LR(5)[8],=NL7LY(5)[8],=NL7MD(5)[8], - =NL7MR(5)[8],=NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8],=NL7PV(5)[8],=NL7U(5)[8],=NL7UP(5)[8], - =NL7VV(5)[8],=NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8],=NL7YZ(5)[8],=NP2B(5)[8],=NP2B/4(5)[8], - =NP2BB(5)[8],=NP2BW(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8],=NP2D(5)[8],=NP2DB(5)[8],=NP2DJ(5)[8], - =NP2EI(5)[8],=NP2FJ(5)[8],=NP2FT(5)[8],=NP2GN(5)[8],=NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8], - =NP2HW(5)[8],=NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8],=NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8], - =NP2JA(5)[8],=NP2JS(5)[8],=NP2JV(5)[8],=NP2L(5)[8],=NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8], - =NP2MP(5)[8],=NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8], - =NP2PA(5)[8],=NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8], - =NP3CI(5)[8],=NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8], - =NP3HN(5)[8],=NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8], - =NP3MM(5)[8],=NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8], - =NP3TM(5)[8],=NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8],=NP4CK(5)[8], - =NP4CV(5)[8],=NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4J(5)[8],=NP4JL(5)[8],=NP4JU(5)[8], - =NP4KV(5)[8],=NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8],=NP4SY(5)[8],=NP4TR(5)[8], - =NP4WT(5)[8],=NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8], - =WH6AJS(5)[8],=WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8], - =WH6CNC(5)[8],=WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8], - =WH6DOL(5)[8],=WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6DZ(5)[8],=WH6ECQ(5)[8],=WH6EFI(5)[8],=WH6EFX(5)[8], - =WH6EIK(5)[8],=WH6EIR(5)[8],=WH6EKW(5)[8],=WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8], - =WH6FCP(5)[8],=WH6FGK(5)[8],=WH6HA(5)[8],=WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8], - =WH6LE(5)[8],=WH6LE/4(5)[8],=WH6LE/M(5)[8],=WH6LE/P(5)[8],=WH6NE(5)[8],=WH6NU(5)[8],=WH6WX(5)[8], - =WH6YH(5)[8],=WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8],=WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8], - =WH7XK(5)[8],=WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8],=WH7ZM(5)[8],=WH9AAF(5)[8],=WL4X(5)[8], - =WL7AUL(5)[8],=WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8],=WL7CKJ(5)[8],=WL7COL(5)[8], - =WL7CPA(5)[8],=WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8],=WL7JE(5)[8],=WL7SR(5)[8], - =WL7UN(5)[8],=WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2AIL(5)[8], - =WP2BB(5)[8],=WP2C(5)[8],=WP2J(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8], - =WP3BC(5)[8],=WP3DW(5)[8],=WP3HL(5)[8],=WP3IM(5)[8],=WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8], - =WP3K(5)[8],=WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8],=WP3PW(5)[8], - =WP3QE(5)[8],=WP3TQ(5)[8],=WP3ZA(5)[8],=WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8], - =WP4AQK(5)[8],=WP4AVW(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8], - =WP4BK(5)[8],=WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4BZG(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8], - =WP4CMH(5)[8],=WP4DC(5)[8],=WP4DCB(5)[8],=WP4DFK(5)[8],=WP4DMV(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8], - =WP4ENX(5)[8],=WP4EXH(5)[8],=WP4FEI(5)[8],=WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8], - =WP4GX(5)[8],=WP4GYA(5)[8],=WP4HFZ(5)[8],=WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8], - =WP4IK(5)[8],=WP4ILP(5)[8],=WP4INP(5)[8],=WP4JC(5)[8],=WP4JKO(5)[8],=WP4JNB(5)[8],=WP4JQJ(5)[8], - =WP4JSR(5)[8],=WP4JSV(5)[8],=WP4JT(5)[8],=WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGI(5)[8], - =WP4KI(5)[8],=WP4KJV(5)[8],=WP4KPK(5)[8],=WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8], - =WP4LDL(5)[8],=WP4LDP(5)[8],=WP4LE(5)[8],=WP4LEO(5)[8],=WP4LHA(5)[8],=WP4LTA(5)[8],=WP4MAE(5)[8], - =WP4MD(5)[8],=WP4MO(5)[8],=WP4MQF(5)[8],=WP4MWE(5)[8],=WP4MWK(5)[8],=WP4MWS(5)[8],=WP4MXE(5)[8], - =WP4MYG(5)[8],=WP4MYK(5)[8],=WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8], - =WP4NKU(5)[8],=WP4NLQ(5)[8],=WP4NVL(5)[8],=WP4NWV(5)[8],=WP4NWW(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8], - =WP4OAT(5)[8],=WP4OBD(5)[8],=WP4OBH(5)[8],=WP4ODR(5)[8],=WP4ODT(5)[8],=WP4OEO(5)[8],=WP4OFA(5)[8], - =WP4OFL(5)[8],=WP4OHJ(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8], - =WP4OPD(5)[8],=WP4OPF(5)[8],=WP4OQH(5)[8],=WP4OTP(5)[8],=WP4OXA(5)[8],=WP4P(5)[8],=WP4PR(5)[8], - =WP4PUV(5)[8],=WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QER(5)[8],=WP4QGV(5)[8],=WP4QHU(5)[8],=WP4RRR(5)[8], - =WP4TD(5)[8],=WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8],=WP4VL(5)[8],=WP4VM(5)[8],=WP4YG(5)[8], - =WP4ZW(5)[8], + =KP4LUV(5)[8],=KP4LX(5)[8],=KP4MA(5)[8],=KP4MMG(5)[8],=KP4MPR(5)[8],=KP4MSP(5)[8],=KP4ND(5)[8], + =KP4NI(5)[8],=KP4OO(5)[8],=KP4PC(5)[8],=KP4PEC(5)[8],=KP4PF(5)[8],=KP4PM(5)[8],=KP4PMD(5)[8], + =KP4Q(5)[8],=KP4QT(5)[8],=KP4QT/4(5)[8],=KP4REY(5)[8],=KP4RGD(5)[8],=KP4RGT(5)[8],=KP4ROP(5)[8], + =KP4RRC(5)[8],=KP4RT(5)[8],=KP4RZ(5)[8],=KP4SU(5)[8],=KP4SWR(5)[8],=KP4TL(5)[8],=KP4TR(5)[8], + =KP4UFO(5)[8],=KP4USA(5)[8],=KP4VMR(5)[8],=KP4VO(5)[8],=KP4WK(5)[8],=KP4WW(5)[8],=KP4WY(5)[8], + =KP4XP(5)[8],=KP4Y(5)[8],=KP4YLV(5)[8],=KP4ZV(5)[8],=KP4ZX(5)[8],=NH2A(5)[8],=NH2BQ(5)[8], + =NH2DB(5)[8],=NH2F(5)[8],=NH2GY(5)[8],=NH2KW(5)[8],=NH2NG(5)[8],=NH6AU(5)[8],=NH6AX(5)[8], + =NH6BD/4(5)[8],=NH6E(5)[8],=NH6GE(5)[8],=NH6GR(5)[8],=NH6HX(5)[8],=NH6HX/4(5)[8],=NH6JX(5)[8], + =NH6KI(5)[8],=NH6QR(5)[8],=NH6SR(5)[8],=NH6SZ(5)[8],=NH6T(5)[8],=NH6TL(5)[8],=NH7AA(5)[8], + =NH7AQ(5)[8],=NH7AR(5)[8],=NH7FG(5)[8],=NH7FV(5)[8],=NH7OI(5)[8],=NH7P(5)[8],=NH7T/4(5)[8], + =NH7UN(5)[8],=NH7XN(5)[8],=NH7YL(5)[8],=NL7AJ(5)[8],=NL7AU(5)[8],=NL7AU/4(5)[8],=NL7BV(5)[8], + =NL7KL(5)[8],=NL7KX(5)[8],=NL7LO(5)[8],=NL7LR(5)[8],=NL7LY(5)[8],=NL7MD(5)[8],=NL7MR(5)[8], + =NL7OB(5)[8],=NL7OS(5)[8],=NL7P(5)[8],=NL7PV(5)[8],=NL7U(5)[8],=NL7UP(5)[8],=NL7VV(5)[8], + =NL7VX(5)[8],=NL7VX/4(5)[8],=NL7VX/M(5)[8],=NL7YZ(5)[8],=NP2B(5)[8],=NP2B/4(5)[8],=NP2BB(5)[8], + =NP2BW(5)[8],=NP2C/4(5)[8],=NP2CB(5)[8],=NP2D(5)[8],=NP2DB(5)[8],=NP2DJ(5)[8],=NP2EI(5)[8], + =NP2FJ(5)[8],=NP2FT(5)[8],=NP2GN(5)[8],=NP2GW(5)[8],=NP2HQ(5)[8],=NP2HS(5)[8],=NP2HW(5)[8], + =NP2IE(5)[8],=NP2IF(5)[8],=NP2IJ(5)[8],=NP2IS(5)[8],=NP2IW(5)[8],=NP2IX(5)[8],=NP2JA(5)[8], + =NP2JS(5)[8],=NP2JV(5)[8],=NP2L(5)[8],=NP2LC(5)[8],=NP2MM(5)[8],=NP2MN(5)[8],=NP2MP(5)[8], + =NP2MR(5)[8],=NP2MR/4(5)[8],=NP2O(5)[8],=NP2OL(5)[8],=NP2OO(5)[8],=NP2OR(5)[8],=NP2PA(5)[8], + =NP2R(5)[8],=NP2T(5)[8],=NP2W(5)[8],=NP3AX(5)[8],=NP3BL(5)[8],=NP3CC(5)[8],=NP3CI(5)[8], + =NP3CM(5)[8],=NP3CT(5)[8],=NP3FR(5)[8],=NP3G(5)[8],=NP3HD(5)[8],=NP3HG(5)[8],=NP3HN(5)[8], + =NP3HP(5)[8],=NP3HU(5)[8],=NP3IL(5)[8],=NP3IU(5)[8],=NP3K(5)[8],=NP3KM(5)[8],=NP3MM(5)[8], + =NP3MX(5)[8],=NP3NC(5)[8],=NP3OW(5)[8],=NP3QT(5)[8],=NP3R(5)[8],=NP3ST(5)[8],=NP3TM(5)[8], + =NP3UM(5)[8],=NP3VJ(5)[8],=NP4AS(5)[8],=NP4AV(5)[8],=NP4CC(5)[8],=NP4CK(5)[8],=NP4CV(5)[8], + =NP4DM(5)[8],=NP4EM(5)[8],=NP4GH(5)[8],=NP4J(5)[8],=NP4JL(5)[8],=NP4JU(5)[8],=NP4KV(5)[8], + =NP4M(5)[8],=NP4ND(5)[8],=NP4PF(5)[8],=NP4RJ(5)[8],=NP4SY(5)[8],=NP4TR(5)[8],=NP4WT(5)[8], + =NP4XB(5)[8],=WH2AAT(5)[8],=WH2ABJ(5)[8],=WH2G(5)[8],=WH6A(5)[8],=WH6ACF(5)[8],=WH6AJS(5)[8], + =WH6AQ(5)[8],=WH6AVU(5)[8],=WH6AX(5)[8],=WH6BRQ(5)[8],=WH6CEF(5)[8],=WH6CMT(5)[8],=WH6CNC(5)[8], + =WH6CTC(5)[8],=WH6CXA(5)[8],=WH6CXT(5)[8],=WH6DBX(5)[8],=WH6DMJ(5)[8],=WH6DNF(5)[8],=WH6DOL(5)[8], + =WH6DUJ(5)[8],=WH6DXT(5)[8],=WH6DZ(5)[8],=WH6ECQ(5)[8],=WH6EFI(5)[8],=WH6EFX(5)[8],=WH6EIK(5)[8], + =WH6EIR(5)[8],=WH6EKW(5)[8],=WH6ELG(5)[8],=WH6ELM(5)[8],=WH6ETE(5)[8],=WH6ETF(5)[8],=WH6FCP(5)[8], + =WH6FGK(5)[8],=WH6HA(5)[8],=WH6IF(5)[8],=WH6IZ(5)[8],=WH6J(5)[8],=WH6L(5)[8],=WH6LE(5)[8], + =WH6LE/4(5)[8],=WH6LE/M(5)[8],=WH6LE/P(5)[8],=WH6NE(5)[8],=WH6NU(5)[8],=WH6WX(5)[8],=WH6YH(5)[8], + =WH6YH/4(5)[8],=WH6YM(5)[8],=WH6ZF(5)[8],=WH7GD(5)[8],=WH7HX(5)[8],=WH7NI(5)[8],=WH7XK(5)[8], + =WH7XU(5)[8],=WH7YL(5)[8],=WH7YV(5)[8],=WH7ZM(5)[8],=WH9AAF(5)[8],=WL4X(5)[8],=WL7AUL(5)[8], + =WL7AX(5)[8],=WL7BAL(5)[8],=WL7CHA(5)[8],=WL7CIB(5)[8],=WL7CKJ(5)[8],=WL7COL(5)[8],=WL7CPA(5)[8], + =WL7CQT(5)[8],=WL7CUY(5)[8],=WL7E/4(5)[8],=WL7GV(5)[8],=WL7JE(5)[8],=WL7SR(5)[8],=WL7UN(5)[8], + =WL7YX(5)[8],=WP2AGD(5)[8],=WP2AGO(5)[8],=WP2AHC(5)[8],=WP2AIG(5)[8],=WP2AIL(5)[8],=WP2BB(5)[8], + =WP2C(5)[8],=WP2J(5)[8],=WP2L(5)[8],=WP2MA(5)[8],=WP2P(5)[8],=WP3AY(5)[8],=WP3BC(5)[8], + =WP3DW(5)[8],=WP3HL(5)[8],=WP3IM(5)[8],=WP3JE(5)[8],=WP3JQ(5)[8],=WP3JU(5)[8],=WP3K(5)[8], + =WP3LE(5)[8],=WP3MB(5)[8],=WP3ME(5)[8],=WP3NIS(5)[8],=WP3O(5)[8],=WP3PW(5)[8],=WP3QE(5)[8], + =WP3TQ(5)[8],=WP3ZA(5)[8],=WP4AIE(5)[8],=WP4AIL(5)[8],=WP4AIZ(5)[8],=WP4ALH(5)[8],=WP4AQK(5)[8], + =WP4AVW(5)[8],=WP4B(5)[8],=WP4BFP(5)[8],=WP4BGM(5)[8],=WP4BIN(5)[8],=WP4BJS(5)[8],=WP4BK(5)[8], + =WP4BOC(5)[8],=WP4BQV(5)[8],=WP4BXS(5)[8],=WP4BZG(5)[8],=WP4CKW(5)[8],=WP4CLS(5)[8],=WP4CMH(5)[8], + =WP4DC(5)[8],=WP4DCB(5)[8],=WP4DFK(5)[8],=WP4DMV(5)[8],=WP4DNE(5)[8],=WP4DPX(5)[8],=WP4ENX(5)[8], + =WP4EXH(5)[8],=WP4FEI(5)[8],=WP4FRK(5)[8],=WP4FS(5)[8],=WP4GAK(5)[8],=WP4GFH(5)[8],=WP4GX(5)[8], + =WP4GYA(5)[8],=WP4HFZ(5)[8],=WP4HNN(5)[8],=WP4HOX(5)[8],=WP4IF(5)[8],=WP4IJ(5)[8],=WP4IK(5)[8], + =WP4ILP(5)[8],=WP4INP(5)[8],=WP4JC(5)[8],=WP4JKO(5)[8],=WP4JNB(5)[8],=WP4JQJ(5)[8],=WP4JSR(5)[8], + =WP4JSV(5)[8],=WP4JT(5)[8],=WP4KCJ(5)[8],=WP4KDH(5)[8],=WP4KFP(5)[8],=WP4KGI(5)[8],=WP4KI(5)[8], + =WP4KJV(5)[8],=WP4KPK(5)[8],=WP4KSK(5)[8],=WP4KTD(5)[8],=WP4LBK(5)[8],=WP4LDG(5)[8],=WP4LDL(5)[8], + =WP4LDP(5)[8],=WP4LE(5)[8],=WP4LEO(5)[8],=WP4LHA(5)[8],=WP4LTA(5)[8],=WP4MAE(5)[8],=WP4MD(5)[8], + =WP4MO(5)[8],=WP4MQF(5)[8],=WP4MWE(5)[8],=WP4MWK(5)[8],=WP4MWS(5)[8],=WP4MXE(5)[8],=WP4MYG(5)[8], + =WP4MYK(5)[8],=WP4NAI(5)[8],=WP4NAQ(5)[8],=WP4NBF(5)[8],=WP4NBG(5)[8],=WP4NFU(5)[8],=WP4NKU(5)[8], + =WP4NLQ(5)[8],=WP4NVL(5)[8],=WP4NWV(5)[8],=WP4NWW(5)[8],=WP4O/4(5)[8],=WP4O/M(5)[8],=WP4OAT(5)[8], + =WP4OBD(5)[8],=WP4OBH(5)[8],=WP4ODR(5)[8],=WP4ODT(5)[8],=WP4OEO(5)[8],=WP4OFA(5)[8],=WP4OFL(5)[8], + =WP4OHJ(5)[8],=WP4OLM(5)[8],=WP4OMG(5)[8],=WP4OMV(5)[8],=WP4ONR(5)[8],=WP4OOI(5)[8],=WP4OPD(5)[8], + =WP4OPF(5)[8],=WP4OQH(5)[8],=WP4OTP(5)[8],=WP4OXA(5)[8],=WP4P(5)[8],=WP4PR(5)[8],=WP4PUV(5)[8], + =WP4PWV(5)[8],=WP4PXG(5)[8],=WP4QER(5)[8],=WP4QGV(5)[8],=WP4QHU(5)[8],=WP4RRR(5)[8],=WP4TD(5)[8], + =WP4TX(5)[8],=WP4UC(5)[8],=WP4UM(5)[8],=WP4VL(5)[8],=WP4VM(5)[8],=WP4YG(5)[8],=WP4ZW(5)[8], AA5(4)[7],AB5(4)[7],AC5(4)[7],AD5(4)[7],AE5(4)[7],AF5(4)[7],AG5(4)[7],AI5(4)[7],AJ5(4)[7], AK5(4)[7],K5(4)[7],KA5(4)[7],KB5(4)[7],KC5(4)[7],KD5(4)[7],KE5(4)[7],KF5(4)[7],KG5(4)[7], KI5(4)[7],KJ5(4)[7],KK5(4)[7],KM5(4)[7],KN5(4)[7],KO5(4)[7],KQ5(4)[7],KR5(4)[7],KS5(4)[7], @@ -1381,56 +1383,56 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: WE5(4)[7],WF5(4)[7],WG5(4)[7],WI5(4)[7],WJ5(4)[7],WK5(4)[7],WM5(4)[7],WN5(4)[7],WO5(4)[7], WQ5(4)[7],WR5(4)[7],WS5(4)[7],WT5(4)[7],WU5(4)[7],WV5(4)[7],WW5(4)[7],WX5(4)[7],WY5(4)[7], WZ5(4)[7],=AH2AQ(4)[7],=AH2AQ/5(4)[7],=AH2AZ(4)[7],=AH2DG(4)[7],=AH2DR(4)[7],=AH2EH(4)[7], - =AH2H(4)[7],=AH2T(4)[7],=AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6OU(4)[7], - =AH6RB(4)[7],=AH6TD(4)[7],=AH6TS(4)[7],=AH6UD(4)[7],=AH6VQ(4)[7],=AH7U(4)[7],=AH8O(4)[7], - =AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL5J(4)[7],=AL5P(4)[7],=AL7C(4)[7],=AL7CJ(4)[7], - =AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7],=AL7HU(4)[7],=AL7IH(4)[7], - =AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7],=AL7MQ(4)[7],=AL7PB(4)[7], - =AL7RD(4)[7],=AL7RI(4)[7],=AL7V(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7],=KH0DW(4)[7], - =KH2AI(4)[7],=KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2EV(4)[7],=KH2TB(4)[7],=KH2XD(4)[7], - =KH2XO(4)[7],=KH2YO(4)[7],=KH6ABA(4)[7],=KH6CA(4)[7],=KH6DAN(4)[7],=KH6GGC(4)[7],=KH6HPQ(4)[7], - =KH6IDF(4)[7],=KH6II(4)[7],=KH6IO(4)[7],=KH6ITY(4)[7],=KH6ITY/M(4)[7],=KH6JCV(4)[7],=KH6JIQ(4)[7], - =KH6JTE(4)[7],=KH6JTM(4)[7],=KH6JUM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LL(4)[7],=KH6LX(4)[7], - =KH6MB/5(4)[7],=KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6TG(4)[7],=KH6UW(4)[7],=KH7CF(4)[7],=KH7FB(4)[7], - =KH7IC(4)[7],=KH7JE(4)[7],=KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7],=KL0EX(4)[7], - =KL0HU(4)[7],=KL0IF(4)[7],=KL0PG(4)[7],=KL0WH(4)[7],=KL0XI(4)[7],=KL1DA(4)[7],=KL1DJ(4)[7], - =KL1DY(4)[7],=KL1MM(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7],=KL1WO(4)[7], - =KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7],=KL2HC(4)[7], - =KL2HN(4)[7],=KL2MI(4)[7],=KL2OY(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7],=KL2UO(4)[7], - =KL2UP(4)[7],=KL2VA(4)[7],=KL2ZJ(4)[7],=KL2ZK(4)[7],=KL3DB(4)[7],=KL3DP(4)[7],=KL3HK(4)[7], - =KL3HX(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7],=KL4JQ(4)[7], - =KL4LS(4)[7],=KL4RA(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7],=KL7AX(4)[7], - =KL7BCD(4)[7],=KL7BL(4)[7],=KL7BOB(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7],=KL7CD(4)[7], - =KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7],=KL7FB(4)[7], - =KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQQ(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7],=KL7IDM(4)[7], - =KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7],=KL7JIU(4)[7], - =KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7],=KL7ML(4)[7], - =KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7],=KL7TN/5(4)[7], - =KL7U(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7],=KP2AZ(4)[7], - =KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7],=KP4JG(4)[7], - =KP4JY(4)[7],=KP4YP(4)[7],=KP4YY(4)[7],=NH0V/5(4)[7],=NH2BV(4)[7],=NH2LP(4)[7],=NH6AZ(4)[7], - =NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6L(4)[7],=NH6MG(4)[7],=NH6TD(4)[7],=NH6VB(4)[7], - =NH6VJ(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7],=NH7PZ(4)[7],=NH7R(4)[7], - =NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NH7WB(4)[7],=NL5J(4)[7],=NL7AX(4)[7], - =NL7C(4)[7],=NL7CO(4)[7],=NL7CO/5(4)[7],=NL7DC(4)[7],=NL7HB(4)[7],=NL7IE(4)[7],=NL7JH(4)[7], - =NL7JI(4)[7],=NL7JV(4)[7],=NL7JZ(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7],=NL7LE(4)[7],=NL7NP(4)[7], - =NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7],=NL7RQ/5(4)[7],=NL7SI(4)[7],=NL7TO(4)[7],=NL7WY(4)[7], - =NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7],=NP3CV(4)[7],=NP3NT(4)[7], - =NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7],=NP4NQ(4)[7],=NP4NQ/5(4)[7], - =NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7],=WH6BYJ(4)[7],=WH6BYP(4)[7], - =WH6CCQ(4)[7],=WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DMP(4)[7],=WH6DZU(4)[7],=WH6ECJ(4)[7],=WH6EMW(4)[7], - =WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7],=WH6FGM(4)[7],=WH6FTZ(4)[7], - =WH6FZ/5(4)[7],=WH6FZL(4)[7],=WH6FZN(4)[7],=WH6GBC(4)[7],=WH6GEA(4)[7],=WH6GL(4)[7],=WH6KK(4)[7], - =WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7IN(4)[7],=WH7R(4)[7],=WH7YM(4)[7],=WH7YN(4)[7], - =WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7],=WL7BBV(4)[7],=WL7BKF(4)[7],=WL7BPY(4)[7], - =WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7],=WL7CTP(4)[7],=WL7CTQ(4)[7],=WL7D(4)[7], - =WL7FC(4)[7],=WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7],=WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7], - =WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7],=WL7WN(4)[7],=WL7XI(4)[7],=WL7XR(4)[7], - =WP2AHG(4)[7],=WP2N(4)[7],=WP2U(4)[7],=WP2WP(4)[7],=WP3AL(4)[7],=WP3HG(4)[7],=WP3JM(4)[7], - =WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7],=WP4BAT(4)[7],=WP4CJY(4)[7],=WP4EVA(4)[7], - =WP4EVL(4)[7],=WP4IXT(4)[7],=WP4IYJ(4)[7],=WP4KSP(4)[7],=WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7], - =WP4LQR(4)[7],=WP4MJP(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7],=WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQA(4)[7], - =WP4NQL(4)[7],=WP4OUE(4)[7],=WP4QLB(4)[7],=WP4RON(4)[7], + =AH2H(4)[7],=AH2T(4)[7],=AH6AF(4)[7],=AH6DZ(4)[7],=AH6FV(4)[7],=AH6HT(4)[7],=AH6IJ(4)[7], + =AH6OU(4)[7],=AH6RB(4)[7],=AH6TD(4)[7],=AH6TS(4)[7],=AH6UD(4)[7],=AH6VQ(4)[7],=AH7U(4)[7], + =AH8O(4)[7],=AH9B(4)[7],=AL1F(4)[7],=AL2K(4)[7],=AL2S(4)[7],=AL5J(4)[7],=AL5P(4)[7],=AL7C(4)[7], + =AL7CJ(4)[7],=AL7CQ(4)[7],=AL7DF(4)[7],=AL7DR(4)[7],=AL7GY(4)[7],=AL7HH(4)[7],=AL7HU(4)[7], + =AL7IH(4)[7],=AL7II/5(4)[7],=AL7IM(4)[7],=AL7J(4)[7],=AL7JP(4)[7],=AL7L/5(4)[7],=AL7MQ(4)[7], + =AL7PB(4)[7],=AL7RD(4)[7],=AL7RI(4)[7],=AL7V(4)[7],=KH0BZ(4)[7],=KH0CE(4)[7],=KH0CU(4)[7], + =KH0DW(4)[7],=KH2AI(4)[7],=KH2BH(4)[7],=KH2DF(4)[7],=KH2DF/5(4)[7],=KH2EV(4)[7],=KH2TB(4)[7], + =KH2XD(4)[7],=KH2XO(4)[7],=KH2YO(4)[7],=KH6ABA(4)[7],=KH6CA(4)[7],=KH6DAN(4)[7],=KH6GGC(4)[7], + =KH6HPQ(4)[7],=KH6IDF(4)[7],=KH6II(4)[7],=KH6IO(4)[7],=KH6ITY(4)[7],=KH6ITY/M(4)[7],=KH6JCV(4)[7], + =KH6JIQ(4)[7],=KH6JTE(4)[7],=KH6JTM(4)[7],=KH6JUM(4)[7],=KH6JVL(4)[7],=KH6KG/5(4)[7],=KH6LL(4)[7], + =KH6LX(4)[7],=KH6MB/5(4)[7],=KH6SP/5(4)[7],=KH6SZ(4)[7],=KH6TG(4)[7],=KH6UW(4)[7],=KH7CF(4)[7], + =KH7FB(4)[7],=KH7IC(4)[7],=KH7JE(4)[7],=KH7QL(4)[7],=KH7QO(4)[7],=KH8CG(4)[7],=KH9AE(4)[7], + =KL0EX(4)[7],=KL0HU(4)[7],=KL0IF(4)[7],=KL0PG(4)[7],=KL0WH(4)[7],=KL0XI(4)[7],=KL1DA(4)[7], + =KL1DJ(4)[7],=KL1DY(4)[7],=KL1MM(4)[7],=KL1RX(4)[7],=KL1TS(4)[7],=KL1UR(4)[7],=KL1WG(4)[7], + =KL1WO(4)[7],=KL1XK(4)[7],=KL1Y(4)[7],=KL1ZW(4)[7],=KL2AX(4)[7],=KL2AX/5(4)[7],=KL2CD(4)[7], + =KL2HC(4)[7],=KL2HN(4)[7],=KL2MI(4)[7],=KL2OY(4)[7],=KL2RA(4)[7],=KL2RB(4)[7],=KL2TV(4)[7], + =KL2UO(4)[7],=KL2UP(4)[7],=KL2VA(4)[7],=KL2ZJ(4)[7],=KL2ZK(4)[7],=KL3DB(4)[7],=KL3DP(4)[7], + =KL3HK(4)[7],=KL3HX(4)[7],=KL3HZ(4)[7],=KL3JL(4)[7],=KL3KH(4)[7],=KL3KI(4)[7],=KL3TB(4)[7], + =KL4JQ(4)[7],=KL4LS(4)[7],=KL4RA(4)[7],=KL5L(4)[7],=KL5Z(4)[7],=KL7AH(4)[7],=KL7AU(4)[7], + =KL7AX(4)[7],=KL7BCD(4)[7],=KL7BL(4)[7],=KL7BOB(4)[7],=KL7BX(4)[7],=KL7BZ/5(4)[7],=KL7BZL(4)[7], + =KL7CD(4)[7],=KL7DB(4)[7],=KL7EBE(4)[7],=KL7EMH(4)[7],=KL7EMH/M(4)[7],=KL7EQQ(4)[7],=KL7F(4)[7], + =KL7FB(4)[7],=KL7FHX(4)[7],=KL7FLY(4)[7],=KL7FQQ(4)[7],=KL7FQR(4)[7],=KL7GNW(4)[7],=KL7HH(4)[7], + =KL7IDM(4)[7],=KL7IK(4)[7],=KL7ITF(4)[7],=KL7IWU(4)[7],=KL7IZW(4)[7],=KL7JAR(4)[7],=KL7JEX(4)[7], + =KL7JIU(4)[7],=KL7JR/5(4)[7],=KL7JW(4)[7],=KL7LJ(4)[7],=KL7LY(4)[7],=KL7MA(4)[7],=KL7ME(4)[7], + =KL7ML(4)[7],=KL7NE(4)[7],=KL7NI(4)[7],=KL7OI(4)[7],=KL7PZ(4)[7],=KL7QC(4)[7],=KL7SG(4)[7], + =KL7TN/5(4)[7],=KL7U(4)[7],=KL7UHF(4)[7],=KL7USI/5(4)[7],=KL7XP(4)[7],=KL7XS(4)[7],=KL7YY/5(4)[7], + =KP2AZ(4)[7],=KP4CV(4)[7],=KP4DJT(4)[7],=KP4FF(4)[7],=KP4FFW(4)[7],=KP4GMC(4)[7],=KP4JE(4)[7], + =KP4JG(4)[7],=KP4JY(4)[7],=KP4YP(4)[7],=KP4YY(4)[7],=NH0V/5(4)[7],=NH2BV(4)[7],=NH2LP(4)[7], + =NH6AZ(4)[7],=NH6CJ(4)[7],=NH6EF(4)[7],=NH6FA(4)[7],=NH6L(4)[7],=NH6MG(4)[7],=NH6TD(4)[7], + =NH6VB(4)[7],=NH6VJ(4)[7],=NH6VR(4)[7],=NH6WL(4)[7],=NH6WL/5(4)[7],=NH7FO(4)[7],=NH7MV(4)[7], + =NH7PZ(4)[7],=NH7R(4)[7],=NH7RO(4)[7],=NH7RO/5(4)[7],=NH7TR(4)[7],=NH7VA(4)[7],=NH7WB(4)[7], + =NL5J(4)[7],=NL7AX(4)[7],=NL7C(4)[7],=NL7CO(4)[7],=NL7CO/5(4)[7],=NL7DC(4)[7],=NL7HB(4)[7], + =NL7IE(4)[7],=NL7JH(4)[7],=NL7JI(4)[7],=NL7JV(4)[7],=NL7JZ(4)[7],=NL7K/5(4)[7],=NL7KB(4)[7], + =NL7LE(4)[7],=NL7NP(4)[7],=NL7OM(4)[7],=NL7PD(4)[7],=NL7RQ(4)[7],=NL7RQ/5(4)[7],=NL7SI(4)[7], + =NL7TO(4)[7],=NL7WY(4)[7],=NL7ZL(4)[7],=NP2EE(4)[7],=NP2PR(4)[7],=NP2RA(4)[7],=NP3BA(4)[7], + =NP3CV(4)[7],=NP3NT(4)[7],=NP3PG(4)[7],=NP3RG(4)[7],=NP3SU(4)[7],=NP3TY(4)[7],=NP4EA(4)[7], + =NP4NQ(4)[7],=NP4NQ/5(4)[7],=NP4RW(4)[7],=NP4RZ(4)[7],=WH2ACT(4)[7],=WH2ACT/5(4)[7],=WH6ARN(4)[7], + =WH6BYJ(4)[7],=WH6BYP(4)[7],=WH6CCQ(4)[7],=WH6CDU(4)[7],=WH6CUL(4)[7],=WH6DMP(4)[7],=WH6DZU(4)[7], + =WH6ECJ(4)[7],=WH6EMW(4)[7],=WH6EOF(4)[7],=WH6ERS(4)[7],=WH6EUA(4)[7],=WH6EXQ(4)[7],=WH6FAD(4)[7], + =WH6FGM(4)[7],=WH6FTZ(4)[7],=WH6FZ/5(4)[7],=WH6FZL(4)[7],=WH6FZN(4)[7],=WH6GBC(4)[7], + =WH6GEA(4)[7],=WH6GL(4)[7],=WH6KK(4)[7],=WH6L/5(4)[7],=WH7DC(4)[7],=WH7DW(4)[7],=WH7IN(4)[7], + =WH7R(4)[7],=WH7YM(4)[7],=WH7YN(4)[7],=WL3WX(4)[7],=WL5H(4)[7],=WL7AIU(4)[7],=WL7AWC(4)[7], + =WL7BBV(4)[7],=WL7BKF(4)[7],=WL7BPY(4)[7],=WL7CA(4)[7],=WL7CJA(4)[7],=WL7CJC(4)[7],=WL7CQE(4)[7], + =WL7CTP(4)[7],=WL7CTQ(4)[7],=WL7D(4)[7],=WL7FC(4)[7],=WL7FE(4)[7],=WL7FT(4)[7],=WL7FT/5(4)[7], + =WL7K/5(4)[7],=WL7ME(4)[7],=WL7MQ/5(4)[7],=WL7OP(4)[7],=WL7OU(4)[7],=WL7SG(4)[7],=WL7W(4)[7], + =WL7WN(4)[7],=WL7XI(4)[7],=WL7XR(4)[7],=WP2AHG(4)[7],=WP2N(4)[7],=WP2U(4)[7],=WP2WP(4)[7], + =WP3AL(4)[7],=WP3HG(4)[7],=WP3JM(4)[7],=WP4A(4)[7],=WP4ADA(4)[7],=WP4APJ(4)[7],=WP4BAB(4)[7], + =WP4BAT(4)[7],=WP4CJY(4)[7],=WP4EVA(4)[7],=WP4EVL(4)[7],=WP4IXT(4)[7],=WP4IYJ(4)[7],=WP4KSP(4)[7], + =WP4KTF(4)[7],=WP4KUW(4)[7],=WP4LKA(4)[7],=WP4LQR(4)[7],=WP4MJP(4)[7],=WP4MYI(4)[7],=WP4MZR(4)[7], + =WP4NAK(4)[7],=WP4NEP(4)[7],=WP4NQA(4)[7],=WP4NQL(4)[7],=WP4OUE(4)[7],=WP4QLB(4)[7],=WP4RON(4)[7], AA6(3)[6],AB6(3)[6],AC6(3)[6],AD6(3)[6],AE6(3)[6],AF6(3)[6],AG6(3)[6],AI6(3)[6],AJ6(3)[6], AK6(3)[6],K6(3)[6],KA6(3)[6],KB6(3)[6],KC6(3)[6],KD6(3)[6],KE6(3)[6],KF6(3)[6],KG6(3)[6], KI6(3)[6],KJ6(3)[6],KK6(3)[6],KM6(3)[6],KN6(3)[6],KO6(3)[6],KQ6(3)[6],KR6(3)[6],KS6(3)[6], @@ -1457,45 +1459,45 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KH6GJV/6(3)[6],=KH6GK(3)[6],=KH6GKR(3)[6],=KH6HH(3)[6],=KH6HJE(3)[6],=KH6HOU(3)[6],=KH6IKH(3)[6], =KH6IKL(3)[6],=KH6IP(3)[6],=KH6IPJ(3)[6],=KH6JCT(3)[6],=KH6JGD(3)[6],=KH6JJN(3)[6], =KH6JJN/P(3)[6],=KH6JN(3)[6],=KH6JNK(3)[6],=KH6JR(3)[6],=KH6JRB(3)[6],=KH6JRC(3)[6],=KH6JS(3)[6], - =KH6JVS(3)[6],=KH6JWG(3)[6],=KH6JWJ(3)[6],=KH6JWJ/6(3)[6],=KH6KT(3)[6],=KH6LO(3)[6],=KH6MV(3)[6], - =KH6N(3)[6],=KH6NG(3)[6],=KH6O(3)[6],=KH6OK(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6],=KH6PW(3)[6], - =KH6TO(3)[6],=KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6],=KH6WL(3)[6], - =KH6WZ(3)[6],=KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6],=KH7IZ(3)[6], - =KH7JI(3)[6],=KH7JR(3)[6],=KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6],=KH7TJ(3)[6], - =KH7TJ/6(3)[6],=KH7TR(3)[6],=KH7TW(3)[6],=KH7VD(3)[6],=KH7VE(3)[6],=KH7WN(3)[6],=KH7WO(3)[6], - =KH7WP(3)[6],=KH7WR(3)[6],=KH7WS(3)[6],=KH7XX/6(3)[6],=KH7Y(3)[6],=KH7Y/6(3)[6],=KH8A(3)[6], - =KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6],=KL0AF(3)[6],=KL0AL(3)[6],=KL0HZ(3)[6],=KL0ZA(3)[6], - =KL1NER(3)[6],=KL1PU(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL2WL(3)[6],=KL3IM(3)[6],=KL3JY/6(3)[6], - =KL3YH(3)[6],=KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6],=KL7AK(3)[6], - =KL7CE/6(3)[6],=KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6],=KL7EAE(3)[6], - =KL7EAL(3)[6],=KL7GKW(3)[6],=KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6],=KL7ID(3)[6], - =KL7IDY/6(3)[6],=KL7ISB(3)[6],=KL7ISN(3)[6],=KL7JBE(3)[6],=KL7JG(3)[6],=KL7KNP(3)[6],=KL7KX(3)[6], - =KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6],=KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6],=KL7VU(3)[6], - =KL7VU/6(3)[6],=KP2BK(3)[6],=KP3BN(3)[6],=KP3YL(3)[6],=KP4AVU(3)[6],=KP4BR(3)[6],=KP4DSO(3)[6], - =KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6],=KP4FBT(3)[6],=KP4MD(3)[6],=KP4UB(3)[6],=KP4ZW(3)[6], - =NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6],=NH2CM(3)[6],=NH2FT(3)[6],=NH2FX(3)[6], - =NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6],=NH6AE(3)[6],=NH6AF(3)[6],=NH6FV(3)[6],=NH6FX(3)[6], - =NH6G(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6SF(3)[6],=NH6ST(3)[6],=NH6WR(3)[6],=NH7AG(3)[6], - =NH7EM(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6],=NH7QV(3)[6], - =NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WC(3)[6],=NH7WE(3)[6],=NH7WG(3)[6],=NH7ZE(3)[6], - =NL7GE(3)[6],=NL7IB(3)[6],=NL7LC(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7TP(3)[6],=NL7VL(3)[6], - =NL7YB(3)[6],=NP2KY(3)[6],=NP4AB(3)[6],=NP4AI/6(3)[6],=NP4IW(3)[6],=NP4IW/6(3)[6],=NP4MV(3)[6], - =NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6],=WH2ALN(3)[6],=WH2K(3)[6],=WH6AAJ(3)[6], - =WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6],=WH6CIL(3)[6],=WH6CK(3)[6],=WH6CO(3)[6], - =WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6],=WH6CUF(3)[6],=WH6CUU(3)[6],=WH6CUX(3)[6], - =WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6],=WH6DHN(3)[6],=WH6DPA(3)[6],=WH6DSK(3)[6], - =WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6],=WH6DZY(3)[6],=WH6EEZ(3)[6], - =WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6],=WH6EZW(3)[6],=WH6FTF(3)[6],=WH6FTO(3)[6], - =WH6JO(3)[6],=WH6LZ(3)[6],=WH6MC(3)[6],=WH6MK(3)[6],=WH6OI(3)[6],=WH6PX(3)[6],=WH6QA(3)[6], - =WH6RF(3)[6],=WH6TD(3)[6],=WH6TK(3)[6],=WH6TT(3)[6],=WH6USA(3)[6],=WH6VM(3)[6],=WH6VN(3)[6], - =WH6XI(3)[6],=WH6XX(3)[6],=WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6],=WH7HQ(3)[6],=WH7IV(3)[6], - =WH7IZ(3)[6],=WH7L(3)[6],=WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6],=WH7PV(3)[6],=WH7QC(3)[6], - =WH7RU(3)[6],=WH7TT(3)[6],=WH7TY(3)[6],=WH7UZ(3)[6],=WH7VM(3)[6],=WH7VU(3)[6],=WH7XR(3)[6], - =WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6],=WL7BA(3)[6],=WL7BGF(3)[6],=WL7CPL(3)[6], - =WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6],=WL7RA(3)[6],=WL7SE(3)[6],=WL7TG(3)[6], - =WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2Q(3)[6],=WP3OV(3)[6],=WP4CUJ(3)[6],=WP4CW(3)[6], - =WP4HNF(3)[6],=WP4IER(3)[6],=WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6],=WP4OBC(3)[6],=WP4PWS(3)[6], - =WP4QQA(3)[6], + =KH6JVS(3)[6],=KH6JWG(3)[6],=KH6JWJ(3)[6],=KH6JWJ/6(3)[6],=KH6KN(3)[6],=KH6KT(3)[6],=KH6LO(3)[6], + =KH6MV(3)[6],=KH6N(3)[6],=KH6NG(3)[6],=KH6O(3)[6],=KH6OK(3)[6],=KH6PGA/6(3)[6],=KH6PM(3)[6], + =KH6PW(3)[6],=KH6TO(3)[6],=KH6UQ(3)[6],=KH6USA(3)[6],=KH6VC(3)[6],=KH6VC/6(3)[6],=KH6VZ(3)[6], + =KH6WL(3)[6],=KH6WZ(3)[6],=KH7CD/6(3)[6],=KH7CO(3)[6],=KH7CS(3)[6],=KH7EM(3)[6],=KH7I(3)[6], + =KH7IZ(3)[6],=KH7JI(3)[6],=KH7JR(3)[6],=KH7NS(3)[6],=KH7QS(3)[6],=KH7QU(3)[6],=KH7RB(3)[6], + =KH7TJ(3)[6],=KH7TJ/6(3)[6],=KH7TR(3)[6],=KH7TW(3)[6],=KH7VD(3)[6],=KH7VE(3)[6],=KH7WN(3)[6], + =KH7WO(3)[6],=KH7WP(3)[6],=KH7WR(3)[6],=KH7WS(3)[6],=KH7XX/6(3)[6],=KH7Y(3)[6],=KH7Y/6(3)[6], + =KH8A(3)[6],=KH8AF(3)[6],=KH8FL(3)[6],=KL0AA(3)[6],=KL0AF(3)[6],=KL0AL(3)[6],=KL0HZ(3)[6], + =KL0ZA(3)[6],=KL1NER(3)[6],=KL1PU(3)[6],=KL1WE/6(3)[6],=KL2CQ(3)[6],=KL2WL(3)[6],=KL3IM(3)[6], + =KL3JY/6(3)[6],=KL3YH(3)[6],=KL4GW(3)[6],=KL4LV(3)[6],=KL4NZ(3)[6],=KL4QW(3)[6],=KL4UZ(3)[6], + =KL7AK(3)[6],=KL7CE/6(3)[6],=KL7CM(3)[6],=KL7CN(3)[6],=KL7CW/6(3)[6],=KL7CX(3)[6],=KL7DJ(3)[6], + =KL7EAE(3)[6],=KL7EAL(3)[6],=KL7GKW(3)[6],=KL7HQR(3)[6],=KL7HQR/6(3)[6],=KL7HSY(3)[6], + =KL7ID(3)[6],=KL7IDY/6(3)[6],=KL7ISB(3)[6],=KL7ISN(3)[6],=KL7JBE(3)[6],=KL7JG(3)[6],=KL7KNP(3)[6], + =KL7KX(3)[6],=KL7MF(3)[6],=KL7MF/6(3)[6],=KL7MF/M(3)[6],=KL7RT(3)[6],=KL7SL(3)[6],=KL7SY(3)[6], + =KL7VU(3)[6],=KL7VU/6(3)[6],=KP2BK(3)[6],=KP3BN(3)[6],=KP3YL(3)[6],=KP4AVU(3)[6],=KP4BR(3)[6], + =KP4DSO(3)[6],=KP4DX/6(3)[6],=KP4ENM(3)[6],=KP4ERR(3)[6],=KP4FBT(3)[6],=KP4MD(3)[6],=KP4UB(3)[6], + =KP4ZW(3)[6],=NH0C(3)[6],=NH0X(3)[6],=NH2AR(3)[6],=NH2BD(3)[6],=NH2CM(3)[6],=NH2FT(3)[6], + =NH2FX(3)[6],=NH2R(3)[6],=NH2S(3)[6],=NH6AC(3)[6],=NH6AE(3)[6],=NH6AF(3)[6],=NH6FV(3)[6], + =NH6FX(3)[6],=NH6G(3)[6],=NH6NG(3)[6],=NH6RG(3)[6],=NH6SF(3)[6],=NH6ST(3)[6],=NH6WR(3)[6], + =NH7AG(3)[6],=NH7EM(3)[6],=NH7FW(3)[6],=NH7G(3)[6],=NH7IG(3)[6],=NH7IH(3)[6],=NH7PM(3)[6], + =NH7QV(3)[6],=NH7RT(3)[6],=NH7ST(3)[6],=NH7SU(3)[6],=NH7WC(3)[6],=NH7WE(3)[6],=NH7WG(3)[6], + =NH7ZE(3)[6],=NL7GE(3)[6],=NL7IB(3)[6],=NL7LC(3)[6],=NL7OP(3)[6],=NL7RO(3)[6],=NL7TP(3)[6], + =NL7VL(3)[6],=NL7YB(3)[6],=NP2KY(3)[6],=NP4AB(3)[6],=NP4AI/6(3)[6],=NP4IW(3)[6],=NP4IW/6(3)[6], + =NP4MV(3)[6],=NP4XE(3)[6],=WH0AAZ(3)[6],=WH0M(3)[6],=WH2ABS(3)[6],=WH2ALN(3)[6],=WH2K(3)[6], + =WH6AAJ(3)[6],=WH6AFM(3)[6],=WH6ANA(3)[6],=WH6ASW/M(3)[6],=WH6BYT(3)[6],=WH6CIL(3)[6], + =WH6CK(3)[6],=WH6CO(3)[6],=WH6CPO(3)[6],=WH6CPT(3)[6],=WH6CRE(3)[6],=WH6CSG(3)[6],=WH6CUF(3)[6], + =WH6CUU(3)[6],=WH6CUX(3)[6],=WH6CVJ(3)[6],=WH6CWS(3)[6],=WH6CZF(3)[6],=WH6CZH(3)[6],=WH6DHN(3)[6], + =WH6DPA(3)[6],=WH6DSK(3)[6],=WH6DVM(3)[6],=WH6DVN(3)[6],=WH6DVX(3)[6],=WH6DYA(3)[6],=WH6DZV(3)[6], + =WH6DZY(3)[6],=WH6EEZ(3)[6],=WH6EHY(3)[6],=WH6EKB(3)[6],=WH6ENG(3)[6],=WH6EUH(3)[6],=WH6EZW(3)[6], + =WH6FTF(3)[6],=WH6FTO(3)[6],=WH6JO(3)[6],=WH6LZ(3)[6],=WH6MC(3)[6],=WH6MK(3)[6],=WH6OI(3)[6], + =WH6PX(3)[6],=WH6QA(3)[6],=WH6RF(3)[6],=WH6TD(3)[6],=WH6TK(3)[6],=WH6TT(3)[6],=WH6USA(3)[6], + =WH6VM(3)[6],=WH6VN(3)[6],=WH6XI(3)[6],=WH6XX(3)[6],=WH6YJ(3)[6],=WH7DG(3)[6],=WH7DH(3)[6], + =WH7HQ(3)[6],=WH7IV(3)[6],=WH7IZ(3)[6],=WH7L(3)[6],=WH7LP(3)[6],=WH7OO(3)[6],=WH7PM(3)[6], + =WH7PV(3)[6],=WH7QC(3)[6],=WH7RU(3)[6],=WH7TT(3)[6],=WH7TY(3)[6],=WH7UZ(3)[6],=WH7VM(3)[6], + =WH7VU(3)[6],=WH7XR(3)[6],=WL3AF(3)[6],=WL3DZ(3)[6],=WL4JC(3)[6],=WL7ACO(3)[6],=WL7BA(3)[6], + =WL7BGF(3)[6],=WL7CPL(3)[6],=WL7CSD(3)[6],=WL7DN/6(3)[6],=WL7EA(3)[6],=WL7EKK(3)[6],=WL7RA(3)[6], + =WL7SE(3)[6],=WL7TG(3)[6],=WL7WL(3)[6],=WL7YQ(3)[6],=WL7YQ/6(3)[6],=WP2Q(3)[6],=WP3OV(3)[6], + =WP4CUJ(3)[6],=WP4CW(3)[6],=WP4HNF(3)[6],=WP4IER(3)[6],=WP4KSU(3)[6],=WP4MVE(3)[6],=WP4OBB(3)[6], + =WP4OBC(3)[6],=WP4PWS(3)[6],=WP4QQA(3)[6], AA7(3)[6],AB7(3)[6],AC7(3)[6],AD7(3)[6],AE7(3)[6],AF7(3)[6],AG7(3)[6],AI7(3)[6],AJ7(3)[6], AK7(3)[6],K7(3)[6],KA7(3)[6],KB7(3)[6],KC7(3)[6],KD7(3)[6],KE7(3)[6],KF7(3)[6],KG7(3)[6], KI7(3)[6],KJ7(3)[6],KK7(3)[6],KM7(3)[6],KN7(3)[6],KO7(3)[6],KQ7(3)[6],KR7(3)[6],KS7(3)[6], @@ -1512,21 +1514,21 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =AH6OD(3)[6],=AH6PJ(3)[6],=AH6PW(3)[6],=AH6QW(3)[6],=AH6RI/7(3)[6],=AH6SV(3)[6],=AH6VM(3)[6], =AH6Y(3)[6],=AH7MP(3)[6],=AH7Q(3)[6],=AH8AC(3)[6],=AH8DX(3)[6],=AH8K(3)[6],=AH9A(3)[6], =AH9AC(3)[6],=AL0AA(3)[6],=AL0FT(3)[6],=AL0H(3)[6],=AL0X(3)[6],=AL1N(3)[6],=AL1P(3)[6], - =AL1VE(3)[6],=AL2B(3)[6],=AL2I(3)[6],=AL2N(3)[6],=AL3L(3)[6],=AL4F(3)[6],=AL4Q/7(3)[6], - =AL4R(3)[6],=AL5B(3)[6],=AL5W(3)[6],=AL6U(3)[6],=AL7AA(3)[6],=AL7AN(3)[6],=AL7AW(3)[6], - =AL7BN(3)[6],=AL7BQ(3)[6],=AL7CC(3)[6],=AL7CG(3)[6],=AL7CM(3)[6],=AL7CM/7(3)[6],=AL7CR(3)[6], - =AL7CS(3)[6],=AL7D(3)[6],=AL7D/7(3)[6],=AL7D/P(3)[6],=AL7D/R(3)[6],=AL7DD(3)[6],=AL7DU(3)[6], - =AL7EI(3)[6],=AL7EJ(3)[6],=AL7FA(3)[6],=AL7FB(3)[6],=AL7FZ(3)[6],=AL7GN(3)[6],=AL7HD(3)[6], - =AL7HI(3)[6],=AL7HJ(3)[6],=AL7HS(3)[6],=AL7HY(3)[6],=AL7IG(3)[6],=AL7IT(3)[6],=AL7JF(3)[6], - =AL7JJ(3)[6],=AL7JS(3)[6],=AL7JU(3)[6],=AL7JV(3)[6],=AL7JW(3)[6],=AL7JY(3)[6],=AL7KE(3)[6], - =AL7KF(3)[6],=AL7KG(3)[6],=AL7KK(3)[6],=AL7KL(3)[6],=AL7KV(3)[6],=AL7L/7(3)[6],=AL7LI(3)[6], - =AL7LL(3)[6],=AL7MH(3)[6],=AL7ND(3)[6],=AL7NK(3)[6],=AL7NZ(3)[6],=AL7OK(3)[6],=AL7OW(3)[6], - =AL7PR(3)[6],=AL7PV(3)[6],=AL7QL(3)[6],=AL7QZ(3)[6],=AL7R(3)[6],=AL7R/7(3)[6],=AL7RF(3)[6], - =AL7RF/7(3)[6],=AL7RM(3)[6],=AL7RR(3)[6],=AL7W(3)[6],=AL8F(3)[6],=G4KHG/M(3)[6],=KH0AS(3)[6], - =KH0H(3)[6],=KH0K(3)[6],=KH0SH(3)[6],=KH0TL(3)[6],=KH0X(3)[6],=KH2CH(3)[6],=KH2DX(3)[6], - =KH2G(3)[6],=KH2GG(3)[6],=KH2JA(3)[6],=KH2QH(3)[6],=KH2RK(3)[6],=KH2SK(3)[6],=KH2SR(3)[6], - =KH2TJ/7(3)[6],=KH2TJ/P(3)[6],=KH2XP(3)[6],=KH2YL(3)[6],=KH3AD(3)[6],=KH6AB(3)[6],=KH6AHQ(3)[6], - =KH6BXZ(3)[6],=KH6CN(3)[6],=KH6CN/7(3)[6],=KH6COY(3)[6],=KH6CQG(3)[6],=KH6CQH(3)[6], + =AL1VE(3)[6],=AL2B(3)[6],=AL2GR(3)[6],=AL2I(3)[6],=AL2N(3)[6],=AL3L(3)[6],=AL4F(3)[6], + =AL4Q/7(3)[6],=AL4R(3)[6],=AL5B(3)[6],=AL5W(3)[6],=AL6U(3)[6],=AL7AA(3)[6],=AL7AN(3)[6], + =AL7AW(3)[6],=AL7BN(3)[6],=AL7BQ(3)[6],=AL7CC(3)[6],=AL7CG(3)[6],=AL7CM(3)[6],=AL7CM/7(3)[6], + =AL7CR(3)[6],=AL7CS(3)[6],=AL7D(3)[6],=AL7D/7(3)[6],=AL7D/P(3)[6],=AL7D/R(3)[6],=AL7DD(3)[6], + =AL7DU(3)[6],=AL7EI(3)[6],=AL7EJ(3)[6],=AL7FA(3)[6],=AL7FB(3)[6],=AL7FZ(3)[6],=AL7GN(3)[6], + =AL7HD(3)[6],=AL7HI(3)[6],=AL7HJ(3)[6],=AL7HS(3)[6],=AL7HY(3)[6],=AL7IG(3)[6],=AL7IT(3)[6], + =AL7JF(3)[6],=AL7JJ(3)[6],=AL7JS(3)[6],=AL7JU(3)[6],=AL7JV(3)[6],=AL7JW(3)[6],=AL7JY(3)[6], + =AL7KE(3)[6],=AL7KF(3)[6],=AL7KG(3)[6],=AL7KK(3)[6],=AL7KL(3)[6],=AL7KV(3)[6],=AL7L/7(3)[6], + =AL7LI(3)[6],=AL7LL(3)[6],=AL7MH(3)[6],=AL7ND(3)[6],=AL7NK(3)[6],=AL7NZ(3)[6],=AL7OK(3)[6], + =AL7OW(3)[6],=AL7PR(3)[6],=AL7PV(3)[6],=AL7QL(3)[6],=AL7QZ(3)[6],=AL7R(3)[6],=AL7R/7(3)[6], + =AL7RF(3)[6],=AL7RF/7(3)[6],=AL7RM(3)[6],=AL7RR(3)[6],=AL7W(3)[6],=AL8F(3)[6],=G4KHG/M(3)[6], + =KH0AS(3)[6],=KH0H(3)[6],=KH0K(3)[6],=KH0SH(3)[6],=KH0TL(3)[6],=KH0X(3)[6],=KH2CH(3)[6], + =KH2DX(3)[6],=KH2G(3)[6],=KH2GG(3)[6],=KH2JA(3)[6],=KH2QH(3)[6],=KH2RK(3)[6],=KH2SK(3)[6], + =KH2SR(3)[6],=KH2TJ/7(3)[6],=KH2TJ/P(3)[6],=KH2XP(3)[6],=KH2YL(3)[6],=KH3AD(3)[6],=KH6AB(3)[6], + =KH6AHQ(3)[6],=KH6BXZ(3)[6],=KH6CN(3)[6],=KH6CN/7(3)[6],=KH6COY(3)[6],=KH6CQG(3)[6],=KH6CQH(3)[6], =KH6CQH/7(3)[6],=KH6CTQ(3)[6],=KH6DB(3)[6],=KH6DE(3)[6],=KH6DOT(3)[6],=KH6DUT(3)[6],=KH6EE(3)[6], =KH6EE/7(3)[6],=KH6FE(3)[6],=KH6FKA/7(3)[6],=KH6FU(3)[6],=KH6GB(3)[6],=KH6GDN(3)[6],=KH6GN(3)[6], =KH6HP(3)[6],=KH6HU(3)[6],=KH6HWK(3)[6],=KH6IA(3)[6],=KH6ICQ(3)[6],=KH6IKC(3)[6],=KH6IMN(3)[6], @@ -1665,8 +1667,8 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =NL7YI(4)[8],=NP2AV(4)[8],=NP2DK(4)[8],=NP2GM(4)[8],=NP2L/9(4)[8],=NP2MU(4)[8],=NP3QC(4)[8], =NP4ZI(4)[8],=WH0AI(4)[8],=WH2T(4)[8],=WH6ERQ(4)[8],=WH6FBA(4)[8],=WH6FIR(4)[8],=WH6SB(4)[8], =WL7AHP(4)[8],=WL7AIT(4)[8],=WL7BEV(4)[8],=WL7CTA(4)[8],=WL7FJ(4)[8],=WL7JAN(4)[8],=WL7NP(4)[8], - =WL7UU(4)[8],=WL9N(4)[8],=WP4JSP(4)[8],=WP4LKY(4)[8],=WP4LSQ(4)[8],=WP4MQX(4)[8],=WP4MSD(4)[8], - =WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MXP(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], + =WL7UU(4)[8],=WL9N(4)[8],=WP2B(4)[8],=WP4JSP(4)[8],=WP4LKY(4)[8],=WP4LSQ(4)[8],=WP4MQX(4)[8], + =WP4MSD(4)[8],=WP4MTN(4)[8],=WP4MVQ(4)[8],=WP4MXP(4)[8],=WP4MYL(4)[8],=WP4OCZ(4)[8], =AH2BG(4)[8],=AH2CF(4)[8],=AH6ES(4)[8],=AH6FF(4)[8],=AH6HR(4)[8],=AH6HR/4(4)[8],=AH6KB(4)[8], =AL0F(4)[8],=AL0P(4)[8],=AL2C(4)[8],=AL2F/4(4)[8],=AL4B(4)[8],=AL7CX(4)[8],=AL7EU(4)[8], =AL7JN(4)[8],=AL7KN(4)[8],=AL7LP(4)[8],=AL7MR(4)[8],=AL7QO(4)[8],=KH0UN(4)[8],=KH2AR(4)[8], @@ -1688,8 +1690,8 @@ United States: 05: 08: NA: 37.53: 91.67: 5.0: K: =KL0TF(4)[7],=KL1HE(4)[7],=KL1MW(4)[7],=KL1TV(4)[7],=KL2NZ(4)[7],=KL4CZ(4)[7],=KL7AR(4)[7], =KL7HF(4)[7],=KL7HSG(4)[7],=KL7JGS(4)[7],=KL7JGS/M(4)[7],=KL7JM(4)[7],=KL7JUL(4)[7],=KL7LH(4)[7], =KL7MVX(4)[7],=KL7YY/7(4)[7],=KL9A(4)[7],=KL9A/7(4)[7],=NH6HW(4)[7],=NL7IH(4)[7],=NL7MW(4)[7], - =NL7UI(4)[7],=WH2M(4)[7],=WH6COM(4)[7],=WH6ETU(4)[7],=WH6EVP(4)[7],=WH6GFE(4)[7],=WL7A(4)[7], - =WL7DP(4)[7],=WL7HP/7(4)[7],=WL7I(4)[7], + =NL7UI(4)[7],=WH2M(4)[7],=WH6COM(4)[7],=WH6ETU(4)[7],=WH6EVP(4)[7],=WH6FWD(4)[7],=WH6GFE(4)[7], + =WL7A(4)[7],=WL7DP(4)[7],=WL7HP/7(4)[7],=WL7I(4)[7], =AL7LU(5)[8],=KL7JFR(5)[8]; Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4: KG4,=KG44WW,=KG4AC,=KG4AS,=KG4AW,=KG4AY,=KG4BP,=KG4DY,=KG4EM,=KG4EU,=KG4HF,=KG4HH,=KG4LA,=KG4LB, @@ -1740,31 +1742,31 @@ Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6: =KE7IZS,=KE7JTX,=KE7KRQ,=KE7LWN,=KE7MW,=KE7PEQ,=KE7PIZ,=KE7QML,=KE7RCT,=KE7UAJ,=KE7UV,=KE7UW, =KF4DWA,=KF4FQR,=KF4IBW,=KF4JLZ,=KF4OOB,=KF4SGA,=KF4UJC,=KF4URD,=KF4VHS,=KF5AHW,=KF5JFX,=KF5MXM, =KF5MXP,=KF6BS,=KF6FDG,=KF6IVV,=KF6LWN,=KF6LYU,=KF6MQT,=KF6OHL,=KF6OSA,=KF6PJ,=KF6PQE,=KF6QZD, - =KF6RLP,=KF6YZR,=KF6ZAL,=KF6ZVS,=KF7GNP,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4CAN,=KG4FJB, - =KG4HZF,=KG4JKJ,=KG4SGC,=KG4SGV,=KG4TZD,=KG5CH,=KG5CNO,=KG5IVP,=KG6CJA,=KG6CJK,=KG6DV,=KG6EZW, - =KG6HRX,=KG6IER,=KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI,=KG6SC,=KG6SDD, - =KG6TFI,=KG6WZD,=KG6ZRY,=KG7AYU,=KG7CJI,=KG7EUP,=KG7JHH,=KG7TSD,=KG7ZJM,=KG9MDR,=KH0AI,=KH0HL, - =KH0WJ,=KH2DC,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE,=KH3AE/M,=KH3AF,=KH8Z,=KI4CAU,=KI4HCZ,=KI4NOH, - =KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC,=KI6LPT,=KI6NOC,=KI6QDQ,=KI6QQJ, - =KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7AUZ,=KI7EZG,=KI7FJW,=KI7FJX,=KI7FUT,=KI7OS,=KI7QZQ,=KJ4BHO, - =KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6CKZ,=KJ6COM,=KJ6CPN,=KJ6CQT,=KJ6FDF,=KJ6GYD,=KJ6LAW,=KJ6LAX,=KJ6LBI, - =KJ6MQL,=KJ6NIA,=KJ6NIB,=KJ6NZH,=KJ6PEH,=KJ6QQT,=KJ6RGW,=KJ6TJZ,=KK4EEC,=KK4RNF,=KK6BRW,=KK6DIT, - =KK6DWS,=KK6EJ,=KK6GM,=KK6OMX,=KK6PGA,=KK6RM,=KK6VJN,=KK6ZQ,=KK6ZZE,=KK7WR,=KL0TK,=KL1TP,=KL3FN, - =KL3JC,=KL7PN,=KL7TN/P,=KL7UB,=KL7XT,=KM4FPS,=KM4IP,=KM6IK,=KM6RM,=KM6RWE,=KM6UVP,=KN6BE,=KN6ZU, - =KN8AQR,=KO4BNK,=KO6KW,=KO6QT,=KQ6CD,=KQ6M,=KR1LLR,=KU4OY,=KW4JC,=KX6RTG,=KY1I,=N0CAN,=N0KXY, - =N0PJV,=N0RMC,=N0VYO,=N0ZSJ,=N1CBF,=N1CFD,=N1CNQ,=N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH,=N2KJU, - =N2KLQ,=N3BQY,=N3DJT,=N3FUR,=N3GWR,=N3HQW,=N3RWD,=N3VDM,=N3ZFY,=N4BER,=N4ERA,=N4ZIW,=N5IWF,=N5JKJ, - =N6CGA,=N6DXW,=N6EQZ,=N6GOZ,=N6IKX,=N6KB,=N6NCT,=N6OM,=N6PJQ,=N6QBK,=N6XLB,=N6ZAB,=N7AMY,=N7BLC, - =N7BMD,=N7JRO,=N7KZB,=N7NYY,=N7OBR,=N7ODC,=N7TSV,=N7WBX,=N9GFL,=N9SBL,=NB6R,=ND1A,=NE7SO,=NH2CC, - =NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2HR,=NH2HU,=NH2IB,=NH2IC,=NH2IF,=NH2II,=NH2IJ,=NH2IO,=NH2JO,=NH2KF, - =NH2KH,=NH2YL,=NH2Z,=NI1J,=NL7UW,=NO0H,=NR0G,=NT0DA,=NT4AA,=NZ2F,=W0OHO,=W0UNX,=W1BMB,=W1ETT, - =W1JJS,=W2UNS,=W3ZRT,=W4AJM,=W4PRO,=W4YQS,=W5CHT,=W5FJG,=W6CAG,=W6CWJ,=W6DSD,=W6KEV,=W6KIT,=W6KPI, - =W6KZL,=W6MQB,=W6MRJ,=W6NBK,=W6QPV,=W6ROM,=W6SHH,=W6UNX,=W7EHP,=W7NVQ,=W7NX,=W7RCR,=W7TEN,=W7UEA, - =W7WKS,=W8AYD,=W8JAY,=W8WH,=WA0FUR,=WA0NHD,=WA0TFB,=WA2AUI,=WA3ZEM,=WA6AW,=WA6CZL,=WA6ECX,=WA6IIQ, - =WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7WSU,=WA7ZK,=WA8HEB,=WA8JQP,=WB0RUA, - =WB0TZQ,=WB1HAL,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT,=WB6SAA, - =WB6VBM,=WB8NCD,=WB9SMM,=WD0FTF,=WD0LFN,=WD4MLF,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WK1K,=WV0Z,=WV6K, - =WX0H,=WY6F; + =KF6RLP,=KF6YYH,=KF6YZR,=KF6ZAL,=KF6ZVS,=KF7GNP,=KF7LRS,=KF7OJR,=KF7TUU,=KF7VUK,=KG0XR,=KG4CAN, + =KG4FJB,=KG4HZF,=KG4JKJ,=KG4SGC,=KG4SGV,=KG4TZD,=KG5CH,=KG5CNO,=KG5IVP,=KG6CJA,=KG6CJK,=KG6DV, + =KG6EZW,=KG6HRX,=KG6IER,=KG6IGY,=KG6JJP,=KG6LFX,=KG6MZJ,=KG6NNF,=KG6NQI,=KG6OOB,=KG6RJI,=KG6SC, + =KG6SDD,=KG6TFI,=KG6WZD,=KG6ZRY,=KG7AYU,=KG7CJI,=KG7EUP,=KG7JHH,=KG7TSD,=KG7ZJM,=KG9MDR,=KH0AI, + =KH0HL,=KH0WJ,=KH2DC,=KH2MD,=KH2TD,=KH2TE,=KH2YI,=KH3AE,=KH3AE/M,=KH3AF,=KH8Z,=KI4CAU,=KI4HCZ, + =KI4NOH,=KI4YAF,=KI4YOG,=KI6CRL,=KI6DVJ,=KI6EFY,=KI6FTE,=KI6HBZ,=KI6JEC,=KI6LPT,=KI6NOC,=KI6QDQ, + =KI6QQJ,=KI6SNP,=KI6VYB,=KI6WOJ,=KI6ZRV,=KI7AUZ,=KI7EZG,=KI7FJW,=KI7FJX,=KI7FUT,=KI7OS,=KI7QZQ, + =KJ4BHO,=KJ4EYV,=KJ4KND,=KJ4WOI,=KJ6CKZ,=KJ6COM,=KJ6CPN,=KJ6CQT,=KJ6FDF,=KJ6GYD,=KJ6LAW,=KJ6LAX, + =KJ6LBI,=KJ6MQL,=KJ6NIA,=KJ6NIB,=KJ6NZH,=KJ6PEH,=KJ6QQT,=KJ6RGW,=KJ6TJZ,=KK4EEC,=KK4RNF,=KK6BRW, + =KK6DIT,=KK6DWS,=KK6EJ,=KK6GM,=KK6OMX,=KK6PGA,=KK6RM,=KK6VJN,=KK6ZQ,=KK6ZZE,=KK7WR,=KL0TK,=KL1TP, + =KL3FN,=KL3JC,=KL7PN,=KL7TN/P,=KL7UB,=KL7XT,=KM4FPS,=KM4IP,=KM6IK,=KM6RM,=KM6RWE,=KM6UVP,=KN6BE, + =KN6ZU,=KN8AQR,=KO4BNK,=KO6KW,=KO6QT,=KQ6CD,=KQ6M,=KR1LLR,=KU4OY,=KW4JC,=KX6RTG,=KY1I,=N0CAN, + =N0KXY,=N0PJV,=N0RMC,=N0VYO,=N0ZSJ,=N1CBF,=N1CFD,=N1CNQ,=N1IDP,=N1SHV,=N1TEE,=N1TLE,=N1VOP,=N1YLH, + =N2KJU,=N2KLQ,=N3BQY,=N3DJT,=N3FUR,=N3GWR,=N3HQW,=N3RWD,=N3VDM,=N3ZFY,=N4BER,=N4ERA,=N4ZIW,=N5IWF, + =N5JKJ,=N6CGA,=N6DXW,=N6EQZ,=N6GOZ,=N6IKX,=N6KB,=N6NCT,=N6OM,=N6PJQ,=N6QBK,=N6XLB,=N6ZAB,=N7AMY, + =N7BLC,=N7BMD,=N7JRO,=N7KZB,=N7NYY,=N7OBR,=N7ODC,=N7TSV,=N7WBX,=N9GFL,=N9SBL,=NB6R,=ND1A,=NE7SO, + =NH2CC,=NH2CD,=NH2CF,=NH2CQ,=NH2CR,=NH2HR,=NH2HU,=NH2IB,=NH2IC,=NH2IF,=NH2II,=NH2IJ,=NH2IO,=NH2JO, + =NH2KF,=NH2KH,=NH2YL,=NH2Z,=NI1J,=NL7UW,=NO0H,=NR0G,=NT0DA,=NT4AA,=NZ2F,=W0OHO,=W0UNX,=W1BMB, + =W1ETT,=W1JJS,=W2UNS,=W3ZRT,=W4AJM,=W4PRO,=W4YQS,=W5CHT,=W5FJG,=W6CAG,=W6CWJ,=W6DSD,=W6KEV,=W6KIT, + =W6KPI,=W6KZL,=W6MQB,=W6MRJ,=W6NBK,=W6QPV,=W6ROM,=W6SHH,=W6UNX,=W7EHP,=W7NVQ,=W7NX,=W7RCR,=W7TEN, + =W7UEA,=W7WKS,=W8AYD,=W8JAY,=W8WH,=WA0FUR,=WA0NHD,=WA0TFB,=WA2AUI,=WA3ZEM,=WA6AW,=WA6CZL,=WA6ECX, + =WA6IIQ,=WA6JDA,=WA6JJQ,=WA6QDQ,=WA6UVF,=WA7ESE,=WA7HEO,=WA7TFE,=WA7WSU,=WA7ZK,=WA8HEB,=WA8JQP, + =WB0RUA,=WB0TZQ,=WB1HAL,=WB2AHM,=WB2SQW,=WB4JTT,=WB4MNF,=WB5ZDH,=WB5ZOV,=WB6CVJ,=WB6PIO,=WB6PJT, + =WB6SAA,=WB6VBM,=WB8NCD,=WB9SMM,=WD0FTF,=WD0LFN,=WD4MLF,=WD8LIB,=WD8OBO,=WH2Y,=WH7K,=WK1K,=WV0Z, + =WV6K,=WX0H,=WY6F; Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K: AH7K,KH7K,NH7K,WH7K; American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8: @@ -1781,21 +1783,21 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: =K4RND,=K4WPK,=K5DOW,=K5HL,=K5RD,=K5RSO,=K5RZW,=K5TDN,=K6ANE,=K6GKW,=K7BUF,=K7CAP,=K7EJM,=K7GRW, =K7LOP,=K7MVX,=K7OCL,=K7RDR,=K7UNX,=K7VRK,=K8IEL,=K8OUA,=K9DUG,=KA0SIM,=KA0YPV,=KA1NCN,=KA2TJZ, =KA2ZSD,=KA6DBB,=KA6UGT,=KA7ETQ,=KA7HHF,=KA7HOX,=KA7JOR,=KA7PUB,=KA7TMU,=KA7TOM,=KA7UKN,=KA7VCR, - =KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1KLH,=KB1PHP,=KB1QCD, - =KB1QCE,=KB1SYV,=KB1WQL,=KB2FWF,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX,=KB5DNT, - =KB5HEV,=KB5NOW,=KB5UWU,=KB5YLG,=KB6DKJ,=KB7AMA,=KB7BNG,=KB7BUF,=KB7DEL,=KB7FXJ,=KB7IBI,=KB7JA, - =KB7LJZ,=KB7LON,=KB7PHT,=KB7QLB,=KB7RWK,=KB7RXZ,=KB7SIQ,=KB7UBH,=KB7VFZ,=KB7YEC,=KB7ZVZ,=KB8LJT, - =KB8QKR,=KB8SBG,=KB8TEW,=KB8VYJ,=KB9MWG,=KB9RWE,=KB9RWJ,=KB9THD,=KB9YGR,=KC0ATI,=KC0CWG,=KC0CYR, - =KC0EF,=KC0EFL,=KC0GDH,=KC0GHH,=KC0GLN,=KC0LLL,=KC0NSV,=KC0OKQ,=KC0PSZ,=KC0TK,=KC0TZL,=KC0UYK, - =KC0VDN,=KC0WSG,=KC0YSW,=KC1DL,=KC1KPL,=KC1LVR,=KC2BYX,=KC2HRV,=KC2KMU,=KC2OJP,=KC2PCV,=KC2PIO, - =KC3BWW,=KC3DBK,=KC3NUH,=KC3QVN,=KC4MXQ,=KC4MXR,=KC4OPI,=KC5BNN,=KC5CHO,=KC5DJA,=KC5IBS,=KC5KIG, - =KC5LKF,=KC5LKG,=KC5NHL,=KC5QPJ,=KC5THY,=KC5YIB,=KC5YOX,=KC5ZAA,=KC6FRJ,=KC6RJW,=KC7BUL,=KC7COW, - =KC7DNT,=KC7ENM,=KC7FWK,=KC7HJM,=KC7HPF,=KC7IKE,=KC7IKF,=KC7INC,=KC7MIJ,=KC7MPY,=KC7MRO,=KC7OQZ, - =KC7PLJ,=KC7PLQ,=KC7RCP,=KC7TYT,=KC7UZY,=KC7WOA,=KC7YZR,=KC8GKK,=KC8MVW,=KC8NOY,=KC8WWS,=KC8YIV, - =KC9CMY,=KC9HIK,=KC9IKH,=KC9RQZ,=KC9SXX,=KC9VLD,=KD0CLU,=KD0CZC,=KD0DHU,=KD0FJG,=KD0IXU,=KD0JJB, - =KD0NSG,=KD0ONB,=KD0VAK,=KD0VAL,=KD0ZOD,=KD2CTE,=KD2GKT,=KD2NPD,=KD2SKJ,=KD4EYW,=KD4MEY,=KD4QJL, - =KD5DNA,=KD5DWV,=KD5GAL,=KD5MQC,=KD5QPD,=KD5RVD,=KD5SHW,=KD5WCF,=KD5WEV,=KD5WYP,=KD6DLB,=KD6NFV, - =KD6RVY,=KD6YKS,=KD7APU,=KD7AWK,=KD7BBX,=KD7BGP,=KD7DIG,=KD7DUQ,=KD7FGL,=KD7FUL,=KD7HXF,=KD7IMM, + =KA7YEY,=KA9GYQ,=KB0APK,=KB0LOW,=KB0TSU,=KB0UGE,=KB0UVK,=KB1CRT,=KB1FCX,=KB1IEV,=KB1KLH,=KB1PHP, + =KB1QCD,=KB1QCE,=KB1SYV,=KB1WQL,=KB2FWF,=KB2JWV,=KB2ZME,=KB3CYB,=KB3JFK,=KB3NCR,=KB3VQE,=KB4DX, + =KB5DNT,=KB5HEV,=KB5NOW,=KB5UWU,=KB5YLG,=KB6DKJ,=KB7AMA,=KB7BNG,=KB7BUF,=KB7DEL,=KB7FXJ,=KB7IBI, + =KB7JA,=KB7LJZ,=KB7LON,=KB7PHT,=KB7QLB,=KB7RWK,=KB7RXZ,=KB7SIQ,=KB7UBH,=KB7VFZ,=KB7YEC,=KB7ZVZ, + =KB8LJT,=KB8QKR,=KB8SBG,=KB8TEW,=KB8VYJ,=KB9MWG,=KB9RWE,=KB9RWJ,=KB9THD,=KB9YGR,=KC0ATI,=KC0CWG, + =KC0CYR,=KC0EF,=KC0EFL,=KC0GDH,=KC0GHH,=KC0GLN,=KC0LLL,=KC0NSV,=KC0OKQ,=KC0PSZ,=KC0TK,=KC0TZL, + =KC0UYK,=KC0VDN,=KC0WSG,=KC0YSW,=KC1DL,=KC1KPL,=KC1LVR,=KC2BYX,=KC2HRV,=KC2KMU,=KC2OJP,=KC2PCV, + =KC2PIO,=KC3BWW,=KC3DBK,=KC3NUH,=KC3QVN,=KC4MXQ,=KC4MXR,=KC4OPI,=KC5BNN,=KC5CHO,=KC5DJA,=KC5IBS, + =KC5KIG,=KC5LKF,=KC5LKG,=KC5NHL,=KC5QPJ,=KC5THY,=KC5YIB,=KC5YOX,=KC5ZAA,=KC6FRJ,=KC6RJW,=KC7BUL, + =KC7COW,=KC7DNT,=KC7ENM,=KC7FWK,=KC7HJM,=KC7HPF,=KC7IKE,=KC7IKF,=KC7INC,=KC7MIJ,=KC7MPY,=KC7MRO, + =KC7OQZ,=KC7PLJ,=KC7PLQ,=KC7RCP,=KC7TYT,=KC7UZY,=KC7WOA,=KC7YZR,=KC8GKK,=KC8MVW,=KC8NOY,=KC8WWS, + =KC8YIV,=KC9CMY,=KC9HIK,=KC9IKH,=KC9RQZ,=KC9SXX,=KC9VLD,=KD0CLU,=KD0CZC,=KD0DHU,=KD0FJG,=KD0IXU, + =KD0JJB,=KD0NSG,=KD0ONB,=KD0VAK,=KD0VAL,=KD0ZOD,=KD2CTE,=KD2GKT,=KD2NPD,=KD2SKJ,=KD4EYW,=KD4MEY, + =KD4QJL,=KD5DNA,=KD5DWV,=KD5GAL,=KD5MQC,=KD5QPD,=KD5RVD,=KD5SHW,=KD5WCF,=KD5WEV,=KD5WYP,=KD6DLB, + =KD6NFV,=KD6RVY,=KD6YKS,=KD7AWK,=KD7BBX,=KD7BGP,=KD7DIG,=KD7DUQ,=KD7FGL,=KD7FUL,=KD7HXF,=KD7IMM, =KD7IMT,=KD7KRK,=KD7MGO,=KD7OOS,=KD7QAR,=KD7RYC,=KD7SIX,=KD7TOJ,=KD7TWB,=KD7UAG,=KD7VOI,=KD7VXE, =KD7ZTJ,=KD8DDY,=KD8GEL,=KD8GMS,=KD8JOU,=KD8KQL,=KD8LNA,=KD8WMX,=KD9QKS,=KD9TK,=KE0DYM,=KE0KKI, =KE0PRX,=KE4DGR,=KE4LJD,=KE4MQD,=KE4YEI,=KE4YLG,=KE5CVD,=KE5CVT,=KE5DQV,=KE5FOC,=KE5GEB,=KE5HHR, @@ -1820,10 +1822,10 @@ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL: =N6IGV,=N6JM,=N6QEK,=N6ZZX,=N7BUO,=N7DBN,=N7DKL,=N7DUD,=N7ELD,=N7FCT,=N7GLP,=N7HER,=N7HQK,=N7IA, =N7JUX,=N7MGT,=N7MTG,=N7QAN,=N7TBU,=N7UTV,=N7UWT,=N7XEA,=N7XNM,=N7YKY,=N7YQS,=N8DDY,=N8EX,=N8JKB, =N8KCJ,=N8KYW,=N8SUG,=N9AIG,=N9YD,=NA7WM,=NC2US,=NC4OI,=NE7EK,=NH2GZ,=NH2LS,=NH7UO,=NM0H,=NN5H, - =NP4FU,=NU9Q,=NW7F,=W0EZM,=W0FJN,=W0OPT,=W0RWS,=W0UZJ,=W0ZEE,=W1JM,=W1LYD,=W1RSC,=W1ZKA,=W2DLS, - =W2KRZ,=W3ICG,=W3JPN,=W3MKG,=W4AUL,=W4BMR,=W4RSB,=W5AIT,=W5JKT,=W5SPY,=W6DDP,=W6GTE,=W6ROW,=W7APM, - =W7DDG,=W7EGG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9CG,=W9ITU, - =W9JMC,=W9WLN,=WA0JS,=WA1FVJ,=WA1OUS,=WA2BGL,=WA2BIW,=WA4RRE,=WA6GFS,=WA7B,=WA7MDS,=WA7PXH, + =NP4FU,=NU9Q,=NW7F,=W0EZM,=W0FJN,=W0HPD,=W0OPT,=W0RWS,=W0UZJ,=W0ZEE,=W1JM,=W1LYD,=W1RSC,=W1ZKA, + =W2DLS,=W2KRZ,=W3ICG,=W3JPN,=W3MKG,=W4AUL,=W4BMR,=W4RSB,=W5AIT,=W5JKT,=W5SPY,=W6DDP,=W6GTE,=W6ROW, + =W7APM,=W7DDG,=W7EGG,=W7EIK,=W7JMR,=W7PWA,=W7RAZ,=W7ROS,=W7WEZ,=W7ZWT,=W8MDD,=W8PVZ,=W8TCX,=W9CG, + =W9ITU,=W9JMC,=W9WLN,=WA0JS,=WA1FVJ,=WA1OUS,=WA2BGL,=WA2BIW,=WA4RRE,=WA6GFS,=WA7B,=WA7MDS,=WA7PXH, =WA7USX,=WA7YXF,=WB0CMZ,=WB1GZL,=WB1ILS,=WB6COP,=WB7ULO,=WB9JZL,=WD6CET,=WE3B,=WH6CYY,=WH6DPL, =WH6DX,=WH6GBB,=WH6GCO,=WH7AK,=WJ6AA,=WJ8M,=WT5T,=WW4AL,=WX1NCC; Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1: @@ -1957,7 +1959,7 @@ Argentina: 13: 14: SA: -32.50: 62.13: 3.0: LU: =LU7YG/F,=LU8FAB/F,=LU8FC/F,=LU8FGB/F,=LU8FMA/F,=LU8SAN/F,=LU9EI/F,=LU9ESD/F,=LU9FBA/F,=LU9FNI/F, =LU9FQR/F,=LU9RBI/F, =LU1ACG/GP,=LU1GQQ/GP,=LU1GR/GP,=LU3AAL/GR,=LU4FM/G,=LU4FM/GP,=LU4GF/GA,=LU4GO/GA,=LU5BE/GR, - =LU5FZ/GA,=LU8EFF/GR,=LU8GCJ/GA,=LU9GAH/G,=LU9GOO/GA,=LU9GOX/GA,=LU9GOY/GA,=LU9GRE/GP, + =LU5FZ/GA,=LU8EFF/GR,=LU8GCJ/GA,=LU8GCW/GP,=LU9GAH/G,=LU9GOO/GA,=LU9GOX/GA,=LU9GOY/GA,=LU9GRE/GP, =LS4AA/H,=LU1DZ/H,=LU1EZ/H,=LU1HBD/H,=LU1HCG/H,=LU1HCP/H,=LU1HH/H,=LU1HK/H,=LU1HLH/H,=LU1HPW/H, =LU1HRA/H,=LU1HYW/H,=LU1JB/H,=LU1XZ/H,=LU2DVI/H,=LU2HAE/H,=LU2HC/H,=LU2HCG/H,=LU2HEA/H,=LU2HEQ/H, =LU2HJ/H,=LU2HNV/H,=LU2MAA/H,=LU3AJL/H,=LU3FCR/H,=LU3FN/H,=LU3HAT/H,=LU3HAZ/H,=LU3HE/H,=LU3HKA/H, @@ -2414,12 +2416,12 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =UA0FQ/6,=UA0KBG/3,=UA0KBG/6,=UA0KCX/3/P,=UA0KT/4,=UA0QNE/3,=UA0QNU/3,=UA0QQJ/3,=UA0UV/6, =UA0XAK/3,=UA0XAK/6,=UA4NF/M,=UA9CCO/6,=UA9CDC/3,=UA9CTT/3,=UA9FFS/1/MM,=UE23DKA,=UE6MAC/9(17), =UE95AE,=UE95E,=UE95ME,=UE96ME,=UE99PS, - =R900BL,=R900DM,=R900DV,=R9J/1,=RA2FN/1,=RA9KU/1,=RA9KU/1/M,=RA9MC/1,=RA9SGI/1,=RK9XWV/1,=RL1O, - =RM0L/1,=RM80DZ,=RN1M/P,=RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RV1CC/M,=RW1AI/ANT, - =RW1AI/LH,=RW8W/1,=RW9QA/1,=RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1,=UA9B/1, - =UA9KG/1,=UA9KGH/1,=UA9KK/1,=UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC,=UE25AQ, - =UE2AT/1, - =R0XAC/1,=R1CF/M,=R8FF/1,=R8XF/1,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RD1A/M,=RN9N/1,=RU9MU/1, + =R1CF/M,=R900BL,=R900DM,=R900DV,=R9J/1,=RA2FN/1,=RA9KU/1,=RA9KU/1/M,=RA9MC/1,=RA9SGI/1,=RK9XWV/1, + =RL1O,=RM0L/1,=RM80DZ,=RN1M/P,=RN85AM,=RN85KN,=RT9T/1,=RU2FB/1,=RU9YT/1,=RU9YT/1/P,=RV1CC/M, + =RW1AI/ANT,=RW1AI/LH,=RW8W/1,=RW9QA/1,=RX3AMI/1/LH,=UA1ADQ/ANT,=UA1BJ/ANT,=UA1JJ/ANT,=UA2FFX/1, + =UA9B/1,=UA9KG/1,=UA9KGH/1,=UA9KK/1,=UA9UDX/1,=UB9YUW/1,=UE21A,=UE21B,=UE21M,=UE22A,=UE25AC, + =UE25AQ,=UE2AT/1, + =R0XAC/1,=R8FF/1,=R8XF/1,=R90LPU,=R9JNO/1,=RA0FU/1,=RA9FNV/1,=RD1A/M,=RN2FA/1,=RN9N/1,=RU9MU/1, =RV0CA/1,=RV2FW/1,=RV9JD/1,=RX9TN/1,=UA0BDS/1,=UA0SIK/1,=UA1CDA/LH,=UA1CIO/LH,=UA9MA/1,=UA9MQR/1, R1N[19],RA1N[19],RC1N[19],RD1N[19],RE1N[19],RF1N[19],RG1N[19],RJ1N[19],RK1N[19],RL1N[19],RM1N[19], RN1N[19],RO1N[19],RQ1N[19],RT1N[19],RU1N[19],RV1N[19],RW1N[19],RX1N[19],RY1N[19],RZ1N[19],U1N[19], @@ -2439,8 +2441,7 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: RN1P[20],RO1P[20],RQ1P[20],RT1P[20],RU1P[20],RV1P[20],RW1P[20],RX1P[20],RY1P[20],RZ1P[20],U1P[20], UA1P[20],UB1P[20],UC1P[20],UD1P[20],UE1P[20],UF1P[20],UG1P[20],UH1P[20],UI1P[20],=R8XW/1[20], =R9SAO/1[20],=R9XC/1[20],=R9XT/1[20],=RA2FW/1[20],=RA9JG/1[20],=RA9LI/1[20],=RC9XM/1[20], - =RK1PWA/ANT[20],=RL1P[20],=RN2FA/1[20],=UA1PAC/1/ANT[20],=UA9FOJ/1[20],=UA9MRY/1[20], - =UA9XRP/1[20], + =RK1PWA/ANT[20],=RL1P[20],=UA1PAC/1/ANT[20],=UA9FOJ/1[20],=UA9MRY/1[20],=UA9XRP/1[20], =R9FM/1,=RA0BM/1,=RA0BM/1/P,=RA1QQ/LH,=RU9MX/1,=RW9XC/1,=UA1QV/ANT,=UA9XC/1,=UE80GS, =R88EPC,=R95NRL,=RA9FBV/1,=RA9SC/1,=RA9XY/1,=RV2FW/1/M,=RZ0IWW/1,=UA9XF/1,=UE9WFF/1, =RA0ZD/1,=RP9X/1,=RP9XWM/1,=UE25WDW,=UE9XBW/1,=UF2F/1/M, @@ -2466,8 +2467,8 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =RK3MXT/FF,=RV9AZ/3,=UA0AD/3, =R870T,=RT90PK,=RU0ZW/3,=RW0UM/3,=RW9JV/3, =R0AI/3,=R0AI/M,=R0AIB/3,=R89AFG,=RA0CCV/3,=RA0QA/3,=RC9YA/3/P,=RM8X/3,=RV9LC/3,=UA0QJE/3, - =UA0QQO/3,=UA9CGL/3,=UA9JLY/3,=UA9XLE/3,=UB0AJJ/3,=UB5O/M,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG, - =UE28AFG,=UE96SN, + =UA0QQO/3,=UA9CGL/3,=UA9JLY/3,=UA9XLE/3,=UB0AJJ/3,=UC0LAF/3,=UE25AFG,=UE25R,=UE27AFG,=UE28AFG, + =UE96SN, =R80RTL,=R90IARU,=R9CZ/3,=RU80TO,=RZ9HK/3/P, =R920RZ,=R925RZ,=R95DOD,=RA0QQ/3,=UA0KBA/3,=UE80S,=UE85NKN,=UE85WDW, =R3TT/FF,=R8TA/4/P,=R8TR/3,=R90NOR,=R9KW/3,=R9KW/4,=R9PA/4,=RA95FL,=RA9AP/3,=RA9CKQ/4,=RA9KW/3, @@ -2535,8 +2536,9 @@ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA: =UA0ZDA/6,=UA0ZS/6,=UA6HBO/N,=UA6HBO/ST30,=UA6IC/6/FF,=UA9CE/6,=UA9UAX/7/M,=UE80HS, =RM8A/6/M,=UA6IC/FF, =RU2FB/6/P,=UA9UAX/7, - =R6LCA/J,=R8WC/6,=R8WC/6/P,=RA20NY,=RA21NY,=RU97AE,=RV9CMT/6,=RV9DC/6/P,=RV9LC/6,=RW9XC/6/M, - =RX9KT/6,=UA0QBR/6,=UA0ZED/6,=UA6LP/P/LH,=UA6LV/ANT,=UA6MM/LH,=UE20DS,=UE28DX,=UE29DX,=UE92L, + =R6LCA/J,=R8WC/6,=R8WC/6/P,=RA20NY,=RA21NY,=RA98AE,=RU97AE,=RV9CMT/6,=RV9DC/6/P,=RV9LC/6, + =RW9XC/6/M,=RX9KT/6,=UA0QBR/6,=UA0ZED/6,=UA6LP/P/LH,=UA6LV/ANT,=UA6MM/LH,=UE20DS,=UE28DX,=UE29DX, + =UE92L, =RV0ANH/6,=RV0APR/6,=RW0AF/6, =R8FF/6,=R9DA/6,=R9MAV/6,=RA9DF/6/M,=RA9DF/6/P,=RU9CK/6/M,=RU9CK/6/P,=RV9CX/6/P,=UA9CES/6, =UA9FGR/6,=UA9WQK/6, @@ -2707,18 +2709,18 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RW4AA/9[20],=RW4HIF/9[20],=RW4HIH/9[20],=RW6BA/9[20],=RW9XU/9[20],=RX6CP/8[20],=RX6LMA/9[20], =RX9SN/8[20],=UA0KY/9[20],=UA0QMU/0[20],=UA0QQO/9/P[20],=UA1FBP/9[20],=UA1PBA/9[20],=UA1PBP/9[20], =UA3DFM/8[20],=UA3DFM/9[20],=UA3MGA/9[20],=UA6BTN/9[20],=UA9SUV/8[20], - =R110WG,=R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R2015EP,=R2015LY,=R2015LY/8,=R22BIA,=R30STM, - =R430LT,=R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9,=RC1M/8/M, - =RO25TN,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK,=RP69LL, - =RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL,=RP71P, - =RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RP74LL,=RP74P,=RP75GP,=RP75LL,=RP75P,=RP75YN, - =RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8,=RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P,=RZ9MXM/9/M, - =UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, + =R110WG,=R115AN,=R11QRP/8,=R11QRP/8/P,=R120RL,=R18POR,=R2015EP,=R2015LY,=R2015LY/8,=R22BIA, + =R30STM,=R430LT,=R4FAA/8,=R8MC/9,=R8MD/9,=RA/EW8ADX,=RA0UAC/8,=RA0UF/8,=RA3CW/9,=RA9JG/9, + =RC1M/8/M,=RO25TN,=RP67JH,=RP67LK,=RP67LL,=RP67TT,=RP68LS,=RP68TT,=RP69CM,=RP69DK,=RP69GP,=RP69LK, + =RP69LL,=RP69LS,=RP69MM,=RP69P,=RP69YN,=RP70GP,=RP70LL,=RP70LM,=RP70P,=RP70TM,=RP71GP,=RP71LL, + =RP71P,=RP72GP,=RP72LL,=RP72P,=RP72PJ,=RP73LL,=RP73P,=RP74LL,=RP74P,=RP75GP,=RP75LL,=RP75P, + =RP75YN,=RR110RAEM,=RU22LR,=RW0QJ/9,=RX4W/8,=RX6DL/8,=RX6DL/8/P,=RX6DL/8/P/QRP,=RX6DL/9/P, + =RZ9MXM/9/M,=UB5O/8/P,=UE44Y/8,=UE9FDA/9/M,=UE9MDA/9, =R16CAN,=R1716K,=R1716M,=R1716O,=R1716S,=R21HNY,=R30MDXC,=R9MJ/M,=RA/DK2AI/M,=RA22MX,=RA4CQ/9/M, =RA9MR/0,=RA9MX/P,=RC20MX,=RG78ML,=RK6YYA/9,=RN0SZ/9,=RN9N/9,=RN9N/M,=RP65MOH,=RP67MC,=RP67MD, =RP68MC,=RP68MD,=RP69MC,=RP69MD,=RP70GK,=RP70MC,=RP70MD,=RP70OB,=RP70OF,=RP70OS,=RP71GK,=RP71MJ, =RP71OB,=RP72GK,=RP72MJ,=RP72OB,=RP72ZW,=RP73GK,=RP73OB,=RP74PO,=RP75GK,=RP8M,=RT22MC,=RT22MD, - =RU20NY,=RU20RU,=RV0SR/9,=RW22MW,=RY22MC,=RZ5D/9,=UA1ZGD/9,=UA3AKO/9,=UA9UAX/M,=UB5O/9,=UE55OM, + =RU20NY,=RU20RU,=RV0SR/9,=RW22MW,=RY22MC,=RZ5D/9,=UA1ZGD/9,=UA3AKO/9,=UA9UAX/M,=UB5O/M,=UE55OM, =UE70KRM/9,=UE70KRM/9/M,=UE9OFF/9, R8O(18)[31],R8P(18)[31],R9O(18)[31],R9P(18)[31],RA8O(18)[31],RA8P(18)[31],RA9O(18)[31], RA9P(18)[31],RC8O(18)[31],RC8P(18)[31],RC9O(18)[31],RC9P(18)[31],RD8O(18)[31],RD8P(18)[31], @@ -2844,8 +2846,8 @@ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9: =RJ30KR(18)[31],=RK1B/9(18)[31],=RL30KR(18)[31],=RP68BP(18)[31],=RP68TZ(18)[31],=RP70AF(18)[31], =RP70BP(18)[31],=RP70GA(18)[31],=RP71BP(18)[31],=RP72BP(18)[31],=RP73BP(18)[31],=RP9Y(18)[31], =RP9YAF(18)[31],=RP9YTZ(18)[31],=RT73GM(18)[31],=RW22WG(18)[31],=RX6AY/9(18)[31], - =UA0LLW/9(18)[31],=UA0ZDY/9(18)[31],=UA9UAX/9/P(18)[31],=UE0ZOO/9(18)[31],=UE44R/9(18)[31], - =UE80AL(18)[31], + =UA0LLW/9(18)[31],=UA0ZDY/9(18)[31],=UA9UAX/9/P(18)[31],=UB5O/9(18)[31],=UE0ZOO/9(18)[31], + =UE44R/9(18)[31],=UE80AL(18)[31], R8Z(18)[31],R9Z(18)[31],RA8Z(18)[31],RA9Z(18)[31],RC8Z(18)[31],RC9Z(18)[31],RD8Z(18)[31], RD9Z(18)[31],RE8Z(18)[31],RE9Z(18)[31],RF8Z(18)[31],RF9Z(18)[31],RG8Z(18)[31],RG9Z(18)[31], RJ8Z(18)[31],RJ9Z(18)[31],RK8Z(18)[31],RK9Z(18)[31],RL8Z(18)[31],RL9Z(18)[31],RM8Z(18)[31], @@ -3113,7 +3115,7 @@ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7: Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8: V8; Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE: - CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20210127, + CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,=VE2EM/M,=VER20210208, =CF7AAW/1,=CK7IG/1,=VA3QSL/1,=VA3WR/1,=VE1REC/LH,=VE1REC/M/LH,=VE3RSA/1,=VE7IG/1, CF2[4],CG2[4],CJ2[4],CK2[4],VA2[4],VB2[4],VC2[4],VE2[4],VG2[4],VX2[4],XL2[4],XM2[4],=4Y1CAO[4], =CY2ZT/2[4],=VA3MPM/2[4],=VA7AQ/P[4],=VE2/G3ZAY/P[4],=VE2/M0BLF/P[4],=VE2FK[9],=VE2HAY/P[4], diff --git a/displayWidgets.txt b/displayWidgets.txt index 8f7378b01..7a58347ef 100644 --- a/displayWidgets.txt +++ b/displayWidgets.txt @@ -10,8 +10,7 @@ JT9/VHF 1111101010001111100100000000000000000 JT9+JT65 1110100000011110000100000000000010000 JT65 1110100000001110000100000000000010000 JT65/VHF 1111100100001101101011000100000000000 -QRA64 1111100101101101100000000010000000000 -Q65 1111110101101101001110000011000000001 +Q65 1111110101101101001110000001000000001 ISCAT 1001110000000001100000000000000000000 MSK144 1011111101000000000100010000000000000 WSPR 0000000000000000010100000000000000000 diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 40d8b27fd..9806708c4 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -166,9 +166,9 @@ function (document) COMMAND ${ASCIIDOCTOR_EXECUTABLE} ${_args_ASCIIDOCTOR_OPTIONS} -b html5 -a nofooter - -a VERSION_MAJOR=${WSJTX_VERSION_MAJOR} - -a VERSION_MINOR=${WSJTX_VERSION_MINOR} - -a VERSION_PATCH=${WSJTX_VERSION_PATCH} + -a VERSION_MAJOR=${PROJECT_VERSION_MAJOR} + -a VERSION_MINOR=${PROJECT_VERSION_MINOR} + -a VERSION_PATCH=${PROJECT_VERSION_PATCH} -a VERSION=${wsjtx_VERSION} --out-file=${_html_file} ${_source_name} DEPENDS ${_args_DEPENDS} @@ -195,9 +195,9 @@ function (document) COMMAND ${ASCIIDOCTOR_EXECUTABLE} ARGS ${_args_ASCIIDOCTOR_OPTIONS} -b docbook -a data-uri! - -a VERSION_MAJOR=${WSJTX_VERSION_MAJOR} - -a VERSION_MINOR=${WSJTX_VERSION_MINOR} - -a VERSION_PATCH=${WSJTX_VERSION_PATCH}${BUILD_TYPE_REVISION} + -a VERSION_MAJOR=${wsjtx_VERSION_MAJOR} + -a VERSION_MINOR=${wsjtx_VERSION_MINOR} + -a VERSION_PATCH=${wsjtx_VERSION_PATCH}${BUILD_TYPE_REVISION} -a VERSION=${wsjtx_VERSION} -D ${CMAKE_CURRENT_BINARY_DIR} -o ${_docbook_file} ${_source_name} diff --git a/doc/common/license.adoc b/doc/common/license.adoc index bc62060c7..4e5a6b8dc 100755 --- a/doc/common/license.adoc +++ b/doc/common/license.adoc @@ -27,9 +27,10 @@ our work under terms of the GNU General Public License must display the following copyright notice prominently: *The algorithms, source code, look-and-feel of _{prog}_ and related -programs, and protocol specifications for the modes FSK441, FT4, FT8, -JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, and MSK144 are Copyright (C) -2001-2020 by one or more of the following authors: Joseph Taylor, -K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, -IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; -Philip Karn, KA9Q; and other members of the WSJT Development Group.* +programs, and protocol specifications for the modes FSK441, FST4, +FST4W, FT4, FT8, JT4, JT6M, JT9, JT44, JT65, JTMS, Q65, QRA64, ISCAT, +and MSK144 are Copyright (C) 2001-2021 by one or more of the following +authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, +K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; +Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the +WSJT Development Group.* diff --git a/doc/common/links.adoc b/doc/common/links.adoc index fd13cd5a5..c16cdbfe7 100644 --- a/doc/common/links.adoc +++ b/doc/common/links.adoc @@ -94,8 +94,8 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes. :sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK] :ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice] :win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages] -:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1h.msi[Win32 OpenSSL Light Package] -:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1h.msi[Win64 OpenSSL Light Package] +:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1j.msi[Win32 OpenSSL Light Package] +:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1j.msi[Win64 OpenSSL Light Package] :writelog: https://writelog.com/[Writelog] :wsjtx_group: https://groups.io/g/WSJTX[WSJTX Group] :wsjtx: https://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X] diff --git a/doc/user_guide/en/controls-functions-center.adoc b/doc/user_guide/en/controls-functions-center.adoc index 29efde698..b3afa3d2d 100644 --- a/doc/user_guide/en/controls-functions-center.adoc +++ b/doc/user_guide/en/controls-functions-center.adoc @@ -42,7 +42,7 @@ control. The *Sync* control sets a minimum threshold for establishing time and frequency synchronization with a received signal. * Spinner control *T/R xx s* sets sequence lengths for transmission -and reception in ISCAT, MSK144, and the fast JT9 modes. +and reception in Q65, MSK144, and the fast JT9 modes. * With *Split operation* activated on the *File -> Settings -> Radio* tab, in MSK144 and the fast JT9 submodes you can activate the spinner control @@ -60,7 +60,7 @@ specified response frequency. * Checkboxes at bottom center of the main window control special features for particular operating modes: -** *Sh* enables shorthand messages in JT4, JT65, QRA64 and MSK144 modes +** *Sh* enables shorthand messages in JT4, JT65, Q65, and MSK144 modes ** *Fast* enables fast JT9 submodes @@ -69,4 +69,5 @@ features for particular operating modes: ** *Call 1st* enables automatic response to the first decoded responder to your CQ -** *Tx6* toggles between two types of shorthand messages in JT4 mode \ No newline at end of file +** *Tx6* toggles between two types of shorthand messages in JT4 and + Q65 modes \ No newline at end of file diff --git a/doc/user_guide/en/controls-functions-menus.adoc b/doc/user_guide/en/controls-functions-menus.adoc index 546a62d70..defb075ad 100644 --- a/doc/user_guide/en/controls-functions-menus.adoc +++ b/doc/user_guide/en/controls-functions-menus.adoc @@ -37,6 +37,12 @@ examples for configurations `FT8` and `Echo`: ==== View Menu image::view-menu.png[align="left",alt="View Menu"] +The *SWL Mode* action reduces the _WSJT-X_ main window to a minimum +size with just the menus, decodes windows, and status bar visible. You +may find this useful when running multiple instances of the +application. Both size and location of the main window are saved and +recalled independently for this view. + [[MODE_MENU]] ==== Mode Menu image::mode-menu.png[align="left",alt="Mode Menu"] diff --git a/doc/user_guide/en/controls-functions-messages.adoc b/doc/user_guide/en/controls-functions-messages.adoc index 2654de71f..b62a6a84b 100644 --- a/doc/user_guide/en/controls-functions-messages.adoc +++ b/doc/user_guide/en/controls-functions-messages.adoc @@ -1,11 +1,10 @@ // Status=edited -Two arrangements of controls are provided for generating and selecting -Tx messages. Controls familiar to users of program _WSJT_ -appear on *Tab 1*, providing six fields for message entry. -Pre-formatted messages for the standard minimal QSO are generated when -you click *Generate Std Msgs* or double-click on an appropriate line -in one of the decoded text windows. +Controls familiar to users of program _WSJT_ appear on *Tab 1*, +providing six fields for message entry. Pre-formatted messages for +the standard minimal QSO are generated when you click *Generate Std +Msgs* or double-click on an appropriate line in one of the decoded +text windows. //.Traditional Message Menu image::traditional-msg-box.png[align="center",alt="Traditional Message Menu"] @@ -28,31 +27,12 @@ stored messages entered on the *Files -> Settings -> Tx Macros* tab. Pressing *Enter* on a modified message #5 automatically adds that message to the stored macros. -* In some circumstances it may be desirable to make your QSOs as -short as possible. To configure the program to start contacts with -message #2, disable message #1 by double-clicking its radio-button in the *Next* column or *Tx 1* button in the *Now* column. Similarly, to send RR73 -rather than RRR for message #4, double-click one of its buttons. - -The second arrangement of controls for generating and selecting -Tx messages appears on *Tab 2* of the Message Control Panel: - -//.New Message Menu -image::new-msg-box.png[align="center",alt="New Message Menu"] - -With this setup you normally follow a top-to-bottom sequence of -transmissions from the left column if you are calling CQ, or the right -column if answering a CQ. - -* Clicking a button puts the appropriate message in the *Gen Msg* box. -If you are already transmitting, the Tx message is changed -immediately. - -* You can enter and transmit anything (up to 13 characters, including -spaces) in the *Free Msg* box. - -* Click the pull-down arrow in the *Free Msg* box to select a -stored macro. Pressing *Enter* on a modified message here -automatically adds that message to the table of stored macros. +* In some circumstances it may be desirable to make your QSOs as short +as possible. To configure the program to start contacts with message +#2, disable message #1 by double-clicking its radio-button in the +*Next* column or *Tx 1* button in the *Now* column. Similarly, to +send RR73 rather than RRR for message #4, double-click one of its +buttons. + diff --git a/doc/user_guide/en/decoder_notes.adoc b/doc/user_guide/en/decoder_notes.adoc index fafbdcd4e..3da3a8cab 100644 --- a/doc/user_guide/en/decoder_notes.adoc +++ b/doc/user_guide/en/decoder_notes.adoc @@ -2,12 +2,12 @@ === AP Decoding -The _WSJT-X_ decoders for FT4, FT8, JT65, QRA64, include +The _WSJT-X_ decoders for FST4, FT4, FT8, JT65, and Q65 include procedures that use naturally accumulating information during a minimal QSO. This _a priori_ (AP) information increases sensitivity of the decoder by up to 4 dB, at the cost of a slightly higher rate of -false decodes. AP is optional in FT8, JT65, and QRA64, but is always -enabled for FT4. +false decodes. AP is optional in FT8 and JT65, but is always enabled +for Q65 and for FT4 and FST4 when decode depth is Normal or Deep. For example: when you decide to answer a CQ, you already know your own callsign and that of your potential QSO partner. The software @@ -27,7 +27,7 @@ example, `a2` indicates that the successful decode used MyCall as hypothetically known information. [[FT8_AP_INFO_TABLE]] -.FT4 and FT8 AP information types +.FST4, FT4, and FT8 AP information types [width="35%",cols="h10, \| RRR \| RR73 \| 73] |=============================================== diff --git a/doc/user_guide/en/images/EME_Deep_1.png b/doc/user_guide/en/images/EME_Deep_1.png index 49a654374..1867099ba 100644 Binary files a/doc/user_guide/en/images/EME_Deep_1.png and b/doc/user_guide/en/images/EME_Deep_1.png differ diff --git a/doc/user_guide/en/images/EME_Deep_2.png b/doc/user_guide/en/images/EME_Deep_2.png index 6628c5b93..bb3e707ec 100644 Binary files a/doc/user_guide/en/images/EME_Deep_2.png and b/doc/user_guide/en/images/EME_Deep_2.png differ diff --git a/doc/user_guide/en/images/FST4-1.png b/doc/user_guide/en/images/FST4-1.png new file mode 100644 index 000000000..fb003fd36 Binary files /dev/null and b/doc/user_guide/en/images/FST4-1.png differ diff --git a/doc/user_guide/en/images/FST4W-1.png b/doc/user_guide/en/images/FST4W-1.png new file mode 100644 index 000000000..dfd9d1f12 Binary files /dev/null and b/doc/user_guide/en/images/FST4W-1.png differ diff --git a/doc/user_guide/en/images/MSK144.png b/doc/user_guide/en/images/MSK144.png index adc28f98e..53d6107df 100644 Binary files a/doc/user_guide/en/images/MSK144.png and b/doc/user_guide/en/images/MSK144.png differ diff --git a/doc/user_guide/en/images/RadioTab.png b/doc/user_guide/en/images/RadioTab.png index f81081f90..d9b183df8 100644 Binary files a/doc/user_guide/en/images/RadioTab.png and b/doc/user_guide/en/images/RadioTab.png differ diff --git a/doc/user_guide/en/images/Windows_Dark.png b/doc/user_guide/en/images/Windows_Dark.png index 8f615601f..6e877f4e1 100644 Binary files a/doc/user_guide/en/images/Windows_Dark.png and b/doc/user_guide/en/images/Windows_Dark.png differ diff --git a/doc/user_guide/en/images/colors.png b/doc/user_guide/en/images/colors.png index 8845ada9c..bbfa9da8c 100644 Binary files a/doc/user_guide/en/images/colors.png and b/doc/user_guide/en/images/colors.png differ diff --git a/doc/user_guide/en/images/decode-menu.png b/doc/user_guide/en/images/decode-menu.png index 36049e768..bfb3240c6 100644 Binary files a/doc/user_guide/en/images/decode-menu.png and b/doc/user_guide/en/images/decode-menu.png differ diff --git a/doc/user_guide/en/images/help-menu.png b/doc/user_guide/en/images/help-menu.png index e4d9ab325..3af2ec08a 100644 Binary files a/doc/user_guide/en/images/help-menu.png and b/doc/user_guide/en/images/help-menu.png differ diff --git a/doc/user_guide/en/images/keyboard-shortcuts.png b/doc/user_guide/en/images/keyboard-shortcuts.png index 9249e2e08..c080c2d2c 100644 Binary files a/doc/user_guide/en/images/keyboard-shortcuts.png and b/doc/user_guide/en/images/keyboard-shortcuts.png differ diff --git a/doc/user_guide/en/images/log-qso.png b/doc/user_guide/en/images/log-qso.png index 4f85dc7df..55b9e99e8 100644 Binary files a/doc/user_guide/en/images/log-qso.png and b/doc/user_guide/en/images/log-qso.png differ diff --git a/doc/user_guide/en/images/main-ui.png b/doc/user_guide/en/images/main-ui.png index 8268af411..a3c63706f 100644 Binary files a/doc/user_guide/en/images/main-ui.png and b/doc/user_guide/en/images/main-ui.png differ diff --git a/doc/user_guide/en/images/mode-menu.png b/doc/user_guide/en/images/mode-menu.png index 8e63a02e2..b9e5fd272 100644 Binary files a/doc/user_guide/en/images/mode-menu.png and b/doc/user_guide/en/images/mode-menu.png differ diff --git a/doc/user_guide/en/images/reporting.png b/doc/user_guide/en/images/reporting.png index 59bd78f3d..4cced8bb4 100644 Binary files a/doc/user_guide/en/images/reporting.png and b/doc/user_guide/en/images/reporting.png differ diff --git a/doc/user_guide/en/images/settings-general.png b/doc/user_guide/en/images/settings-general.png index 70d3ae233..6971060e1 100644 Binary files a/doc/user_guide/en/images/settings-general.png and b/doc/user_guide/en/images/settings-general.png differ diff --git a/doc/user_guide/en/images/view-menu.png b/doc/user_guide/en/images/view-menu.png index cb329215a..3f3fc0486 100644 Binary files a/doc/user_guide/en/images/view-menu.png and b/doc/user_guide/en/images/view-menu.png differ diff --git a/doc/user_guide/en/introduction.adoc b/doc/user_guide/en/introduction.adoc index c1345f685..8f749b7fa 100644 --- a/doc/user_guide/en/introduction.adoc +++ b/doc/user_guide/en/introduction.adoc @@ -8,45 +8,44 @@ as an extended branch of an earlier program, _WSJT_, first released in 2001. Bill Somerville, G4WJS, and Steve Franke, K9AN, have been major contributors to development of _WSJT-X_ since 2013 and 2015, respectively. -_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} offers twelve +_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} offers eleven different protocols or modes: *FST4*, *FT4*, *FT8*, *JT4*, *JT9*, -*JT65*, *QRA64*, *ISCAT*, *MSK144*, *WSPR*, *FST4W*, and *Echo*. The +*JT65*, *Q65*, *MSK144*, *WSPR*, *FST4W*, and *Echo*. The first seven are designed for making reliable QSOs under weak-signal conditions. They use nearly identical message structure and source -encoding. JT65 and QRA64 were designed for EME ("`moonbounce`") on -the VHF/UHF bands and have also proven very effective for worldwide -QRP communication on the HF bands. QRA64 has some advantages over -JT65, including better performance for EME on the higher microwave -bands. JT9 was originally designed for the HF and lower bands. Its -submode JT9A is 1 dB more sensitive than JT65 while using less than -10% of the bandwidth. JT4 offers a wide variety of tone spacings and -has proven highly effective for EME on microwave bands up to 24 GHz. -These four "`slow`" modes use one-minute timed sequences of -alternating transmission and reception, so a minimal QSO takes four to -six minutes — two or three transmissions by each station, one sending -in odd UTC minutes and the other even. FT8 is operationally similar -but four times faster (15-second T/R sequences) and less sensitive by -a few dB. FT4 is faster still (7.5 s T/R sequences) and especially -well-suited for radio contesting. FST4 was added to _WSJT-X_ in -version 2.3.0. It is intended especially for use on the LF and MF -bands, and already during its first few months of testing -intercontinental paths have been spanned many times on the 2200 and -630 m bands. Further details can be found in the following section, -<>. On the HF bands, -world-wide QSOs are possible with any of these modes using power -levels of a few watts (or even milliwatts) and compromise antennas. -On VHF bands and higher, QSOs are possible (by EME and other -propagation types) at signal levels 10 to 15 dB below those required -for CW. +encoding. JT65 was designed for EME ("`moonbounce`") on VHF and +higher bands and is mostly used for that purpose today. Q65 replaces +an earlier mode, QRA64. Q65 is particularly effective for tropospheric +scatter, rain scatter, ionospheric scatter, TEP, and EME on VHF and +higher bands, as well as other types of fast-fading signals. JT9 was +originally designed for the HF and lower bands. Its submode JT9A is 1 +dB more sensitive than JT65 while using less than 10% of the +bandwidth. JT4 offers a wide variety of tone spacings and has proven +highly effective for EME on microwave bands up to 24 GHz. These four +"`slow`" modes use one-minute timed sequences of alternating +transmission and reception, so a minimal QSO takes four to six minutes +— two or three transmissions by each station, one sending in odd UTC +minutes and the other even. FT8 is operationally similar but four +times faster (15-second T/R sequences) and less sensitive by a few dB. +FT4 is faster still (7.5 s T/R sequences) and especially well-suited +for radio contesting. FST4 was added to _WSJT-X_ in version 2.3.0. +It is intended especially for use on the LF and MF bands, and already +during its first few months of testing intercontinental paths have +been spanned many times on the 2200 and 630 m bands. Further details +can be found in the following section, <>. On the HF bands, world-wide QSOs are possible with +any of these modes using power levels of a few watts (or even +milliwatts) and compromise antennas. On VHF bands and higher, QSOs +are possible (by EME, scatter, and other propagation types) at signal +levels 10 to 15 dB below those required for CW. -*ISCAT*, *MSK144*, and optionally submodes *JT9E-H* are "`fast`" +*MSK144*, and optionally submodes *JT9E-H* are "`fast`" protocols designed to take advantage of brief signal enhancements from ionized meteor trails, aircraft scatter, and other types of scatter propagation. These modes use timed sequences of 5, 10, 15, or 30 s duration. User messages are transmitted repeatedly at high rate (up to 250 characters per second for MSK144) to make good use of the -shortest meteor-trail reflections or "`pings`". ISCAT uses free-form -messages up to 28 characters long, while MSK144 uses the same +shortest meteor-trail reflections or "`pings`". MSK144 uses the same structured messages as the slow modes and optionally an abbreviated format with hashed callsigns. diff --git a/doc/user_guide/en/make-qso.adoc b/doc/user_guide/en/make-qso.adoc index 725bafe73..5bdbc3db7 100644 --- a/doc/user_guide/en/make-qso.adoc +++ b/doc/user_guide/en/make-qso.adoc @@ -60,12 +60,10 @@ or rag-chewing. === Auto-Sequencing -The 15-second T/R cycles of FT8 allow only about two seconds to inspect -decoded messages and decide how to reply, which is often not enough. -The slow modes JT4, JT9, JT65, and QRA64 allow nearly 10 seconds -for this task, but operators may find that this is still insufficient -when workload is high, especially on EME. For these reasons a basic -auto-sequencing feature is offered. +The T/R cycles of many _WSJT-X_ modes allow only a few seconds to +inspect decoded messages and decide how to reply. Often this is not +enough time, so for FST4, FT4, FT8, MSK144, and Q65 the program +offers a basic auto-sequencing feature. Check *Auto Seq* on the main window to enable this feature: @@ -77,7 +75,8 @@ responder to your CQ. NOTE: When *Auto-Seq* is enabled, the program de-activates *Enable Tx* at the end of each QSO. It is not intended that _WSJT-X_ should make -fully automated QSOs. +fully automated QSOs. *Auto-sequencing is an operator aid, not an +operator replacement.* [[CONTEST_MSGS]] === Contest Messages @@ -160,7 +159,7 @@ guidelines for contest logging with FT4, FT8, and MSK144: [[COMP-CALL]] === Nonstandard Callsigns -*FT4, FT8, and MSK144* +*FST4, FT4, FT8, MSK144, and Q65* Compound callsigns like xx/K1ABC or K1ABC/x and special event callsigns like YW18FIFA are supported for normal QSOs but not for @@ -196,7 +195,7 @@ the types of information that can be included in a message. It prevents including your locator in standard messages, which necessarily impairs the usefulness of tools like PSK Reporter. -*JT4, JT9, JT65, and QRA64* +*JT4, JT9, and JT65* In the 72-bit modes, compound callsigns are handled in one of two possible ways: diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index cd7c67869..93a104092 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,34 +1,15 @@ [[NEW_FEATURES]] === New in Version {VERSION} -_WSJT-X 2.3.0_ introduces *FST4* and *FST4W*, new digital protocols -designed particularly for the LF and MF bands. Decoders for these -modes can take advantage of the very small Doppler spreads present at -these frequencies, even over intercontinental distances. As a -consequence, fundamental sensitivities of FST4 and FST4W are better -than other _WSJT-X_ modes with the same sequence lengths, approaching -the theoretical limits for their rates of information throughput. The -FST4 protocol is optimized for two-way QSOs, while FST4W is for -quasi-beacon transmissions of WSPR-style messages. FST4 and FST4W do -not require the strict, independent phase locking and time -synchronization of modes like EbNaut. +_WSJT-X 2.4.0_ introduces *Q65*, a new digital protocol designed for +minimal two-way QSOs over especially difficult propagation paths. On +paths with Doppler spread more than a few Hz, the weak-signal +performance of Q65 is the best among all WSJT-X modes. -The new modes use 4-GFSK modulation and share common software for -encoding and decoding messages. FST4 offers T/R sequence lengths of -15, 30, 60, 120, 300, 900, and 1800 seconds, while FST4W omits the -lengths shorter than 120 s. Submodes are given names like FST4-60, -FST4W-300, etc., the appended numbers indicating sequence length in -seconds. Message payloads contain either 77 bits, as in FT4, FT8, and -MSK144, or 50 bits for the WSPR-like messages of FST4W. Message -formats displayed to the user are like those in the other 77-bit and -50-bit modes in _WSJT-X_. Forward error correction uses a low density -parity check (LDPC) code with 240 information and parity bits. -Transmissions consist of 160 symbols: 120 information-carrying symbols -of two bits each, interspersed with five groups of eight predefined -synchronization symbols. - -*We recommend that on the 2200 and 630 m bands FST4 should replace JT9 -for making 2-way QSOs, and FST4W should replace WSPR for propagation -tests*. Operating conventions on these LF and MF bands will -eventually determine the most useful T/R sequence lengths for each -type of operation. +Q65 uses message formats and sequencing identical to those used in +FST4, FT4, FT8, and MSK144. Submodes are provided with a wide variety +of tone spacings and T/R sequence lengths 15, 30, 60, 120, and 300 s. +A new, highly reliable list-decoding technique is used for messages +that contain previously copied message fragments. Message averaging +is provided for situations where single transmissions are too weak or +signal enhancements too sparse for a signal to be decoded. diff --git a/doc/user_guide/en/protocols.adoc b/doc/user_guide/en/protocols.adoc index ae3b78478..dbfc0732a 100644 --- a/doc/user_guide/en/protocols.adoc +++ b/doc/user_guide/en/protocols.adoc @@ -3,9 +3,9 @@ [[PROTOCOL_OVERVIEW]] === Overview -All QSO modes except ISCAT use structured messages that compress -user-readable information into fixed-length packets. JT4, JT9, JT65, -and QRA64 use 72-bit payloads. Standard messages consist of two +All QSO modes use structured messages that compress +user-readable information into fixed-length packets. JT4, JT9, and JT65 +use 72-bit payloads. Standard messages consist of two 28-bit fields normally used for callsigns and a 15-bit field for a grid locator, report, acknowledgment, or 73. An additional bit flags a message containing arbitrary free text, up to 13 characters. @@ -14,7 +14,7 @@ Special cases allow other information such as add-on callsign prefixes aim is to compress the most common messages used for minimally valid QSOs into a fixed 72-bit length. -Information payloads for FST4, FT4, FT8, and MSK144 contain 77 bits. +Information payloads for FST4, FT4, FT8, Q65, and MSK144 contain 77 bits. The 5 additional bits are used to flag special message types used for nonstandard callsigns, contest exchanges, FT8 DXpedition Mode, and a few other possibilities. Full details have been published in QEX, see @@ -169,25 +169,25 @@ same as that of the sync tone used in long messages, and the frequency separation is 110250/4096 = 26.92 Hz multiplied by n for JT65A, with n = 2, 3, 4 used to convey the messages RO, RRR, and 73, respectively. -[[QRA64_PROTOCOL]] -==== QRA64 +[[Q65_PROTOCOL]] +==== Q65 -QRA64 is intended for EME and other extreme weak-signal applications. -Its internal code was designed by IV3NWV. The protocol uses a (63,12) -**Q**-ary **R**epeat **A**ccumulate code that is inherently better -than the Reed Solomon (63,12) code used in JT65, yielding a 1.3 dB -advantage. A new synchronizing scheme is based on three 7 x 7 Costas -arrays. This change yields another 1.9 dB advantage. +Q65 is intended for scatter, EME, and other extreme weak-signal +applications. Forward error correction (FEC) uses a specially +designed (65,15) block code with six-bit symbols. Two symbols are +“punctured” from the code, yielding an effective (63,13) code with a +payload of k = 13 information symbols conveyed by n = 63 channel +symbols. The punctured symbols consist of a 12-bit CRC computed from +the 13 information symbols. The CRC is used to reduce the +false-decode rate to a very low value. A 22-symbol pseudo-random +sequence spread throughout a transmission is sent as “tone 0” and used +for synchronization. The total number of channel symbols in a Q65 +transmission is thus 63 + 22 = 85. -In most respects the current implementation of QRA64 is operationally -similar to JT65. QRA64 does not use two-tone shorthand messages, and -it makes no use of a callsign database. Rather, additional -sensitivity is gained by making use of already known information as a -QSO progresses -- for example, when reports are being exchanged and -you have already decoded both callsigns in a previous transmission. -QRA64 presently offers no message averaging capability, though that -feature may be added. In early tests, many EME QSOs were made using -submodes QRA64A-E on bands from 144 MHz to 24 GHz. +For each T/R sequence length, submodes A - E have tone spacings and +occupied bandwidths 1, 2, 4, 8, and 16 times those specified in the +above table. Full submode designations include a number for sequence +length and a letter for tone spacing, as in Q65-15A, Q65-120C, etc. [[WSPR_PROTOCOL]] ==== WSPR @@ -277,8 +277,12 @@ which the probability of decoding is 50% or higher. |FT8 |LDPC |(174,91)| 8| 8-GFSK| 6.25 | 50.0 | 0.27| 12.6 | -21 |JT4A |K=32, r=1/2|(206,72)| 2| 4-FSK| 4.375| 17.5 | 0.50| 47.1 | -23 |JT9A |K=32, r=1/2|(206,72)| 8| 9-FSK| 1.736| 15.6 | 0.19| 49.0 | -26 -|JT65A |Reed Solomon|(63,12) |64|65-FSK| 2.692| 177.6 | 0.50| 46.8 | -25 -|QRA64A|Q-ary Repeat Accumulate|(63,12) |64|64-FSK|1.736|111.1|0.25|48.4| -26 +|JT65A |RS|(63,12) |64|65-FSK| 2.692| 177.6 | 0.50| 46.8 | -25 +|Q65-15A |QRA|(63,13) |64|65-FSK|6.667|433|0.26| 12.8| -22.2 +|Q65-30A |QRA|(63,13) |64|65-FSK|3.333|217|0.26| 25.5| -24.8 +|Q65-60A |QRA|(63,13) |64|65-FSK|1.667|108|0.26| 51.0| -27.6 +|Q65-120A|QRA|(63,13) |64|65-FSK|0.750| 49|0.26|113.3| -30.8 +|Q65-300A|QRA|(63,13) |64|65-FSK|0.289| 19|0.26|293.8| -33.8 | WSPR |K=32, r=1/2|(162,50)| 2| 4-FSK| 1.465| 5.9 | 0.50|110.6 | -31 |FST4W-120 |LDPC | (240,74)| 4| 4-GFSK| 1.46 | 5.9 | 0.25| 109.3 | -32.8 |FST4W-300 |LDPC | (240,74)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -36.8 @@ -286,14 +290,18 @@ which the probability of decoding is 50% or higher. |FST4W-1800 |LDPC | (240,74)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -44.8 |=============================================================================== -Submodes of JT4, JT9, JT65, and QRA64 offer wider tone spacings for + LDPC = Low Density Parity Check + RS = Reed Solomon + QRA = Q-ary Repeat Accumulate + +Submodes of JT4, JT9, and JT65 offer wider tone spacings for circumstances that may require them, such as significant Doppler spread. Table 8 summarizes the tone spacings, bandwidths, and approximate threshold sensitivities of the various submodes when spreading is comparable to tone spacing. [[SLOW_SUBMODES]] -.Parameters of Slow Submodes with Selectable Tone Spacings +.Parameters of Slow Submodes JT4, JT9, and JT65 with Selectable Tone Spacings [width="50%",cols="h,3*^",frame=topbot,options="header"] |===================================== |Mode |Tone Spacing |BW (Hz)|S/N (dB) @@ -315,56 +323,22 @@ comparable to tone spacing. |JT65A |2.692| 177.6 |-25 |JT65B |5.383| 352.6 |-25 |JT65C |10.767| 702.5 |-25 -|QRA64A|1.736| 111.1 |-26 -|QRA64B|3.472| 220.5 |-25 -|QRA64C|6.944| 439.2 |-24 -|QRA64D|13.889| 876.7 |-23 -|QRA64E|27.778|1751.7 |-22 +|===================================== + +.Parameters of Q65 Submodes +[width="100%",cols="h,5*^",frame=topbot,options="header"] +|===================================== +|T/R Period (s) |A Spacing Width (Hz)|B Spacing Width (Hz)|C Spacing Width (Hz)|D Spacing Width (Hz)|E Spacing Width (Hz) +|15|6.67     4.33|13.33     867|26.67     1733|N/A|N/A +|30|3.33     217|6.67     433|13.33     867| 26.67     1733| N/A +|60|1.67     108|3.33     217|6.67     433|13.33     867|26.67     1733 +|120|0.75     49|1.50     98|3.00     195|6.00     390| 12.00     780 +|300|0.29     19|0.58     38|1.16     75|2.31     150|4.63     301 |===================================== [[FAST_MODES]] === Fast Modes -==== ISCAT - -ISCAT messages are free-form, up to 28 characters in length. -Modulation is 42-tone frequency-shift keying at 11025 / 512 = 21.533 -baud (ISCAT-A), or 11025 / 256 = 43.066 baud (ISCAT-B). Tone -frequencies are spaced by an amount in Hz equal to the baud rate. The -available character set is: - ----- - 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /.?@- ----- - -Transmissions consist of sequences of 24 symbols: a synchronizing -pattern of four symbols at tone numbers 0, 1, 3, and 2, followed by -two symbols with tone number corresponding to (message length) and -(message length + 5), and, finally, 18 symbols conveying the user's -message, sent repeatedly character by character. The message always -starts with `@`, the beginning-of-message symbol, which is not -displayed to the user. The sync pattern and message-length indicator -have a fixed repetition period, recurring every 24 symbols. Message -information occurs periodically within the 18 symbol positions set -aside for its use, repeating at its own natural length. - -For example, consider the user message `CQ WA9XYZ`. Including the -beginning-of-message symbol `@`, the message is 10 characters long. -Using the character sequence displayed above to indicate tone numbers, -the transmitted message will therefore start out as shown in the first -line below: - ----- - 0132AF@CQ WA9XYZ@CQ WA9X0132AFYZ@CQ WA9XYZ@CQ W0132AFA9X ... - sync## sync## sync## ----- - -Note that the first six symbols (four for sync, two for message -length) repeat every 24 symbols. Within the 18 information-carrying -symbols in each 24, the user message `@CQ WA9XYZ` repeats at its own -natural length, 10 characters. The resulting sequence is extended as -many times as will fit into a Tx sequence. - ==== JT9 The JT9 slow modes all use keying rate 12000/6912 = 1.736 baud. By contrast, with @@ -419,8 +393,6 @@ and your QSO partner ± 200 Hz. |===================================================================== |Mode |FEC Type |(n,k) | Q|Modulation Type|Keying rate (Baud) |Bandwidth (Hz)|Sync Energy|Tx Duration (s) -|ISCAT-A | - | - |42|42-FSK| 21.5 | 905 | 0.17| 1.176 -|ISCAT-B | - | - |42|42-FSK| 43.1 | 1809 | 0.17| 0.588 |JT9E |K=32, r=1/2|(206,72)| 8| 9-FSK| 25.0 | 225 | 0.19| 3.400 |JT9F |K=32, r=1/2|(206,72)| 8| 9-FSK| 50.0 | 450 | 0.19| 1.700 |JT9G |K=32, r=1/2|(206,72)| 8| 9-FSK|100.0 | 900 | 0.19| 0.850 diff --git a/doc/user_guide/en/settings-colors.adoc b/doc/user_guide/en/settings-colors.adoc index fd47c2988..125846007 100644 --- a/doc/user_guide/en/settings-colors.adoc +++ b/doc/user_guide/en/settings-colors.adoc @@ -18,6 +18,13 @@ image::colors.png[align="center",alt="Colors Screen"] * Check *Highlight by Mode* if you wish worked before status to be per <>. +* Check *Only grid Fields sought* if you are only interested in the + leading two character grid locator Fields rather than teh four + character grid locator Squares. + +* Check *Include extra WAE entities* if you are interested in the + extra entities defined for DARC WAE and CQ Marathon awards. + * Worked before status is calculated from your _WSJT-X_ ADIF <> file, you may replace ADIF log file with one exported from your station logging application, *Rescan ADIF Log* diff --git a/doc/user_guide/en/settings-radio.adoc b/doc/user_guide/en/settings-radio.adoc index e61d0998b..fe922fd17 100644 --- a/doc/user_guide/en/settings-radio.adoc +++ b/doc/user_guide/en/settings-radio.adoc @@ -96,5 +96,6 @@ green to indicate that proper communication has been established. Failure of the CAT-control test turns the button red and displays an error message. After a successful CAT test, toggle the *Test PTT* button to confirm that your selected method of T/R control is working -properly. (If you selected *VOX* for _PTT Method_, you can test T/R +properly, the button turns red if the rig has been successfully +keyed. (If you selected *VOX* for _PTT Method_, you can test T/R switching later by using the *Tune* button on the main window.) diff --git a/doc/user_guide/en/settings-reporting.adoc b/doc/user_guide/en/settings-reporting.adoc index 4c74b50b8..b3bc758d8 100644 --- a/doc/user_guide/en/settings-reporting.adoc +++ b/doc/user_guide/en/settings-reporting.adoc @@ -19,6 +19,10 @@ QRZ messages. Full details of the protocol can be found in comments at the top of this file in our source code repository: https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/Network/NetworkMessage.hpp +NOTE: The *Outgoing interfaces* and *Multicast TTL* fields are only + present when a multicast group IP address has been entered in + the *UDP Server* field. + Programs like _JTAlert_ use the _UDP Server_ feature to obtain information about running _WSJT-X_ instances. If you are using _JTAlert_ to control _WSJT-X_, be sure to check the diff --git a/doc/user_guide/en/settings-txmacros.adoc b/doc/user_guide/en/settings-txmacros.adoc index 31493c4b6..a0ffc9ba2 100644 --- a/doc/user_guide/en/settings-txmacros.adoc +++ b/doc/user_guide/en/settings-txmacros.adoc @@ -16,6 +16,5 @@ characters) in the entry field at top, then click *Add*. - You can reorder your macro messages by using drag-and-drop. The new order will be preserved when _WSJT-X_ is restarted. -- Messages can also be added from the main window's *Tx5* field on Tab -1 or the *Free msg* field on Tab 2. Simply hit [Enter] after the -message has been entered. +- Messages can also be added from the main window's *Tx5* + field. Simply hit [Enter] after the message has been entered. diff --git a/doc/user_guide/en/transceiver-setup.adoc b/doc/user_guide/en/transceiver-setup.adoc index d0d53ba53..13fdb5b99 100644 --- a/doc/user_guide/en/transceiver-setup.adoc +++ b/doc/user_guide/en/transceiver-setup.adoc @@ -31,7 +31,7 @@ TIP: The PC audio mixer normally has two sliders, one for each conventional JT65 and JT9 sub-bands simultaneously on most HF bands. Further details are provided in the <>. A wider displayed bandwidth may also be helpful at VHF - and above, where FT8, JT4, JT65, and QRA64 signals may be found over + and above, where FT8, JT4, JT65, and Q65 signals may be found over much wider ranges of frequencies. - If you have only a standard SSB filter you won’t be able to display diff --git a/doc/user_guide/en/tutorial-example5.adoc b/doc/user_guide/en/tutorial-example5.adoc index 3b979ce5f..db4e81f66 100644 --- a/doc/user_guide/en/tutorial-example5.adoc +++ b/doc/user_guide/en/tutorial-example5.adoc @@ -1,5 +1,19 @@ Do not confuse FST4 with FT4, which has a very different purpose! -FST4 is is designed for making 2-way QSOs on the LF and MF bands. +FST4 is designed primarily for making weak-signal 2-way QSOs on the +LF and MF bands. T/R periods from 15 s up to 1800 s are +available. Longer T/R periods provide better sensitivity only if +Tx and Rx frequency instability and channel Doppler spread +are small enough so that received signals +remain phase coherent over periods spanning several transmitted symbols. +Generally speaking, Rx and Tx frequency changes +during the transmission and channel Doppler spread should each be small compared +to the symbol keying rate shown for each T/R duration in Table 7 within section +<>. For example, the keying rate for +the 1800 s T/R period is 0.089 Baud, so +successful operation using this T/R length requires Tx and Rx frequency +stability better than 0.089 Hz over the duration of the 1800 s transmission in +addition to channel Doppler spread smaller than 0.089 Hz. + Operation with FST4 is similar to that with other _WSJT-X_ modes: most on-screen controls, auto-sequencing, and other features behave in familiar ways. However, operating conventions on the 2200 and 630 m @@ -21,3 +35,26 @@ decoding process (and of course will be undecodable). By checking further limit the decoding range to the setting of *F Tol* on either side of *Rx Freq*. +A noise blanker can be enabled by setting the *NB* percentage to a non-zero value. +This setting determines how many of the largest-amplitude samples will be +blanked (zeroed) before the data is submitted to the decoder. Most users find +that settings between 0% (no blanking) and 10% work best. If the noise +blanker percentage is set to -1%, then the decoder will try 0, 5, 10, 15, and 20 % +in succession. Similarly, a setting of -2% causes the decoder to loop over +blanking percentages 0, 2, 4, ... 20 %. To save time, the multiple blanking +percentages triggered by negative *NB* settings are tried only for signal +candidates located near (within +/- 20 Hz) of the *Rx* frequency setting. + +.Open a sample Wave File: + +- Select *FST4* on the *Mode* menu. Set *T/R* to 60 s and *Decode | Deep*. +- Set *NB* (noise blanker) to 0%. +- Set up the Wide Graph display with settings appropriate for the FST4-60 mode. +For example, try *Bins/Pixel* 2 and *N Avg* 4. Set the *Start* frequency and the width of +the Wide Graph to include the frequency range that you want to decode. For this +example, make sure that *Start* is less than 1000 Hz and that the Wide Graph extends to above 1400 Hz. +- Set *F Low* 1000, *F High* 1400. These settings define the decoder's frequency search range. +- Open a sample Wave file using *File | Open* and select the file +...\save\samples\FST4+FST4W\210115_0058.wav. After _WSJT-X_ has processed the file you should see something similar to the following screen shot: + +image::FST4-1.png[align="left"] diff --git a/doc/user_guide/en/tutorial-example6.adoc b/doc/user_guide/en/tutorial-example6.adoc index 4fe4804e3..88838b5d5 100644 --- a/doc/user_guide/en/tutorial-example6.adoc +++ b/doc/user_guide/en/tutorial-example6.adoc @@ -1,5 +1,5 @@ FST4W is used in the same way as WSPR, but FST4W has significant -advantages for use on the 2200 and 630 m bands. By default the +advantages for use on the 2200 m and 630 m bands. By default the central *Rx Freq* is 1500 Hz and *F Tol* is 100 Hz, so the active decoding range is 1400 to 1600 Hz. However, for added flexibility you can select different center frequencies and *F Tol* values. We expect @@ -16,3 +16,19 @@ If three operators agree in advance to select the options *1/3*, a fixed sequence with no two stations transmitting simultaneously. Sequence 1 is the first sequence after 00:00 UTC. For WSPR-like scheduling behavior, you should select *Random* with this control. + +.Open a Wave File: + +- Select *FST4W* on the *Mode* menu. Set *T/R* to 1800 s and *Decode | Deep*. +- Set *NB* to 0%. +- Select appropriate wide graph settings. For example, try *Bins/Pixel* 1, +*Start* 1200 Hz and *N Avg* 150. +- Open a sample Wave file using *File | Open* and select the file +...\save\samples\FST4+FST4W\201230_0300.wav. +When it is finished you should see a single decode as shown in the +screenshot: + +image::FST4W-1.png[align="left"] + +Note that the weak signal associated with the single decode is all but invisible on the +widegraph spectrogram. diff --git a/doc/user_guide/en/tutorial-main-window.adoc b/doc/user_guide/en/tutorial-main-window.adoc index c585b1f6a..2abd82aed 100644 --- a/doc/user_guide/en/tutorial-main-window.adoc +++ b/doc/user_guide/en/tutorial-main-window.adoc @@ -13,9 +13,6 @@ and *Page Up/Down* key presses, with the *Page* keys moving the controls in larger steps. You can also type numbers directly into the spinner controls or use the mouse wheel. -- Select *Tab 2* (below the *Decode* button) to choose the alternative -set of controls for generating and selecting Tx messages. - [[DOWNLOAD_SAMPLES]] === Download Samples diff --git a/doc/user_guide/en/utilities.adoc b/doc/user_guide/en/utilities.adoc index deb27c43f..6f0fc7b0e 100644 --- a/doc/user_guide/en/utilities.adoc +++ b/doc/user_guide/en/utilities.adoc @@ -89,25 +89,6 @@ You will discover that every possible JT65 message differs from every other possible JT65 message in at least 52 of the 63 information-carrying channel symbols. -Here's an example using the QRA64 mode: - - C:\WSJTX\bin qra64code "KA1ABC WB9XYZ EN37" - Message Decoded Err? Type - -------------------------------------------------------------------------- - 1 KA1ABC WB9XYZ EN37 KA1ABC WB9XYZ EN37 1: Std Msg - - Packed message, 6-bit symbols 34 16 49 32 51 26 31 40 41 22 0 41 - - Information-carrying channel symbols - 34 16 49 32 51 26 31 40 41 22 0 41 16 46 14 24 58 45 22 45 38 54 7 23 2 49 32 50 20 33 - 55 51 7 31 31 46 41 25 55 14 62 33 29 24 2 49 4 38 15 21 1 41 56 56 16 44 17 30 46 36 - 23 23 41 - - Channel symbols including sync - 20 50 60 0 40 10 30 34 16 49 32 51 26 31 40 41 22 0 41 16 46 14 24 58 45 22 45 38 54 7 - 23 2 49 32 50 20 33 55 51 20 50 60 0 40 10 30 7 31 31 46 41 25 55 14 62 33 29 24 2 49 - 4 38 15 21 1 41 56 56 16 44 17 30 46 36 23 23 41 20 50 60 0 40 10 30 - Execution of any of these utility programs with "-t" as the only command-line argument produces examples of all supported message types. For example, using `jt65code -t`: diff --git a/doc/user_guide/en/vhf-features.adoc b/doc/user_guide/en/vhf-features.adoc index 6349500bf..4d8aa3686 100644 --- a/doc/user_guide/en/vhf-features.adoc +++ b/doc/user_guide/en/vhf-features.adoc @@ -11,12 +11,11 @@ higher bands. These features include: - *JT65*, widely used for EME on VHF and higher bands -- *QRA64*, another mode for EME +- *Q65*, for ionospheric scatter, tropospheric scatter, rain scatter, +TEP, and EME - *MSK144*, for meteor scatter -- *ISCAT*, for aircraft scatter and other types of scatter propagation - - *Echo* mode, for detecting and measuring your own lunar echoes - *Doppler tracking*, which becomes increasingly important for EME @@ -174,55 +173,33 @@ RO, RRR, and 73. image::JT65B.png[align="center",alt="JT65B"] -=== QRA64 +=== Q65 -QRA64 is designed for EME on VHF and higher bands; its -operation is generally similar to JT4 and JT65. The following screen -shot shows an example of a QRA64C transmission from DL7YC recorded at -G3WDG over the EME path at 24 GHz. Doppler spread on the path was 78 -Hz, so although the signal is reasonably strong its tones are -broadened enough to make them hard to see on the waterfall. The -triangular red marker below the frequency scale shows that the decoder -has achieved synchronization with a signal at approximately 967 Hz. +Q65 is designed for propagation paths that produce fast fading +signals: tropospheric scatter, rain scatter, ionospheric scatter, +trans-equatorial propagation (TEP), EME, and the like. The following +screen shot shows an example with submode Q65-30A on a 6-meter +ionospheric scatter path of about 1100 km. -image::QRA64.png[align="center",alt="QRA64"] +image::Q65_6m_ionoscatter.png[align="center",alt="Q65"] -The QRA64 decoder makes no use of a callsign database. Instead, it +The Q65 decoder makes no use of a callsign database. Instead, it takes advantage of _a priori_ (AP) information such as one's own -callsign and the encoded form of message word `CQ`. In normal usage, -as a QSO progresses the available AP information increases to include -the callsign of the station being worked and perhaps also his/her -4-digit grid locator. The decoder always begins by attempting to -decode the full message using no AP information. If this attempt -fails, additional attempts are made using available AP information to -provide initial hypotheses about the message content. At the end of -each iteration the decoder computes the extrinsic probability of the -most likely value for each of the message's 12 six-bit information -symbols. A decode is declared only when the total probability for all -12 symbols has converged to an unambiguous value very close to 1. +callsign and the message word `CQ`. In normal usage, as a QSO +progresses the available AP information increases to include the +callsign of the station being worked and perhaps also his/her 4-digit +grid locator. The decoder takes advantage of whatever AP information +is available. -For EME QSOs some operators use short-form QRA64 messages consisting -of a single tone. To activate automatic generation of these messages, -check the box labeled *Sh*. This also enables the generation of a -single tone at 1000Hz by selecting Tx6, to assist in finding signals -initially, as the QRA64 tones are often not visible on the waterfall. -The box labeled *Tx6* switches the Tx6 message from 1000Hz to 1250Hz -to indicate to the other station that you are ready to receive messages. +For Q65 EME QSOs, particularly on the micriowave bands, some operators +use short-form messages consisting of a single tone. To activate +automatic generation of these messages, check the box labeled *Sh*. +This also enables the generation of a single tone at 1000Hz by +selecting Tx6, to assist in finding signals initially. The box +labeled *Tx6* switches the Tx6 message from 1000Hz to 1250Hz to +indicate to the other station that you are ready to receive messages. -TIP: QRA64 attempts to find and decode only a single signal in the -receiver passband. If many signals are present, you may be able to -decode them by double-clicking on the lowest tone of each one in the -waterfall. - -TIP: G3WDG has prepared a more detailed tutorial on using {QRA64_EME}. - -=== ISCAT - -ISCAT is a useful mode for signals that are weak but more or less -steady in amplitude over several seconds or longer. Aircraft scatter -at 10 GHz is a good example. ISCAT messages are free-format and may -have any length from 1 to 28 characters. This protocol includes no -error-correction facility. +// TIP: G3WDG has prepared a more detailed tutorial on using {QRA64_EME}. === MSK144 @@ -335,21 +312,28 @@ image::echo_144.png[align="center",alt="Echo 144 MHz"] === Tips for EME -Current conventions dictate that digital EME is usually done with -JT65A on the 50 MHz band, JT65B on 144 and 432 MHz, and JT65C on 1296 -MHz. On higher microwave bands typical choices are JT65C or one of +Until the advent of Q65, digital EME has mostly been done using JT65A +on the 50 MHz band, JT65B on 144 and 432 MHz, and JT65C on 1296 MHz. +On higher microwave bands typical choices have been JT65C or one of the wider QRA64 or JT4 submodes, depending on the expected amount of -Doppler spread. JT4 and JT65 offer message *Averaging* -- the -summation of subsequent transmissions that convey the same message -- -to enable decodes at signal-to-noise ratios several dB below the -threshold for single transmissions. These modes also allow *Deep -Search* decoding, in which the decoder hypothesizes messages -containing known or previously decoded callsigns and tests them for -reliability using a correlation algorithm. Finally, JT65 and QRA64 -offer _a priori_ (AP) decoding, which takes advantage of naturally -accumulating information during a QSO. The following tutorial aims to -familiarize you with these program features, all of which are of -special interest for EME and other extreme weak-signal conditions. +Doppler spread. We now recommend a suitable submodes of Q65 for EME +on all bands: for example, Q65-60A on 50 and 144 MHz, -60B on +432 MHz, -60C on 1296 MHz, and -60D on 10 GHz. + +JT4, JT65, and Q65 offer *Message Averaging* -- the summation of +subsequent transmissions that convey the same message -- to enable +decodes at signal-to-noise ratios several dB below the threshold for +single transmissions. JT4 and JT65 also allow *Deep Search* decoding, +in which the decoder hypothesizes messages containing known or +previously decoded callsigns and tests them for reliability using a +correlation algorithm. JT65 and Q65 offer _a priori_ (AP) +decoding, which takes advantage of naturally accumulating information +during a QSO. + +//// +The following tutorial aims to familiarize you with +these program features, all of which are of special interest for EME +and other extreme weak-signal conditions. As a starting point, configure _WSJT-X_ as follows: @@ -381,7 +365,7 @@ decode*, *Decode after EME delay* .Wide Graph: -- *Bins/Pixel* = 3, *N Avg* = 10 +- *Bins/Pixel* = 4, *N Avg* = 10 - Adjust the width of the window so that the frequency range extends up to at least 2400 Hz. @@ -437,3 +421,5 @@ You might wish to experiment with other combinations of entries for options of the *Decode* menu on and off. For best sensitivity, most users will want to use *Deep* decoding with *Enable averaging*, *Enable deep search*, and *Enable AP* all turned on. + +//// \ No newline at end of file diff --git a/doc/user_guide/en/wsjtx-main.adoc b/doc/user_guide/en/wsjtx-main.adoc index b6acd256f..7ccc16857 100644 --- a/doc/user_guide/en/wsjtx-main.adoc +++ b/doc/user_guide/en/wsjtx-main.adoc @@ -119,6 +119,15 @@ In macOS, enter the following command from a terminal: open /Applications/wsjtx.app --args -stylesheet :/qdarkstyle/style.qss +In Linux using the Unity or GNOME GUI the following commands will +update the _WSJT-X_ start up: + +.... +sed '/Exec=wsjtx/ s/$/ -stylesheet :\/qdarkstyle\/style.qss/' \ + /usr/share/applications/wsjtx.desktop >~/.local/share/applications/wsjtx.desktop +update-desktop-database ~/.local/share/applications/ +.... + Depending on your operating system, the main _WSJT-X_ window will look something like this: @@ -193,7 +202,7 @@ include::wspr.adoc[] include::controls-functions-menus.adoc[] [[CONTROLS_MAIN]] -=== Button Row + === Button Row include::controls-functions-main-window.adoc[] [[CONTROLS_LEFT]] diff --git a/example_log_configurations/wsjtx_log_config.ini.rig_control b/example_log_configurations/wsjtx_log_config.ini.rig_control index 0bcb82066..bcf981b30 100644 --- a/example_log_configurations/wsjtx_log_config.ini.rig_control +++ b/example_log_configurations/wsjtx_log_config.ini.rig_control @@ -7,7 +7,7 @@ TargetFileName="${AppLocalDataLocation}/logs/wsjtx_syslog_%Y-%m.log" RotationTimePoint="01 00:00:00" Append=true EnableFinalRotation=false -MaxSize=41943040 +MaxSize=52428800 MinFreeSpace=1073741824 MaxFiles=12 Target="${AppLocalDataLocation}/logs" diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 5a254a56b..6422cfd96 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -368,7 +368,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) endif if(params%nmode.ne.8 .or. params%nzhsym.eq.50 .or. & .not.params%ndiskdat) then - + write(*,1010) nsynced,ndecoded,navg0 1010 format('',2i4,i9) call flush(6) @@ -806,7 +806,7 @@ contains select type(this) type is (counting_q65_decoder) - if(idec.gt.0) this%decoded = this%decoded + 1 + if(idec.ge.0) this%decoded = this%decoded + 1 end select return diff --git a/lib/fast_decode.f90 b/lib/fast_decode.f90 index d32314b93..30384b0aa 100644 --- a/lib/fast_decode.f90 +++ b/lib/fast_decode.f90 @@ -86,13 +86,6 @@ subroutine fast_decode(id2,narg,trperiod,line,mycall_12, & endif jz=ib-ia+1 line(1:100)(1:1)=char(0) - if(npick.eq.2) then - call iscat(cdat2(ia),jz,3,40,t2,pick,cfile6,minsync,ntol, & - mousebutton,mode4,nafc,ndebug,psavg,nmax,nlines,line) - else - call iscat(cdat(ia),jz,3,40,t2,pick,cfile6,minsync,ntol, & - mousebutton,mode4,nafc,ndebug,psavg,maxlines,nlines,line) - endif 900 return end subroutine fast_decode diff --git a/lib/fst4_decode.f90 b/lib/fst4_decode.f90 index b58b270e7..64fc207dd 100644 --- a/lib/fst4_decode.f90 +++ b/lib/fst4_decode.f90 @@ -614,7 +614,7 @@ contains endif call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, & iaptype,qual,ntrperiod,lwspr,fmid,w50) - if(iwspr.eq.0 .and. nb.lt.0) go to 900 +! if(iwspr.eq.0 .and. nb.lt.0) go to 900 goto 800 endif enddo ! metrics diff --git a/lib/ft4/ft4code.f90 b/lib/ft4/ft4code.f90 index a7b2ccdd2..dae552450 100644 --- a/lib/ft4/ft4code.f90 +++ b/lib/ft4/ft4code.f90 @@ -65,7 +65,8 @@ program ft4code if(i3.eq.2) msgtype="EU VHF Contest" if(i3.eq.3) msgtype="ARRL RTTY Roundup" if(i3.eq.4) msgtype="Nonstandard calls" - if(i3.ge.5) msgtype="Undefined msg type" + if(i3.eq.5) msgtype="EU VHF Contest" + if(i3.ge.6) msgtype="Undefined msg type" if(i3.ge.1) n3=-1 bad=" " comment=' ' diff --git a/lib/ft8/ft8code.f90 b/lib/ft8/ft8code.f90 index 8d5b52799..219fd2e3d 100644 --- a/lib/ft8/ft8code.f90 +++ b/lib/ft8/ft8code.f90 @@ -64,7 +64,8 @@ program ft8code if(i3.eq.2) msgtype="EU VHF Contest" if(i3.eq.3) msgtype="ARRL RTTY Roundup" if(i3.eq.4) msgtype="Nonstandard call" - if(i3.ge.5) msgtype="Undefined type" + if(i3.eq.5) msgtype="EU VHF Contest" + if(i3.ge.6) msgtype="Undefined type" if(i3.ge.1) n3=-1 bad=" " comment=' ' diff --git a/lib/geniscat.f90 b/lib/geniscat.f90 deleted file mode 100644 index 6df6ed981..000000000 --- a/lib/geniscat.f90 +++ /dev/null @@ -1,55 +0,0 @@ -subroutine geniscat(msg,msgsent,itone) - -! Generate an ISCAT waveform. - - parameter (NSZ=1291) - character msg*28,msgsent*28 !Message to be transmitted - integer imsg(30) - integer itone(NSZ) - real*8 sps - character c*42 - integer icos(4) !Costas array - data icos/0,1,3,2/ - data nsync/4/,nlen/2/,ndat/18/ - data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /.?@-'/ - - sps=256.d0*12000.d0/11025.d0 - nsym=int(30*12000.d0/sps) - nblk=nsync+nlen+ndat - - do i=22,1,-1 - if(msg(i:i).ne.' ' .and. msg(i:i).ne.char(0)) exit - enddo - nmsg=i - msglen=nmsg+1 - k=0 - kk=1 - imsg(1)=40 !Always start with BOM char: '@' - do i=1,nmsg !Define the tone sequence - imsg(i+1)=36 !Illegal char set to blank - do j=1,42 - if(msg(i:i).eq.c(j:j)) imsg(i+1)=j-1 - enddo - enddo - - do i=1,nsym !Total symbols in 30 s - j=mod(i-1,nblk)+1 - if(j.le.nsync) then - itone(i)=icos(j) !Insert 4x4 Costas array - else if(j.gt.nsync .and. j.le.nsync+nlen) then - itone(i)=msglen !Insert message-length indicator - if(j.ge.nsync+2) then - n=msglen + 5*(j-nsync-1) - if(n.gt.41) n=n-42 - itone(i)=n - endif - else - k=k+1 - kk=mod(k-1,msglen)+1 - itone(i)=imsg(kk) - endif - enddo - msgsent=msg - - return -end subroutine geniscat diff --git a/lib/iscat.f90 b/lib/iscat.f90 deleted file mode 100644 index 17d1454f5..000000000 --- a/lib/iscat.f90 +++ /dev/null @@ -1,206 +0,0 @@ -subroutine iscat(cdat0,npts0,nh,npct,t2,pick,cfile6,minsync,ntol, & - mousebutton,mode4,nafc,nmore,psavg,maxlines,nlines,line) - -! Decode an ISCAT signal - - parameter (NMAX=30*3101) - parameter (NSZ=4*1400) - character cfile6*6 !File time - character c42*42 - character msg*29,msg1*29,msgbig*29 - character*80 line(100) - character csync*1 - complex cdat0(NMAX) - complex cdat(NMAX) - real s0(288,NSZ) - real fs1(0:41,30) - real psavg(72) !Average spectrum of whole file - integer nsum(30) - integer ntol - integer icos(4) - logical pick,last - data icos/0,1,3,2/ - data nsync/4/,nlen/2/,ndat/18/ - data c42/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /.?@-'/ - save cdat,s0 - - nlines = 0 - fsample=3100.78125 !Sample rate after 9/32 downsampling - nsps=144/mode4 - - bigworst=-1.e30 !Silence compiler warnings ... - bigxsync=0. - bigsig=-1.e30 - msglenbig=0 - ndf0big=0 - nfdotbig=0 - bigt2=0. - bigavg=0. - bigtana=0. - if(nmore.eq.-999) bigsig=-1 !... to here - - last=.false. - do inf=1,6 !Loop over data-segment sizes - nframes=2**inf - if(nframes*24*nsps.gt.npts0) then - nframes=npts0/(24*nsps) - last=.true. - endif - npts=nframes*24*nsps - - do ia=1,npts0-npts,nsps*24 !Loop over start times stepped by 1 frame - ib=ia+npts-1 - cdat(1:npts)=cdat0(ia:ib) - t3=(ia + 0.5*npts)/fsample + 0.9 - if(pick) t3=t2+t3 - -! Compute symbol spectra and establish sync: - call synciscat(cdat,npts,nh,npct,s0,jsym,df,ntol, & - mousebutton,mode4,nafc,psavg,xsync,sig,ndf0,msglen, & - ipk,jpk,idf,df1) - nfdot=nint(idf*df1) - - isync=xsync - if(msglen.eq.0 .or. isync.lt.max(minsync,0)) then - msglen=0 - worst=1. - avg=1. - ndf0=0 - cycle - endif - - ipk3=0 !Silence compiler warning - nblk=nsync+nlen+ndat - fs1=0. - nsum=0 - nfold=jsym/96 - jb=96*nfold - k=0 - n=0 - do j=jpk,jsym,4 !Fold information symbols into fs1 - k=k+1 - km=mod(k-1,nblk)+1 - if(km.gt.6) then - n=n+1 - m=mod(n-1,msglen)+1 - ii=nint(idf*float(j-jb/2)/float(jb)) - do i=0,41 - iii=ii+ipk+2*i - if(iii.ge.1 .and. iii.le.288) fs1(i,m)=fs1(i,m) + s0(iii,j) - enddo - nsum(m)=nsum(m)+1 - endif - enddo - - do m=1,msglen - fs1(0:41,m)=fs1(0:41,m)/nsum(m) - enddo - -! Read out the message contents: - msg= ' ' - msg1=' ' - mpk=0 - worst=9999. - sum=0. - do m=1,msglen - smax=0. - smax2=0. - do i=0,41 - if(fs1(i,m).gt.smax) then - smax=fs1(i,m) - ipk3=i - endif - enddo - do i=0,41 - if(fs1(i,m).gt.smax2 .and. i.ne.ipk3) smax2=fs1(i,m) - enddo - rr=0. - if(smax2.gt.0.0) rr=smax/smax2 - sum=sum + rr - if(rr.lt.worst) worst=rr - if(ipk3.eq.40) mpk=m - msg1(m:m)=c42(ipk3+1:ipk3+1) - enddo - - avg=sum/msglen - if(mpk.eq.1) then - msg=msg1(2:) - else if(mpk.lt.msglen) then - msg=msg1(mpk+1:msglen)//msg1(1:mpk-1) - else - msg=msg1(1:msglen-1) - endif - - ttot=npts/3100.78125 - - if(worst.gt.bigworst) then - bigworst=worst - bigavg=avg - bigxsync=xsync - bigsig=sig - ndf0big=ndf0 - nfdotbig=nfdot - msgbig=msg - msglenbig=msglen - bigt2=t3 - bigtana=nframes*24*nsps/fsample - endif - - isync = xsync - if(avg.gt.2.5 .and. xsync.ge.max(float(minsync),1.5) .and. & - maxlines.ge.2) then - nsig=nint(sig) - nworst=10.0*(worst-1.0) - navg=10.0*(avg-1.0) - if(nworst.gt.10) nworst=10 - if(navg.gt.10) navg=10 - tana=nframes*24*nsps/fsample - csync=' ' - if(isync.ge.1) csync='*' - if(nlines.le.maxlines-1) nlines = nlines + 1 - write(line(nlines),1020) cfile6,isync,nsig,t2,ndf0,nfdot,csync, & - msg(1:28),msglen,navg,nworst,tana,char(0) - endif - enddo - if(last) exit - enddo - - worst=bigworst - avg=bigavg - xsync=bigxsync - sig=bigsig - ndf0=ndf0big - nfdot=nfdotbig - msg=msgbig - msglen=msglenbig - t2=bigt2 - tana=bigtana - - isync=xsync - nworst=10.0*(worst-1.0) - navg=10.0*(avg-1.0) - if(nworst.gt.10) nworst=10 - if(navg.gt.10) navg=10 - - if(navg.le.0 .or. isync.lt.max(minsync,0)) then - msg=' ' - nworst=0 - navg=0 - ndf0=0 - nfdot=0 - sig=-20 - msglen=0 - tana=0. - t2=0. - endif - csync=' ' - if(isync.ge.1) csync='*' - nsig=nint(sig) - - if(nlines.le.maxlines-1) nlines = nlines + 1 - write(line(nlines),1020) cfile6,isync,nsig,t2,ndf0,nfdot,csync,msg(1:28), & - msglen,navg,nworst,tana,char(0) -1020 format(a6,2i4,f5.1,i5,i4,1x,a1,2x,a28,i4,i3,2x,i1,f5.1,a1) - - return -end subroutine iscat diff --git a/lib/jt9.f90 b/lib/jt9.f90 index 9a150dadc..e07fd742e 100644 --- a/lib/jt9.f90 +++ b/lib/jt9.f90 @@ -206,6 +206,12 @@ program jt9 go to 999 endif + if(mycall.eq.'b') mycall=' ' + if(hiscall.eq.'b') then + hiscall=' ' + hisgrid=' ' + endif + if (mode .eq. 241) then ntol = min (ntol, 100) else if (mode .eq. 65 + 9 .and. .not. have_ntol) then diff --git a/lib/msk144code.f90 b/lib/msk144code.f90 index e75ebf3d3..2cb4d6a4d 100644 --- a/lib/msk144code.f90 +++ b/lib/msk144code.f90 @@ -51,7 +51,8 @@ program msk144code if(i3.eq.2) msgtype="EU VHF Contest" if(i3.eq.3) msgtype="ARRL RTTY Roundup" if(i3.eq.4) msgtype="Nonstandard calls" - if(i3.ge.5) msgtype="Undefined msg type" + if(i3.eq.5) msgtype="EU VHF Contest" + if(i3.ge.6) msgtype="Undefined msg type" if(i3.ge.1) n3=-1 if(i4tone(41).lt.0) then msgtype="Sh msg" diff --git a/lib/msk144decodeframe.f90 b/lib/msk144decodeframe.f90 index 24119b9bd..b8bdba28c 100644 --- a/lib/msk144decodeframe.f90 +++ b/lib/msk144decodeframe.f90 @@ -100,7 +100,7 @@ subroutine msk144decodeframe(c,softbits,msgreceived,nsuccess) nsuccess=1 write(c77,'(77i1)') decoded77 read(c77(72:77),'(2b3)') n3,i3 - if( (i3.eq.0.and.(n3.eq.1 .or. n3.eq.3 .or. n3.eq.4 .or. n3.gt.5)) .or. i3.eq.3 .or. i3.gt.4 ) then + if( (i3.eq.0.and.(n3.eq.1 .or. n3.eq.3 .or. n3.eq.4 .or. n3.gt.5)) .or. i3.eq.3 .or. i3.gt.5 ) then nsuccess=0 else call unpack77(c77,1,msgreceived,unpk77_success) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 0bea7d8ee..2d45f1067 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -67,10 +67,10 @@ contains integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain + logical single_decode,lagain,ex complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s - + ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) nfa=nfa0 @@ -79,7 +79,7 @@ contains idec=-1 idf=0 idt=0 - irc=0 + nrc=-2 mode_q65=2**nsubmode npts=ntrperiod*12000 nfft1=ntrperiod*12000 @@ -98,9 +98,8 @@ contains allocate (c00(0:nfft1-1)) allocate (c0(0:nfft1-1)) - if(ntrperiod.eq.15) then - nsps=1800 - else if(ntrperiod.eq.30) then + nsps=1800 + if(ntrperiod.eq.30) then nsps=3600 else if(ntrperiod.eq.60) then nsps=7200 @@ -108,23 +107,26 @@ contains nsps=16000 else if(ntrperiod.eq.300) then nsps=41472 - else - stop 'Invalid TR period' endif baud=12000.0/nsps this%callback => callback nFadingModel=1 + + inquire(file='ndepth.dat',exist=ex) + if(.not.ex) ndepth=iand(ndepth,not(3)) + 1 !Treat any ndepth as "Fast" + maxiters=67 ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) - ibwb=min(10,ibwa+3) + ibwb=min(10,ibwa+4) if(iand(ndepth,3).ge.2) then - ibwa=max(1,int(1.8*log(baud*mode_q65)) + 2) + ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) ibwb=min(10,ibwa+5) else if(iand(ndepth,3).eq.3) then ibwa=max(1,ibwa-1) ibwb=min(10,ibwb+1) + maxiters=100 endif - + ! Generate codewords for full-AP list decoding call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) dgen=0 @@ -175,7 +177,6 @@ contains call timer('q65loops',0) call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) -! idec=-1 !### TEMPORARY ### call timer('q65loops',1) if(idec.ge.0) then dtdec=xdt1 @@ -229,6 +230,7 @@ contains write(c77,1000) dat4(1:12),dat4(13)/2 1000 format(12b6.6,b5.5) call unpack77(c77,0,decoded,unpk77_success) !Unpack to get msgsent + call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) @@ -244,21 +246,22 @@ contains if(c6.eq.' ') c6=' ' c4=hisgrid(1:4) if(c4.eq.' ') c4=' ' - fmt='(i6.4,1x,a4,5i2,3i3,f6.2,f7.1,f7.2,f6.1,f6.2,'// & + fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f6.2,'// & '1x,a6,1x,a6,1x,a4,1x,a)' if(ntrperiod.le.30) fmt(5:5)='6' - write(22,fmt) nutc,cmode,nQSOprogress,idec,idf,idt,ibw,nused, & - icand,ncand,xdt,f0,snr1,snr2,tdecode,mycall(1:6),c6,c4, & - trim(decoded) + if(idec.eq.3) nrc=0 + write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, & + ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,tdecode, & + mycall(1:6),c6,c4,trim(decoded) close(22) endif - else +! else ! Report snr1, even if no decode. - nsnr=db(snr1) - 35.0 - if(nsnr.lt.-35) nsnr=-35 - idec=-1 - call this%callback(nutc,snr1,nsnr,xdt,f0,decoded, & - idec,0,ntrperiod) +! nsnr=db(snr1) - 35.0 +! if(nsnr.lt.-35) nsnr=-35 +! idec=-1 +! call this%callback(nutc,snr1,nsnr,xdt,f0,decoded, & +! idec,0,ntrperiod) endif navg0=1000*navg(0) + navg(1) if(single_decode .or. lagain) go to 900 @@ -309,6 +312,7 @@ contains ! Unpack decoded message for display to user write(c77,1000) dat4(1:12),dat4(13)/2 call unpack77(c77,0,decoded,unpk77_success) !Unpack to get msgsent + call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) @@ -324,12 +328,13 @@ contains if(c6.eq.' ') c6=' ' c4=hisgrid(1:4) if(c4.eq.' ') c4=' ' - fmt='(i6.4,1x,a4,5i2,3i3,f6.2,f7.1,f7.2,f6.1,f6.2,'// & + fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f6.2,'// & '1x,a6,1x,a6,1x,a4,1x,a)' if(ntrperiod.le.30) fmt(5:5)='6' - write(22,fmt) nutc,cmode,nQSOprogress,idec,idf,idt,ibw,nused, & - icand,ncand,xdt,f0,snr1,snr2,tdecode,mycall(1:6),c6,c4, & - trim(decoded) + if(idec.eq.3) nrc=0 + write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, & + ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,tdecode, & + mycall(1:6),c6,c4,trim(decoded) close(22) endif endif diff --git a/lib/qra/q65/q65.c b/lib/qra/q65/q65.c index f47f25fa3..f7701792f 100644 --- a/lib/qra/q65/q65.c +++ b/lib/qra/q65/q65.c @@ -522,7 +522,9 @@ int q65_esnodb_fastfading( } -int q65_decode(q65_codec_ds *pCodec, int* pDecodedCodeword, int *pDecodedMsg, const float *pIntrinsics, const int *pAPMask, const int *pAPSymbols) +int q65_decode(q65_codec_ds *pCodec, int* pDecodedCodeword, int *pDecodedMsg, + const float *pIntrinsics, const int *pAPMask, + const int *pAPSymbols, const int maxiters) { const qracode *pQraCode; float *ix, *ex; @@ -579,7 +581,7 @@ int q65_decode(q65_codec_ds *pCodec, int* pDecodedCodeword, int *pDecodedMsg, co rc = qra_extrinsic( pQraCode, ex, ix, - 100, + maxiters, pCodec->qra_v2cmsg, pCodec->qra_c2vmsg); diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 106df8a3c..30138781b 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -11,13 +11,15 @@ module q65 38,46,50,55,60,62,66,69,74,76,85/) integer codewords(63,206) integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb - integer idf,idt,ibw - integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand + integer idfbest,idtbest,ibw,ndistbest,maxiters + integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc integer i0,j0 integer navg(0:1) logical lnewdat real candidates(20,3) !snr, xdt, and f0 of top candidates - real,allocatable,save :: s1a(:,:,:) !Cumulative symbol spectra + real, allocatable :: s1raw(:,:) !Symbol spectra, 1/8-symbol steps + real, allocatable :: s1(:,:) !Symbol spectra w/suppressed peaks + real, allocatable,save :: s1a(:,:,:) !Cumulative symbol spectra real sync(85) !sync vector real df,dtstep,dtdec,f0dec,ftol @@ -45,7 +47,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ! width Estimated Doppler spread ! dat4(13) Decoded message as 13 six-bit integers ! snr2 Estimated SNR of decoded signal -! idec Flag for decing results +! idec Flag for decoding results ! -1 No decode ! 0 No AP ! 1 "CQ ? ?" @@ -60,7 +62,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & integer dat4(13) character*37 decoded logical first,lclearave - real, allocatable :: s1(:,:) !Symbol spectra, 1/8-symbol steps real, allocatable :: s3(:,:) !Data-symbol energies s3(LL,63) real, allocatable :: ccf1(:) !CCF(freq) at fixed lag (red) real, allocatable :: ccf2(:) !Max CCF(freq) at any lag (orange) @@ -71,6 +72,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ! Set some parameters and allocate storage for large arrays irc=-2 + nrc=-2 idec=-1 snr1=0. dat4=0 @@ -94,13 +96,17 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & enddo endif - allocate(s1(iz,jz)) allocate(s3(-64:LL-65,63)) allocate(ccf1(-ia2:ia2)) allocate(ccf2(iz)) if(LL.ne.LL0 .or. iz.ne.iz0 .or. jz.ne.jz0 .or. lclearave) then + if(allocated(s1raw)) deallocate(s1raw) + allocate(s1raw(iz,jz)) + if(allocated(s1)) deallocate(s1) + allocate(s1(iz,jz)) if(allocated(s1a)) deallocate(s1a) allocate(s1a(iz,jz,0:1)) + s1=0. s1a=0. navg=0 LL0=LL @@ -127,8 +133,9 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & i0=nint(nfqso/df) !Target QSO frequency if(i0-64.lt.1 .or. i0-65+LL.gt.iz) go to 900 !Frequency out of range - call pctile(s1(i0-64:i0-65+LL,1:jz),LL*jz,40,base) + call pctile(s1(i0-64:i0-65+LL,1:jz),LL*jz,45,base) s1=s1/base + s1raw=s1 ! Apply fast AGC to the symbol spectra s1max=20.0 !Empirical choice @@ -233,9 +240,11 @@ subroutine q65_symspec(iwave,nmax,iz,jz,s1) enddo enddo if(lnewdat) then - s1a(:,:,iseq)=s1a(:,:,iseq) + s1 navg(iseq)=navg(iseq) + 1 - endif + ntc=min(navg(iseq),4) !Averaging time constant in sequences + u=1.0/ntc + s1a(:,:,iseq)=u*s1 + (1.0-u)*s1a(:,:,iseq) + endif return end subroutine q65_symspec @@ -263,6 +272,7 @@ subroutine q65_dec_q3(s1,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded) b90=1.72**ibw b90ts=b90/baud call q65_dec1(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) + nrc=irc if(irc.ge.0) then snr2=esnodb - db(2500.0/baud) + 3.0 !Empirical adjustment idec=3 @@ -314,6 +324,7 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) b90=1.72**ibw b90ts=b90/baud call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) + nrc=irc if(irc.ge.0) then snr2=esnodb - db(2500.0/baud) + 3.0 !Empirical adjustment idec=iaptype @@ -486,6 +497,7 @@ subroutine q65_dec1(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) else irc=-1 endif + nrc=irc return end subroutine q65_dec1 @@ -504,8 +516,9 @@ subroutine q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) nFadingModel=1 decoded=' ' call q65_intrinsics_ff(s3,nsubmode,b90ts,nFadingModel,s3prob) - call q65_dec(s3,s3prob,APmask,APsymbols,esnodb,dat4,irc) + call q65_dec(s3,s3prob,APmask,APsymbols,maxiters,esnodb,dat4,irc) if(sum(dat4).le.0) irc=-2 + nrc=irc if(irc.ge.0) then write(c77,1000) dat4(1:12),dat4(13)/2 1000 format(12b6.6,b5.5) @@ -537,7 +550,8 @@ subroutine q65_s1_to_s3(s1,iz,jz,ipk,jpk,LL,mode_q65,sync,s3) if(j.ge.1 .and. j.le.jz) s3(-64:LL-65,n)=s1(i1:i2,j) enddo endif - + call q65_bzap(s3,LL) !Zap birdies + return end subroutine q65_s1_to_s3 @@ -589,4 +603,88 @@ subroutine q65_sync_curve(ccf1,ia,ib,rms1) return end subroutine q65_sync_curve +subroutine q65_bzap(s3,LL) + + parameter (NBZAP=15) + real s3(-64:LL-65,63) + integer ipk1(1) + integer, allocatable :: hist(:) + + allocate(hist(-64:LL-65)) + hist=0 + do j=1,63 + ipk1=maxloc(s3(:,j)) + i=ipk1(1) - 65 + hist(i)=hist(i)+1 + enddo + if(maxval(hist).gt.NBZAP) then + do i=-64,LL-65 + if(hist(i).gt.NBZAP) s3(i,1:63)=1.0 + enddo + endif + + return +end subroutine q65_bzap + +subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) + +! Estimate SNR of a decoded transmission by aligning the spectra of +! all 85 symbols. + + integer dat4(13) + integer codeword(63) + integer itone(85) + real, allocatable :: spec(:) + + allocate(spec(iz0)) + call q65_enc(dat4,codeword) + i=1 + k=0 + do j=1,85 + if(j.eq.isync(i)) then + i=i+1 + itone(j)=0 + else + k=k+1 + itone(j)=codeword(k) + 1 + endif + enddo + + spec=0. + lagpk=nint(dtdec/dtstep) + do k=1,85 + j=j0 + NSTEP*(k-1) + 1 + lagpk + if(j.ge.1 .and. j.le.jz0) then + do i=1,iz0 + ii=i+mode_q65*itone(k) + if(ii.ge.1 .and. ii.le.iz0) spec(i)=spec(i) + s1raw(ii,j) + enddo + endif + enddo + + i0=nint(f0dec/df) + nsum=max(10*mode_q65,nint(50.0/df)) + ia=i0 - 2*nsum + ib=i0 + 2*nsum + sum1=sum(spec(ia:ia+nsum-1)) + sum2=sum(spec(ib-nsum+1:ib)) + avg=(sum1+sum2)/(2.0*nsum) + spec=spec/avg !Baseline level is now 1.0 + smax=maxval(spec(ia:ib)) + sig_area=sum(spec(ia+nsum:ib-nsum)-1.0) + w_equiv=sig_area/(smax-1.0) + snr2=db(max(1.0,sig_area)) - db(2500.0/df) + if(nused.eq.2) snr2=snr2 - 2.0 + if(nused.eq.3) snr2=snr2 - 2.9 + if(nused.ge.4) snr2=snr2 - 3.5 + +! do i=ia,ib +! write(71,3071) i*df,spec(i),db(spec(i)) +!3071 format(3f10.3) +! enddo +! flush(71) + + return +end subroutine q65_snr + end module q65 diff --git a/lib/qra/q65/q65.h b/lib/qra/q65/q65.h index 9e3d79adb..d0a04d4e9 100644 --- a/lib/qra/q65/q65.h +++ b/lib/qra/q65/q65.h @@ -75,11 +75,12 @@ int q65_intrinsics_fastfading(q65_codec_ds *pCodec, int q65_decode(q65_codec_ds *pCodec, - int* pDecodedCodeword, - int *pDecodedMsg, - const float *pIntrinsics, - const int *pAPMask, - const int *pAPSymbols); + int* pDecodedCodeword, + int *pDecodedMsg, + const float *pIntrinsics, + const int *pAPMask, + const int *pAPSymbols, + const int maxiters); int q65_decode_fullaplist(q65_codec_ds *codec, int *ydec, diff --git a/lib/qra/q65/q65_loops.f90 b/lib/qra/q65/q65_loops.f90 index 092997e69..827e7f4c5 100644 --- a/lib/qra/q65/q65_loops.f90 +++ b/lib/qra/q65/q65_loops.f90 @@ -38,6 +38,9 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, & napmin=99 xdt1=xdt0 f1=f0 + idfbest=0 + idtbest=0 + ndistbest=0 do idf=1,idfmax ndf=idf/2 @@ -56,6 +59,7 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, & call pctile(s3,LL*NN,40,base) s3=s3/base where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim + call q65_bzap(s3,LL) !Zap birdies do ibw=ibwa,ibwb ndist=ndf**2 + ndt**2 + (ibw-ibw0)**2 if(ndist.gt.maxdist) cycle @@ -69,7 +73,13 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, & ! -1 = invalid params ! -2 = decode failed ! -3 = CRC mismatch - if(irc.ge.0) go to 100 + if(irc.ge.0) then + idfbest=idf + idtbest=idt + ndistbest=ndist + nrc=irc + go to 100 + endif enddo ! ibw (b90 loop) enddo ! idt (DT loop) enddo ! idf (f0 loop) diff --git a/lib/qra/q65/q65_subs.c b/lib/qra/q65/q65_subs.c index e55fe927d..4311ba392 100644 --- a/lib/qra/q65/q65_subs.c +++ b/lib/qra/q65/q65_subs.c @@ -77,7 +77,7 @@ void q65_intrinsics_ff_(float s3[], int* submode, float* B90Ts, } void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[], - float* esnodb0, int xdec[], int* rc0) + int* maxiters0, float* esnodb0, int xdec[], int* rc0) { /* Input: s3[LL,NN] Symbol spectra @@ -93,8 +93,9 @@ void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[], int rc; int ydec[63]; float esnodb; + int maxiters=*maxiters0; - rc = q65_decode(&codec,ydec,xdec,s3prob,APmask,APsymbols); + rc = q65_decode(&codec,ydec,xdec,s3prob,APmask,APsymbols,maxiters); *rc0=rc; // rc = -1: Invalid params // rc = -2: Decode failed diff --git a/lib/qra/q65/q65sim.f90 b/lib/qra/q65/q65sim.f90 index 5c7efb1a4..f3db7b9d6 100644 --- a/lib/qra/q65/q65sim.f90 +++ b/lib/qra/q65/q65sim.f90 @@ -9,10 +9,13 @@ program q65sim integer*2 iwave(NMAX) !Generated waveform integer itone(85) !Channel symbols (values 0-65) integer y(63) !Codeword + integer istart !averaging compatible start seconds + integer imins !minutes for 15s period timestamp + integer isecs !seconds for 15s period timestamp real*4 xnoise(NMAX) !Generated random noise real*4 dat(NMAX) !Generated real data complex cdat(NMAX) !Generated complex waveform - complex cspread(0:NMAX-1) !Complex amplitude for Rayleigh fading + complex cspread(0:NMAX-1) !Complex amplitude for Rayleigh fading complex z real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq character msg*37,fname*17,csubmode*1,arg*12 @@ -22,10 +25,13 @@ program q65sim if(nargs.ne.10) then print*,'Usage: q65sim "msg" A-E freq fDop DT f1 Stp TRp Nfile SNR' print*,'Example: q65sim "K1ABC W9XYZ EN37" A 1500 0.0 0.0 0.0 1 60 1 -26' + print*,'Example: q65sim "ST" A 1500 0.0 0.0 0.0 1 60 1 -26' print*,' fDop = Doppler spread' print*,' f1 = Drift or Doppler rate (Hz/min)' print*,' Stp = Step size (Hz)' print*,' Stp = 0 implies no Doppler tracking' + print*,' Creates filenames which increment to permit averaging in first period' + print*,' If msg = ST program produces a single tone at freq' go to 999 endif call getarg(1,msg) @@ -94,14 +100,17 @@ program q65sim h=default_header(12000,npts) write(*,1004) -1004 format('File TR Freq Mode S/N Dop DT f1 Stp Message'/70('-')) +1004 format('File TR Freq Mode S/N Dop DT f1 Stp Message'/70('-')) - do ifile=1,nfiles !Loop over requested number of files - if(ntrperiod.lt.60) then - write(fname,1005) ifile !Output filename -1005 format('000000_',i6.6,'.wav') + do ifile=1,nfiles !Loop over requested number of files + istart = (ifile*ntrperiod*2) - (ntrperiod*2) + if(ntrperiod.lt.30) then !wdg was 60 + imins=istart/60 + isecs=istart-(60*imins) + write(fname,1005) imins,isecs !Construction of output filename for 15s periods with averaging +1005 format('000000_',i4.4, i2.2,'.wav') else - write(fname,1106) ifile + write(fname,1106) istart/60 !Output filename to be compatible with averaging 30-300s periods 1106 format('000000_',i4.4,'.wav') endif @@ -118,7 +127,7 @@ program q65sim sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) if(snrdb.gt.90.0) sig=1.0 write(*,1020) ifile,ntrperiod,f0,csubmode,snrdb,fspread,xdt,f1,nstp,trim(msgsent) -1020 format(i4,i6,f7.1,2x,a1,2x,f5.1,f6.2,2f6.1,i4,2x,a) +1020 format(i4,i6,f7.1,2x,a1,2x,f5.1,1x,f6.2,2f6.1,i4,2x,a) phi=0.d0 dphi=0.d0 k=(xdt+0.5)*12000 !Start audio at t=xdt+0.5 s (TR=15 and 30 s) @@ -130,7 +139,11 @@ program q65sim if(isym.ne.isym0) then freq_drift=f1*i*dt/60.0 if(nstp.ne.0) freq_drift=freq_drift - nstp*nint(freq_drift/nstp) - freq = f0 + freq_drift + itone(isym)*baud*mode65 + if (msg(1:2).eq.'ST') then + freq = f0 + freq_drift + else + freq = f0 + freq_drift + itone(isym)*baud*mode65 + endif dphi=twopi*freq*dt isym0=isym endif diff --git a/lib/qra/qra64/Makefile.Win b/lib/qra/qra64/Makefile.Win deleted file mode 100644 index 7bd10c2d1..000000000 --- a/lib/qra/qra64/Makefile.Win +++ /dev/null @@ -1,30 +0,0 @@ -FC = gfortran -CC = gcc -CFLAGS = -O2 -Wall -I. -D_WIN32 - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: qra64.exe - -OBJS1 = main.o qra64.o -qra64.exe: $(OBJS1) - ${CC} -o qra64.exe $(OBJS1) ../qracodes/libqra64.a -lm - -OBJS2 = qra64sim.o options.o wavhdr.o -qra64sim.exe: $(OBJS2) - ${FC} -o qra64sim.exe $(OBJS2) ../qracodes/libqra64.a -lm - -.PHONY : clean - -clean: - $(RM) *.o qra64.exe qra64sim.exe diff --git a/lib/qra/qra64/fadengauss.c b/lib/qra/qra64/fadengauss.c deleted file mode 100644 index c229626f4..000000000 --- a/lib/qra/qra64/fadengauss.c +++ /dev/null @@ -1,302 +0,0 @@ -// Gaussian energy fading tables for QRA64 -static const int glen_tab_gauss[64] = { - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 6, - 6, 6, 7, 7, 8, 8, 9, 10, - 10, 11, 12, 13, 14, 15, 17, 18, - 19, 21, 23, 25, 27, 29, 32, 34, - 37, 41, 44, 48, 52, 57, 62, 65 -}; -static const float ggauss1[2] = { -0.0296f, 0.9101f -}; -static const float ggauss2[2] = { -0.0350f, 0.8954f -}; -static const float ggauss3[2] = { -0.0411f, 0.8787f -}; -static const float ggauss4[2] = { -0.0483f, 0.8598f -}; -static const float ggauss5[2] = { -0.0566f, 0.8387f -}; -static const float ggauss6[2] = { -0.0660f, 0.8154f -}; -static const float ggauss7[2] = { -0.0767f, 0.7898f -}; -static const float ggauss8[2] = { -0.0886f, 0.7621f -}; -static const float ggauss9[2] = { -0.1017f, 0.7325f -}; -static const float ggauss10[2] = { -0.1159f, 0.7012f -}; -static const float ggauss11[2] = { -0.1310f, 0.6687f -}; -static const float ggauss12[2] = { -0.1465f, 0.6352f -}; -static const float ggauss13[2] = { -0.1621f, 0.6013f -}; -static const float ggauss14[2] = { -0.1771f, 0.5674f -}; -static const float ggauss15[2] = { -0.1911f, 0.5339f -}; -static const float ggauss16[2] = { -0.2034f, 0.5010f -}; -static const float ggauss17[3] = { -0.0299f, 0.2135f, 0.4690f -}; -static const float ggauss18[3] = { -0.0369f, 0.2212f, 0.4383f -}; -static const float ggauss19[3] = { -0.0454f, 0.2263f, 0.4088f -}; -static const float ggauss20[3] = { -0.0552f, 0.2286f, 0.3806f -}; -static const float ggauss21[3] = { -0.0658f, 0.2284f, 0.3539f -}; -static const float ggauss22[3] = { -0.0766f, 0.2258f, 0.3287f -}; -static const float ggauss23[3] = { -0.0869f, 0.2212f, 0.3049f -}; -static const float ggauss24[3] = { -0.0962f, 0.2148f, 0.2826f -}; -static const float ggauss25[4] = { -0.0351f, 0.1041f, 0.2071f, 0.2616f -}; -static const float ggauss26[4] = { -0.0429f, 0.1102f, 0.1984f, 0.2420f -}; -static const float ggauss27[4] = { -0.0508f, 0.1145f, 0.1890f, 0.2237f -}; -static const float ggauss28[4] = { -0.0582f, 0.1169f, 0.1791f, 0.2067f -}; -static const float ggauss29[5] = { -0.0289f, 0.0648f, 0.1176f, 0.1689f, 0.1908f -}; -static const float ggauss30[5] = { -0.0351f, 0.0703f, 0.1168f, 0.1588f, 0.1760f -}; -static const float ggauss31[5] = { -0.0411f, 0.0745f, 0.1146f, 0.1488f, 0.1623f -}; -static const float ggauss32[6] = { -0.0246f, 0.0466f, 0.0773f, 0.1115f, 0.1390f, 0.1497f -}; -static const float ggauss33[6] = { -0.0297f, 0.0512f, 0.0788f, 0.1075f, 0.1295f, 0.1379f -}; -static const float ggauss34[6] = { -0.0345f, 0.0549f, 0.0791f, 0.1029f, 0.1205f, 0.1270f -}; -static const float ggauss35[7] = { -0.0240f, 0.0387f, 0.0575f, 0.0784f, 0.0979f, 0.1118f, 0.1169f -}; -static const float ggauss36[7] = { -0.0281f, 0.0422f, 0.0590f, 0.0767f, 0.0926f, 0.1037f, 0.1076f -}; -static const float ggauss37[8] = { -0.0212f, 0.0318f, 0.0449f, 0.0596f, 0.0744f, 0.0872f, 0.0960f, 0.0991f -}; -static const float ggauss38[8] = { -0.0247f, 0.0348f, 0.0467f, 0.0593f, 0.0716f, 0.0819f, 0.0887f, 0.0911f -}; -static const float ggauss39[9] = { -0.0199f, 0.0278f, 0.0372f, 0.0476f, 0.0584f, 0.0684f, 0.0766f, 0.0819f, -0.0838f -}; -static const float ggauss40[10] = { -0.0166f, 0.0228f, 0.0303f, 0.0388f, 0.0478f, 0.0568f, 0.0649f, 0.0714f, -0.0756f, 0.0771f -}; -static const float ggauss41[10] = { -0.0193f, 0.0254f, 0.0322f, 0.0397f, 0.0474f, 0.0548f, 0.0613f, 0.0664f, -0.0697f, 0.0709f -}; -static const float ggauss42[11] = { -0.0168f, 0.0217f, 0.0273f, 0.0335f, 0.0399f, 0.0464f, 0.0524f, 0.0576f, -0.0617f, 0.0643f, 0.0651f -}; -static const float ggauss43[12] = { -0.0151f, 0.0191f, 0.0237f, 0.0288f, 0.0342f, 0.0396f, 0.0449f, 0.0498f, -0.0540f, 0.0572f, 0.0592f, 0.0599f -}; -static const float ggauss44[13] = { -0.0138f, 0.0171f, 0.0210f, 0.0252f, 0.0297f, 0.0343f, 0.0388f, 0.0432f, -0.0471f, 0.0504f, 0.0529f, 0.0545f, 0.0550f -}; -static const float ggauss45[14] = { -0.0128f, 0.0157f, 0.0189f, 0.0224f, 0.0261f, 0.0300f, 0.0339f, 0.0377f, -0.0412f, 0.0444f, 0.0470f, 0.0489f, 0.0501f, 0.0505f -}; -static const float ggauss46[15] = { -0.0121f, 0.0146f, 0.0173f, 0.0202f, 0.0234f, 0.0266f, 0.0299f, 0.0332f, -0.0363f, 0.0391f, 0.0416f, 0.0437f, 0.0452f, 0.0461f, 0.0464f -}; -static const float ggauss47[17] = { -0.0097f, 0.0116f, 0.0138f, 0.0161f, 0.0186f, 0.0212f, 0.0239f, 0.0267f, -0.0294f, 0.0321f, 0.0346f, 0.0369f, 0.0389f, 0.0405f, 0.0417f, 0.0424f, -0.0427f -}; -static const float ggauss48[18] = { -0.0096f, 0.0113f, 0.0131f, 0.0151f, 0.0172f, 0.0194f, 0.0217f, 0.0241f, -0.0264f, 0.0287f, 0.0308f, 0.0329f, 0.0347f, 0.0362f, 0.0375f, 0.0384f, -0.0390f, 0.0392f -}; -static const float ggauss49[19] = { -0.0095f, 0.0110f, 0.0126f, 0.0143f, 0.0161f, 0.0180f, 0.0199f, 0.0219f, -0.0239f, 0.0258f, 0.0277f, 0.0294f, 0.0310f, 0.0325f, 0.0337f, 0.0347f, -0.0354f, 0.0358f, 0.0360f -}; -static const float ggauss50[21] = { -0.0083f, 0.0095f, 0.0108f, 0.0122f, 0.0136f, 0.0152f, 0.0168f, 0.0184f, -0.0201f, 0.0217f, 0.0234f, 0.0250f, 0.0265f, 0.0279f, 0.0292f, 0.0303f, -0.0313f, 0.0320f, 0.0326f, 0.0329f, 0.0330f -}; -static const float ggauss51[23] = { -0.0074f, 0.0084f, 0.0095f, 0.0106f, 0.0118f, 0.0131f, 0.0144f, 0.0157f, -0.0171f, 0.0185f, 0.0199f, 0.0213f, 0.0227f, 0.0240f, 0.0252f, 0.0263f, -0.0273f, 0.0282f, 0.0290f, 0.0296f, 0.0300f, 0.0303f, 0.0303f -}; -static const float ggauss52[25] = { -0.0068f, 0.0076f, 0.0085f, 0.0094f, 0.0104f, 0.0115f, 0.0126f, 0.0137f, -0.0149f, 0.0160f, 0.0172f, 0.0184f, 0.0196f, 0.0207f, 0.0218f, 0.0228f, -0.0238f, 0.0247f, 0.0255f, 0.0262f, 0.0268f, 0.0273f, 0.0276f, 0.0278f, -0.0279f -}; -static const float ggauss53[27] = { -0.0063f, 0.0070f, 0.0078f, 0.0086f, 0.0094f, 0.0103f, 0.0112f, 0.0121f, -0.0131f, 0.0141f, 0.0151f, 0.0161f, 0.0170f, 0.0180f, 0.0190f, 0.0199f, -0.0208f, 0.0216f, 0.0224f, 0.0231f, 0.0237f, 0.0243f, 0.0247f, 0.0251f, -0.0254f, 0.0255f, 0.0256f -}; -static const float ggauss54[29] = { -0.0060f, 0.0066f, 0.0072f, 0.0079f, 0.0086f, 0.0093f, 0.0101f, 0.0109f, -0.0117f, 0.0125f, 0.0133f, 0.0142f, 0.0150f, 0.0159f, 0.0167f, 0.0175f, -0.0183f, 0.0190f, 0.0197f, 0.0204f, 0.0210f, 0.0216f, 0.0221f, 0.0225f, -0.0228f, 0.0231f, 0.0233f, 0.0234f, 0.0235f -}; -static const float ggauss55[32] = { -0.0053f, 0.0058f, 0.0063f, 0.0068f, 0.0074f, 0.0080f, 0.0086f, 0.0093f, -0.0099f, 0.0106f, 0.0113f, 0.0120f, 0.0127f, 0.0134f, 0.0141f, 0.0148f, -0.0155f, 0.0162f, 0.0168f, 0.0174f, 0.0180f, 0.0186f, 0.0191f, 0.0196f, -0.0201f, 0.0204f, 0.0208f, 0.0211f, 0.0213f, 0.0214f, 0.0215f, 0.0216f -}; -static const float ggauss56[34] = { -0.0052f, 0.0056f, 0.0060f, 0.0065f, 0.0070f, 0.0075f, 0.0080f, 0.0086f, -0.0091f, 0.0097f, 0.0103f, 0.0109f, 0.0115f, 0.0121f, 0.0127f, 0.0133f, -0.0138f, 0.0144f, 0.0150f, 0.0155f, 0.0161f, 0.0166f, 0.0170f, 0.0175f, -0.0179f, 0.0183f, 0.0186f, 0.0189f, 0.0192f, 0.0194f, 0.0196f, 0.0197f, -0.0198f, 0.0198f -}; -static const float ggauss57[37] = { -0.0047f, 0.0051f, 0.0055f, 0.0058f, 0.0063f, 0.0067f, 0.0071f, 0.0076f, -0.0080f, 0.0085f, 0.0090f, 0.0095f, 0.0100f, 0.0105f, 0.0110f, 0.0115f, -0.0120f, 0.0125f, 0.0130f, 0.0134f, 0.0139f, 0.0144f, 0.0148f, 0.0152f, -0.0156f, 0.0160f, 0.0164f, 0.0167f, 0.0170f, 0.0173f, 0.0175f, 0.0177f, -0.0179f, 0.0180f, 0.0181f, 0.0181f, 0.0182f -}; -static const float ggauss58[41] = { -0.0041f, 0.0044f, 0.0047f, 0.0050f, 0.0054f, 0.0057f, 0.0060f, 0.0064f, -0.0068f, 0.0072f, 0.0076f, 0.0080f, 0.0084f, 0.0088f, 0.0092f, 0.0096f, -0.0101f, 0.0105f, 0.0109f, 0.0113f, 0.0117f, 0.0121f, 0.0125f, 0.0129f, -0.0133f, 0.0137f, 0.0140f, 0.0144f, 0.0147f, 0.0150f, 0.0153f, 0.0155f, -0.0158f, 0.0160f, 0.0162f, 0.0163f, 0.0164f, 0.0165f, 0.0166f, 0.0167f, -0.0167f -}; -static const float ggauss59[44] = { -0.0039f, 0.0042f, 0.0044f, 0.0047f, 0.0050f, 0.0053f, 0.0056f, 0.0059f, -0.0062f, 0.0065f, 0.0068f, 0.0072f, 0.0075f, 0.0079f, 0.0082f, 0.0086f, -0.0089f, 0.0093f, 0.0096f, 0.0100f, 0.0104f, 0.0107f, 0.0110f, 0.0114f, -0.0117f, 0.0120f, 0.0124f, 0.0127f, 0.0130f, 0.0132f, 0.0135f, 0.0138f, -0.0140f, 0.0142f, 0.0144f, 0.0146f, 0.0148f, 0.0149f, 0.0150f, 0.0151f, -0.0152f, 0.0153f, 0.0153f, 0.0153f -}; -static const float ggauss60[48] = { -0.0036f, 0.0038f, 0.0040f, 0.0042f, 0.0044f, 0.0047f, 0.0049f, 0.0052f, -0.0055f, 0.0057f, 0.0060f, 0.0063f, 0.0066f, 0.0068f, 0.0071f, 0.0074f, -0.0077f, 0.0080f, 0.0083f, 0.0086f, 0.0089f, 0.0092f, 0.0095f, 0.0098f, -0.0101f, 0.0104f, 0.0107f, 0.0109f, 0.0112f, 0.0115f, 0.0117f, 0.0120f, -0.0122f, 0.0124f, 0.0126f, 0.0128f, 0.0130f, 0.0132f, 0.0134f, 0.0135f, -0.0136f, 0.0137f, 0.0138f, 0.0139f, 0.0140f, 0.0140f, 0.0140f, 0.0140f -}; -static const float ggauss61[52] = { -0.0033f, 0.0035f, 0.0037f, 0.0039f, 0.0041f, 0.0043f, 0.0045f, 0.0047f, -0.0049f, 0.0051f, 0.0053f, 0.0056f, 0.0058f, 0.0060f, 0.0063f, 0.0065f, -0.0068f, 0.0070f, 0.0073f, 0.0075f, 0.0078f, 0.0080f, 0.0083f, 0.0085f, -0.0088f, 0.0090f, 0.0093f, 0.0095f, 0.0098f, 0.0100f, 0.0102f, 0.0105f, -0.0107f, 0.0109f, 0.0111f, 0.0113f, 0.0115f, 0.0116f, 0.0118f, 0.0120f, -0.0121f, 0.0122f, 0.0124f, 0.0125f, 0.0126f, 0.0126f, 0.0127f, 0.0128f, -0.0128f, 0.0129f, 0.0129f, 0.0129f -}; -static const float ggauss62[57] = { -0.0030f, 0.0031f, 0.0033f, 0.0034f, 0.0036f, 0.0038f, 0.0039f, 0.0041f, -0.0043f, 0.0045f, 0.0047f, 0.0048f, 0.0050f, 0.0052f, 0.0054f, 0.0056f, -0.0058f, 0.0060f, 0.0063f, 0.0065f, 0.0067f, 0.0069f, 0.0071f, 0.0073f, -0.0075f, 0.0077f, 0.0080f, 0.0082f, 0.0084f, 0.0086f, 0.0088f, 0.0090f, -0.0092f, 0.0094f, 0.0096f, 0.0097f, 0.0099f, 0.0101f, 0.0103f, 0.0104f, -0.0106f, 0.0107f, 0.0108f, 0.0110f, 0.0111f, 0.0112f, 0.0113f, 0.0114f, -0.0115f, 0.0116f, 0.0116f, 0.0117f, 0.0117f, 0.0118f, 0.0118f, 0.0118f, -0.0118f -}; -static const float ggauss63[62] = { -0.0027f, 0.0029f, 0.0030f, 0.0031f, 0.0032f, 0.0034f, 0.0035f, 0.0037f, -0.0038f, 0.0040f, 0.0041f, 0.0043f, 0.0045f, 0.0046f, 0.0048f, 0.0049f, -0.0051f, 0.0053f, 0.0055f, 0.0056f, 0.0058f, 0.0060f, 0.0062f, 0.0063f, -0.0065f, 0.0067f, 0.0069f, 0.0071f, 0.0072f, 0.0074f, 0.0076f, 0.0078f, -0.0079f, 0.0081f, 0.0083f, 0.0084f, 0.0086f, 0.0088f, 0.0089f, 0.0091f, -0.0092f, 0.0094f, 0.0095f, 0.0096f, 0.0098f, 0.0099f, 0.0100f, 0.0101f, -0.0102f, 0.0103f, 0.0104f, 0.0105f, 0.0105f, 0.0106f, 0.0107f, 0.0107f, -0.0108f, 0.0108f, 0.0108f, 0.0108f, 0.0109f, 0.0109f -}; -static const float ggauss64[65] = { -0.0028f, 0.0029f, 0.0030f, 0.0031f, 0.0032f, 0.0034f, 0.0035f, 0.0036f, -0.0037f, 0.0039f, 0.0040f, 0.0041f, 0.0043f, 0.0044f, 0.0046f, 0.0047f, -0.0048f, 0.0050f, 0.0051f, 0.0053f, 0.0054f, 0.0056f, 0.0057f, 0.0059f, -0.0060f, 0.0062f, 0.0063f, 0.0065f, 0.0066f, 0.0068f, 0.0069f, 0.0071f, -0.0072f, 0.0074f, 0.0075f, 0.0077f, 0.0078f, 0.0079f, 0.0081f, 0.0082f, -0.0083f, 0.0084f, 0.0086f, 0.0087f, 0.0088f, 0.0089f, 0.0090f, 0.0091f, -0.0092f, 0.0093f, 0.0094f, 0.0094f, 0.0095f, 0.0096f, 0.0097f, 0.0097f, -0.0098f, 0.0098f, 0.0099f, 0.0099f, 0.0099f, 0.0099f, 0.0100f, 0.0100f, -0.0100f -}; -static const float *gptr_tab_gauss[64] = { -ggauss1, ggauss2, ggauss3, ggauss4, -ggauss5, ggauss6, ggauss7, ggauss8, -ggauss9, ggauss10, ggauss11, ggauss12, -ggauss13, ggauss14, ggauss15, ggauss16, -ggauss17, ggauss18, ggauss19, ggauss20, -ggauss21, ggauss22, ggauss23, ggauss24, -ggauss25, ggauss26, ggauss27, ggauss28, -ggauss29, ggauss30, ggauss31, ggauss32, -ggauss33, ggauss34, ggauss35, ggauss36, -ggauss37, ggauss38, ggauss39, ggauss40, -ggauss41, ggauss42, ggauss43, ggauss44, -ggauss45, ggauss46, ggauss47, ggauss48, -ggauss49, ggauss50, ggauss51, ggauss52, -ggauss53, ggauss54, ggauss55, ggauss56, -ggauss57, ggauss58, ggauss59, ggauss60, -ggauss61, ggauss62, ggauss63, ggauss64 -}; diff --git a/lib/qra/qra64/fadenlorentz.c b/lib/qra/qra64/fadenlorentz.c deleted file mode 100644 index 673a89033..000000000 --- a/lib/qra/qra64/fadenlorentz.c +++ /dev/null @@ -1,304 +0,0 @@ -// Lorentz energy fading tables for QRA64 -static const int glen_tab_lorentz[64] = { - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 4, 4, 4, - 4, 4, 5, 5, 5, 5, 6, 6, - 7, 7, 7, 8, 8, 9, 10, 10, - 11, 12, 13, 14, 15, 16, 17, 19, - 20, 22, 23, 25, 27, 30, 32, 35, - 38, 41, 45, 49, 53, 57, 62, 65 -}; -static const float glorentz1[2] = { -0.0214f, 0.9107f -}; -static const float glorentz2[2] = { -0.0244f, 0.9030f -}; -static const float glorentz3[2] = { -0.0280f, 0.8950f -}; -static const float glorentz4[2] = { -0.0314f, 0.8865f -}; -static const float glorentz5[2] = { -0.0349f, 0.8773f -}; -static const float glorentz6[2] = { -0.0388f, 0.8675f -}; -static const float glorentz7[2] = { -0.0426f, 0.8571f -}; -static const float glorentz8[2] = { -0.0463f, 0.8459f -}; -static const float glorentz9[2] = { -0.0500f, 0.8339f -}; -static const float glorentz10[2] = { -0.0538f, 0.8210f -}; -static const float glorentz11[2] = { -0.0579f, 0.8074f -}; -static const float glorentz12[2] = { -0.0622f, 0.7930f -}; -static const float glorentz13[2] = { -0.0668f, 0.7777f -}; -static const float glorentz14[2] = { -0.0715f, 0.7616f -}; -static const float glorentz15[3] = { -0.0196f, 0.0765f, 0.7445f -}; -static const float glorentz16[3] = { -0.0210f, 0.0816f, 0.7267f -}; -static const float glorentz17[3] = { -0.0226f, 0.0870f, 0.7080f -}; -static const float glorentz18[3] = { -0.0242f, 0.0925f, 0.6885f -}; -static const float glorentz19[3] = { -0.0259f, 0.0981f, 0.6682f -}; -static const float glorentz20[3] = { -0.0277f, 0.1039f, 0.6472f -}; -static const float glorentz21[3] = { -0.0296f, 0.1097f, 0.6255f -}; -static const float glorentz22[4] = { -0.0143f, 0.0316f, 0.1155f, 0.6031f -}; -static const float glorentz23[4] = { -0.0153f, 0.0337f, 0.1213f, 0.5803f -}; -static const float glorentz24[4] = { -0.0163f, 0.0358f, 0.1270f, 0.5570f -}; -static const float glorentz25[4] = { -0.0174f, 0.0381f, 0.1325f, 0.5333f -}; -static const float glorentz26[4] = { -0.0186f, 0.0405f, 0.1378f, 0.5095f -}; -static const float glorentz27[5] = { -0.0113f, 0.0198f, 0.0429f, 0.1428f, 0.4855f -}; -static const float glorentz28[5] = { -0.0120f, 0.0211f, 0.0455f, 0.1473f, 0.4615f -}; -static const float glorentz29[5] = { -0.0129f, 0.0225f, 0.0481f, 0.1514f, 0.4376f -}; -static const float glorentz30[5] = { -0.0137f, 0.0239f, 0.0508f, 0.1549f, 0.4140f -}; -static const float glorentz31[6] = { -0.0095f, 0.0147f, 0.0254f, 0.0536f, 0.1578f, 0.3907f -}; -static const float glorentz32[6] = { -0.0101f, 0.0156f, 0.0270f, 0.0564f, 0.1600f, 0.3680f -}; -static const float glorentz33[7] = { -0.0076f, 0.0109f, 0.0167f, 0.0287f, 0.0592f, 0.1614f, 0.3458f -}; -static const float glorentz34[7] = { -0.0081f, 0.0116f, 0.0178f, 0.0305f, 0.0621f, 0.1620f, 0.3243f -}; -static const float glorentz35[7] = { -0.0087f, 0.0124f, 0.0190f, 0.0324f, 0.0649f, 0.1618f, 0.3035f -}; -static const float glorentz36[8] = { -0.0069f, 0.0093f, 0.0133f, 0.0203f, 0.0343f, 0.0676f, 0.1607f, 0.2836f -}; -static const float glorentz37[8] = { -0.0074f, 0.0100f, 0.0142f, 0.0216f, 0.0362f, 0.0702f, 0.1588f, 0.2645f -}; -static const float glorentz38[9] = { -0.0061f, 0.0080f, 0.0107f, 0.0152f, 0.0230f, 0.0382f, 0.0726f, 0.1561f, -0.2464f -}; -static const float glorentz39[10] = { -0.0052f, 0.0066f, 0.0086f, 0.0115f, 0.0162f, 0.0244f, 0.0402f, 0.0747f, -0.1526f, 0.2291f -}; -static const float glorentz40[10] = { -0.0056f, 0.0071f, 0.0092f, 0.0123f, 0.0173f, 0.0259f, 0.0422f, 0.0766f, -0.1484f, 0.2128f -}; -static const float glorentz41[11] = { -0.0049f, 0.0061f, 0.0076f, 0.0098f, 0.0132f, 0.0184f, 0.0274f, 0.0441f, -0.0780f, 0.1437f, 0.1975f -}; -static const float glorentz42[12] = { -0.0044f, 0.0053f, 0.0065f, 0.0082f, 0.0106f, 0.0141f, 0.0196f, 0.0290f, -0.0460f, 0.0791f, 0.1384f, 0.1831f -}; -static const float glorentz43[13] = { -0.0040f, 0.0048f, 0.0057f, 0.0070f, 0.0088f, 0.0113f, 0.0150f, 0.0209f, -0.0305f, 0.0477f, 0.0797f, 0.1327f, 0.1695f -}; -static const float glorentz44[14] = { -0.0037f, 0.0043f, 0.0051f, 0.0062f, 0.0075f, 0.0094f, 0.0121f, 0.0160f, -0.0221f, 0.0321f, 0.0493f, 0.0799f, 0.1267f, 0.1568f -}; -static const float glorentz45[15] = { -0.0035f, 0.0040f, 0.0047f, 0.0055f, 0.0066f, 0.0081f, 0.0101f, 0.0129f, -0.0171f, 0.0234f, 0.0335f, 0.0506f, 0.0795f, 0.1204f, 0.1450f -}; -static const float glorentz46[16] = { -0.0033f, 0.0037f, 0.0043f, 0.0050f, 0.0059f, 0.0071f, 0.0087f, 0.0108f, -0.0138f, 0.0181f, 0.0246f, 0.0349f, 0.0517f, 0.0786f, 0.1141f, 0.1340f -}; -static const float glorentz47[17] = { -0.0031f, 0.0035f, 0.0040f, 0.0046f, 0.0054f, 0.0064f, 0.0077f, 0.0093f, -0.0116f, 0.0147f, 0.0192f, 0.0259f, 0.0362f, 0.0525f, 0.0773f, 0.1076f, -0.1237f -}; -static const float glorentz48[19] = { -0.0027f, 0.0030f, 0.0034f, 0.0038f, 0.0043f, 0.0050f, 0.0058f, 0.0069f, -0.0082f, 0.0100f, 0.0123f, 0.0156f, 0.0203f, 0.0271f, 0.0374f, 0.0530f, -0.0755f, 0.1013f, 0.1141f -}; -static const float glorentz49[20] = { -0.0026f, 0.0029f, 0.0032f, 0.0036f, 0.0041f, 0.0047f, 0.0054f, 0.0063f, -0.0074f, 0.0088f, 0.0107f, 0.0131f, 0.0165f, 0.0213f, 0.0282f, 0.0383f, -0.0531f, 0.0734f, 0.0950f, 0.1053f -}; -static const float glorentz50[22] = { -0.0023f, 0.0025f, 0.0028f, 0.0031f, 0.0035f, 0.0039f, 0.0044f, 0.0050f, -0.0058f, 0.0067f, 0.0079f, 0.0094f, 0.0114f, 0.0139f, 0.0175f, 0.0223f, -0.0292f, 0.0391f, 0.0529f, 0.0709f, 0.0889f, 0.0971f -}; -static const float glorentz51[23] = { -0.0023f, 0.0025f, 0.0027f, 0.0030f, 0.0034f, 0.0037f, 0.0042f, 0.0048f, -0.0054f, 0.0062f, 0.0072f, 0.0085f, 0.0100f, 0.0121f, 0.0148f, 0.0184f, -0.0233f, 0.0301f, 0.0396f, 0.0524f, 0.0681f, 0.0829f, 0.0894f -}; -static const float glorentz52[25] = { -0.0021f, 0.0023f, 0.0025f, 0.0027f, 0.0030f, 0.0033f, 0.0036f, 0.0040f, -0.0045f, 0.0051f, 0.0058f, 0.0067f, 0.0077f, 0.0090f, 0.0107f, 0.0128f, -0.0156f, 0.0192f, 0.0242f, 0.0308f, 0.0398f, 0.0515f, 0.0650f, 0.0772f, -0.0824f -}; -static const float glorentz53[27] = { -0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0027f, 0.0029f, 0.0032f, 0.0035f, -0.0039f, 0.0044f, 0.0049f, 0.0055f, 0.0062f, 0.0072f, 0.0083f, 0.0096f, -0.0113f, 0.0135f, 0.0164f, 0.0201f, 0.0249f, 0.0314f, 0.0398f, 0.0502f, -0.0619f, 0.0718f, 0.0759f -}; -static const float glorentz54[30] = { -0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0026f, 0.0029f, -0.0031f, 0.0034f, 0.0038f, 0.0042f, 0.0047f, 0.0052f, 0.0059f, 0.0067f, -0.0076f, 0.0088f, 0.0102f, 0.0120f, 0.0143f, 0.0171f, 0.0208f, 0.0256f, -0.0317f, 0.0395f, 0.0488f, 0.0586f, 0.0666f, 0.0698f -}; -static const float glorentz55[32] = { -0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0026f, -0.0028f, 0.0031f, 0.0034f, 0.0037f, 0.0041f, 0.0045f, 0.0050f, 0.0056f, -0.0063f, 0.0071f, 0.0081f, 0.0094f, 0.0108f, 0.0127f, 0.0149f, 0.0178f, -0.0214f, 0.0261f, 0.0318f, 0.0389f, 0.0470f, 0.0553f, 0.0618f, 0.0643f -}; -static const float glorentz56[35] = { -0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0020f, 0.0021f, 0.0023f, -0.0024f, 0.0026f, 0.0028f, 0.0031f, 0.0033f, 0.0036f, 0.0040f, 0.0044f, -0.0049f, 0.0054f, 0.0060f, 0.0067f, 0.0076f, 0.0087f, 0.0099f, 0.0114f, -0.0133f, 0.0156f, 0.0184f, 0.0220f, 0.0264f, 0.0318f, 0.0381f, 0.0451f, -0.0520f, 0.0572f, 0.0591f -}; -static const float glorentz57[38] = { -0.0013f, 0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0020f, -0.0021f, 0.0023f, 0.0024f, 0.0026f, 0.0028f, 0.0031f, 0.0033f, 0.0036f, -0.0039f, 0.0043f, 0.0047f, 0.0052f, 0.0058f, 0.0064f, 0.0072f, 0.0081f, -0.0092f, 0.0104f, 0.0120f, 0.0139f, 0.0162f, 0.0190f, 0.0224f, 0.0265f, -0.0315f, 0.0371f, 0.0431f, 0.0487f, 0.0529f, 0.0544f -}; -static const float glorentz58[41] = { -0.0012f, 0.0013f, 0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, -0.0019f, 0.0020f, 0.0022f, 0.0023f, 0.0025f, 0.0026f, 0.0028f, 0.0030f, -0.0033f, 0.0036f, 0.0039f, 0.0042f, 0.0046f, 0.0050f, 0.0056f, 0.0061f, -0.0068f, 0.0076f, 0.0086f, 0.0097f, 0.0110f, 0.0125f, 0.0144f, 0.0167f, -0.0194f, 0.0226f, 0.0265f, 0.0309f, 0.0359f, 0.0409f, 0.0455f, 0.0488f, -0.0500f -}; -static const float glorentz59[45] = { -0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, 0.0015f, 0.0016f, -0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0023f, 0.0025f, -0.0026f, 0.0028f, 0.0030f, 0.0033f, 0.0035f, 0.0038f, 0.0041f, 0.0045f, -0.0049f, 0.0054f, 0.0059f, 0.0065f, 0.0072f, 0.0081f, 0.0090f, 0.0102f, -0.0115f, 0.0130f, 0.0149f, 0.0171f, 0.0197f, 0.0227f, 0.0263f, 0.0302f, -0.0345f, 0.0387f, 0.0425f, 0.0451f, 0.0460f -}; -static const float glorentz60[49] = { -0.0010f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, -0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0020f, 0.0021f, -0.0022f, 0.0024f, 0.0025f, 0.0027f, 0.0028f, 0.0030f, 0.0033f, 0.0035f, -0.0038f, 0.0041f, 0.0044f, 0.0048f, 0.0052f, 0.0057f, 0.0063f, 0.0069f, -0.0077f, 0.0085f, 0.0095f, 0.0106f, 0.0119f, 0.0135f, 0.0153f, 0.0174f, -0.0199f, 0.0227f, 0.0259f, 0.0293f, 0.0330f, 0.0365f, 0.0395f, 0.0415f, -0.0423f -}; -static const float glorentz61[53] = { -0.0009f, 0.0010f, 0.0010f, 0.0011f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, -0.0013f, 0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0016f, 0.0017f, 0.0018f, -0.0019f, 0.0020f, 0.0021f, 0.0023f, 0.0024f, 0.0025f, 0.0027f, 0.0029f, -0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0041f, 0.0044f, 0.0047f, 0.0051f, -0.0056f, 0.0061f, 0.0067f, 0.0073f, 0.0081f, 0.0089f, 0.0099f, 0.0110f, -0.0124f, 0.0139f, 0.0156f, 0.0176f, 0.0199f, 0.0225f, 0.0253f, 0.0283f, -0.0314f, 0.0343f, 0.0367f, 0.0383f, 0.0389f -}; -static const float glorentz62[57] = { -0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f, 0.0011f, 0.0011f, 0.0011f, -0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, 0.0015f, 0.0015f, 0.0016f, -0.0017f, 0.0018f, 0.0019f, 0.0020f, 0.0021f, 0.0022f, 0.0023f, 0.0024f, -0.0026f, 0.0027f, 0.0029f, 0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0040f, -0.0043f, 0.0047f, 0.0050f, 0.0055f, 0.0059f, 0.0064f, 0.0070f, 0.0077f, -0.0085f, 0.0093f, 0.0103f, 0.0114f, 0.0127f, 0.0142f, 0.0158f, 0.0177f, -0.0198f, 0.0221f, 0.0246f, 0.0272f, 0.0297f, 0.0321f, 0.0340f, 0.0353f, -0.0357f -}; -static const float glorentz63[62] = { -0.0008f, 0.0008f, 0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f, 0.0010f, -0.0011f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, -0.0015f, 0.0015f, 0.0016f, 0.0017f, 0.0017f, 0.0018f, 0.0019f, 0.0020f, -0.0021f, 0.0022f, 0.0023f, 0.0025f, 0.0026f, 0.0028f, 0.0029f, 0.0031f, -0.0033f, 0.0035f, 0.0038f, 0.0040f, 0.0043f, 0.0046f, 0.0050f, 0.0053f, -0.0058f, 0.0062f, 0.0068f, 0.0074f, 0.0081f, 0.0088f, 0.0097f, 0.0106f, -0.0117f, 0.0130f, 0.0144f, 0.0159f, 0.0176f, 0.0195f, 0.0216f, 0.0237f, -0.0259f, 0.0280f, 0.0299f, 0.0315f, 0.0325f, 0.0328f -}; -static const float glorentz64[65] = { -0.0008f, 0.0008f, 0.0008f, 0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f, -0.0010f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, -0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0016f, 0.0017f, 0.0018f, 0.0019f, -0.0020f, 0.0021f, 0.0022f, 0.0023f, 0.0024f, 0.0025f, 0.0027f, 0.0028f, -0.0030f, 0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0040f, 0.0043f, 0.0046f, -0.0049f, 0.0052f, 0.0056f, 0.0061f, 0.0066f, 0.0071f, 0.0077f, 0.0084f, -0.0091f, 0.0100f, 0.0109f, 0.0120f, 0.0132f, 0.0145f, 0.0159f, 0.0175f, -0.0192f, 0.0209f, 0.0228f, 0.0246f, 0.0264f, 0.0279f, 0.0291f, 0.0299f, -0.0301f -}; -static const float *gptr_tab_lorentz[64] = { -glorentz1, glorentz2, glorentz3, glorentz4, -glorentz5, glorentz6, glorentz7, glorentz8, -glorentz9, glorentz10, glorentz11, glorentz12, -glorentz13, glorentz14, glorentz15, glorentz16, -glorentz17, glorentz18, glorentz19, glorentz20, -glorentz21, glorentz22, glorentz23, glorentz24, -glorentz25, glorentz26, glorentz27, glorentz28, -glorentz29, glorentz30, glorentz31, glorentz32, -glorentz33, glorentz34, glorentz35, glorentz36, -glorentz37, glorentz38, glorentz39, glorentz40, -glorentz41, glorentz42, glorentz43, glorentz44, -glorentz45, glorentz46, glorentz47, glorentz48, -glorentz49, glorentz50, glorentz51, glorentz52, -glorentz53, glorentz54, glorentz55, glorentz56, -glorentz57, glorentz58, glorentz59, glorentz60, -glorentz61, glorentz62, glorentz63, glorentz64 -}; diff --git a/lib/qra/qra64/main.c b/lib/qra/qra64/main.c deleted file mode 100644 index b685fd316..000000000 --- a/lib/qra/qra64/main.c +++ /dev/null @@ -1,746 +0,0 @@ -/* -main.c -QRA64 mode encode/decode tests - -(c) 2016 - Nico Palermo, IV3NWV - -Thanks to Andrea Montefusco IW0HDV for his help on adapting the sources -to OSs other than MS Windows - ------------------------------------------------------------------------------- -This file is part of the qracodes project, a Forward Error Control -encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. - -Files in this package: - main.c - this file - qra64.c/.h - qra64 mode encode/decoding functions - - ../qracodes/normrnd.{c,h} - random gaussian number generator - ../qracodes/npfwht.{c,h} - Fast Walsh-Hadamard Transforms - ../qracodes/pdmath.{c,h} - Elementary math on probability distributions - ../qracodes/qra12_63_64_irr_b.{c,h} - Tables for a QRA(12,63) irregular RA - code over GF(64) - ../qracodes/qra13_64_64_irr_e.{c,h} - Tables for a QRA(13,64) irregular RA - code over GF(64) - ../qracodes/qracodes.{c,h} - QRA codes encoding/decoding functions - -------------------------------------------------------------------------------- - - qracodes is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - qracodes is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qracodes source distribution. - If not, see . - ------------------------------------------------------------------------------ - -The code used by the QRA64 mode is the code: QRA13_64_64_IRR_E: K=13 -N=64 Q=64 irregular QRA code (defined in qra13_64_64_irr_e.{h,c}). - -This code has been designed to include a CRC as the 13th information -symbol and improve the code UER (Undetected Error Rate). The CRC -symbol is not sent along the channel (the codes are punctured) and the -resulting code is still a (12,63) code with an effective code rate of -R = 12/63. -*/ - -// OS dependent defines and includes ------------------------------------------ - -#if _WIN32 // note the underscore: without it, it's not msdn official! -// Windows (x64 and x86) -#include // required only for GetTickCount(...) -#include // _beginthread -#endif - -#if __linux__ -#include -#include - -unsigned GetTickCount(void) { - struct timespec ts; - unsigned theTick = 0U; - clock_gettime( CLOCK_REALTIME, &ts ); - theTick = ts.tv_nsec / 1000000; - theTick += ts.tv_sec * 1000; - return theTick; -} -#endif - -#if __APPLE__ -#endif - -#include -#include -#include - -#include "qra64.h" -#include "../qracodes/normrnd.h" // gaussian numbers generator - -// ---------------------------------------------------------------------------- - -// channel types -#define CHANNEL_AWGN 0 -#define CHANNEL_RAYLEIGH 1 -#define CHANNEL_FASTFADE 2 - -#define JT65_SNR_EBNO_OFFSET 29.1f // with the synch used in JT65 -#define QRA64_SNR_EBNO_OFFSET 31.0f // with the costas array synch - -void printwordd(char *msg, int *x, int size) -{ - int k; - printf("\n%s ",msg); - for (k=0;k-15) - if (channel_type == CHANNEL_AWGN) - for (k=0;k=0) { // decoded - printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]); - -// Step 2a: K1JT replies to IV3NWV (with no grid) - printf("K1JT tx: IV3NWV K1JT\n"); - encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_BLANK); - qra64_encode(codec_k1jt, y, x); - rx = mfskchannel(y,channel_type,EbNodB); - -// Step 2b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?] or [IV3NWV ?] - rc = qra64_decode(codec_iv3nwv, 0, xdec,rx); - if (rc>=0) { // decoded - printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]); - -// Step 3a: IV3NWV replies to K1JT with a 73 - printf("IV3NWV tx: K1JT IV3NWV 73\n"); - encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV, GRID_73); - qra64_encode(codec_iv3nwv, y, x); - rx = mfskchannel(y,channel_type,EbNodB); - -// Step 3b: K1JT attempts to decode [? ? ?] or [K1JT IV3NWV ?] - rc = qra64_decode(codec_k1jt, 0, xdec,rx); - if (rc>=0) { // decoded - printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]); - -// Step 4a: K1JT replies to IV3NWV with a 73 - printf("K1JT tx: IV3NWV K1JT 73\n"); - encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_73); - qra64_encode(codec_k1jt, y, x); - rx = mfskchannel(y,channel_type,EbNodB); - -// Step 4b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?], or [IV3NWV ?] - rc = qra64_decode(codec_iv3nwv, 0, xdec,rx); - if (rc>=0) { // decoded - printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]); - return 0; - } - } - } - } - printf("no decode\n"); - return -1; -} - -int test_proc_2(int channel_type, float EbNodB, int mode) -{ -/* -Here we simulate the decoder of K1JT after K1JT has sent a msg [IV3NWV K1JT] -and IV3NWV sends him the msg [K1JT IV3NWV JN66]. - -If mode=QRA_NOAP, K1JT decoder attempts to decode only msgs of type [? ? ?]. - -If mode=QRA_AUTOP, K1JT decoder will attempt to decode also the msgs -[K1JT IV3NWV] and [K1JT IV3NWV ?]. - -In the case a decode is successful the return code of the qra64_decode function -indicates the amount of a-priori information required to decode the received -message according to this table: - - rc=0 [? ? ?] AP0 - rc=1 [CQ ? ?] AP27 - rc=2 [CQ ? ] AP42 - rc=3 [CALL ? ?] AP29 - rc=4 [CALL ? ] AP44 - rc=5 [CALL CALL ?] AP57 - rc=6 [? CALL ?] AP29 - rc=7 [? CALL ] AP44 - rc=8 [CALL CALL GRID] AP72 - rc=9 [CQ CALL ?] AP55 - rc=10 [CQ CALL ] AP70 - rc=11 [CQ CALL GRID] AP70 - -The return code is <0 when decoding is unsuccessful - -This test simulates the situation ntx times and reports how many times -a particular type decode among the above 6 cases succeded. -*/ - - int x[QRA64_K], xdec[QRA64_K]; - int y[QRA64_N]; - float *rx; - float ebnodbest, ebnodbavg=0; - int rc,k; - - int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - int nundet = 0; - int ntx = 200,ndec=0; - - qra64codec *codec_iv3nwv = qra64_init(mode); // codec for IV3NWV - qra64codec *codec_k1jt = qra64_init(mode); // codec for K1JT - - printf("\nQRA64 Test #2 - Decoding with AP knowledge (SNR-Eb/No offset = %.1f dB)\n\n", - QRA64_SNR_EBNO_OFFSET); - -// This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b] -// printf("K1JT decoder enabled for [K1JT ? ?/blank]\n"); -// qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL); - -// This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b] -// printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n"); -// qra64_apset(codec_k1jt, CALL_CQ,CALL_IV3NWV,0,APTYPE_BOTHCALLS); - -// This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?] -// printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n"); -// qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL); - -// This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs - printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n"); - qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL); - -// This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs - printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n"); - qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL); - - - // Dx station IV3NWV calls - printf("\nIV3NWV encoder sends msg: [K1JT IV3NWV JN66]\n\n"); - encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66); - -// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV JN66]\n\n"); -// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66); - -// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV]\n\n"); -// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_BLANK); - qra64_encode(codec_iv3nwv, y, x); - - printf("Simulating K1JT decoder up to AP72\n"); - - for (k=0;k=0) { - ebnodbavg +=ebnodbest; - if (memcmp(xdec,x,12*sizeof(int))==0) - ndecok[rc]++; - else - nundet++; - } - } - printf("\n\n"); - - - printf("Transimtted msgs:%d\nDecoded msgs:\n\n",ntx); - for (k=0;k<12;k++) { - printf("%3d with %s\n",ndecok[k],decode_type[k]); - ndec += ndecok[k]; - } - printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet); - printf(""); - - ebnodbavg/=(ndec+nundet); - printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET); - - return 0; -} - -int test_fastfading(float EbNodB, float B90, int fadingModel, int submode, int apmode, int olddec, int channel_type, int ntx) -{ - int x[QRA64_K], xdec[QRA64_K]; - int y[QRA64_N]; - float *rx; - float ebnodbest, ebnodbavg=0; - int rc,k; - float rxolddec[QRA64_N*QRA64_M]; // holds the energies at nominal tone freqs - - int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - int nundet = 0; - int ndec=0; - - qra64codec *codec_iv3nwv; - qra64codec *codec_k1jt; - - codec_iv3nwv=qra64_init(QRA_NOAP); - codec_k1jt =qra64_init(apmode); - - if (channel_type==2) { // fast-fading case - printf("Simulating the fast-fading channel\n"); - printf("B90=%.2f Hz - Fading Model=%s - Submode=QRA64%c\n",B90,fadingModel?"Lorentz":"Gauss",submode+'A'); - printf("Decoder metric = %s\n",olddec?"AWGN":"Matched to fast-fading signal"); - } - else { - printf("Simulating the %s channel\n",channel_type?"Rayleigh block fading":"AWGN"); - printf("Decoder metric = AWGN\n"); - } - - - printf("\nEncoding msg [K1JT IV3NWV JN66]\n"); - encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV,GRID_JN66); -// printf("["); -// for (k=0;k<11;k++) printf("%02hX ",x[k]); printf("%02hX]\n",x[11]); - - qra64_encode(codec_iv3nwv, y, x); - printf("%d transmissions will be simulated\n\n",ntx); - - if (apmode==QRA_USERAP) { - // This will enable K1JT's decoder to look for cq/qrz calls [CQ/QRZ ? ?/b] - printf("K1JT decoder enabled for [CQ ? ?/blank]\n"); - qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_CQQRZ); - - // This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b] - printf("K1JT decoder enabled for [K1JT ? ?/blank]\n"); - qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL); - - // This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?] - printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n"); - qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL); - - // This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b] - printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n"); - qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,0,APTYPE_BOTHCALLS); - - // This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs - printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n"); - qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL); - - // This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs - printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n"); - qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL); - - } - - printf("\nNow decoding with K1JT's decoder...\n"); -/* - if (channel_type==2) // simulate a fast-faded signal - printf("Simulating a fast-fading channel with given B90 and spread type\n"); - else - printf("Simulating a %s channel\n",channel_type?"Rayleigh block fading":"AWGN"); -*/ - for (k=0;k=0) { - ebnodbavg +=ebnodbest; - if (memcmp(xdec,x,12*sizeof(int))==0) - ndecok[rc]++; - else { - fprintf(stderr,"\nUndetected error with rc=%d\n",rc); - nundet++; - } - } - - } - printf(" %5.1f %%\r",100.0*k/ntx); - - printf("\n\n"); - - printf("Msgs transmitted:%d\nMsg decoded:\n\n",ntx); - for (k=0;k<12;k++) { - printf("rc=%2d %3d with %s\n",k,ndecok[k],decode_type[k]); - ndec += ndecok[k]; - } - printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet); - printf(""); - - if (ndec>0) { - ebnodbavg/=(ndec+nundet); - printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET); - } - - return 0; -} - - - -void syntax(void) -{ - - printf("\nQRA64 Mode Tests\n"); - printf("2016, Nico Palermo - IV3NWV\n\n"); - printf("---------------------------\n\n"); - printf("Syntax: qra64 [-s] [-c] [-a] [-t] [-h]\n"); - printf("Options: \n"); - printf(" -s : set simulation SNR in 2500 Hz BW (default:-27.5 dB)\n"); - printf(" -c : set channel type 0=AWGN (default) 1=Rayleigh 2=Fast-fading\n"); - printf(" -a : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP\n"); - printf(" -t: 0=simulate seq of msgs between IV3NWV and K1JT (default)\n"); - printf(" 1=simulate K1JT receiving K1JT IV3NWV JN66\n"); - printf(" 2=simulate fast-fading/awgn/rayliegh decoders performance\n"); - printf(" -n : simulate the transmission of ntx codewords (default=100)\n"); - - printf("Options used only for fast-fading simulations (-c2):\n"); - printf(" -b : 90%% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz)\n"); - printf(" -m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz)\n"); - printf(" -q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A)\n"); - printf(" -d : use the old awgn decoder\n"); - printf(" -h: this help\n"); - printf("Example:\n"); - printf(" qra64 -t2 -c2 -a2 -b50 -m1 -q2 -n10000 -s-26\n"); - printf(" runs the error performance test (-t2)\n"); - printf(" with USER_AP (-a2)\n"); - printf(" simulating a fast fading channel (-c2)\n"); - printf(" with B90 = 50 Hz (-b50), Lorentz Doppler (-m1), mode QRA64C (-q2)\n"); - printf(" ntx = 10000 codewords (-n10000) and SNR = -26 dB (-s-26)\n"); - -} - -int main(int argc, char* argv[]) -{ - int k, rc, nok=0; - float SNRdB = -27.5f; - unsigned int channel = CHANNEL_AWGN; - unsigned int mode = QRA_AUTOAP; - unsigned int testtype=0; - int nqso = 100; - float EbNodB; - float B90 = 2.5; - int fadingModel = 1; - int submode = 0; - int olddec = 0; - int ntx = 100; - -// Parse the command line - while(--argc) { - argv++; - - if (strncmp(*argv,"-h",2)==0) { - syntax(); - return 0; - } - else - if (strncmp(*argv,"-n",2)==0) { - ntx = ( int)atoi((*argv)+2); - if (ntx<100 || ntx>1000000) { - printf("Invalid -n option. ntx must be in the range [100..1000000]\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-a",2)==0) { - mode = ( int)atoi((*argv)+2); - if (mode>2) { - printf("Invalid decoding mode\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-s",2)==0) { - SNRdB = (float)atof((*argv)+2); - if (SNRdB>20 || SNRdB<-50) { - printf("SNR should be in the range [-50..20]\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-t",2)==0) { - testtype = ( int)atoi((*argv)+2); - if (testtype>2) { - printf("Invalid test type\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-c",2)==0) { - channel = ( int)atoi((*argv)+2); - if (channel>CHANNEL_FASTFADE) { - printf("Invalid channel type\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-b",2)==0) { - B90 = (float)atof((*argv)+2); - if (B90<1 || B90>230) { - printf("Invalid B90\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-m",2)==0) { - fadingModel = (int)atoi((*argv)+2); - if (fadingModel<0 || fadingModel>1) { - printf("Invalid fading model\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-q",2)==0) { - submode = (int)atoi((*argv)+2); - if (submode<0 || submode>4) { - printf("Invalid submode\n"); - syntax(); - return -1; - } - } - else - if (strncmp(*argv,"-d",2)==0) { - olddec = 1; - } - else { - printf("Invalid option\n"); - syntax(); - return -1; - } - } - - if (testtype<2) // old tests - if (channel==CHANNEL_FASTFADE) { - printf("Invalid Option. Test type 0 and 1 supports only AWGN or Rayleigh Channel model\n"); - return -1; - } - - EbNodB = SNRdB+QRA64_SNR_EBNO_OFFSET; - -#if defined(__linux__) || defined(__unix__) - srand48(GetTickCount()); -#endif - - if (testtype==0) { - for (k=0;k. - ------------------------------------------------------------------------------ - -QRA code used in this sowftware release: - -QRA13_64_64_IRR_E: K=13 N=64 Q=64 irregular QRA code (defined in -qra13_64_64_irr_e.h /.c) - -Codes with K=13 are designed to include a CRC as the 13th information symbol -and improve the code UER (Undetected Error Rate). -The CRC symbol is not sent along the channel (the codes are punctured) and the -resulting code is a (12,63) code -*/ -//---------------------------------------------------------------------------- - -#include -#include - -#include "qra64.h" -#include "../qracodes/qracodes.h" -#include "../qracodes/qra13_64_64_irr_e.h" -#include "../qracodes/pdmath.h" -#include "../qracodes/normrnd.h" - -// Code parameters of the QRA64 mode -#define QRA64_CODE qra_13_64_64_irr_e -#define QRA64_NMSG 218 // Must much value indicated in QRA64_CODE.NMSG - -#define QRA64_KC (QRA64_K+1) // Information symbols (crc included) -#define QRA64_NC (QRA64_N+1) // Codeword length (as defined in the code) -#define QRA64_NITER 100 // max number of iterations per decode - -// static functions declarations ---------------------------------------------- -static int calc_crc6(const int *x, int sz); -static void ix_mask(float *dst, const float *src, const int *mask, - const int *x); -static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix); -static int qra64_do_decode(int *x, const float *pix, const int *ap_mask, - const int *ap_x); -static float qra64_fastfading_estim_noise_std( - const float *rxen, - const float esnometric, - const int submode); - -static void qra64_fastfading_intrinsics( - float *pix, - const float *rxen, - const float *hptr, - const int hlen, - const float sigma, - const float EsNoMetric, - const int submode); - -static float qra64_fastfading_msg_esno( - const int *ydec, - const float *rxen, - const float sigma, - const float EsNoMetric, - const int hlen, - const int submode); - - -// a-priori information masks for fields in JT65-like msgs -------------------- - -// when defined limits the AP masks to reduce the false decode rate -#define LIMIT_AP_MASKS - -#ifdef LIMIT_AP_MASKS -#define MASK_CQQRZ 0xFFFFFFC -#define MASK_CALL1 0xFFFFFFC -#define MASK_CALL2 0xFFFFFFC -#define MASK_GRIDFULL 0x3FFC -#define MASK_GRIDFULL12 0x3FFC -#define MASK_GRIDBIT 0x8000 -#else -#define MASK_CQQRZ 0xFFFFFFC -#define MASK_CALL1 0xFFFFFFF -#define MASK_CALL2 0xFFFFFFF -#define MASK_GRIDFULL 0xFFFF -#define MASK_GRIDFULL12 0x3FFC -#define MASK_GRIDBIT 0x8000 // b[15] is 1 for free text, 0 otherwise -#endif - -// ---------------------------------------------------------------------------- - - - - -qra64codec *qra64_init(int flags) -{ - - // Eb/No value for which we optimize the decoder metric - const float EbNodBMetric = 2.8f; - const float EbNoMetric = (float)pow(10,EbNodBMetric/10); - const float R = 1.0f*(QRA64_KC)/(QRA64_NC); - - qra64codec *pcodec = (qra64codec*)malloc(sizeof(qra64codec)); - - if (!pcodec) - return 0; // can't allocate memory - - pcodec->decEsNoMetric = 1.0f*QRA64_m*R*EbNoMetric; - pcodec->apflags = flags; - - memset(pcodec->apmsg_set,0,APTYPE_SIZE*sizeof(int)); - - if (flags==QRA_NOAP) - return pcodec; - - // for QRA_USERAP and QRA_AUTOAP modes we always enable [CQ/QRZ ? ?] mgs look-up. - // encode CQ/QRZ AP messages - // NOTE: Here we handle only CQ and QRZ msgs. - // 'CQ nnn', 'CQ DX' and 'DE' msgs will be handled by the decoder - // as messages with no a-priori knowledge - qra64_apset(pcodec, CALL_CQ, 0, GRID_BLANK, APTYPE_CQQRZ); - - // initialize masks for decoding with a-priori information - encodemsg_jt65(pcodec->apmask_cqqrz, MASK_CQQRZ, 0, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_cqqrz_ooo, MASK_CQQRZ, 0, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call1, MASK_CALL1, 0, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call1_ooo, MASK_CALL1, 0, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call2, 0, MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call2_ooo, 0, MASK_CALL2, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call1_call2, MASK_CALL1,MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call1_call2_grid,MASK_CALL1,MASK_CALL2, MASK_GRIDFULL12); - encodemsg_jt65(pcodec->apmask_cq_call2, MASK_CQQRZ, MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_cq_call2_ooo, MASK_CQQRZ, MASK_CALL2, MASK_GRIDFULL12); - - return pcodec; -} - -void qra64_close(qra64codec *pcodec) -{ - free(pcodec); -} - -int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype) -{ -// Set decoder a-priori knowledge accordingly to the type of the message to look up for -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// mycall = mycall to look for -// hiscall = hiscall to look for -// grid = grid to look for -// aptype = define and masks the type of AP to be set accordingly to the following: -// APTYPE_CQQRZ set [cq/qrz ? ?/blank] -// APTYPE_MYCALL set [mycall ? ?/blank] -// APTYPE_HISCALL set [? hiscall ?/blank] -// APTYPE_BOTHCALLS set [mycall hiscall ?] -// APTYPE_FULL set [mycall hiscall grid] -// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] and [cq/qrz hiscall grid] -// returns: -// 0 on success -// -1 when qra64_init was called with the QRA_NOAP flag -// -2 invalid apytpe - - if (pcodec->apflags==QRA_NOAP) - return -1; - - switch (aptype) { - case APTYPE_CQQRZ: - encodemsg_jt65(pcodec->apmsg_cqqrz, CALL_CQ, 0, GRID_BLANK); - break; - case APTYPE_MYCALL: - encodemsg_jt65(pcodec->apmsg_call1, mycall, 0, GRID_BLANK); - break; - case APTYPE_HISCALL: - encodemsg_jt65(pcodec->apmsg_call2, 0, hiscall, GRID_BLANK); - break; - case APTYPE_BOTHCALLS: - encodemsg_jt65(pcodec->apmsg_call1_call2, mycall, hiscall, GRID_BLANK); - break; - case APTYPE_FULL: - encodemsg_jt65(pcodec->apmsg_call1_call2_grid, mycall, hiscall, grid); - break; - case APTYPE_CQHISCALL: - encodemsg_jt65(pcodec->apmsg_cq_call2, CALL_CQ, hiscall, GRID_BLANK); - encodemsg_jt65(pcodec->apmsg_cq_call2_grid, CALL_CQ, hiscall, grid); - break; - default: - return -2; // invalid ap type - } - - pcodec->apmsg_set[aptype]=1; // signal the decoder to look-up for the specified type - - - return 0; -} -void qra64_apdisable(qra64codec *pcodec, const int aptype) -{ - if (pcodec->apflags==QRA_NOAP) - return; - - if (aptype=APTYPE_SIZE) - return; - - pcodec->apmsg_set[aptype] = 0; // signal the decoder not to look-up to the specified type -} - -void qra64_encode(qra64codec *pcodec, int *y, const int *x) -{ - int encx[QRA64_KC]; // encoder input buffer - int ency[QRA64_NC]; // encoder output buffer - - int hiscall,mycall,grid; - - memcpy(encx,x,QRA64_K*sizeof(int)); // Copy input to encoder buffer - encx[QRA64_K]=calc_crc6(encx,QRA64_K); // Compute and add crc symbol - qra_encode(&QRA64_CODE, ency, encx); // encode msg+crc using given QRA code - - // copy codeword to output puncturing the crc symbol - memcpy(y,ency,QRA64_K*sizeof(int)); // copy information symbols - memcpy(y+QRA64_K,ency+QRA64_KC,QRA64_C*sizeof(int)); // copy parity symbols - - if (pcodec->apflags!=QRA_AUTOAP) - return; - - // Here we handle the QRA_AUTOAP mode -------------------------------------------- - - // When a [hiscall mycall ?] msg is detected we instruct the decoder - // to look for [mycall hiscall ?] msgs - // otherwise when a [cq mycall ?] msg is sent we reset the APTYPE_BOTHCALLS - - // look if the msg sent is a std type message (bit15 of grid field = 0) - if ((x[9]&0x80)) - return; // no, it's a text message, nothing to do - - // It's a [hiscall mycall grid] message - - // We assume that mycall is our call (but we don't check it) - // hiscall the station we are calling or a general call (CQ/QRZ/etc..) - decodemsg_jt65(&hiscall,&mycall,&grid,x); - - - if ((hiscall>=CALL_CQ && hiscall<=CALL_CQ999) || hiscall==CALL_CQDX || - hiscall==CALL_DE) { - // tell the decoder to look for msgs directed to us - qra64_apset(pcodec,mycall,0,0,APTYPE_MYCALL); - // We are making a general call and don't know who might reply - // Reset APTYPE_BOTHCALLS so decoder won't look for [mycall hiscall ?] msgs - qra64_apdisable(pcodec,APTYPE_BOTHCALLS); - } else { - // We are replying to someone named hiscall - // Set APTYPE_BOTHCALLS so decoder will try for [mycall hiscall ?] msgs - qra64_apset(pcodec,mycall, hiscall, GRID_BLANK, APTYPE_BOTHCALLS); - } - -} - -#define EBNO_MIN -10.0f // minimum Eb/No value returned by the decoder (in dB) -// AWGN metric decoder -int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *rxen) -{ - int k; - float *srctmp, *dsttmp; - float ix[QRA64_NC*QRA64_M]; // (depunctured) intrisic information - int xdec[QRA64_KC]; // decoded message (with crc) - int ydec[QRA64_NC]; // re-encoded message (for snr calculations) - float noisestd; // estimated noise variance - float msge; // estimated message energy - float ebnoval; // estimated Eb/No - int rc; - - if (QRA64_NMSG!=QRA64_CODE.NMSG) // sanity check - return -16; // QRA64_NMSG define is wrong - - // compute symbols intrinsic probabilities from received energy observations - noisestd = qra_mfskbesselmetric(ix, rxen, QRA64_m, QRA64_N,pcodec->decEsNoMetric); - - // de-puncture observations adding a uniform distribution for the crc symbol - - // move check symbols distributions one symbol towards the end - dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist - srctmp = dsttmp-QRA64_M; // source is the previous pd - for (k=0;k57.004f) - ebnoval=57.004f; - ebnoval = ebnoval*57.03f/(57.03f-ebnoval); - - // compute value in dB - if (ebnoval<=0) { - ebnoval = EBNO_MIN; // assume a minimum, positive value - } - else { - ebnoval = 10.0f*(float)log10(ebnoval); - if (ebnoval4) - return -17; // invalid submode - - if (B90<1.0f || B90>238.0f) - return -18; // B90 out of range - - // compute index to most appropriate amplitude weighting function coefficients - hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); - - if (hidx<0 || hidx > 64) - return -19; // index of weighting function out of range - - if (fadingModel==0) { // gaussian fading model - // point to gaussian energy weighting taps - hlen = glen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = gptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else if (fadingModel==1) { - // point to lorentzian energy weighting taps - hlen = glen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = gptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else - return -20; // invalid fading model index - - - // compute (euristically) the optimal decoder metric accordingly the given spread amount - // We assume that the decoder threshold is: - // Es/No(dB) = Es/No(AWGN)(dB) + 8*log(B90)/log(240)(dB) - // that's to say, at the maximum Doppler spread bandwidth (240 Hz) there's a ~8 dB Es/No degradation - // over the AWGN case - tempf = 8.0f*(float)log((float)B90)/(float)log(240.0f); - EsNoMetric = pcodec->decEsNoMetric*(float)pow(10.0f,tempf/10.0f); - - - - // Step 1 ----------------------------------------------------------------------------------- - // Evaluate the noise stdev from the received energies at nominal tone frequencies - noisestd = qra64_fastfading_estim_noise_std(rxen, EsNoMetric, submode); - - // Step 2 ----------------------------------------------------------------------------------- - // Compute message symbols probability distributions - qra64_fastfading_intrinsics(ix, rxen, hptr, hlen, noisestd, EsNoMetric, submode); - - // Step 3 --------------------------------------------------------------------------- - // De-puncture observations adding a uniform distribution for the crc symbol - // Move check symbols distributions one symbol towards the end - dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist - srctmp = dsttmp-QRA64_M; // source is the previous pd - for (k=0;k Eb/N0 conversion - ebnoval = 1.0f/(1.0f*QRA64_K/QRA64_N*QRA64_m)*esno; - - // compute value in dB - if (ebnoval<=0) { - ebnoval = EBNO_MIN; // assume a minimum, positive value - } - else { - ebnoval = 10.0f*(float)log10(ebnoval); - if (ebnoval238.0f) - return -18; // B90 out of range - - // compute index to most appropriate energy weighting function coefficients - hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); - - if (hidx<0 || hidx > 64) - return -19; // index of weighting function out of range - - if (fadingModel==0) { // gaussian fading model - // point to gaussian weighting taps - hlen = glen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = gptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else if (fadingModel==1) { - // point to lorentzian weighting taps - hlen = glen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = gptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else - return -20; // invalid fading model index - - - // Compute the unfaded tone amplitudes from the Eb/No value passed to the call - N0 = 1.0f; // assume unitary noise PSD - sigmanoise = (float)sqrt(N0/2); - EsN0 = (float)pow(10.0f,EbN0dB/10.0f)*QRA64_m*QRA64_K/QRA64_N; // Es/No = m*R*Eb/No - Es = EsN0*N0; - - // compute signal bin sigmas - for (n=0;n=0;j--) { - normrnd_s(iq, 2, 0 , sigmasig[j]); - *curi++ += iq[0]; - *curq++ += iq[1]; - } - - } - - // compute total bin energies (S+N) and store in first half of buffer - curi = channel_out; - curq = channel_out+bpm; - for (n=0;nmaxloglh) // keep track of the max loglikelihood - maxloglh = loglh; - curix[k]=loglh; - } - - // scale to likelihoods - sumix = 0.f; - for (k=0;k1 - if (u<1) - return 0.f; - - // check u(bps/tothlen)) - return 10000.f; - - // solve for Es/No - esno = (u-1.0f)/(1.0f/tothlen-u/bps); - - return esno; - - -} - -#ifdef LIMIT_AP_MASKS - -static int call1_match(const int *papmsg, const int *pdec) -{ - // assumes MASK_CALL1 = 0xFFFFFFC - int u = papmsg[4]^pdec[4]; - return (u&0x3C)==0; -} -static int call2_match(const int *papmsg, const int *pdec) -{ - // assumes MASK_CALL2 = 0xFFFFFFC - int u = papmsg[9]^pdec[9]; - return (u&0x30)==0; -} -static int grid_match(const int *papmsg, const int *pdec) -{ - // assumes MASK_GRIDFULL = 0x3FFC - int u = papmsg[11]^pdec[11]; - int rc = (u&0x03)==0; - - u = papmsg[9]^pdec[9]; - - return (u&0x0C)==0 && rc; -} - -#else -#define call1_match(a,b) (1) -#define call2_match(a,b) (1) -#define grid_match(a,b) (1) -#endif - - - - -// Attempt to decode given intrisic information -static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix) -{ - int rc; - - // Attempt to decode without a-priori info -------------------------------- - rc = qra64_do_decode(xdec, ix, NULL, NULL); - if (rc>=0) - return 0; // successfull decode with AP0 - else - if (pcodec->apflags==QRA_NOAP) - // nothing more to do - return rc; // rc<0 = unsuccessful decode - - // Here we handle decoding with AP knowledge - - - // Attempt to decode CQ calls - rc = qra64_do_decode(xdec,ix,pcodec->apmask_cqqrz, pcodec->apmsg_cqqrz); - if (rc>=0) - return 1; // decoded [cq/qrz ? ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cqqrz_ooo, - pcodec->apmsg_cqqrz); - if (rc>=0) - // check that ooo really matches - if (grid_match(pcodec->apmsg_cqqrz,xdec)) - return 2; // decoded [cq/qrz ? ooo] - - // attempt to decode calls directed to us - if (pcodec->apmsg_set[APTYPE_MYCALL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1, - pcodec->apmsg_call1); - if (rc>=0) - // check that mycall really matches - if (call1_match(pcodec->apmsg_call1,xdec)) - return 3; // decoded [mycall ? ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_ooo, - pcodec->apmsg_call1); - if (rc>=0) - // check that mycall and ooo really match - if (call1_match(pcodec->apmsg_call1,xdec) && - grid_match(pcodec->apmsg_call1,xdec)) - return 4; // decoded [mycall ? ooo] - } - - // attempt to decode [mycall hiscall ?] msgs - if (pcodec->apmsg_set[APTYPE_BOTHCALLS]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2, - pcodec->apmsg_call1_call2); - if (rc>=0) - // check that mycall and hiscall really match - if (call1_match(pcodec->apmsg_call1_call2,xdec) && - call2_match(pcodec->apmsg_call1_call2,xdec)) - return 5; // decoded [mycall srccall ?] - } - - // attempt to decode [? hiscall ?/b] msgs - if (pcodec->apmsg_set[APTYPE_HISCALL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2, - pcodec->apmsg_call2); - if (rc>=0) - // check that hiscall really match - if (call2_match(pcodec->apmsg_call2,xdec)) - return 6; // decoded [? hiscall ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2_ooo, - pcodec->apmsg_call2); - if (rc>=0) - // check that hiscall and ooo match - if (call2_match(pcodec->apmsg_call2,xdec) && - grid_match(pcodec->apmsg_call2,xdec)) - return 7; // decoded [? hiscall ooo] - } - - // attempt to decode [cq/qrz hiscall ?/b/grid] msgs - if (pcodec->apmsg_set[APTYPE_CQHISCALL]) { - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2, - pcodec->apmsg_cq_call2); - if (rc>=0) - // check that hiscall matches - if (call2_match(pcodec->apmsg_call2,xdec)) - return 9; // decoded [cq/qrz hiscall ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, - pcodec->apmsg_cq_call2_grid); - if (rc>=0) { - // Full AP mask need special handling - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_cq_call2_grid,xdec, QRA64_K*sizeof(int))==0) - return 11; // decoded [cq/qrz hiscall grid] - } - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, - pcodec->apmsg_cq_call2); - if (rc>=0) { - // Full AP mask need special handling - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_cq_call2,xdec, QRA64_K*sizeof(int))==0) - return 10; // decoded [cq/qrz hiscall ] - } - } - - // attempt to decode [mycall hiscall grid] - if (pcodec->apmsg_set[APTYPE_FULL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2_grid, - pcodec->apmsg_call1_call2_grid); - if (rc>=0) { - // Full AP mask need special handling - // All the three msg fields were given. - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_call1_call2_grid,xdec, QRA64_K*sizeof(int))==0) - return 8; // decoded [mycall hiscall grid] - } - } - - // all decoding attempts failed - return -1; -} - - - -// Decode with given a-priori information -static int qra64_do_decode(int *xdec, const float *pix, const int *ap_mask, - const int *ap_x) -{ - int rc; - const float *ixsrc; - float ix_masked[QRA64_NC*QRA64_M]; // Masked intrinsic information - float ex[QRA64_NC*QRA64_M]; // Extrinsic information from the decoder - - float v2cmsg[QRA64_NMSG*QRA64_M]; // buffers for the decoder messages - float c2vmsg[QRA64_NMSG*QRA64_M]; - - if (ap_mask==NULL) { // no a-priori information - ixsrc = pix; // intrinsic source is what passed as argument - } else { - // a-priori information provided - // mask channel observations with a-priori - ix_mask(ix_masked,pix,ap_mask,ap_x); - ixsrc = ix_masked; // intrinsic source is the masked version - } - - // run the decoding algorithm - rc = qra_extrinsic(&QRA64_CODE,ex,ixsrc,QRA64_NITER,v2cmsg,c2vmsg); - if (rc<0) - return -1; // no convergence in given iterations - - // decode - qra_mapdecode(&QRA64_CODE,xdec,ex,ixsrc); - - // verify crc - if (calc_crc6(xdec,QRA64_K)!=xdec[QRA64_K]) // crc doesn't match (detected error) - return -2; // decoding was succesfull but crc doesn't match - - return 0; -} - - -// crc functions -------------------------------------------------------------- -// crc-6 generator polynomial -// g(x) = x^6 + a5*x^5 + ... + a1*x + a0 - -// g(x) = x^6 + x + 1 -#define CRC6_GEN_POL 0x30 // MSB=a0 LSB=a5 - -// g(x) = x^6 + x^2 + x + 1 (See: https://users.ece.cmu.edu/~koopman/crc/) -// #define CRC6_GEN_POL 0x38 // MSB=a0 LSB=a5. Simulation results are similar - -static int calc_crc6(const int *x, int sz) -{ - // todo: compute it faster using a look up table - int k,j,t,sr = 0; - for (k=0;k>1) ^ CRC6_GEN_POL; - else - sr = (sr>>1); - t>>=1; - } - } - return sr; -} - -static void ix_mask(float *dst, const float *src, const int *mask, - const int *x) -{ - // mask intrinsic information (channel observations) with a priori knowledge - - int k,kk, smask; - float *row; - - memcpy(dst,src,(QRA64_NC*QRA64_M)*sizeof(float)); - - for (k=0;k>22)&0x3F; - y[1]= (call1>>16)&0x3F; - y[2]= (call1>>10)&0x3F; - y[3]= (call1>>4)&0x3F; - y[4]= (call1<<2)&0x3F; - - y[4] |= (call2>>26)&0x3F; - y[5]= (call2>>20)&0x3F; - y[6]= (call2>>14)&0x3F; - y[7]= (call2>>8)&0x3F; - y[8]= (call2>>2)&0x3F; - y[9]= (call2<<4)&0x3F; - - y[9] |= (grid>>12)&0x3F; - y[10]= (grid>>6)&0x3F; - y[11]= (grid)&0x3F; - -} -void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x) -{ - int nc1, nc2, ng; - - nc1 = x[4]>>2; - nc1 |= x[3]<<4; - nc1 |= x[2]<<10; - nc1 |= x[1]<<16; - nc1 |= x[0]<<22; - - nc2 = x[9]>>4; - nc2 |= x[8]<<2; - nc2 |= x[7]<<8; - nc2 |= x[6]<<14; - nc2 |= x[5]<<20; - nc2 |= (x[4]&0x03)<<26; - - ng = x[11]; - ng |= x[10]<<6; - ng |= (x[9]&0x0F)<<12; - - *call1 = nc1; - *call2 = nc2; - *grid = ng; -} diff --git a/lib/qra/qra64/qra64.h b/lib/qra/qra64/qra64.h deleted file mode 100644 index 3b2b5bd3d..000000000 --- a/lib/qra/qra64/qra64.h +++ /dev/null @@ -1,269 +0,0 @@ -// qra64.h -// Encoding/decoding functions for the QRA64 mode -// -// (c) 2016 - Nico Palermo, IV3NWV -// ------------------------------------------------------------------------------ -// This file is part of the qracodes project, a Forward Error Control -// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes. -// -// qracodes is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// qracodes is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with qracodes source distribution. -// If not, see . - -#ifndef _qra64_h_ -#define _qra64_h_ - -// qra64_init(...) initialization flags -#define QRA_NOAP 0 // don't use a-priori knowledge -#define QRA_AUTOAP 1 // use auto a-priori knowledge -#define QRA_USERAP 2 // a-priori knowledge messages provided by the user - -// QRA code parameters -#define QRA64_K 12 // information symbols -#define QRA64_N 63 // codeword length -#define QRA64_C 51 // (number of parity checks C=(N-K)) -#define QRA64_M 64 // code alphabet size -#define QRA64_m 6 // bits per symbol - -// packed predefined callsigns and fields as defined in JT65 -#define CALL_CQ 0xFA08319 -#define CALL_QRZ 0xFA0831A -#define CALL_CQ000 0xFA0831B -#define CALL_CQ999 0xFA08702 -#define CALL_CQDX 0x5624C39 -#define CALL_DE 0xFF641D1 -#define GRID_BLANK 0x7E91 - -// Types of a-priori knowledge messages -#define APTYPE_CQQRZ 0 // [cq/qrz ? ?/blank] -#define APTYPE_MYCALL 1 // [mycall ? ?/blank] -#define APTYPE_HISCALL 2 // [? hiscall ?/blank] -#define APTYPE_BOTHCALLS 3 // [mycall hiscall ?] -#define APTYPE_FULL 4 // [mycall hiscall grid] -#define APTYPE_CQHISCALL 5 // [cq/qrz hiscall ?/blank] -#define APTYPE_SIZE (APTYPE_CQHISCALL+1) - -typedef struct { - float decEsNoMetric; - int apflags; - int apmsg_set[APTYPE_SIZE]; // indicate which ap type knowledge has - // been set by the user -// ap messages buffers - int apmsg_cqqrz[12]; // [cq/qrz ? ?/blank] - int apmsg_call1[12]; // [mycall ? ?/blank] - int apmsg_call2[12]; // [? hiscall ?/blank] - int apmsg_call1_call2[12]; // [mycall hiscall ?] - int apmsg_call1_call2_grid[12]; // [mycall hiscall grid] - int apmsg_cq_call2[12]; // [cq hiscall ?/blank] - int apmsg_cq_call2_grid[12]; // [cq hiscall grid] - -// ap messages masks - int apmask_cqqrz[12]; - int apmask_cqqrz_ooo[12]; - int apmask_call1[12]; - int apmask_call1_ooo[12]; - int apmask_call2[12]; - int apmask_call2_ooo[12]; - int apmask_call1_call2[12]; - int apmask_call1_call2_grid[12]; - int apmask_cq_call2[12]; - int apmask_cq_call2_ooo[12]; -} qra64codec; - -#ifdef __cplusplus -extern "C" { -#endif - -qra64codec *qra64_init(int flags); -// QRA64 mode initialization function -// arguments: -// flags: set the decoder mode -// QRA_NOAP use no a-priori information -// QRA_AUTOAP use any relevant previous decodes -// QRA_USERAP use a-priori information provided via qra64_apset(...) -// returns: -// Pointer to initialized qra64codec data structure -// this pointer should be passed to the encoding/decoding functions -// -// 0 if unsuccessful (can't allocate memory) -// ---------------------------------------------------------------------------- - -void qra64_encode(qra64codec *pcodec, int *y, const int *x); -// QRA64 encoder -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// x = pointer to the message to be encoded, int x[12] -// x must point to an array of integers (i.e. defined as int x[12]) -// y = pointer to encoded message, int y[63]= -// ---------------------------------------------------------------------------- - -int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *r); -// QRA64 mode decoder -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// ebno = pointer to a float where the avg Eb/No (in dB) will be stored -// in case of successfull decoding -// (pass a null pointer if not interested) -// x = pointer to decoded message, int x[12] -// r = pointer to received symbol energies (squared amplitudes) -// r must point to an array of length QRA64_M*QRA64_N (=64*63=4032) -// The first QRA_M entries should be the energies of the first -// symbol in the codeword; the last QRA_M entries should be the -// energies of the last symbol in the codeword -// -// return code: -// -// The return code is <0 when decoding is unsuccessful -// -16 indicates that the definition of QRA64_NMSG does not match what required by the code -// If the decoding process is successfull the return code is accordingly to the following table -// rc=0 [? ? ?] AP0 (decoding with no a-priori) -// rc=1 [CQ ? ?] AP27 -// rc=2 [CQ ? ] AP44 -// rc=3 [CALL ? ?] AP29 -// rc=4 [CALL ? ] AP45 -// rc=5 [CALL CALL ?] AP57 -// rc=6 [? CALL ?] AP29 -// rc=7 [? CALL ] AP45 -// rc=8 [CALL CALL GRID] AP72 (actually a AP68 mask to reduce false decodes) -// rc=9 [CQ CALL ?] AP55 -// rc=10 [CQ CALL ] AP70 (actaully a AP68 mask to reduce false decodes) - -// return codes in the range 1-10 indicate the amount and the type of a-priori -// information was required to decode the received message. - - -// Decode a QRA64 msg using a fast-fading metric -int qra64_decode_fastfading( - qra64codec *pcodec, // ptr to the codec structure - float *ebno, // ptr to where the estimated Eb/No value will be saved - int *x, // ptr to decoded message - const float *rxen, // ptr to received symbol energies array - const int submode, // submode idx (0=QRA64A ... 4=QRA64E) - const float B90, // spread bandwidth (90% fractional energy) - const int fadingModel); // 0=Gaussian 1=Lorentzian fade model -// -// rxen: The array of the received bin energies -// Bins must be spaced by integer multiples of the symbol rate (1/Ts Hz) -// The array must be an array of total length U = L x N where: -// L: is the number of frequency bins per message symbol (see after) -// N: is the number of symbols in a QRA64 msg (63) -// -// The number of bins/symbol L depends on the selected submode accordingly to -// the following rule: -// L = (64+64*2^submode+64) = 64*(2+2^submode) -// Tone 0 is always supposed to be at offset 64 in the array. -// The m-th tone nominal frequency is located at offset 64 + m*2^submode (m=0..63) -// -// Submode A: (2^submode = 1) -// L = 64*3 = 196 bins/symbol -// Total length of the energies array: U = 192*63 = 12096 floats -// -// Submode B: (2^submode = 2) -// L = 64*4 = 256 bins/symbol -// Total length of the energies array: U = 256*63 = 16128 floats -// -// Submode C: (2^submode = 4) -// L = 64*6 = 384 bins/symbol -// Total length of the energies array: U = 384*63 = 24192 floats -// -// Submode D: (2^submode = 8) -// L = 64*10 = 640 bins/symbol -// Total length of the energies array: U = 640*63 = 40320 floats -// -// Submode E: (2^submode = 16) -// L = 64*18 = 1152 bins/symbol -// Total length of the energies array: U = 1152*63 = 72576 floats -// -// Note: The rxen array is modified and reused for internal calculations. -// -// -// B90: spread fading bandwidth in Hz (90% fractional average energy) -// -// B90 should be in the range 1 Hz ... 238 Hz -// The value passed to the call is rounded to the closest value among the -// 64 available values: -// B = 1.09^k Hz, with k=0,1,...,63 -// -// I.e. B90=27 Hz will be approximated in this way: -// k = rnd(log(27)/log(1.09)) = 38 -// B90 = 1.09^k = 1.09^38 = 26.4 Hz -// -// For any input value the maximum rounding error is not larger than +/- 5% -// -// return codes: same return codes of qra64_decode (+some additional error codes) - - -// Simulate the fast-fading channel (to be used with qra64_decode_fastfading) -int qra64_fastfading_channel( - float **rxen, - const int *xmsg, - const int submode, - const float EbN0dB, - const float B90, - const int fadingModel); -// Simulate transmission over a fading channel with given B90, fading model and submode -// and non coherent detection. -// Sets rxen to point to an array of bin energies formatted as required -// by the (fast-fading) decoding routine. -// returns 0 on success or negative values on error conditions - - -int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype); -// Set decoder a-priori knowledge accordingly to the type of the message to -// look up for -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// mycall = mycall to look for -// hiscall = hiscall to look for -// grid = grid to look for -// aptype = define the type of AP to be set: -// APTYPE_CQQRZ set [cq/qrz ? ?/blank] -// APTYPE_MYCALL set [mycall ? ?/blank] -// APTYPE_HISCALL set [? hiscall ?/blank] -// APTYPE_BOTHCALLS set [mycall hiscall ?] -// APTYPE_FULL set [mycall hiscall grid] -// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] - -// returns: -// 0 on success -// -1 when qra64_init was called with the QRA_NOAP flag -// -2 invalid apytpe (valid range [APTYPE_CQQRZ..APTYPE_CQHISCALL] -// (APTYPE_CQQRZ [cq/qrz ? ?] is set by default ) - -void qra64_apdisable(qra64codec *pcodec, const int aptype); -// disable specific AP type -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// aptype = define the type of AP to be disabled -// APTYPE_CQQRZ disable [cq/qrz ? ?/blank] -// APTYPE_MYCALL disable [mycall ? ?/blank] -// APTYPE_HISCALL disable [ ? hiscall ?/blank] -// APTYPE_BOTHCALLS disable [mycall hiscall ? ] -// APTYPE_FULL disable [mycall hiscall grid] -// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] - -void qra64_close(qra64codec *pcodec); -// Free memory allocated by qra64_init -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init - -// ---------------------------------------------------------------------------- - -// encode/decode std msgs in 12 symbols as done in jt65 -void encodemsg_jt65(int *y, const int call1, const int call2, const int grid); -void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x); - -#ifdef __cplusplus -} -#endif - -#endif // _qra64_h_ diff --git a/lib/qra/qra64/qra64_all.c b/lib/qra/qra64/qra64_all.c deleted file mode 100644 index 28f8ab928..000000000 --- a/lib/qra/qra64/qra64_all.c +++ /dev/null @@ -1,1050 +0,0 @@ -/* -qra64.c -Encoding/decoding functions for the QRA64 mode - -(c) 2016 - Nico Palermo, IV3NWV - -------------------------------------------------------------------------------- - - qracodes is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - qracodes is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with qracodes source distribution. - If not, see . - ------------------------------------------------------------------------------ - -QRA code used in this sowftware release: - -QRA13_64_64_IRR_E: K=13 N=64 Q=64 irregular QRA code (defined in -qra13_64_64_irr_e.h /.c) - -Codes with K=13 are designed to include a CRC as the 13th information symbol -and improve the code UER (Undetected Error Rate). -The CRC symbol is not sent along the channel (the codes are punctured) and the -resulting code is a (12,63) code -*/ -//---------------------------------------------------------------------------- - -#include -#include - -#include "qra64.h" -#include "../qracodes/qracodes.h" -#include "../qracodes/qra13_64_64_irr_e.h" -#include "../qracodes/pdmath.h" -#include "../qracodes/normrnd.h" - -// Code parameters of the QRA64 mode -#define QRA64_CODE qra_13_64_64_irr_e -#define QRA64_NMSG 218 // Must much value indicated in QRA64_CODE.NMSG - -#define QRA64_KC (QRA64_K+1) // Information symbols (crc included) -#define QRA64_NC (QRA64_N+1) // Codeword length (as defined in the code) -#define QRA64_NITER 100 // max number of iterations per decode - -// static functions declarations ---------------------------------------------- -static int calc_crc6(const int *x, int sz); -static void ix_mask(float *dst, const float *src, const int *mask, - const int *x); -static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix); -static int qra64_do_decode(int *x, const float *pix, const int *ap_mask, - const int *ap_x); -static float qra64_fastfading_estim_noise_std( - float *rxen, - const float esnometric, - const int submode); -static void qra64_fastfading_intrinsics( - float *pix, - const float *rxamp, - const float *hptr, - const int hlen, - const float cmetric, - const int submode); -static float qra64_fastfading_msg_esno( - const int *ydec, - const float *rxamp, - const float sigma, - const float EsNoMetric, - const int hlen, - const int submode); - - -// a-priori information masks for fields in JT65-like msgs -------------------- -#define MASK_CQQRZ 0xFFFFFFC // CQ/QRZ calls common bits -#define MASK_CALL1 0xFFFFFFF -#define MASK_CALL2 0xFFFFFFF -#define MASK_GRIDFULL 0xFFFF -#define MASK_GRIDFULL12 0x3FFC // less aggressive mask (to be used with full AP decoding) -#define MASK_GRIDBIT 0x8000 // b[15] is 1 for free text, 0 otherwise -// ---------------------------------------------------------------------------- - -qra64codec *qra64_init(int flags) -{ - - // Eb/No value for which we optimize the decoder metric - const float EbNodBMetric = 2.8f; - const float EbNoMetric = (float)pow(10,EbNodBMetric/10); - const float R = 1.0f*(QRA64_KC)/(QRA64_NC); - - qra64codec *pcodec = (qra64codec*)malloc(sizeof(qra64codec)); - - if (!pcodec) - return 0; // can't allocate memory - - pcodec->decEsNoMetric = 1.0f*QRA64_m*R*EbNoMetric; - pcodec->apflags = flags; - - memset(pcodec->apmsg_set,0,APTYPE_SIZE*sizeof(int)); - - if (flags==QRA_NOAP) - return pcodec; - - // for QRA_USERAP and QRA_AUTOAP modes we always enable [CQ/QRZ ? ?] mgs look-up. - // encode CQ/QRZ AP messages - // NOTE: Here we handle only CQ and QRZ msgs. - // 'CQ nnn', 'CQ DX' and 'DE' msgs will be handled by the decoder - // as messages with no a-priori knowledge - qra64_apset(pcodec, CALL_CQ, 0, GRID_BLANK, APTYPE_CQQRZ); - - // initialize masks for decoding with a-priori information - encodemsg_jt65(pcodec->apmask_cqqrz, MASK_CQQRZ, 0, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_cqqrz_ooo, MASK_CQQRZ, 0, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call1, MASK_CALL1, 0, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call1_ooo, MASK_CALL1, 0, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call2, 0, MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call2_ooo, 0, MASK_CALL2, MASK_GRIDFULL); - encodemsg_jt65(pcodec->apmask_call1_call2, MASK_CALL1,MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_call1_call2_grid,MASK_CALL1,MASK_CALL2, MASK_GRIDFULL12); - encodemsg_jt65(pcodec->apmask_cq_call2, MASK_CQQRZ, MASK_CALL2, MASK_GRIDBIT); - encodemsg_jt65(pcodec->apmask_cq_call2_ooo, MASK_CQQRZ, MASK_CALL2, MASK_GRIDFULL12); - - return pcodec; -} - -void qra64_close(qra64codec *pcodec) -{ - free(pcodec); -} - -int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype) -{ -// Set decoder a-priori knowledge accordingly to the type of the message to look up for -// arguments: -// pcodec = pointer to a qra64codec data structure as returned by qra64_init -// mycall = mycall to look for -// hiscall = hiscall to look for -// grid = grid to look for -// aptype = define and masks the type of AP to be set accordingly to the following: -// APTYPE_CQQRZ set [cq/qrz ? ?/blank] -// APTYPE_MYCALL set [mycall ? ?/blank] -// APTYPE_HISCALL set [? hiscall ?/blank] -// APTYPE_BOTHCALLS set [mycall hiscall ?] -// APTYPE_FULL set [mycall hiscall grid] -// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank] and [cq/qrz hiscall grid] -// returns: -// 0 on success -// -1 when qra64_init was called with the QRA_NOAP flag -// -2 invalid apytpe - - if (pcodec->apflags==QRA_NOAP) - return -1; - - switch (aptype) { - case APTYPE_CQQRZ: - encodemsg_jt65(pcodec->apmsg_cqqrz, CALL_CQ, 0, GRID_BLANK); - break; - case APTYPE_MYCALL: - encodemsg_jt65(pcodec->apmsg_call1, mycall, 0, GRID_BLANK); - break; - case APTYPE_HISCALL: - encodemsg_jt65(pcodec->apmsg_call2, 0, hiscall, GRID_BLANK); - break; - case APTYPE_BOTHCALLS: - encodemsg_jt65(pcodec->apmsg_call1_call2, mycall, hiscall, GRID_BLANK); - break; - case APTYPE_FULL: - encodemsg_jt65(pcodec->apmsg_call1_call2_grid, mycall, hiscall, grid); - break; - case APTYPE_CQHISCALL: - encodemsg_jt65(pcodec->apmsg_cq_call2, CALL_CQ, hiscall, GRID_BLANK); - encodemsg_jt65(pcodec->apmsg_cq_call2_grid, CALL_CQ, hiscall, grid); - break; - default: - return -2; // invalid ap type - } - - pcodec->apmsg_set[aptype]=1; // signal the decoder to look-up for the specified type - - - return 0; -} -void qra64_apdisable(qra64codec *pcodec, const int aptype) -{ - if (pcodec->apflags==QRA_NOAP) - return; - - if (aptype=APTYPE_SIZE) - return; - - pcodec->apmsg_set[aptype] = 0; // signal the decoder not to look-up to the specified type -} - -void qra64_encode(qra64codec *pcodec, int *y, const int *x) -{ - int encx[QRA64_KC]; // encoder input buffer - int ency[QRA64_NC]; // encoder output buffer - - int hiscall,mycall,grid; - - memcpy(encx,x,QRA64_K*sizeof(int)); // Copy input to encoder buffer - encx[QRA64_K]=calc_crc6(encx,QRA64_K); // Compute and add crc symbol - qra_encode(&QRA64_CODE, ency, encx); // encode msg+crc using given QRA code - - // copy codeword to output puncturing the crc symbol - memcpy(y,ency,QRA64_K*sizeof(int)); // copy information symbols - memcpy(y+QRA64_K,ency+QRA64_KC,QRA64_C*sizeof(int)); // copy parity symbols - - if (pcodec->apflags!=QRA_AUTOAP) - return; - - // Here we handle the QRA_AUTOAP mode -------------------------------------------- - - // When a [hiscall mycall ?] msg is detected we instruct the decoder - // to look for [mycall hiscall ?] msgs - // otherwise when a [cq mycall ?] msg is sent we reset the APTYPE_BOTHCALLS - - // look if the msg sent is a std type message (bit15 of grid field = 0) - if ((x[9]&0x80)==1) - return; // no, it's a text message, nothing to do - - // It's a [hiscall mycall grid] message - - // We assume that mycall is our call (but we don't check it) - // hiscall the station we are calling or a general call (CQ/QRZ/etc..) - decodemsg_jt65(&hiscall,&mycall,&grid,x); - - - if ((hiscall>=CALL_CQ && hiscall<=CALL_CQ999) || hiscall==CALL_CQDX || - hiscall==CALL_DE) { - // tell the decoder to look for msgs directed to us - qra64_apset(pcodec,mycall,0,0,APTYPE_MYCALL); - // We are making a general call and don't know who might reply - // Reset APTYPE_BOTHCALLS so decoder won't look for [mycall hiscall ?] msgs - qra64_apdisable(pcodec,APTYPE_BOTHCALLS); - } else { - // We are replying to someone named hiscall - // Set APTYPE_BOTHCALLS so decoder will try for [mycall hiscall ?] msgs - qra64_apset(pcodec,mycall, hiscall, GRID_BLANK, APTYPE_BOTHCALLS); - } - -} - -#define EBNO_MIN -10.0f // minimum Eb/No value returned by the decoder (in dB) -int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *rxen) -{ - int k; - float *srctmp, *dsttmp; - float ix[QRA64_NC*QRA64_M]; // (depunctured) intrisic information - int xdec[QRA64_KC]; // decoded message (with crc) - int ydec[QRA64_NC]; // re-encoded message (for snr calculations) - float noisestd; // estimated noise variance - float msge; // estimated message energy - float ebnoval; // estimated Eb/No - int rc; - - if (QRA64_NMSG!=QRA64_CODE.NMSG) // sanity check - return -16; // QRA64_NMSG define is wrong - - // compute symbols intrinsic probabilities from received energy observations - noisestd = qra_mfskbesselmetric(ix, rxen, QRA64_m, QRA64_N,pcodec->decEsNoMetric); - - // de-puncture observations adding a uniform distribution for the crc symbol - - // move check symbols distributions one symbol towards the end - dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist - srctmp = dsttmp-QRA64_M; // source is the previous pd - for (k=0;k57.004f) - ebnoval=57.004f; - ebnoval = ebnoval*57.03f/(57.03f-ebnoval); - - // compute value in dB - if (ebnoval<=0) - ebnoval = EBNO_MIN; // assume a minimum, positive value - else - ebnoval = 10.0f*(float)log10(ebnoval); - if (ebnoval4) - return -17; // invalid submode - - if (B90<1.0f || B90>238.0f) - return -18; // B90 out of range - - // compute index to most appropriate amplitude weighting function coefficients - hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); - - if (hidx<0 || hidx > 64) - return -19; // index of weighting function out of range - - if (fadingModel==0) { // gaussian fading model - // point to gaussian weighting taps - hlen = hlen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = hptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else if (fadingModel==1) { - // point to lorentzian weighting taps - hlen = hlen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = hptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else - return -20; // invalid fading model index - - - // compute (euristically) the optimal decoder metric accordingly the given spread amount - // We assume that the decoder threshold is: - // Es/No(dB) = Es/No(AWGN)(dB) + 8*log(B90)/log(240)(dB) - // that's to say, at the maximum Doppler spread bandwidth (240 Hz) there's a ~8 dB Es/No degradation - // over the AWGN case - tempf = 8.0f*(float)log((float)B90)/(float)log(240.0f); - EsNoMetric = pcodec->decEsNoMetric*(float)pow(10.0f,tempf/10.0f); - - // Step 1 ----------------------------------------------------------------------------------- - // Evaluate the noise stdev from the received energies at nominal tone frequencies - // and transform energies to amplitudes - tempf = hptr[hlen-1]; // amplitude weigth at nominal freq; - tempf = tempf*tempf; // fractional energy at nominal freq. bin - - noisestd = qra64_fastfading_estim_noise_std(rxen, EsNoMetric, submode); - cmetric = (float)sqrt(M_PI_2*EsNoMetric)/noisestd; - - // Step 2 ----------------------------------------------------------------------------------- - // Compute message symbols probability distributions - qra64_fastfading_intrinsics(ix, rxen, hptr, hlen, cmetric, submode); - - // Step 3 --------------------------------------------------------------------------- - // De-puncture observations adding a uniform distribution for the crc symbol - // Move check symbols distributions one symbol towards the end - dsttmp = PD_ROWADDR(ix,QRA64_M, QRA64_NC-1); //Point to last symbol prob dist - srctmp = dsttmp-QRA64_M; // source is the previous pd - for (k=0;k238.0f) - return -18; // B90 out of range - - // compute index to most appropriate amplitude weighting function coefficients - hidx = (int)(log((float)B90)/log(1.09f) - 0.499f); - - if (hidx<0 || hidx > 64) - return -19; // index of weighting function out of range - - if (fadingModel==0) { // gaussian fading model - // point to gaussian weighting taps - hlen = hlen_tab_gauss[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = hptr_tab_gauss[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else if (fadingModel==1) { - // point to lorentzian weighting taps - hlen = hlen_tab_lorentz[hidx]; // hlen = (L+1)/2 (where L=(odd) number of taps of w fun) - hptr = hptr_tab_lorentz[hidx]; // pointer to the first (L+1)/2 coefficients of w fun - } - else - return -20; // invalid fading model index - - - // Compute the unfaded tone amplitudes from the Eb/No value passed to the call - N0 = 1.0f; // assume unitary noise PSD - sigmanoise = (float)sqrt(N0/2); - EsN0 = (float)pow(10.0f,EbN0dB/10.0f)*QRA64_m*QRA64_K/QRA64_N; // Es/No = m*R*Eb/No - Es = EsN0*N0; - A = (float)sqrt(Es/2.0f); // unfaded tone amplitude (i^2+q^2 = Es/2+Es/2 = Es) - - - // Generate gaussian noise iq components - normrnd_s(channel_out, bpm*2, 0 , sigmanoise); - - // Add message symbols energies - for (n=0;n=0;j--) { - sigmasig = A*hptr[j]; - normrnd_s(iq, 2, 0 , sigmasig); -// iq[0]=sigmasig*sqrt(2); iq[1]=0; debug: used to verify Eb/No - *curi++ += iq[0]; - *curq++ += iq[1]; -// tote +=iq[0]*iq[0]+iq[1]*iq[1]; // debug - } - - } - -// tote = tote/QRA64_N; // debug - - // compute total bin energies (S+N) and store in first half of buffer - curi = channel_out; - curq = channel_out+bpm; - for (n=0;n=0;j--) { - u = *curbin++ * hptr[j]*cmetric; - u = u*u/(u+(float)M_E); // log(I0(u)) approx. - loglh = loglh + u; - } - if (loglh>maxloglh) // keep track of the max loglikelihood - maxloglh = loglh; - curix[k]=loglh; - } - // scale to likelihoods - sumix = 0.f; - for (k=0;k=0;j--) { - u = *curbin++; - msgsn += u*u; - } - - } - - msgsn = msgsn/(QRA64_N*tothlen); // avg msg energy per bin (noise included) - - // as sigma is overestimated (sigmatrue = sigma*sqrt((1+EsNoMetric/bps)/(1+EsNo/bps)) - // we have: msgsn = (1+x/hlen)/(1+x/bps)*2*sigma^2*(1+EsnoMetric/bps), where x = Es/N0(true) - // - // we can then write: - // u = msgsn/2.0f/(sigma*sigma)/(1.0f+EsNoMetric/bps); - // (1+x/hlen)/(1+x/bps) = u - - u = msgsn/(2.0f*sigma*sigma)/(1.0f+EsNoMetric/bps); - - // check u>1 - if (u<1) - return 0.f; - - // check u(bps/tothlen)) - return 10000.f; - - // solve for Es/No - esno = (u-1.0f)/(1.0f/tothlen-u/bps); - - return esno; - - -} - - -// Attempt to decode given intrisic information -static int qra64_decode_attempts(qra64codec *pcodec, int *xdec, const float *ix) -{ - int rc; - - // Attempt to decode without a-priori info -------------------------------- - rc = qra64_do_decode(xdec, ix, NULL, NULL); - if (rc>=0) - return 0; // successfull decode with AP0 - else - if (pcodec->apflags==QRA_NOAP) - // nothing more to do - return rc; // rc<0 = unsuccessful decode - - // Here we handle decoding with AP knowledge - - // Attempt to decode CQ calls - rc = qra64_do_decode(xdec,ix,pcodec->apmask_cqqrz, pcodec->apmsg_cqqrz); - if (rc>=0) return 1; // decoded [cq/qrz ? ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cqqrz_ooo, - pcodec->apmsg_cqqrz); - if (rc>=0) return 2; // decoded [cq ? ooo] - - // attempt to decode calls directed to us - if (pcodec->apmsg_set[APTYPE_MYCALL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1, - pcodec->apmsg_call1); - if (rc>=0) return 3; // decoded [mycall ? ?] - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_ooo, - pcodec->apmsg_call1); - if (rc>=0) return 4; // decoded [mycall ? ooo] - } - - // attempt to decode [mycall srccall ?] msgs - if (pcodec->apmsg_set[APTYPE_BOTHCALLS]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2, - pcodec->apmsg_call1_call2); - if (rc>=0) return 5; // decoded [mycall srccall ?] - } - - // attempt to decode [? hiscall ?/b] msgs - if (pcodec->apmsg_set[APTYPE_HISCALL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2, - pcodec->apmsg_call2); - if (rc>=0) return 6; // decoded [? hiscall ?] - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call2_ooo, - pcodec->apmsg_call2); - if (rc>=0) return 7; // decoded [? hiscall ooo] - } - - // attempt to decode [cq/qrz hiscall ?/b/grid] msgs - if (pcodec->apmsg_set[APTYPE_CQHISCALL]) { - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2, - pcodec->apmsg_cq_call2); - if (rc>=0) return 9; // decoded [cq/qrz hiscall ?] - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, - pcodec->apmsg_cq_call2_grid); - if (rc>=0) { - // Full AP mask need special handling - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_cq_call2_grid,xdec, QRA64_K*sizeof(int))!=0) - return -1; - else - return 11; // decoded [cq/qrz hiscall grid] - }; - - rc = qra64_do_decode(xdec, ix, pcodec->apmask_cq_call2_ooo, - pcodec->apmsg_cq_call2); - if (rc>=0) { - // Full AP mask need special handling - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_cq_call2,xdec, QRA64_K*sizeof(int))!=0) - return -1; - else - return 10; // decoded [cq/qrz hiscall ] - } - } - - // attempt to decode [mycall hiscall grid] - if (pcodec->apmsg_set[APTYPE_FULL]) { - rc = qra64_do_decode(xdec, ix, pcodec->apmask_call1_call2_grid, - pcodec->apmsg_call1_call2_grid); - if (rc>=0) { - // Full AP mask need special handling - // All the three msg fields were given. - // To minimize false decodes we check the decoded message - // with what passed in the ap_set call - if (memcmp(pcodec->apmsg_call1_call2_grid,xdec, QRA64_K*sizeof(int))!=0) - return -1; - else - return 8; // decoded [mycall hiscall grid] - } - } - - // all decoding attempts failed - return rc; -} - - - -// Decode with given a-priori information -static int qra64_do_decode(int *xdec, const float *pix, const int *ap_mask, - const int *ap_x) -{ - int rc; - const float *ixsrc; - float ix_masked[QRA64_NC*QRA64_M]; // Masked intrinsic information - float ex[QRA64_NC*QRA64_M]; // Extrinsic information from the decoder - - float v2cmsg[QRA64_NMSG*QRA64_M]; // buffers for the decoder messages - float c2vmsg[QRA64_NMSG*QRA64_M]; - - if (ap_mask==NULL) { // no a-priori information - ixsrc = pix; // intrinsic source is what passed as argument - } else { - // a-priori information provided - // mask channel observations with a-priori - ix_mask(ix_masked,pix,ap_mask,ap_x); - ixsrc = ix_masked; // intrinsic source is the masked version - } - - // run the decoding algorithm - rc = qra_extrinsic(&QRA64_CODE,ex,ixsrc,QRA64_NITER,v2cmsg,c2vmsg); - if (rc<0) - return -1; // no convergence in given iterations - - // decode - qra_mapdecode(&QRA64_CODE,xdec,ex,ixsrc); - - // verify crc - if (calc_crc6(xdec,QRA64_K)!=xdec[QRA64_K]) // crc doesn't match (detected error) - return -2; // decoding was succesfull but crc doesn't match - - return 0; -} - - -// crc functions -------------------------------------------------------------- -// crc-6 generator polynomial -// g(x) = x^6 + a5*x^5 + ... + a1*x + a0 - -// g(x) = x^6 + x + 1 -#define CRC6_GEN_POL 0x30 // MSB=a0 LSB=a5 - -// g(x) = x^6 + x^2 + x + 1 (See: https://users.ece.cmu.edu/~koopman/crc/) -// #define CRC6_GEN_POL 0x38 // MSB=a0 LSB=a5. Simulation results are similar - -static int calc_crc6(const int *x, int sz) -{ - // todo: compute it faster using a look up table - int k,j,t,sr = 0; - for (k=0;k>1) ^ CRC6_GEN_POL; - else - sr = (sr>>1); - t>>=1; - } - } - return sr; -} - -static void ix_mask(float *dst, const float *src, const int *mask, - const int *x) -{ - // mask intrinsic information (channel observations) with a priori knowledge - - int k,kk, smask; - float *row; - - memcpy(dst,src,(QRA64_NC*QRA64_M)*sizeof(float)); - - for (k=0;k>22)&0x3F; - y[1]= (call1>>16)&0x3F; - y[2]= (call1>>10)&0x3F; - y[3]= (call1>>4)&0x3F; - y[4]= (call1<<2)&0x3F; - - y[4] |= (call2>>26)&0x3F; - y[5]= (call2>>20)&0x3F; - y[6]= (call2>>14)&0x3F; - y[7]= (call2>>8)&0x3F; - y[8]= (call2>>2)&0x3F; - y[9]= (call2<<4)&0x3F; - - y[9] |= (grid>>12)&0x3F; - y[10]= (grid>>6)&0x3F; - y[11]= (grid)&0x3F; - -} -void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x) -{ - int nc1, nc2, ng; - - nc1 = x[4]>>2; - nc1 |= x[3]<<4; - nc1 |= x[2]<<10; - nc1 |= x[1]<<16; - nc1 |= x[0]<<22; - - nc2 = x[9]>>4; - nc2 |= x[8]<<2; - nc2 |= x[7]<<8; - nc2 |= x[6]<<14; - nc2 |= x[5]<<20; - nc2 |= (x[4]&0x03)<<26; - - ng = x[11]; - ng |= x[10]<<6; - ng |= (x[9]&0x0F)<<12; - - *call1 = nc1; - *call2 = nc2; - *grid = ng; -} diff --git a/lib/qra/qra64/qra64_subs.c b/lib/qra/qra64/qra64_subs.c deleted file mode 100644 index b60f9fafa..000000000 --- a/lib/qra/qra64/qra64_subs.c +++ /dev/null @@ -1,65 +0,0 @@ -// qra64_subs.c -// Fortran interface routines for QRA64 - -#include "qra64.h" -#include - -static qra64codec *pqra64codec = NULL; - -void qra64_enc_(int x[], int y[]) -{ - if (pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP); - qra64_encode(pqra64codec, y, x); -} - -void qra64_dec_(float r[], int* nc1, int* nc2, int* ng2, int* APtype, - int* iset, int* ns0, float* b0, int* nf0, - int xdec[], float* snr, int* rc) -{ -/* - APtype: AP ------------------------------------------------------------------------ - -1 0 (no AP information) - 0 [CQ/QRZ ? ? ] 25/37 - 1 [MyCall ? ? ] 25/37 - 2 [ ? HisCall ? ] 25/37 - 3 [MyCall HisCall ? ] 49/68 - 4 [MyCall HisCall grid] 68 - 5 [CQ/QRZ HisCall ? ] 49/68 - - rc Message format AP APTYPE Comments ------------------------------------------------------------------------- - -16 Failed sanity check - -2 Decoded but CRC failed - -1 No decode - 0 [ ? ? ? ] 0 -1 Decode with no AP info - 1 [CQ/QRZ ? ? ] 25 0 - 2 [CQ/QRZ ? _ ] 37 0 - 3 [MyCall ? ? ] 25 1 - 4 [MyCall ? _ ] 37 1 - 5 [MyCall HisCall ? ] 49 3 - 6 [ ? HisCall ? ] 25 2 Optional - 7 [ ? HisCall _ ] 37 2 Optional - 8 [MyCall HisCall Grid] 68 4 - 9 [CQ/QRZ HisCall ? ] 49 5 Optional (not needed?) - 10 [CQ/QRZ HisCall _ ] 68 5 Optional - 11 [CQ/QRZ HisCall Grid] 68 ? Optional -*/ - - float EbNodBEstimated; - int err=0; - int nSubmode=*ns0; - float b90=*b0; - int nFadingModel=*nf0; - - if(pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP); - err=qra64_apset(pqra64codec,*nc1,*nc2,*ng2,*APtype); - if(err<0) printf("ERROR: qra64_apset returned %d\n",err); - - if(*iset==0) { - *rc = qra64_decode_fastfading(pqra64codec,&EbNodBEstimated,xdec,r, - nSubmode,b90,nFadingModel); - *snr = EbNodBEstimated - 31.0; - } -} - diff --git a/lib/qra/qra64/qra64example.txt b/lib/qra/qra64/qra64example.txt deleted file mode 100644 index 3add33d36..000000000 --- a/lib/qra/qra64/qra64example.txt +++ /dev/null @@ -1,88 +0,0 @@ -$ qra64_nico -h - -QRA64 Mode Tests -2016, Nico Palermo - IV3NWV - ---------------------------- - -Syntax: qra64 [-s] [-c] [-a] [-t] [-h] -Options: - -s : set simulation SNR in 2500 Hz BW (default:-27.5 dB) - -c : set channel type 0=AWGN (default) 1=Rayleigh - -a : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP - -t: 0=simulate seq of msgs between IV3NWV and K1JT (default) - 1=simulate K1JT receiving K1JT IV3NWV JN66 - 2=simulate fast-fading routines (option -c ignored) -Options used only for fast-fading simulations: - -b : 90% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz) - -m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz) - -q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A) - -h: this help - - -############################################################################# -Usage example: - -qra64 -c2 -t2 -a2 -b50 -m1 -q2 -s-26.0 -n50000 - -Simulate a fast-fading channel (-c2) -Evaluate decoder performance (-t2) with -USER_AP (-a2) -B90 = 50 Hz (-b50) -Lorentz model (-m1) -submode QRA64C (-q2) -Input SNR = -26.0 dB (-s-26.0) -Simulate 50000 transmissions (-n50000) - -(type qra64 -h for command syntax) - -Command Output: - -Input SNR = -26.0dB ap-mode=USER AP - -Simulating the fast-fading channel -B90=50.00 Hz - Fading Model=Lorentz - Submode=QRA64C -Decoder metric = Matched to fast-fading signal - -Encoding msg [K1JT IV3NWV JN66] -50000 transmissions will be simulated - -K1JT decoder enabled for [CQ ? ?/blank] -K1JT decoder enabled for [K1JT ? ?/blank] -K1JT decoder enabled for [? IV3NWV ?/blank] -K1JT decoder enabled for [K1JT IV3NWV ?] -K1JT decoder enabled for [K1JT IV3NWV JN66] -K1JT decoder enabled for [CQ IV3NWV ?/b/JN66] - -Now decoding with K1JT's decoder... - 5.5 % -Undetected error with rc=6 - 13.1 % -Undetected error with rc=7 - 70.8 % -Undetected error with rc=1 - 75.8 % -Undetected error with rc=9 - 88.9 % -Undetected error with rc=6 - 100.0 % - -Msgs transmitted:50000 -Msg decoded: - -rc= 0 0 with [? ? ?] AP0 -rc= 1 0 with [CQ ? ?] AP27 -rc= 2 0 with [CQ ? ] AP42 -rc= 3 145 with [CALL ? ?] AP29 -rc= 4 0 with [CALL ? ] AP44 -rc= 5 12085 with [CALL CALL ?] AP57 -rc= 6 0 with [? CALL ?] AP29 -rc= 7 0 with [? CALL ] AP44 -rc= 8 24307 with [CALL CALL G] AP72 -rc= 9 0 with [CQ CALL ?] AP55 -rc=10 0 with [CQ CALL ] AP70 -rc=11 0 with [CQ CALL G] AP70 - -Total: 36537/50000 (5 undetected errors) - -Estimated SNR (average in dB) = -26.26 dB diff --git a/lib/qra/qra64/qra64sim.f90 b/lib/qra/qra64/qra64sim.f90 deleted file mode 100644 index 2360ef7da..000000000 --- a/lib/qra/qra64/qra64sim.f90 +++ /dev/null @@ -1,201 +0,0 @@ -program qra64sim - -! Generate simulated QRA64 data for testing the decoder. - - use wavhdr - use packjt - parameter (NMAX=54*12000) ! = 648,000 - parameter (NFFT=10*65536,NH=NFFT/2) - type(hdr) h !Header for .wav file - integer*2 iwave(NMAX) !Generated waveform - integer*4 itone(84) !Channel symbols (values 0-63) - real*4 xnoise(NMAX) !Generated random noise - real*4 dat(NMAX) !Generated real data - complex cdat(NMAX) !Generated complex waveform - complex cspread(0:NFFT-1) !Complex amplitude for Rayleigh fading - complex z - complex c00(0:720000) !Analytic signal for dat() - real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq - character msg*22,fname*11,csubmode*1,arg*12,cd*1 - character msgsent*22 - logical lsync - data lsync/.false./ - - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: qra64sim "msg" A-E Nsigs fDop DT Nfiles Sync SNR' - print*,'Example qra64sim "K1ABC W9XYZ EN37" A 10 0.2 0.0 1 T -26' - print*,'Sync = T to include sync test.' - go to 999 - endif - call getarg(1,msg) - call getarg(2,csubmode) - mode64=2**(ichar(csubmode)-ichar('A')) - call getarg(3,arg) - read(arg,*) nsigs - call getarg(4,arg) - read(arg,*) fspread - call getarg(5,arg) - read(arg,*) xdt - call getarg(6,arg) - read(arg,*) nfiles - call getarg(7,arg) - if(arg(1:1).eq.'T' .or. arg(1:1).eq.'1') lsync=.true. - call getarg(8,arg) - read(arg,*) snrdb - - if(mode64.ge.8) nsigs=1 - rms=100. - fsample=12000.d0 !Sample rate (Hz) - dt=1.d0/fsample !Sample interval (s) - twopi=8.d0*atan(1.d0) - npts=54*12000 !Total samples in .wav file - nsps=6912 - baud=12000.d0/nsps !Keying rate = 1.7361111111 - nsym=84 !Number of channel symbols - h=default_header(12000,npts) - dfsig=2000.0/nsigs !Freq spacing between sigs in file (Hz) - ichk=0 - - write(*,1000) -1000 format('File Sig Freq A-E S/N DT Dop Message'/60('-')) - - nsync=0 - do ifile=1,nfiles !Loop over requested number of files - write(fname,1002) ifile !Output filename -1002 format('000000_',i4.4) - open(10,file=fname//'.wav',access='stream',status='unknown') - xnoise=0. - cdat=0. - if(snrdb.lt.90) then - do i=1,npts - xnoise(i)=gran() !Generate gaussian noise - enddo - endif - - do isig=1,nsigs !Generate requested number of sigs - if(mod(nsigs,2).eq.0) f0=1500.0 + dfsig*(isig-0.5-nsigs/2) - if(mod(nsigs,2).eq.1) f0=1500.0 + dfsig*(isig-(nsigs+1)/2) - if(nsigs.eq.1) f0=1000.0 - xsnr=snrdb - if(snrdb.eq.0.0) xsnr=-20 - isig - - call genqra64(msg,ichk,msgsent,itone,itype) - - bandwidth_ratio=2500.0/6000.0 - sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*xsnr) - if(xsnr.gt.90.0) sig=1.0 - write(*,1020) ifile,isig,f0,csubmode,xsnr,xdt,fspread,msg -1020 format(i4,i4,f10.3,2x,a1,2x,f5.1,f6.2,f6.1,1x,a22) - - phi=0.d0 - dphi=0.d0 - k=(xdt+1.0)*12000 !Start audio at t = xdt + 1.0 s - isym0=-99 - do i=1,npts !Add this signal into cdat() - isym=i/nsps + 1 - if(isym.gt.nsym) exit - if(isym.ne.isym0) then - freq=f0 + itone(isym)*baud*mode64 - dphi=twopi*freq*dt - isym0=isym - endif - phi=phi + dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - z=cmplx(cos(xphi),sin(xphi)) - k=k+1 - if(k.ge.1) cdat(k)=cdat(k) + sig*z - enddo - enddo - - if(fspread.ne.0) then !Apply specified Doppler spread - df=12000.0/nfft - twopi=8*atan(1.0) - cspread(0)=1.0 - cspread(NH)=0. - b=6.0 !Use truncated Lorenzian shape for fspread - do i=1,NH - f=i*df - x=b*f/fspread - z=0. - a=0. - if(x.lt.3.0) then !Cutoff beyond x=3 - a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian - call random_number(r1) - phi1=twopi*r1 - z=a*cmplx(cos(phi1),sin(phi1)) - endif - cspread(i)=z - z=0. - if(x.lt.50.0) then - call random_number(r2) - phi2=twopi*r2 - z=a*cmplx(cos(phi2),sin(phi2)) - endif - cspread(NFFT-i)=z - enddo - -! do i=0,NFFT-1 -! f=i*df -! if(i.gt.NH) f=(i-nfft)*df -! s=real(cspread(i))**2 + aimag(cspread(i))**2 -! write(13,3000) i,f,s,cspread(i) -!3000 format(i5,f10.3,3f12.6) -! enddo -! s=real(cspread(0))**2 + aimag(cspread(0))**2 -! write(13,3000) 1024,0.0,s,cspread(0) - - call four2a(cspread,NFFT,1,1,1) !Transform to time domain - - sum=0. - do i=0,NFFT-1 - p=real(cspread(i))**2 + aimag(cspread(i))**2 - sum=sum+p - enddo - avep=sum/NFFT - fac=sqrt(1.0/avep) - cspread=fac*cspread !Normalize to constant avg power - cdat=cspread(1:npts)*cdat !Apply Rayleigh fading - -! do i=0,NFFT-1 -! p=real(cspread(i))**2 + aimag(cspread(i))**2 -! write(14,3010) i,p,cspread(i) -!3010 format(i8,3f12.6) -! enddo - - endif - - dat=aimag(cdat) + xnoise !Add the generated noise - fac=32767.0/nsigs - if(snrdb.ge.90.0) iwave(1:npts)=nint(fac*dat(1:npts)) - if(snrdb.lt.90.0) iwave(1:npts)=nint(rms*dat(1:npts)) - write(10) h,iwave(1:npts) !Save the .wav file - close(10) - - if(lsync) then - cd=' ' - if(ifile.eq.nfiles) cd='d' - nf1=200 - nf2=3000 - nfqso=nint(f0) - ntol=100 - minsync=0 - emedelay=0.0 - call ana64(dat,npts,c00) - call sync64(c00,nf1,nf2,nfqso,ntol,minsync,mode64,emedelay,xdt2,f02, & - jpk0,sync,sync2,width) - terr=1.01/(8.0*baud) - ferr=1.01*mode64*baud - if(abs(xdt2-xdt).lt.terr .and. abs(f02-f0).lt.ferr) nsync=nsync+1 - open(40,file='sync64.out',status='unknown',position='append') - write(40,1030) ifile,64,csubmode,snrdb,fspread,xdt2-xdt,f02-f0, & - width,sync,sync2,nsync,cd -1030 format(i4,i3,1x,a1,2f7.1,f7.2,4f8.1,i5,1x,a1) - close(40) - endif - enddo - if(lsync) write(*,1040) snrdb,nfiles,nsync -1040 format('SNR:',f6.1,' nfiles:',i5,' nsynced:',i5) - -999 end program qra64sim diff --git a/lib/qra_loops.f90 b/lib/qra_loops.f90 deleted file mode 100644 index cebd7036a..000000000 --- a/lib/qra_loops.f90 +++ /dev/null @@ -1,137 +0,0 @@ -subroutine qra_loops(c00,npts2,nsps,mode,mode64,nsubmode,nFadingModel, & - ndepth,nc1,nc2,ng2,naptype,jpk0,xdt,f0,width,snr2,irc,dat4) - - use packjt - use timer_module, only: timer - parameter (LN=2176*63) !LN=LL*NN; LL = 64*(mode64+2) - character*37 decoded - complex c00(0:npts2-1) !Analytic representation of dd(), 6000 Hz - complex ,allocatable :: c0(:) !Ditto, with freq shift - real a(3) !twkfreq params f,f1,f2 - real s3(LN) !Symbol spectra - real s3avg(LN) !Averaged symbol spectra - integer dat4(12),dat4x(12) !Decoded message (as 12 integers) - integer nap(0:11) !AP return codes - data nap/0,2,3,2,3,4,2,3,6,4,6,6/,nsave/0/ - save nsave,s3avg - - allocate(c0(0:npts2-1)) - irc=-99 - s3lim=20. - ibwmax=11 - if(mode64.le.4) ibwmax=9 - ibwmin=ibwmax - idtmax=3 - call qra_params(ndepth,maxaptype,idfmax,idtmax,ibwmin,ibwmax,maxdist) - LL=64*(mode64+2) - NN=63 - napmin=99 - ncall=0 - - do iavg=0,1 - if(iavg.eq.1) then - idfmax=1 - idtmax=1 - endif - do idf=1,idfmax - ndf=idf/2 - if(mod(idf,2).eq.0) ndf=-ndf - a=0. - a(1)=-(f0+0.4*ndf) - call twkfreq(c00,c0,npts2,6000.0,a) - do idt=1,idtmax - ndt=idt/2 - if(iavg.eq.0) then - if(mod(idt,2).eq.0) ndt=-ndt - jpk=jpk0 + 240*ndt !240/6000 = 0.04 s = tsym/32 - if(jpk.lt.0) jpk=0 - call timer('spec64 ',0) - call spec64(c0,nsps,mode,mode64,jpk,s3,LL,NN) - call timer('spec64 ',1) - call pctile(s3,LL*NN,40,base) - s3=s3/base - where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim - else - s3(1:LL*NN)=s3avg(1:LL*NN) - endif - do ibw=ibwmax,ibwmin,-2 - ndist=ndf**2 + ndt**2 + ((ibwmax-ibw)/2)**2 - if(ndist.gt.maxdist) cycle - b90=1.728**ibw - if(b90.gt.230.0) cycle - if(b90.lt.0.15*width) exit - ncall=ncall+1 - call timer('qra64_de',0) - call qra64_dec(s3,nc1,nc2,ng2,naptype,0,nSubmode,b90, & - nFadingModel,dat4,snr2,irc) - call timer('qra64_de',1) - if(irc.eq.0) go to 200 - if(irc.gt.0) call badmsg(irc,dat4,nc1,nc2,ng2) - iirc=max(0,min(irc,11)) - if(irc.gt.0 .and. nap(iirc).lt.napmin) then - dat4x=dat4 - b90x=b90 - snr2x=snr2 - napmin=nap(iirc) - irckeep=irc - xdtkeep=jpk/6000.0 - 1.0 - f0keep=-a(1) - idfkeep=idf - idtkeep=idt - ibwkeep=ibw - ndistx=ndist - go to 100 !### - endif - enddo ! ibw (b90 loop) - !### if(iand(ndepth,3).lt.3 .and. irc.ge.0) go to 100 - enddo ! idt (DT loop) - enddo ! idf (f0 loop) -! if(iavg.eq.0 .and. abs(jpk0-4320).le.1300) then - if(iavg.eq.0) then - a=0. - a(1)=-f0 - call twkfreq(c00,c0,npts2,6000.0,a) - jpk=3000 !### These definitions need work ### -! if(nsps.ge.3600) jpk=4080 !### - if(nsps.ge.3600) jpk=6000 !### - call spec64(c0,nsps,mode,mode64,jpk,s3,LL,NN) - call pctile(s3,LL*NN,40,base) - s3=s3/base - where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim - s3avg(1:LL*NN)=s3avg(1:LL*NN)+s3(1:LL*NN) - nsave=nsave+1 - endif - if(iavg.eq.0 .and. nsave.lt.2) exit - enddo ! iavg - -100 if(napmin.ne.99) then - dat4=dat4x - b90=b90x - snr2=snr2x - irc=irckeep - xdt=xdtkeep - f0=f0keep - idt=idtkeep - idf=idfkeep - ibw=ibwkeep - ndist=ndistx - endif - -200 if(mode.eq.65 .and. nsps.eq.7200/2) xdt=xdt+0.4 !### Empirical -- WHY ??? ### - - if(irc.ge.0) then - navg=nsave - if(iavg.eq.0) navg=0 - !### For tests only: - open(53,file='fort.53',status='unknown',position='append') - call unpackmsg(dat4,decoded) !Unpack the user message - write(53,3053) idf,idt,ibw,b90,xdt,f0,snr2,ndist,irc,navg,decoded(1:22) -3053 format(3i5,f7.1,f7.2,2f7.1,3i4,2x,a22) - close(53) - !### - nsave=0 - s3avg=0. - irc=irc + 100*navg - endif - return -end subroutine qra_loops diff --git a/lib/symspec.f90 b/lib/symspec.f90 index 707a6368e..8f5ddd093 100644 --- a/lib/symspec.f90 +++ b/lib/symspec.f90 @@ -140,20 +140,20 @@ subroutine chk_samples(ihsym,k,nstop) call system_clock(count0,clkfreq) maxhsym=0 endif - if((mod(ihsym,100).eq.0 .or. ihsym.ge.nstop-100) .and. & - k0.ne.99999999) then - call system_clock(count1,clkfreq) - dtime=dfloat(count1-count0)/dfloat(clkfreq) - if(dtime.lt.28.0) return - if(dtime.gt.1.d-6) fsample=(k-3456)/dtime - call date_and_time(values=itime) - sec=itime(7)+0.001*itime(8) - write(ctime,3000) itime(5)-itime(4)/60,itime(6),sec -3000 format(i2.2,':',i2.2,':',f6.3) - write(33,3033) ctime,dtime,ihsym,nstop,k,fsample -3033 format(a12,f12.6,2i7,i10,f15.3) - flush(33) - endif +! if((mod(ihsym,100).eq.0 .or. ihsym.ge.nstop-100) .and. & +! k0.ne.99999999) then +! call system_clock(count1,clkfreq) +! dtime=dfloat(count1-count0)/dfloat(clkfreq) +! if(dtime.lt.28.0) return +! if(dtime.gt.1.d-6) fsample=(k-3456)/dtime +! call date_and_time(values=itime) +! sec=itime(7)+0.001*itime(8) +! write(ctime,3000) itime(5)-itime(4)/60,itime(6),sec +!3000 format(i2.2,':',i2.2,':',f6.3) +! write(33,3033) ctime,dtime,ihsym,nstop,k,fsample +!3033 format(a12,f12.6,2i7,i10,f15.3) +! flush(33) +! endif k0=k return diff --git a/lib/sync4.f90 b/lib/sync4.f90 index 9bfe6c60b..00387fdb4 100644 --- a/lib/sync4.f90 +++ b/lib/sync4.f90 @@ -29,7 +29,7 @@ subroutine sync4(dat,jz,ntol,nfqso,mode,mode4,minwidth,dtx,dfx,snrx, & df=0.5*11025.0/nfft ftop=nfqso + 7*mode4*df if(ftop.gt.11025.0/4.0) then - print*,'*** Rx Freq is set too high for this sybmode ***' + print*,'*** Rx Freq is set too high for this submode ***' go to 900 endif @@ -85,7 +85,7 @@ subroutine sync4(dat,jz,ntol,nfqso,mode,mode4,minwidth,dtx,dfx,snrx, & enddo if(syncbest.lt.-1.e29) go to 900 ccfred=red - call pctile(ccfred(iaa:ibb),ibb-iaa+1,45,base) + call pctile(ccfred(ia:ib),ib-ia+1,45,base) ccfred=ccfred-base dfx=ipk*df diff --git a/lib/synciscat.f90 b/lib/synciscat.f90 deleted file mode 100644 index 747eeca64..000000000 --- a/lib/synciscat.f90 +++ /dev/null @@ -1,185 +0,0 @@ -subroutine synciscat(cdat,npts,nh,npct,s0,jsym,df,ntol, & - mousebutton,mode4,nafc,psavg,xsync,sig,ndf0,msglen, & - ipk,jpk,idf,df1) - -! Synchronize an ISCAT signal -! cdat() is the downsampled analytic signal. -! Sample rate = fsample = BW = 11025 * (9/32) = 3100.78125 Hz -! npts, nsps, etc., are all reduced by 9/32 - - parameter (NMAX=30*3101) - parameter (NSZ=4*1400) - complex cdat(NMAX) - complex c(288) - real s0(288,NSZ) - real fs0(288,96) !108 = 96 + 3*4 - real savg(288) - real sref(288) - real psavg(72) !Average spectrum of whole file - integer icos(4) - data icos/0,1,3,2/ - data nsync/4/,nlen/2/,ndat/18/ - -! Silence compiler warnings: - sigbest=-20.0 - ndf0best=0 - msglenbest=0 - ipkbest=0 - jpkbest=0 - ipk2=0 - idfbest=mousebutton - - fsample=3100.78125 !New sample rate - nsps=144/mode4 - nsym=npts/nsps - 1 - nblk=nsync+nlen+ndat - nfft=2*nsps !FFTs at twice the symbol length, - - kstep=nsps/4 ! stepped by 1/4 symbol - df=fsample/nfft - fac=1.0/1000.0 !Somewhat arbitrary - savg=0. - s0=0. - - ia=1-kstep - do j=1,4*nsym !Compute symbol spectra - ia=ia+kstep - ib=ia+nsps-1 - if(ib.gt.npts) exit - c(1:nsps)=fac*cdat(ia:ib) - c(nsps+1:nfft)=0. - call four2a(c,nfft,1,-1,1) - do i=1,nfft - s0(i,j)=real(c(i))**2 + aimag(c(i))**2 - savg(i)=savg(i) + s0(i,j) !Accumulate avg spectrum - enddo - i0=40 - enddo - - jsym=4*nsym - savg=savg/jsym - - do i=1,71 !Compute spectrum in dB, for plot - if(mode4.eq.1) then - psavg(i)=2*db(savg(4*i)+savg(4*i-1)+savg(4*i-2)+savg(4*i-3)) + 1.0 - else - psavg(i)=2*db(savg(2*i)+savg(2*i-1)) + 7.0 - endif - enddo - - do i=nh+1,nfft-nh - call pctile(savg(i-nh),2*nh+1,npct,sref(i)) - enddo - sref(1:nh)=sref(nh+11) - sref(nfft-nh+1:nfft)=sref(nfft-nh) - - do i=1,nfft !Normalize the symbol spectra - fac=1.0/sref(i) - if(i.lt.11) fac=1.0/savg(11) - do j=1,jsym - s0(i,j)=fac*s0(i,j) - enddo - enddo - - nfold=jsym/96 - jb=96*nfold - - ttot=npts/fsample !Length of record (s) - df1=df/ttot !Step size for f1=fdot - idf1=int(-25.0/df1) - idf2=int(5.0/df1) - if(nafc.eq.0) then - idf1=0 - idf2=0 - else if(mod(-idf1,2).eq.1) then - idf1=idf1-1 - endif - - xsyncbest=0. - do idf=idf1,idf2 !Loop over fdot - fs0=0. - do j=1,jb !Fold s0 into fs0, modulo 4*nblk - k=mod(j-1,4*nblk)+1 - ii=nint(idf*float(j-jb/2)/float(jb)) - ia=max(1-ii,1) - ib=min(nfft-ii,nfft) - do i=ia,ib - fs0(i,k)=fs0(i,k) + s0(i+ii,j) - enddo - enddo - ref=nfold*4 - - i0=27 - if(mode4.eq.1) i0=95 - ia=i0-nint(ntol/df) - ib=i0+nint(ntol/df) - if(ia.lt.1) ia=1 - if(ib.gt.nfft-3) ib=nfft-3 - - smax=0. - ipk=1 - jpk=1 - do j=0,4*nblk-1 !Find sync pattern: lags 0-95 - do i=ia,ib !Search specified freq range - ss=0. - do n=1,4 !Sum over 4 sync tones - k=j+4*n-3 - if(k.gt.96) k=k-96 - ss=ss + fs0(i+2*icos(n),k) - enddo - if(ss.gt.smax) then - smax=ss - ipk=i !Frequency offset, DF - jpk=j+1 !Time offset, DT - endif - enddo - enddo - - xsync=smax/ref - 1.0 - if(nfold.lt.26) xsync=xsync * sqrt(nfold/26.0) - xsync=xsync-0.5 !Empirical - - sig=db(smax/ref - 1.0) - 15.0 - if(mode4.eq.1) sig=sig-5.0 -! if(sig.lt.-20 .or. xsync.lt.1.0) sig=-20.0 -! if(sig.lt.-20) sig=-20.0 - ndf0=nint(df*(ipk-i0)) - - smax=0. - ja=jpk+16 - if(ja.gt.4*nblk) ja=ja-4*nblk - jj=jpk+20 - if(jj.gt.4*nblk) jj=jj-4*nblk - do i=ipk,ipk+60,2 !Find User's message length - ss=fs0(i,ja) + fs0(i+10,jj) - if(ss.gt.smax) then - smax=ss - ipk2=i - endif - enddo - - msglen=(ipk2-ipk)/2 - if(msglen.lt.2 .or. msglen.gt.29) cycle - - if(xsync.ge.xsyncbest) then - xsyncbest=xsync - sigbest=sig - ndf0best=ndf0 - msglenbest=msglen - ipkbest=ipk - jpkbest=jpk - idfbest=idf - endif - enddo - - xsync=xsyncbest - sig=sigbest - ndf0=ndf0best - msglen=msglenbest - ipk=ipkbest - jpk=jpkbest - idf=idfbest - if(nafc.eq.0) idf=0 - - return -end subroutine synciscat diff --git a/lib/test_q65.f90 b/lib/test_q65.f90 index 29d3ebef8..4135a290d 100644 --- a/lib/test_q65.f90 +++ b/lib/test_q65.f90 @@ -103,7 +103,7 @@ program test_q65 dterr=tsym/4.0 nferr=max(1,nint(0.5*baud),nint(fdop/3.0)) ndec1z=nfiles - + do nsnr=ia,ib,-1 snr1=nsnr if(ia.eq.99) snr1=snr diff --git a/main.cpp b/main.cpp index 0960789e0..2db250b33 100644 --- a/main.cpp +++ b/main.cpp @@ -225,8 +225,7 @@ int main(int argc, char *argv[]) // disallow multiple instances with same instance key QLockFile instance_lock {temp_dir.absoluteFilePath (a.applicationName () + ".lock")}; instance_lock.setStaleLockTime (0); - bool lock_ok {false}; - while (!(lock_ok = instance_lock.tryLock ())) + while (!instance_lock.tryLock ()) { if (QLockFile::LockFailedError == instance_lock.error ()) { @@ -249,6 +248,10 @@ int main(int argc, char *argv[]) throw std::runtime_error {"Multiple instances must have unique rig names"}; } } + else + { + throw std::runtime_error {"Failed to access lock file"}; + } } // load UI translations diff --git a/models/Modes.cpp b/models/Modes.cpp index b341ebef4..966665bb6 100644 --- a/models/Modes.cpp +++ b/models/Modes.cpp @@ -19,7 +19,6 @@ namespace "JT4", "WSPR", "Echo", - "ISCAT", "MSK144", "FreqCal", "FT8", diff --git a/models/Modes.hpp b/models/Modes.hpp index 4a0ce25ab..675f097e3 100644 --- a/models/Modes.hpp +++ b/models/Modes.hpp @@ -44,7 +44,6 @@ public: JT4, WSPR, Echo, - ISCAT, MSK144, FreqCal, FT8, diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 63792806e..d074bdf30 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -1,6 +1,10 @@ set (SAMPLE_FILES FT4/000000_000002.wav FT8/181201_180245.wav + FST4+FST4W/210115_0058.wav + FST4+FST4W/201230_0300.wav + MSK144/181211_120500.wav + MSK144/181211_120800.wav ISCAT/ISCAT-A/VK7MO_110401_235515.wav ISCAT/ISCAT-B/K0AWU_100714_115000.wav JT4/JT4A/DF2ZC_070926_040700.WAV @@ -19,9 +23,22 @@ set (SAMPLE_FILES MSK144/181211_120800.wav QRA64/QRA64C/161113_0111.wav WSPR/150426_0918.wav + Q65/30A_Ionoscatter_6m/201203_022700.wav + Q65/30A_Ionoscatter_6m/201203_022800.wav + Q65/30A_Ionoscatter_6m/201203_022900.wav + Q65/30A_Ionoscatter_6m/201203_024000.wav + Q65/60A_EME_6m/210106_1621.wav + Q65/60B_1296_Troposcatter/210109_0007.wav + Q65/60B_1296_Troposcatter/210109_0147.wav + Q65/60B_1296_Troposcatter/210109_0151.wav + Q65/60D_EME_10GHz/201212_1838.wav + Q65/120D_Rainscatter_10_GHz/210117_0920.wav + Q65/120E_Ionoscatter_6m/210130_1438.wav + Q65/120E_Ionoscatter_6m/210130_1442.wav + Q65/300A_Optical_Scatter/201210_0505.wav ) -set (contents_file_name contents_${WSJTX_VERSION_MAJOR}.${WSJTX_VERSION_MINOR}.json) +set (contents_file_name contents_${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.json) set (contents_file ${CMAKE_CURRENT_BINARY_DIR}/${contents_file_name}) set (web_tree ${CMAKE_CURRENT_BINARY_DIR}/web) set_source_files_properties (${contents_file} PROPERTIES GENERATED ON) diff --git a/samples/FST4+FST4W/201230_0300.wav b/samples/FST4+FST4W/201230_0300.wav new file mode 100644 index 000000000..524875f3c Binary files /dev/null and b/samples/FST4+FST4W/201230_0300.wav differ diff --git a/samples/FST4+FST4W/210115_0058.wav b/samples/FST4+FST4W/210115_0058.wav new file mode 100644 index 000000000..c0541b3d9 Binary files /dev/null and b/samples/FST4+FST4W/210115_0058.wav differ diff --git a/samples/Q65/120D_Rainscatter_10_GHz/210117_0920.wav b/samples/Q65/120D_Rainscatter_10_GHz/210117_0920.wav new file mode 100644 index 000000000..a7243be53 Binary files /dev/null and b/samples/Q65/120D_Rainscatter_10_GHz/210117_0920.wav differ diff --git a/samples/Q65/120E_Ionoscatter_6m/210130_1438.wav b/samples/Q65/120E_Ionoscatter_6m/210130_1438.wav new file mode 100644 index 000000000..6d1921ac4 Binary files /dev/null and b/samples/Q65/120E_Ionoscatter_6m/210130_1438.wav differ diff --git a/samples/Q65/120E_Ionoscatter_6m/210130_1442.wav b/samples/Q65/120E_Ionoscatter_6m/210130_1442.wav new file mode 100644 index 000000000..d59e82b96 Binary files /dev/null and b/samples/Q65/120E_Ionoscatter_6m/210130_1442.wav differ diff --git a/samples/Q65/300A_Optical_Scatter/201210_0505.wav b/samples/Q65/300A_Optical_Scatter/201210_0505.wav new file mode 100644 index 000000000..eb95d8bc7 Binary files /dev/null and b/samples/Q65/300A_Optical_Scatter/201210_0505.wav differ diff --git a/samples/Q65/30A_Ionoscatter_6m/201203_022700.wav b/samples/Q65/30A_Ionoscatter_6m/201203_022700.wav new file mode 100644 index 000000000..12db3ed55 Binary files /dev/null and b/samples/Q65/30A_Ionoscatter_6m/201203_022700.wav differ diff --git a/samples/Q65/30A_Ionoscatter_6m/201203_022800.wav b/samples/Q65/30A_Ionoscatter_6m/201203_022800.wav new file mode 100644 index 000000000..8dbd3766b Binary files /dev/null and b/samples/Q65/30A_Ionoscatter_6m/201203_022800.wav differ diff --git a/samples/Q65/30A_Ionoscatter_6m/201203_022900.wav b/samples/Q65/30A_Ionoscatter_6m/201203_022900.wav new file mode 100644 index 000000000..ef9c14235 Binary files /dev/null and b/samples/Q65/30A_Ionoscatter_6m/201203_022900.wav differ diff --git a/samples/Q65/30A_Ionoscatter_6m/201203_024000.wav b/samples/Q65/30A_Ionoscatter_6m/201203_024000.wav new file mode 100644 index 000000000..509f75f05 Binary files /dev/null and b/samples/Q65/30A_Ionoscatter_6m/201203_024000.wav differ diff --git a/samples/Q65/60A_EME_6m/210106_1621.wav b/samples/Q65/60A_EME_6m/210106_1621.wav new file mode 100644 index 000000000..5fd22bb3c Binary files /dev/null and b/samples/Q65/60A_EME_6m/210106_1621.wav differ diff --git a/samples/Q65/60B_1296_Troposcatter/210109_0007.wav b/samples/Q65/60B_1296_Troposcatter/210109_0007.wav new file mode 100644 index 000000000..355526805 Binary files /dev/null and b/samples/Q65/60B_1296_Troposcatter/210109_0007.wav differ diff --git a/samples/Q65/60B_1296_Troposcatter/210109_0147.wav b/samples/Q65/60B_1296_Troposcatter/210109_0147.wav new file mode 100644 index 000000000..945726d8a Binary files /dev/null and b/samples/Q65/60B_1296_Troposcatter/210109_0147.wav differ diff --git a/samples/Q65/60B_1296_Troposcatter/210109_0151.wav b/samples/Q65/60B_1296_Troposcatter/210109_0151.wav new file mode 100644 index 000000000..70e7a915a Binary files /dev/null and b/samples/Q65/60B_1296_Troposcatter/210109_0151.wav differ diff --git a/samples/Q65/60D_EME_10GHz/201212_1838.wav b/samples/Q65/60D_EME_10GHz/201212_1838.wav new file mode 100644 index 000000000..a6e2754ed Binary files /dev/null and b/samples/Q65/60D_EME_10GHz/201212_1838.wav differ diff --git a/translations/wsjtx_da.ts b/translations/wsjtx_da.ts index c4dfa4ce3..3954c0215 100644 --- a/translations/wsjtx_da.ts +++ b/translations/wsjtx_da.ts @@ -4170,55 +4170,56 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2). </table> Keyboard shortcuts help window contents Hjælpetekst til Tastetur genveje - <tabelcelleafstand = 1> - <tr><td> <b> Esc </b></td> <td> Stop Tx, afbryd QSO, ryd kø ved næste kald </td> </tr> - <tr><td> <b> F1 </b></td> <td> Online brugervejledning (Alt: transmitter Tx6) </td> </tr> - <tr><td> <b> Shift + F1 </b></td> <td> Meddelelse om ophavsret </td> </tr> - <tr><td> <b> Ctrl + F1 </b></td> <td> Om WSJT-X </td> </tr> - <tr><td> <b> F2 </b></td> <td> Åbn indstillingsvinduet (Alt: send Tx2) </td> </tr> - <tr><td> <b> F3 </b></td> <td> Vis tastaturgenveje (Alt: transmitter Tx3) </td> </tr> - <tr><td> <b> F4 </b></td> <td> Ryd DX Call, DX Grid, Tx meddelelser 1-4 (Alt: send Tx4) </td> </tr> - <tr><td> <b> Alt + F4 </b></td> <td> Afslutningsprogram </td> </tr> - <tr><td> <b> F5 </b></td> <td> Vis specielle musekommandoer (Alt: transmitter Tx5) </td> </tr> -<tr><td> <b> F6 </b></td> <td> Åbn næste fil i biblioteket (Alt: skift "Call 1st") </td> </tr> - <tr><td> <b> Shift + F6 </b></td> <td> Dekod alle resterende filer i biblioteket </td> </tr> - <tr><td> <b> F7 </b></td> <td> Vis vindue for gennemsnitsmeddelelse </td> </tr> - <tr><td> <b> F11 </b></td> <td> Flyt Rx-frekvensen ned 1 Hz </td> </tr> - <tr><td> <b> Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> - <tr><td> <b> Shift + F11 </b></td> <td> Flyt Tx-frekvensen 60 Hz ned (FT8) eller 90 Hz (FT4) </td> </tr> - <tr><td> <b> Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen 2000 Hz ned </td> </tr> - <tr><td> <b> F12 </b></td> <td> Flyt Rx-frekvensen 1 Hz op </td> </tr> - <tr><td> <b> Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> -<tr><td> <b> Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> - <tr><td> <b> Shift + F11 </b></td> <td> Flyt Tx-frekvensen ned 60 Hz (FT8) eller 90 Hz (FT4) </td> </tr> - <tr><td> <b> Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen ned 2000 Hz </td> </tr> - <tr><td> <b> F12 </b></td> <td> Flyt Rx-frekvensen op 1 Hz </td> </tr> - <tr><td> <b> Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> - <tr><td> <b> Shift + F12 </b></td> <td> Flyt Tx-frekvensen 60 Hz op (FT8) eller 90 Hz (FT4) </td> </tr> - <tr><td> <b> Ctrl + Shift + F12 </b></td> <td> Flyt kaldefrekvensen 2000 Hz op</td> </tr> - <tr><td> <b> Alt + 1-6 </b></td> <td> Indstil NU transmission til dette nummer på fane 1 </td> </tr> - <tr><td> <b> Ctl + 1-6 </b></td> <td> Indstil næste transmission til dette nummer på fane 1 </td> </tr> - <tr><td> <b> Alt + B </b></td> <td> Skift status "Bedste S + P" </td> </tr> - <tr><td> <b> Alt + C </b></td> <td> Skift afkrydsningsfelt "Kald 1st" </td> </tr> - <tr><td> <b> Alt + D </b></td> <td> Dekod igen ved QSO-frekvens </td> </tr> - <tr><td> <b> Shift + D </b></td> <td> Fuld Dekodning (begge vinduer) </td> </tr> -<tr><td> <b> Ctrl + E </b></td> <td> Aktiver TX lige / 1. </td> </tr> - <tr><td> <b> Shift + E </b></td> <td> Deaktiver TX lige / 1. </td> </tr> - <tr><td> <b> Alt + E </b></td><td>Sætning</td> </tr> - <tr><td> <b> Ctrl + F </b></td> <td> Rediger fri tekstmeddelelsesfelt </td> </tr> - <tr><td> <b> Alt + G </b></td> <td> Generer standardmeddelelser </td> </tr> - <tr><td> <b> Alt + H </b></td> <td> Stop Tx </td> </tr> - <tr><td> <b> Ctrl + L </b></td> <td> Opslag af kaldesignal i database, generer standardbeskeder </td> </tr> - <tr><td> <b> Alt + M </b></td><td> Skærm</td> </tr> - <tr><td> <b> Alt + N </b></td> <td> Aktivér Tx </td> </tr> - <tr><td> <b> Ctrl + O </b></td> <td> Åbn en .wav-fil </td> </tr> - <tr><td> <b> Alt + O </b></td> <td> Skift operatør </td> </tr> - <tr><td> <b> Alt + Q </b></td> <td> Log QSO </td> </tr> - <tr><td> <b> Ctrl + R </b></td> <td> Indstil Tx4-besked til RRR (ikke i FT4) </td> </tr> - <tr><td> <b> Alt + R </b></td> <td> Indstil Tx4-besked til RR73 </td> </tr> - <tr><td> <b> Alt + S </b></td> <td> Stop overvågning </td> </tr> - <tr><td> <b> Alt + T </b></td> <td> Skift Tune status </td> </tr> - <tr><td> <b> Alt + Z </b></td> <td> Ryd fyldt buffer dekoderstatus </td> </tr> + <table cellspacing=1> + <tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr> + <tr><td><b>Esc </b></td> <td> Stop Tx, afbryd QSO, ryd Næste-Kaldesignal kø</td> </tr> + <tr><td><b> F1 </b></td> <td> Online brugervejledning (Alt: transmitter Tx6) </td> </tr> + <tr><td><b> Shift + F1 </b></td> <td> Meddelelse om ophavsret </td> </tr> + <tr><td><b> Ctrl + F1 </b></td> <td> Om WSJT-X </td> </tr> + <tr><td><b> F2 </b></td> <td> Åbn indstillingsvinduet (Alt: send Tx2) </td> </tr> + <tr><td><b> F3 </b></td> <td> Vis tastaturgenveje (Alt: transmitter Tx3) </td> </tr> + <tr><td><b> F4 </b></td> <td> Ryd DX Call, DX Grid, Tx meddelelser 1-4 (Alt: send Tx4) </td> </tr> + <tr><td><b> Alt + F4 </b></td> <td> Afslutningsprogram </td> </tr> + <tr><td><b> F5 </b></td> <td> Vis specielle musekommandoer (Alt: transmitter Tx5) </td> </tr> + <tr><td><b> F6 </b></td> <td> Åbn næste fil i biblioteket (Alt: skift "Call 1st") </td> </tr> + <tr><td><b> Shift + F6 </b></td> <td> Dekod alle resterende filer i biblioteket </td> </tr> + <tr><td><b> F7 </b></td> <td> Vis vindue for gennemsnitsmeddelelse </td> </tr> + <tr><td><b> F11 </b></td> <td> Flyt Rx-frekvensen ned 1 Hz </td> </tr> + <tr><td><b> Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> + <tr><td><b> Shift + F11 </b></td> <td> Flyt Tx-frekvensen 60 Hz ned (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td><b> Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen 2000 Hz ned </td> </tr> + <tr><td><b> F12 </b></td> <td> Flyt Rx-frekvensen 1 Hz op </td> </tr> + <tr><td><b>Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> + <tr><td><b>Ctrl + F11 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser ned 1 Hz </td> </tr> + <tr><td><b>Shift + F11 </b></td> <td> Flyt Tx-frekvensen ned 60 Hz (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td> <b>Ctrl + Shift + F11 </b></td> <td> Flyt kaldefrekvensen ned 2000 Hz </td> </tr> + <tr><td> <b>F12 </b></td> <td> Flyt Rx-frekvensen op 1 Hz </td> </tr> + <tr><td> <b>Ctrl + F12 </b></td> <td> Flyt identiske Rx- og Tx-frekvenser 1 Hz op </td> </tr> + <tr><td> <b>Shift + F12 </b></td> <td> Flyt Tx-frekvensen 60 Hz op (FT8) eller 90 Hz (FT4) </td> </tr> + <tr><td> <b>Ctrl + Shift + F12 </b></td> <td> Flyt kaldefrekvensen 2000 Hz op</td> </tr> + <tr><td> <b>Alt + 1-6 </b></td> <td> Indstil NU transmission til dette nummer på fane 1 </td> </tr> + <tr><td> <b>Ctl + 1-6 </b></td> <td> Indstil næste transmission til dette nummer på fane 1 </td> </tr> + <tr><td> <b>Alt + B </b></td> <td> Skift status "Bedste S + P" </td> </tr> + <tr><td> <b>Alt + C </b></td> <td> Skift afkrydsningsfelt "Kald 1st" </td> </tr> + <tr><td> <b>Alt + D </b></td> <td> Dekod igen ved QSO-frekvens </td> </tr> + <tr><td> <b>Shift + D </b></td> <td> Fuld Dekodning (begge vinduer) </td> </tr> + <tr><td> <b>Ctrl + E </b></td> <td> Aktiver TX lige / 1. </td> </tr> + <tr><td> <b>Shift + E </b></td> <td> Deaktiver TX lige / 1. </td> </tr> + <tr><td> <b>Alt + E </b></td><td>Sætning</td> </tr> + <tr><td> <b>Ctrl + F </b></td> <td> Rediger fri tekstmeddelelsesfelt </td> </tr> + <tr><td> <b>Alt + G </b></td> <td> Generer standardmeddelelser </td> </tr> + <tr><td> <b>Alt + H </b></td> <td> Stop Tx </td> </tr> + <tr><td> <b>Ctrl + L </b></td> <td> Opslag af kaldesignal i database, generer standardbeskeder </td> </tr> + <tr><td> <b>Alt + M </b></td><td> Skærm</td> </tr> + <tr><td> <b>Alt + N </b></td> <td> Aktivér Tx </td> </tr> + <tr><td> <b>Ctrl + O </b></td> <td> Åbn en .wav-fil </td> </tr> + <tr><td> <b>Alt + O </b></td> <td> Skift operatør </td> </tr> + <tr><td> <b>Alt + Q </b></td> <td> Log QSO </td> </tr> + <tr><td> <b>Ctrl + R </b></td> <td> Indstil Tx4-besked til RRR (ikke i FT4) </td> </tr> + <tr><td> <b>Alt + R </b></td> <td> Indstil Tx4-besked til RR73 </td> </tr> + <tr><td> <b>Alt + S </b></td> <td> Stop overvågning </td> </tr> + <tr><td> <b>Alt + T </b></td> <td> Skift Tune status </td> </tr> + <tr><td> <b>Alt + Z </b></td> <td> Ryd fyldt buffer dekoderstatus </td> </tr> </tabel> @@ -6627,12 +6628,12 @@ Højre klik for at indsætte eller slette elementer. Check to for grid highlighting to only apply to unworked grid fields - Marker for Grid Highlighting for kun at tilføje ikke kørte Lokator felter + Marker for kun at vise ikke kørte Lokator felter (Contest) Only grid Fields sought - Kun søgte GRID felter + Vis kun ikke kørte GRID felter (Contest) diff --git a/translations/wsjtx_zh.ts b/translations/wsjtx_zh.ts index 775db949e..e1c608057 100644 --- a/translations/wsjtx_zh.ts +++ b/translations/wsjtx_zh.ts @@ -2226,7 +2226,17 @@ Error(%2): %3 菜单 - + + Decode other Hounds calling above 1000 Hz audio offset + 解码其他猎犬调用超过 1000 Hz 音频偏移 + + + + Enable auto response to the first decode from a new DXCC or new call on the current band. + 启用对当前频带上新DXCC或新呼叫的第一个解码的自动响应. + + + F High F 高 @@ -2351,7 +2361,12 @@ Error(%2): %3 <html><head/><body><p>在下一个序列中传送.</p></body></html> - + + Q65 + + + + SWL Mode SWL模式 @@ -3431,12 +3446,7 @@ list. The list can be maintained in Settings (F2). - - JT9+JT65 - - - - + Astronomical data 天文数据 @@ -3647,7 +3657,17 @@ list. The list can be maintained in Settings (F2). - + + Quick-Start Guide to Q65 + Q65 快速入门指南 + + + + Auto Clear Avg after decode + 解码后自动清除平均值 + + + Rig Control Error 无线电设备控制错误 @@ -3885,16 +3905,16 @@ list. The list can be maintained in Settings (F2). "fmt.all" 文件将重命名为 "fmt.bak" - + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: -"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." - 如果您根据 GNU 通用公共许可证条款合理使用 WSJT-X 的任何部分, 则必须在衍生作品中醒目地显示以下版权声明: +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." + 如果您根据GNU通用公共许可证的条款合理使用WSJT-X的任何部分, 您必须在您的衍生作品中突出显示以下版权声明: -"WSJT-X 的算法, 源代码, 外观和感觉及相关程序,和协议规格模式 FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 的版权 (C) 2001-2019 由以下一个或多个作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和 WSJT 开发组的其他成员." +"WSJT-X和相关程序的算法、源代码、外观和感觉, 以及模式的协议规范 FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, ISCAT, MSK144 版权所有(C) 2001-2021是由以下一个或多个作者拥有的: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和WSJT发展小组的其他成员." - + No data read from disk. Wrong file format? 没有从磁盘读取数据. 文件格式出错误? @@ -4953,7 +4973,12 @@ Error(%2): %3 参考 - + + Q65_Sync + Q65_同步 + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> <html><head/><body><p>波段在瀑布左边缘显示</p></body></html> @@ -5003,7 +5028,7 @@ Error(%2): %3 频谱零度 - + Wide Graph 宽瀑布图 diff --git a/translations/wsjtx_zh_HK.ts b/translations/wsjtx_zh_HK.ts index 52fb9251c..b21058531 100644 --- a/translations/wsjtx_zh_HK.ts +++ b/translations/wsjtx_zh_HK.ts @@ -2226,7 +2226,17 @@ Error(%2): %3 選單 - + + Decode other Hounds calling above 1000 Hz audio offset + 解碼其他獵犬調用超過 1000 Hz 音訊偏移 + + + + Enable auto response to the first decode from a new DXCC or new call on the current band. + 啟用對當前頻段上新 DXCC 或新呼叫的第一個解碼的自動回應. + + + F High F 高 @@ -2351,7 +2361,12 @@ Error(%2): %3 <html><head/><body><p>在下一個序列中傳送.</p></body></html> - + + Q65 + + + + SWL Mode SWL 模式 @@ -3431,12 +3446,7 @@ list. The list can be maintained in Settings (F2). - - JT9+JT65 - - - - + Astronomical data 天文數據 @@ -3647,7 +3657,17 @@ list. The list can be maintained in Settings (F2). - + + Quick-Start Guide to Q65 + Q65 快速入門指南 + + + + Auto Clear Avg after decode + 解碼後自動清除平均值 + + + Rig Control Error 無線電設備控制錯誤 @@ -3885,16 +3905,16 @@ list. The list can be maintained in Settings (F2). "fmt.all" 檔案將重新命名為 "fmt.bak" - + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: -"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." - 如果您根據 GNU 通用公共授權條款合理使用 WSJT-X 的任何部分, 則必須在衍生作品中醒目地顯示以下版權聲明: +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." + 如果您根據 GNU 通用公共許可證的條款合理使用 WSJT-X 的任何部分, 您必須在衍生作品中顯著顯示以下版權聲明: -"WSJT-X 的演演演算法, 原始碼, 外觀和感覺及相關程式, 和協定規格模式 FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 的版權 (C) 2001-2019 由以下一個或多個作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和 WSJT 開發組的其他成員." +"WSJT-X 及相關程式的演算法、原始程式碼、外觀和協定規範 FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, ISCAT, MSK144 版權所有 (C) 2001-2021 由以下一個或多個作者提供: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; 和WSJT發展團的其他成員." - + No data read from disk. Wrong file format? 沒有從磁盤讀取數據. 檔案格式錯誤? @@ -4954,7 +4974,12 @@ Error(%2): %3 參考 - + + Q65_Sync + Q65_同步 + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> <html><head/><body><p>波段在瀑布左邊緣顯示</p></body></html> @@ -5004,7 +5029,7 @@ Error(%2): %3 頻譜零度 - + Wide Graph 寬圖 diff --git a/widgets/AbstractLogWindow.cpp b/widgets/AbstractLogWindow.cpp index cbe2b8735..b8e2d7e7a 100644 --- a/widgets/AbstractLogWindow.cpp +++ b/widgets/AbstractLogWindow.cpp @@ -64,7 +64,10 @@ void AbstractLogWindow::impl::delete_QSOs () , tr ("Confirm Delete") , tr ("Are you sure you want to delete the %n " "selected QSO(s) from the log?", "" - , row_indexes.size ()))) + , row_indexes.size ()) + , QString {} + , MessageBox::Yes | MessageBox::No + , MessageBox::No)) { // We must work with source model indexes because we don't want row // removes to invalidate model indexes we haven't yet processed. We diff --git a/widgets/SplashScreen.cpp b/widgets/SplashScreen.cpp index 42f828774..561733ccc 100644 --- a/widgets/SplashScreen.cpp +++ b/widgets/SplashScreen.cpp @@ -33,7 +33,7 @@ SplashScreen::SplashScreen () revision ()}.simplified () + "" "V2.0 has many new features.

" "The release notes have more details.

" - "Send issue reports to wsjtgroup@yahoogroups.com, and be sure to save .wav
" + "Send issue reports to https://wsjtx.groups.io, and be sure to save .wav
" "files where appropriate.

" "Open the Help menu and select Release Notes for more details.
" "" diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 132f8aa4c..0729e106d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -139,8 +139,6 @@ extern "C" { void genwspr_(char* msg, char* msgsent, int itone[], fortran_charlen_t, fortran_charlen_t); - void geniscat_(char* msg, char* msgsent, int itone[], fortran_charlen_t, fortran_charlen_t); - void azdist_(char* MyGrid, char* HisGrid, double* utch, int* nAz, int* nEl, int* nDmiles, int* nDkm, int* nHotAz, int* nHotABetter, fortran_charlen_t, fortran_charlen_t); @@ -186,8 +184,8 @@ extern "C" { void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop); } -int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols -int volatile itone0[NUM_ISCAT_SYMBOLS]; //Dummy array, data not actually used +int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols +int volatile itone0[MAX_NUM_SYMBOLS]; //Dummy array, data not actually used int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID dec_data_t dec_data; // for sharing with Fortran @@ -595,7 +593,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->actionJT4->setActionGroup(modeGroup); ui->actionWSPR->setActionGroup(modeGroup); ui->actionEcho->setActionGroup(modeGroup); - ui->actionISCAT->setActionGroup(modeGroup); ui->actionMSK144->setActionGroup(modeGroup); ui->actionQ65->setActionGroup(modeGroup); ui->actionFreqCal->setActionGroup(modeGroup); @@ -971,7 +968,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, set_mode (m_mode); if(m_mode=="Echo") monitor(false); //Don't auto-start Monitor in Echo mode. ui->sbSubmode->setValue (vhf ? m_nSubMode : 0); //Submodes require VHF features - if(m_mode=="ISCAT" and !vhf) mode_label.setText("ISCAT A"); if(m_mode=="MSK144") { Q_EMIT transmitFrequency (1000.0); } else { @@ -1024,7 +1020,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, if(QCoreApplication::applicationVersion().contains("-devel") or QCoreApplication::applicationVersion().contains("-rc")) { - QTimer::singleShot (0, this, SLOT (not_GA_warning_message ())); + QTimer::singleShot (0, this, SLOT (not_GA_warning_message ())); } ui->pbBestSP->setVisible(m_mode=="FT4"); @@ -1035,14 +1031,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::not_GA_warning_message () { - // MessageBox::critical_message (this, - // "This is a pre-release version of WSJT-X 2.3.0 made\n" - // "available for testing purposes. By design it will\n" - // "be nonfunctional after 0000 UTC on Jan 19, 2021."); - // auto now = QDateTime::currentDateTimeUtc (); - // if (now >= QDateTime {{2021, 1, 19}, {0, 0}, Qt::UTC}) { - // Q_EMIT finished (); - // } + MessageBox::critical_message (this, + "This is a pre-release version of WSJT-X 2.4.0 made\n" + "available for testing purposes. By design it will\n" + "be nonfunctional after May 25, 2021."); + auto now = QDateTime::currentDateTimeUtc (); + if (now >= QDateTime {{2021, 5, 25}, {23, 59, 59, 999}, Qt::UTC}) { + Q_EMIT finished (); + } } void MainWindow::initialize_fonts () @@ -1456,7 +1452,7 @@ void MainWindow::dataSink(qint64 frames) } m_bClearRefSpec=false; - if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9) { + if(m_mode=="MSK144" or m_bFast9) { fastSink(frames); if(m_bFastMode) return; } @@ -1755,7 +1751,7 @@ void MainWindow::fastSink(qint64 frames) m_logBook,m_currentBand,m_config.ppfx()); m_bDecoded=true; auto_sequence (decodedtext, ui->sbFtol->value (), std::numeric_limits::max ()); - if (m_mode != "ISCAT") postDecode (true, decodedtext.string ()); + postDecode (true, decodedtext.string ()); // writeAllTxt(message); write_all("Rx",message); bool stdMsg = decodedtext.report(m_baseCall, @@ -1878,7 +1874,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog if (!vhf) ui->sbSubmode->setValue (0); setup_status_bar (vhf); - bool b = vhf && (m_mode=="JT4" or m_mode=="JT65" or m_mode=="ISCAT" or + bool b = vhf && (m_mode=="JT4" or m_mode=="JT65" or m_mode=="JT9" or m_mode=="MSK144" or m_mode=="Q65"); if(b) VHF_features_enabled(b); set_mode (m_mode); @@ -2383,10 +2379,8 @@ void MainWindow::setup_status_bar (bool vhf) mode_label.setText (t); } else { mode_label.setText (m_mode); - } - if ("ISCAT" == m_mode) { - mode_label.setStyleSheet ("QLabel{color: #000000; background-color: #ff9933}"); - } else if ("JT9" == m_mode) { + } + if ("JT9" == m_mode) { mode_label.setStyleSheet ("QLabel{color: #000000; background-color: #ff6ec7}"); } else if ("JT4" == m_mode) { mode_label.setStyleSheet ("QLabel{color: #000000; background-color: #cc99ff}"); @@ -2410,7 +2404,7 @@ void MainWindow::setup_status_bar (bool vhf) mode_label.setStyleSheet ("QLabel{color: #000000; background-color: #ff9933}"); } last_tx_label.setText (QString {}); - if (m_mode.contains (QRegularExpression {R"(^(Echo|ISCAT))"})) { + if (m_mode.contains (QRegularExpression {R"(^(Echo))"})) { if (band_hopping_label.isVisible ()) statusBar ()->removeWidget (&band_hopping_label); } else if (m_mode=="WSPR") { mode_label.setStyleSheet ("QLabel{color: #000000; background-color: #ff66ff}"); @@ -2601,7 +2595,7 @@ void MainWindow::on_actionCopyright_Notice_triggered() "notice prominently in your derivative work:\n\n" "\"The algorithms, source code, look-and-feel of WSJT-X and related " "programs, and protocol specifications for the modes FSK441, FST4, FT8, " - "JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, ISCAT, MSK144 are Copyright (C) " + "JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) " "2001-2021 by one or more of the following authors: Joseph Taylor, " "K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, " "IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; " @@ -3199,7 +3193,7 @@ void MainWindow::decode() //decode() from += noffset; size -= noffset; } - if(m_mode=="ISCAT" or m_mode=="MSK144" or m_bFast9) { + if(m_mode=="MSK144" or m_bFast9) { float t0=m_t0; float t1=m_t1; qApp->processEvents(); //Update the waterfall @@ -3221,7 +3215,6 @@ void MainWindow::decode() //decode() narg[7]=1000.0*t1; narg[8]=2; //Max decode lines per decode attempt if(dec_data.params.minSync<0) narg[8]=50; - if(m_mode=="ISCAT") narg[9]=101; //ISCAT if(m_mode=="JT9") narg[9]=102; //Fast JT9 if(m_mode=="MSK144") narg[9]=104; //MSK144 narg[10]=ui->RxFreqSpinBox->value(); @@ -3494,8 +3487,8 @@ void MainWindow::readFromStdout() //readFromStdout //Right (Rx Frequency) window bool bDisplayRight=bAvgMsg; int audioFreq=decodedtext.frequencyOffset(); -// if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4" or m_mode=="Q65") { - if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4") { + if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4" or m_mode=="Q65") { +// if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4") { int ftol=10; if(m_mode=="Q65") ftol=ui->sbFtol->value(); auto const& parts = decodedtext.string().remove("<").remove(">") @@ -3640,7 +3633,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler auto const& message_words = message.messageWords (); auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size(); bool is_OK=false; - if(m_mode=="MSK144" and message.string().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true; + if(m_mode=="MSK144" and message.clean_string ().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true; if (message_words.size () > 2 && (message.isStandardMessage() || (is_73 or is_OK))) { auto df = message.frequencyOffset (); auto within_tolerance = (qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance) @@ -3655,7 +3648,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler || message_words.contains ("DE"))) || !message.isStandardMessage ()); // free text 73/RR73 - QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); + QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); QString w2; int nrpt=0; if (w.size () > 2) @@ -3667,8 +3660,8 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler } } bool bEU_VHF=(nrpt>=520001 and nrpt<=594000); - if(bEU_VHF and message.string().contains("<"+m_config.my_callsign() + "> ")) { - m_xRcvd=message.string().trimmed().right(13); + if(bEU_VHF and message.clean_string ().contains("<"+m_config.my_callsign() + "> ")) { + m_xRcvd=message.clean_string ().trimmed().right(13); } if (m_auto && (m_QSOProgress==REPLYING or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT)) @@ -3738,7 +3731,7 @@ void MainWindow::on_EraseButton_clicked () { qint64 ms=QDateTime::currentMSecsSinceEpoch(); ui->decodedTextBrowser2->erase (); - if(m_mode=="WSPR" or m_mode=="Echo" or m_mode=="ISCAT" or m_mode=="FST4W") { + if(m_mode=="WSPR" or m_mode=="Echo" or m_mode=="FST4W") { ui->decodedTextBrowser->erase (); } else { if((ms-m_msErase)<500) { @@ -3807,8 +3800,8 @@ void MainWindow::guiUpdate() if(m_TRperiod==900) txDuration=1.0 + 160*66560/12000.0; if(m_TRperiod==1800) txDuration=1.0 + 160*134400/12000.0; } - if(m_modeTx=="ISCAT" or m_mode=="MSK144" or m_bFast9) { - txDuration=m_TRperiod-0.25; // ISCAT, JT9-fast, MSK144 + if(m_mode=="MSK144" or m_bFast9) { + txDuration=m_TRperiod-0.25; // JT9-fast, MSK144 } double tx1=0.0; @@ -4036,161 +4029,158 @@ void MainWindow::guiUpdate() if(m_tune or m_mode=="Echo") { itone[0]=0; } else { - if(m_mode=="ISCAT") { - geniscat_(message, msgsent, const_cast (itone), 28, 28); - msgsent[28]=0; - } else { - if(m_modeTx=="JT4") gen4_(message, &ichk , msgsent, const_cast (itone), + if(m_QSOProgress==2 or m_QSOProgress==3) m_bSentReport=true; + if(m_bSentReport and (m_QSOProgress<2 or m_QSOProgress>3)) m_bSentReport=false; + if(m_modeTx=="JT4") gen4_(message, &ichk , msgsent, const_cast (itone), + &m_currentMessageType, 22, 22); + if(m_modeTx=="JT9") gen9_(message, &ichk, msgsent, const_cast (itone), + &m_currentMessageType, 22, 22); + if(m_modeTx=="JT65") gen65_(message, &ichk, msgsent, const_cast (itone), &m_currentMessageType, 22, 22); - if(m_modeTx=="JT9") gen9_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 22, 22); - if(m_modeTx=="JT65") gen65_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 22, 22); - if(m_modeTx=="Q65") { - int i3=-1; - int n3=-1; - genq65_(message,&ichk,msgsent,const_cast(itone),&i3,&n3,37,37); - int nsps=1800; - if(m_TRperiod==30) nsps=3600; - if(m_TRperiod==60) nsps=7200; - if(m_TRperiod==120) nsps=16000; - if(m_TRperiod==300) nsps=41472; - int nsps4=4*nsps; //48000 Hz sampling - int nsym=85; - float fsample=48000.0; - int nwave=(nsym+2)*nsps4; - int icmplx=0; - int hmod=1; - float f0=ui->TxFreqSpinBox->value()-m_XIT; - genwave_(const_cast(itone),&nsym,&nsps4,&nwave, - &fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave); - } - if(m_modeTx=="WSPR") genwspr_(message, msgsent, const_cast (itone), - 22, 22); - if(m_modeTx=="MSK144" or m_modeTx=="FT8" or m_modeTx=="FT4" - or m_modeTx=="FST4" or m_modeTx=="FST4W") { - char MyCall[6]; - char MyGrid[6]; - ::memcpy(MyCall, (m_config.my_callsign()+" ").toLatin1(), sizeof MyCall); - ::memcpy(MyGrid, (m_config.my_grid()+" ").toLatin1(), sizeof MyGrid); - if(m_modeTx=="MSK144") { - genmsk_128_90_(message, &ichk, msgsent, const_cast (itone), - &m_currentMessageType, 37, 37); - if(m_restart) { - int nsym=144; - if(itone[40]==-40) nsym=40; - m_modulator->set_nsym(nsym); - } - } - - if(m_modeTx=="FT8") { - if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==1) { - foxTxSequencer(); - } else { - int i3=0; - int n3=0; - char ft8msgbits[77]; - genft8_(message, &i3, &n3, msgsent, const_cast (ft8msgbits), - const_cast (itone), 37, 37); - int nsym=79; - int nsps=4*1920; - float fsample=48000.0; - float bt=2.0; - float f0=ui->TxFreqSpinBox->value() - m_XIT; - int icmplx=0; - int nwave=nsym*nsps; - gen_ft8wave_(const_cast(itone),&nsym,&nsps,&bt,&fsample,&f0,foxcom_.wave, - foxcom_.wave,&icmplx,&nwave); - if(SpecOp::FOX == m_config.special_op_id()) { - //Fox must generate the full Tx waveform, not just an itone[] array. - QString fm = QString::fromStdString(message).trimmed(); - foxGenWaveform(0,fm); - foxcom_.nslots=1; - foxcom_.nfreq=ui->TxFreqSpinBox->value(); - if(m_config.split_mode()) foxcom_.nfreq = foxcom_.nfreq - m_XIT; //Fox Tx freq - QString foxCall=m_config.my_callsign() + " "; - ::memcpy(foxcom_.mycall, foxCall.toLatin1(), sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_ - foxgen_(); - } - } - } - if(m_modeTx=="FT4") { - int ichk=0; - char ft4msgbits[77]; - genft4_(message, &ichk, msgsent, const_cast (ft4msgbits), - const_cast(itone), 37, 37); - int nsym=103; - int nsps=4*576; - float fsample=48000.0; - float f0=ui->TxFreqSpinBox->value() - m_XIT; - int nwave=(nsym+2)*nsps; - int icmplx=0; - gen_ft4wave_(const_cast(itone),&nsym,&nsps,&fsample,&f0,foxcom_.wave, - foxcom_.wave,&icmplx,&nwave); - } - if(m_modeTx=="FST4" or m_modeTx=="FST4W") { - int ichk=0; - int iwspr=0; - char fst4msgbits[101]; - QString wmsg; - if(m_mode=="FST4W") { - iwspr = 1; - wmsg=WSPR_message(); - ba=wmsg.toLatin1(); - ba2msg(ba,message); - } - genfst4_(message,&ichk,msgsent,const_cast (fst4msgbits), - const_cast(itone), &iwspr, 37, 37); - int hmod=1; - if(m_config.x2ToneSpacing()) hmod=2; - if(m_config.x4ToneSpacing()) hmod=4; - int nsps=720; - if(m_TRperiod==30) nsps=1680; - if(m_TRperiod==60) nsps=3888; - if(m_TRperiod==120) nsps=8200; - if(m_TRperiod==300) nsps=21504; - if(m_TRperiod==900) nsps=66560; - if(m_TRperiod==1800) nsps=134400; - nsps=4*nsps; //48000 Hz sampling - int nsym=160; - float fsample=48000.0; - float dfreq=hmod*fsample/nsps; - float f0=ui->TxFreqSpinBox->value() - m_XIT + 1.5*dfreq; - if(m_mode=="FST4W") f0=ui->WSPRfreqSpinBox->value() - m_XIT + 1.5*dfreq; - int nwave=(nsym+2)*nsps; - int icmplx=0; - gen_fst4wave_(const_cast(itone),&nsym,&nsps,&nwave, - &fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave); - - QString t = QString::fromStdString(message).trimmed(); - } - - if(SpecOp::EU_VHF==m_config.special_op_id()) { - if(m_ntx==2) m_xSent=ui->tx2->text().right(13); - if(m_ntx==3) m_xSent=ui->tx3->text().right(13); - } - - if(SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::RTTY==m_config.special_op_id()) { - if(m_ntx==2 or m_ntx==3) { - QStringList t=ui->tx2->text().split(' ', SkipEmptyParts); - int n=t.size(); - m_xSent=t.at(n-2) + " " + t.at(n-1); - } - } - } - msgsent[37]=0; + if(m_modeTx=="Q65") { + int i3=-1; + int n3=-1; + genq65_(message,&ichk,msgsent,const_cast(itone),&i3,&n3,37,37); + int nsps=1800; + if(m_TRperiod==30) nsps=3600; + if(m_TRperiod==60) nsps=7200; + if(m_TRperiod==120) nsps=16000; + if(m_TRperiod==300) nsps=41472; + int nsps4=4*nsps; //48000 Hz sampling + int nsym=85; + float fsample=48000.0; + int nwave=(nsym+2)*nsps4; + int icmplx=0; + int hmod=1; + float f0=ui->TxFreqSpinBox->value()-m_XIT; + genwave_(const_cast(itone),&nsym,&nsps4,&nwave, + &fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave); } + if(m_modeTx=="WSPR") genwspr_(message, msgsent, const_cast (itone), + 22, 22); + if(m_modeTx=="MSK144" or m_modeTx=="FT8" or m_modeTx=="FT4" + or m_modeTx=="FST4" or m_modeTx=="FST4W") { + char MyCall[6]; + char MyGrid[6]; + ::memcpy(MyCall, (m_config.my_callsign()+" ").toLatin1(), sizeof MyCall); + ::memcpy(MyGrid, (m_config.my_grid()+" ").toLatin1(), sizeof MyGrid); + if(m_modeTx=="MSK144") { + genmsk_128_90_(message, &ichk, msgsent, const_cast (itone), + &m_currentMessageType, 37, 37); + if(m_restart) { + int nsym=144; + if(itone[40]==-40) nsym=40; + m_modulator->set_nsym(nsym); + } + } + + if(m_modeTx=="FT8") { + if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==1) { + foxTxSequencer(); + } else { + int i3=0; + int n3=0; + char ft8msgbits[77]; + genft8_(message, &i3, &n3, msgsent, const_cast (ft8msgbits), + const_cast (itone), 37, 37); + int nsym=79; + int nsps=4*1920; + float fsample=48000.0; + float bt=2.0; + float f0=ui->TxFreqSpinBox->value() - m_XIT; + int icmplx=0; + int nwave=nsym*nsps; + gen_ft8wave_(const_cast(itone),&nsym,&nsps,&bt,&fsample,&f0,foxcom_.wave, + foxcom_.wave,&icmplx,&nwave); + if(SpecOp::FOX == m_config.special_op_id()) { + //Fox must generate the full Tx waveform, not just an itone[] array. + QString fm = QString::fromStdString(message).trimmed(); + foxGenWaveform(0,fm); + foxcom_.nslots=1; + foxcom_.nfreq=ui->TxFreqSpinBox->value(); + if(m_config.split_mode()) foxcom_.nfreq = foxcom_.nfreq - m_XIT; //Fox Tx freq + QString foxCall=m_config.my_callsign() + " "; + ::memcpy(foxcom_.mycall, foxCall.toLatin1(), sizeof foxcom_.mycall); //Copy Fox callsign into foxcom_ + foxgen_(); + } + } + } + if(m_modeTx=="FT4") { + int ichk=0; + char ft4msgbits[77]; + genft4_(message, &ichk, msgsent, const_cast (ft4msgbits), + const_cast(itone), 37, 37); + int nsym=103; + int nsps=4*576; + float fsample=48000.0; + float f0=ui->TxFreqSpinBox->value() - m_XIT; + int nwave=(nsym+2)*nsps; + int icmplx=0; + gen_ft4wave_(const_cast(itone),&nsym,&nsps,&fsample,&f0,foxcom_.wave, + foxcom_.wave,&icmplx,&nwave); + } + if(m_modeTx=="FST4" or m_modeTx=="FST4W") { + int ichk=0; + int iwspr=0; + char fst4msgbits[101]; + QString wmsg; + if(m_mode=="FST4W") { + iwspr = 1; + wmsg=WSPR_message(); + ba=wmsg.toLatin1(); + ba2msg(ba,message); + } + genfst4_(message,&ichk,msgsent,const_cast (fst4msgbits), + const_cast(itone), &iwspr, 37, 37); + int hmod=1; + if(m_config.x2ToneSpacing()) hmod=2; + if(m_config.x4ToneSpacing()) hmod=4; + int nsps=720; + if(m_TRperiod==30) nsps=1680; + if(m_TRperiod==60) nsps=3888; + if(m_TRperiod==120) nsps=8200; + if(m_TRperiod==300) nsps=21504; + if(m_TRperiod==900) nsps=66560; + if(m_TRperiod==1800) nsps=134400; + nsps=4*nsps; //48000 Hz sampling + int nsym=160; + float fsample=48000.0; + float dfreq=hmod*fsample/nsps; + float f0=ui->TxFreqSpinBox->value() - m_XIT + 1.5*dfreq; + if(m_mode=="FST4W") f0=ui->WSPRfreqSpinBox->value() - m_XIT + 1.5*dfreq; + int nwave=(nsym+2)*nsps; + int icmplx=0; + gen_fst4wave_(const_cast(itone),&nsym,&nsps,&nwave, + &fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave); + + QString t = QString::fromStdString(message).trimmed(); + } + + if(SpecOp::EU_VHF==m_config.special_op_id()) { + if(m_ntx==2) m_xSent=ui->tx2->text().right(13); + if(m_ntx==3) m_xSent=ui->tx3->text().right(13); + } + + if(SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::RTTY==m_config.special_op_id()) { + if(m_ntx==2 or m_ntx==3) { + QStringList t=ui->tx2->text().split(' ', SkipEmptyParts); + int n=t.size(); + m_xSent=t.at(n-2) + " " + t.at(n-1); + } + } + } + msgsent[37]=0; } { auto temp = m_currentMessage; m_currentMessage = QString::fromLatin1(msgsent); if (m_currentMessage != temp) // check if tx message changed - { + { statusUpdate (); } } - m_bCallingCQ = CALLING == m_QSOProgress + m_bCallingCQ = 6 == m_ntx || m_currentMessage.contains (QRegularExpression {"^(CQ|QRZ) "}); if(m_mode=="FT8" or m_mode=="FT4") { if(m_bCallingCQ && ui->cbFirst->isVisible () && ui->cbFirst->isChecked ()) { @@ -4222,16 +4212,15 @@ void MainWindow::guiUpdate() msg_parts[1].remove (QChar {'<'}); msg_parts[1].remove (QChar {'>'}); } - auto is_73 = m_QSOProgress >= ROGER_REPORT - && message_is_73 (m_currentMessageType, msg_parts); + auto is_73 = message_is_73 (m_currentMessageType, msg_parts); m_sentFirst73 = is_73 && !message_is_73 (m_lastMessageType, m_lastMessageSent.split (' ', SkipEmptyParts)); - if (m_sentFirst73) { + if (m_sentFirst73 || (is_73 && CALLING == m_QSOProgress)) { m_qsoStop=t2; if(m_config.id_after_73 ()) { icw[0] = m_ncw; } - if((m_config.prompt_to_log() or m_config.autoLog()) && !m_tune) logQSOTimer.start(0); + if((m_config.prompt_to_log() or m_config.autoLog()) && !m_tune && CALLING != m_QSOProgress) logQSOTimer.start(0); } bool b=(m_mode=="FT8" or m_mode=="FT4") and ui->cbAutoSeq->isChecked(); @@ -4751,9 +4740,9 @@ void MainWindow::doubleClickOnCall2(Qt::KeyboardModifiers modifiers) void MainWindow::doubleClickOnCall(Qt::KeyboardModifiers modifiers) { QTextCursor cursor; - if(m_mode=="ISCAT" or m_mode=="FST4W") { + if(m_mode=="FST4W") { MessageBox::information_message (this, - "Double-click not available for ISCAT or FST4W mode"); + "Double-click not available for FST4W mode"); return; } if(m_decodedText2) { @@ -4788,7 +4777,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie auto ctrl = modifiers.testFlag (Qt::ControlModifier); // auto alt = modifiers.testFlag (Qt::AltModifier); // basic mode sanity checks - auto const& parts = message.string ().split (' ', SkipEmptyParts); + auto const& parts = message.clean_string ().split (' ', SkipEmptyParts); if (parts.size () < 5) return; auto const& mode = parts.at (4).left (1); if (("JT65" == m_mode && mode != "#") @@ -4837,16 +4826,16 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie QString hisgrid; message.deCallAndGrid(/*out*/hiscall,hisgrid); - if(message.string().contains(hiscall+"/R")) { + if(message.clean_string ().contains(hiscall+"/R")) { hiscall+="/R"; ui->dxCallEntry->setText(hiscall); } - if(message.string().contains(hiscall+"/P")) { + if(message.clean_string ().contains(hiscall+"/P")) { hiscall+="/P"; ui->dxCallEntry->setText(hiscall); } - QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); + QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); int nw=w.size(); if(nw>=4) { if(message_words.size()<3) return; @@ -4858,9 +4847,9 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } bool is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size (); - if (!is_73 and !message.isStandardMessage() and !message.string().contains("<")) { + if (!is_73 and !message.isStandardMessage() and !message.clean_string ().contains("<")) { qDebug () << "Not processing message - hiscall:" << hiscall << "hisgrid:" << hisgrid - << message.string() << message.isStandardMessage(); + << message.clean_string () << message.isStandardMessage(); return; } @@ -4902,7 +4891,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie auto base_call = Radio::base_callsign (hiscall); // Determine appropriate response to received message - auto dtext = " " + message.string () + " "; + auto dtext = " " + message.clean_string () + " "; dtext=dtext.remove("<").remove(">"); if(dtext.contains (" " + m_baseCall + " ") || dtext.contains ("<" + m_baseCall + "> ") @@ -4930,7 +4919,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie MessageBox::information_message (this, msg); } - QStringList t=message.string().split(' ', SkipEmptyParts); + QStringList t=message.clean_string ().split(' ', SkipEmptyParts); int n=t.size(); QString t0=t.at(n-2); QString t1=t0.right(1); @@ -5006,11 +4995,11 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } } else { // no grid on end of msg auto const& word_3 = message_words.at (3); - bool word_3_is_int; - auto word_3_as_number = word_3.toInt (&word_3_is_int); - if(m_QSOProgress >= ROGER_REPORT && ("RRR" == word_3 - || (word_3_is_int && word_3_as_number == 73) - || "RR73" == word_3)) { + auto word_3_as_number = word_3.toInt (); + if (("RRR" == word_3 + || word_3_as_number == 73 + || "RR73" == word_3 + || ("R" == word_3 && m_QSOProgress != REPORT))) { if(m_mode=="FT4" and "RR73" == word_3) m_dateTimeRcvdRR73=QDateTime::currentDateTimeUtc(); m_bTUmsg=false; m_nextCall=""; //### Temporary: disable use of "TU;" message @@ -5023,16 +5012,30 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie ui->tx3->setText(t); m_bTUmsg=true; } else { - if(SpecOp::RTTY == m_config.special_op_id()) { - logQSOTimer.start(0); - m_ntx=6; - ui->txrb6->setChecked(true); - } else { - m_ntx=5; - ui->txrb5->setChecked(true); - } + if (m_QSOProgress > CALLING && m_QSOProgress < SIGNOFF + && SpecOp::NONE < m_config.special_op_id () && SpecOp::FOX > m_config.special_op_id () + && ("RR73" == word_3 || 73 == word_3_as_number)) + { + logQSOTimer.start(0); + m_ntx=6; + ui->txrb6->setChecked(true); + } + else if (word_3.contains (QRegularExpression {"^R(?!R73|RR)"}) + && m_QSOProgress != ROGER_REPORT) + { + m_ntx=4; + ui->txrb4->setChecked(true); + } + else + { + m_ntx=5; + ui->txrb5->setChecked(true); + } } - m_QSOProgress = SIGNOFF; + if (m_QSOProgress >= ROGER_REPORT) + { + m_QSOProgress = SIGNOFF; + } } else if((m_QSOProgress >= REPORT || (m_QSOProgress >= REPLYING && (m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT4"))) @@ -5047,30 +5050,35 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie ui->txrb4->setChecked(true); } else if (m_QSOProgress >= CALLING) { - if (word_3_is_int - && ((word_3_as_number >= -50 && word_3_as_number <= 49) - || (word_3_as_number >= 529 && word_3_as_number <= 599))) { - if(SpecOp::EU_VHF==m_config.special_op_id() or - SpecOp::FIELD_DAY==m_config.special_op_id() or - SpecOp::RTTY==m_config.special_op_id()) { - setTxMsg(2); - m_QSOProgress=REPORT; + if ((word_3_as_number >= -50 && word_3_as_number <= 49) + || (word_3_as_number >= 529 && word_3_as_number <= 599)) + { + if(SpecOp::EU_VHF==m_config.special_op_id() or + SpecOp::FIELD_DAY==m_config.special_op_id() or + SpecOp::RTTY==m_config.special_op_id()) + { + setTxMsg(2); + m_QSOProgress=REPORT; + } + else + { + if (word_3.startsWith ("R-") || word_3.startsWith ("R+")) + { + setTxMsg(4); + m_QSOProgress=ROGERS; + } + else + { + setTxMsg (3); + m_QSOProgress = ROGER_REPORT; + } + } } - else { - setTxMsg (3); - m_QSOProgress = ROGER_REPORT; - } - } else { - if (word_3.startsWith ("R-") || word_3.startsWith ("R+")) { - setTxMsg(4); - m_QSOProgress=ROGERS; - } } - } - else - { // nothing for us - return; - } + else + { // nothing for us + return; + } } } else if (m_QSOProgress >= ROGERS @@ -5148,7 +5156,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } QString s1 = m_QSOText.trimmed (); - QString s2 = message.string ().trimmed(); + QString s2 = message.clean_string ().trimmed(); if (s1!=s2 and !message.isTX()) { if (!s2.contains(m_baseCall) or m_mode=="MSK144") { // Taken care of elsewhere if for_us and slow mode ui->decodedTextBrowser2->displayDecodedText(message, m_baseCall,m_mode,m_config.DXCC(), @@ -5188,10 +5196,10 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie rpt=QString::number(n); } - ui->rptSpinBox->setValue(n); + if(!m_bSentReport) ui->rptSpinBox->setValue(n); //Don't change report within a QSO // Don't genStdMsgs if we're already sending 73, or a "TU; " msg is queued. m_bTUmsg=false; //### Temporary: disable use of "TU;" messages - if (!m_nTx73 and !m_bTUmsg) { + if (!m_bSentReport and !m_nTx73 and !m_bTUmsg) { genStdMsgs(rpt); } if(m_transmitting) m_restart=true; @@ -5721,7 +5729,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() p.setColor(QPalette::Base,"#66ffff"); //light blue } else { p.setColor(QPalette::Base,Qt::transparent); - if(m_mode=="MSK144" and t.mid(0,1)=="<") { + if ("MSK144" == m_mode && t.count ('<') == 1) { p.setColor(QPalette::Base,"#00ffff"); //another light blue } } @@ -6412,9 +6420,7 @@ void MainWindow::on_actionQ65_triggered() m_hsymStop=49; ui->sbTR->values ({15, 30, 60, 120, 300}); on_sbTR_valueChanged (ui->sbTR->value()); -//### ui->sbSubmode->setMaximum(4); - ui->sbSubmode->setMaximum(7); - ui->sbSubmode->setValue(m_nSubMode); + ui->sbSubmode->setValue(m_nSubMode); QString fname {QDir::toNativeSeparators(m_config.temp_dir().absoluteFilePath ("red.dat"))}; m_wideGraph->setRedFile(fname); m_wideGraph->setMode(m_mode); @@ -6433,42 +6439,6 @@ void MainWindow::on_actionQ65_triggered() statusChanged(); } -void MainWindow::on_actionISCAT_triggered() -{ - m_mode="ISCAT"; - m_modeTx="ISCAT"; - ui->actionISCAT->setChecked(true); - ui->sbTR->values ({5, 10, 15, 30}); - on_sbTR_valueChanged (ui->sbTR->value ()); - m_modulator->setTRPeriod(m_TRperiod); - m_detector->setTRPeriod(m_TRperiod); - m_wideGraph->setPeriod(m_TRperiod,m_nsps); - m_nsps=6912; //For symspec only - m_FFTSize = m_nsps / 2; - Q_EMIT FFTSize (m_FFTSize); - m_hsymStop=103; - m_toneSpacing=11025.0/256.0; - WSPR_config(false); - ui->rh_decodes_widget->setVisible (false); - switch_mode(Modes::ISCAT); - m_wideGraph->setMode(m_mode); - m_wideGraph->setModeTx(m_modeTx); - statusChanged(); - if(!m_fastGraph->isVisible()) m_fastGraph->showNormal(); - if(m_wideGraph->isVisible()) m_wideGraph->hide(); - setup_status_bar (true); - ui->cbShMsgs->setChecked(false); - ui->lh_decodes_headings_label->setText( - " UTC Sync dB DT DF F1 M N C T "); - ui->tabWidget->setCurrentIndex(0); - ui->sbSubmode->setMaximum(1); - if(m_nSubMode==0) ui->TxFreqSpinBox->setValue(1012); - if(m_nSubMode==1) ui->TxFreqSpinBox->setValue(560); - displayWidgets(nWidgets("1001110000000001100000000000000000000")); - fast_config(true); - statusChanged (); -} - void MainWindow::on_actionMSK144_triggered() { if(SpecOp::EU_VHF < m_config.special_op_id()) { @@ -6477,7 +6447,6 @@ void MainWindow::on_actionMSK144_triggered() if("JT4"==m_mode) ui->actionJT4->setChecked(true); if("JT9"==m_mode) ui->actionJT9->setChecked(true); if("JT65"==m_mode) ui->actionJT65->setChecked(true); - if("ISCAT"==m_mode) ui->actionISCAT->setChecked(true); if("Q65"==m_mode) ui->actionQ65->setChecked(true); if("WSPR"==m_mode) ui->actionWSPR->setChecked(true); if("Echo"==m_mode) ui->actionEcho->setChecked(true); @@ -6537,6 +6506,7 @@ void MainWindow::on_actionMSK144_triggered() } else { ui->labDXped->setVisible(true); ui->labDXped->setText(t0); + on_contest_log_action_triggered(); } } @@ -6698,7 +6668,7 @@ void MainWindow::fast_config(bool b) m_bFastMode=b; ui->TxFreqSpinBox->setEnabled(!b); ui->sbTR->setVisible(b); - if(b and (m_bFast9 or m_mode=="MSK144" or m_mode=="ISCAT")) { + if(b and (m_bFast9 or m_mode=="MSK144")) { m_wideGraph->hide(); m_fastGraph->showNormal(); } else { @@ -7393,22 +7363,6 @@ void MainWindow::transmit (double snr) false, false, snr, m_TRperiod); } - if(m_mode=="ISCAT") { - double sps,f0; - if(m_nSubMode==0) { - sps=512.0*12000.0/11025.0; - toneSpacing=11025.0/512.0; - f0=47*toneSpacing; - } else { - sps=256.0*12000.0/11025.0; - toneSpacing=11025.0/256.0; - f0=13*toneSpacing; - } - Q_EMIT sendMessage (m_mode, NUM_ISCAT_SYMBOLS, sps, f0, toneSpacing, m_soundOutput, - m_config.audio_output_channel(), - true, true, snr, m_TRperiod); - } - // In auto-sequencing mode, stop after 5 transmissions of "73" message. if (m_bFastMode || m_bFast9) { if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked ()) { @@ -7590,7 +7544,17 @@ void MainWindow::on_sbTR_valueChanged(int value) ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); } } - } + + if ("Q65" == m_mode) + { + switch (value) + { + case 15: ui->sbSubmode->setMaximum (2); break; + case 30: ui->sbSubmode->setMaximum (3); break; + default: ui->sbSubmode->setMaximum (4); break; + } + } + } m_fastGraph->setTRPeriod (value); m_modulator->setTRPeriod (value); // TODO - not thread safe m_detector->setTRPeriod (value); // TODO - not thread safe @@ -7613,8 +7577,8 @@ void MainWindow::on_sbTR_FST4W_valueChanged(int value) QChar MainWindow::current_submode () const { QChar submode {0}; - if (m_mode.contains (QRegularExpression {R"(^(JT65|JT9|JT4|ISCAT|Q65)$)"}) - && (m_config.enable_VHF_features () || "JT4" == m_mode || "ISCAT" == m_mode)) + if (m_mode.contains (QRegularExpression {R"(^(JT65|JT9|JT4|Q65)$)"}) + && (m_config.enable_VHF_features () || "JT4" == m_mode)) { submode = m_nSubMode + 65; } @@ -7633,9 +7597,12 @@ void MainWindow::on_sbSubmode_valueChanged(int n) } else { mode_label.setText (m_mode); } - if(m_mode=="ISCAT") { - if(m_nSubMode==0) ui->TxFreqSpinBox->setValue(1012); - if(m_nSubMode==1) ui->TxFreqSpinBox->setValue(560); + if(m_mode=="Q65") { + if((m_nSubMode==4 && m_TRperiod==60.0) || (m_nSubMode==3 && m_TRperiod==30.0) || (m_nSubMode==2 && m_TRperiod==15.0)) + { ui->TxFreqSpinBox->setValue(700); + } else { + ui->TxFreqSpinBox->setValue(1000); + } } if(m_mode=="JT9") { if(m_nSubMode<4) { @@ -7811,17 +7778,13 @@ void MainWindow::replayDecodes () if (message.size() >= 4 && message.left (4) != "----") { auto const& parts = message.split (' ', SkipEmptyParts); - if (parts.size () >= 5 && parts[3].contains ('.')) // - { - postWSPRDecode (false, parts); - } - else - { - // TODO - how to skip ISCAT decodes - postDecode (false, message); - } - } - } + if (parts.size () >= 5 && parts[3].contains ('.')) { + postWSPRDecode (false, parts); + } else { + postDecode (false, message); + } + } + } statusChanged (); } @@ -8281,7 +8244,7 @@ void MainWindow::fastPick(int x0, int x1, int y) { float pixPerSecond=12000.0/512.0; if(m_TRperiod<30.0) pixPerSecond=12000.0/256.0; - if(m_mode!="ISCAT" and m_mode!="MSK144") return; + if(m_mode!="MSK144") return; if(!m_decoderBusy) { dec_data.params.newdat=0; dec_data.params.nagain=1; @@ -9270,7 +9233,6 @@ void MainWindow::set_mode (QString const& mode) else if ("JT65" == mode) on_actionJT65_triggered (); else if ("Q65" == mode) on_actionQ65_triggered (); else if ("FreqCal" == mode) on_actionFreqCal_triggered (); - else if ("ISCAT" == mode) on_actionISCAT_triggered (); else if ("MSK144" == mode) on_actionMSK144_triggered (); else if ("WSPR" == mode) on_actionWSPR_triggered (); else if ("Echo" == mode) on_actionEcho_triggered (); diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index d71a400f4..61bb98ce1 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -47,17 +47,17 @@ #define NUM_JT65_SYMBOLS 126 //63 data + 63 sync #define NUM_JT9_SYMBOLS 85 //69 data + 16 sync #define NUM_WSPR_SYMBOLS 162 //(50+31)*2, embedded sync -#define NUM_ISCAT_SYMBOLS 1291 //30*11025/256 #define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80 #define NUM_Q65_SYMBOLS 85 //63 data + 22 sync #define NUM_FT8_SYMBOLS 79 #define NUM_FT4_SYMBOLS 105 #define NUM_FST4_SYMBOLS 160 //240/2 data + 5*8 sync #define NUM_CW_SYMBOLS 250 +#define MAX_NUM_SYMBOLS 250 #define TX_SAMPLE_RATE 48000 #define NRING 3456000 -extern int volatile itone[NUM_ISCAT_SYMBOLS]; //Audio tones for all Tx symbols +extern int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols extern int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID //--------------------------------------------------------------- MainWindow @@ -291,7 +291,6 @@ private slots: void on_pbTxNext_clicked(bool b); void on_actionEcho_Graph_triggered(); void on_actionEcho_triggered(); - void on_actionISCAT_triggered(); void on_actionFast_Graph_triggered(); void fast_decode_done(); void on_actionMeasure_reference_spectrum_triggered(); @@ -538,6 +537,7 @@ private: bool m_bTUmsg; bool m_bBestSPArmed=false; bool m_bOK_to_chk=false; + bool m_bSentReport=false; enum { diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 2501b8236..35f64d91b 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2,6 +2,14 @@ MainWindow + + + 0 + 0 + 1124 + 582 + + WSJT-X by K1JT @@ -2796,7 +2804,7 @@ Double-click to reset to the standard 73 message 0 0 - 1110 + 1124 21 @@ -2890,7 +2898,6 @@ Double-click to reset to the standard 73 message -