diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d5ff94de..131663a75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1306,6 +1306,9 @@ target_link_libraries (jt4sim wsjt_fort wsjt_cxx) add_executable (jt65sim lib/jt65sim.f90 wsjtx.rc) target_link_libraries (jt65sim wsjt_fort wsjt_cxx) +add_executable (sumsim lib/sumsim.f90 wsjtx.rc) +target_link_libraries (sumsim wsjt_fort wsjt_cxx) + add_executable (qra64sim lib/qra/qra64/qra64sim.f90 wsjtx.rc) target_link_libraries (qra64sim wsjt_fort wsjt_cxx) diff --git a/doc/user_guide/en/make-qso.adoc b/doc/user_guide/en/make-qso.adoc index 4e6b65db3..da4c0ada5 100644 --- a/doc/user_guide/en/make-qso.adoc +++ b/doc/user_guide/en/make-qso.adoc @@ -79,9 +79,10 @@ 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. +[[CONTEST_MSGS]] === Contest Messages -The new FT4, FT8, and MSK144 protocols support special messages optimized +The FT4, FT8, and MSK144 protocols support special messages optimized for *NA VHF* and *EU VHF* contests. FT8 also supports messages for *ARRL Field Day* and the *ARRL RTTY Roundup*. The decoders recognize and decode these messages at any time. Configure the program to @@ -105,12 +106,17 @@ place of RRR, and the final 73 is optional. CQ TEST G4ABC IO91 G4ABC PA9XYZ JO22 - PA9XYZ 570123 IO91NP - G4ABC R 580071 JO22DB + 570123 IO91NP + R 580071 JO22DB PA9XYZ G4ABC RR73 Either callsign (or both) may have /P appended. +IMPORTANT: Messages conveying signal reports, QSO serial numbers, and +6-character locators have been changed in _WSJT-X v2.2_ and are *NOT* +compatible with the formats used in earlier program versions. Be sure +to upgrade _WSJT-X_ if you will use *EU VHF Contest* messages. + *ARRL Field Day* CQ FD K1ABC FN42 diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index 2b8efe4c4..4bc78be2d 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,15 +1,73 @@ === New in Version {VERSION} -The most important feature added to _WSJT-X_ since Version 2.0.1 is -the new *FT4 protocol*, designed especially for radio contesting. It -has T/R sequence length 7.5 s, bandwidth 80 Hz, and threshold -sensitivity -17.5 dB. Version 2.1.0 also has improvements to FT8 -waveform generation, waterfall and spectrum display, contest logging, -rig control, the user interface, keyboard shortcuts, UDP messaging for -inter-program communication, and accessibility, as well as a number of -more minor enhancements and bug fixes. We now provide a separate -installation package for 64-bit Windows Vista and later, offering -significant improvements in decoding speed. +*Improvements to decoders* + +*FT4:* Corrected bugs that prevented AP (_a priori_) decoding and/or +multi-pass decoding in some circumstances. Improved and extended the +algorithm for AP decoding. + +*FT8:* Decoding is now spread over three intervals. The first starts +11.8 s into an Rx sequence and typically yields around 85% of the +possible decodes, so you see most decodes much earlier than before. A +second processing step starts at 13.5 s, and the final one at 14.7 s. +Overall decoding yield on crowded bands is improved by 10% or more. +Systems with receive latency greater than 0.2 s will see smaller +improvements, but will still see many decodes earlier than before. + +SNR estimates no longer saturate at +20 dB, and large signals in the +passband no longer cause the SNR of weaker signals to be biased low. +Times written to cumulative journal file ALL.TXT are now correct even +when the decode occurs after the T/R sequence boundary. In FT8 +DXpedition Mode, AP decoding is now implemented for Hounds when the +Fox has a compound callsign. + + +*JT4:* Formatting and display of averaged and Deep Search decodes has +been cleaned up and made consistent with other modes used for EME and +extreme weak-signal work on microwave bands. + +*JT65:* Many improvements have been made for averaged and Deep Search +decodes, and their display to the user. For details see <> +in the <> section of this guide. + +*WSPR:* Significant improvements have been made to the WSPR decoder's +sensitivity, its ability to cope with many signals in a crowded +sub-band, and its rate of undetected false decodes. We now use up to +three decoding passes. Passes 1 and 2 use noncoherent demodulation of +single symbols and allow for frequency drifts up to ±4 Hz in a +transmission. Pass 3 assumes no drift and does coherent block +detection of up to three symbols. It also applies bit-by-bit +normalization of the single-symbol bit metrics, a technique that has +proven helpful for signals corrupted by artifacts of the subtraction +of stronger signals and also for LF/MF signals heavily contaminated by +lightning transients. With these improvements the number of decodes +in a crowded WSPR sub-band typically increases by 10 to 15%. + +*New message format:* When *EU VHF Contest* is selected, the Tx2 and +Tx3 messages -- those conveying signal report, serial number, and +6-character locator -- now use hashcodes for both callsigns . This +change is *not* backward compatible with earlier versions of _WSJT-X_, so +all users of *EU VHF Contest* messages should be sure to upgrade to +versiion 2.2.0. See <> for details. + +*Minor enhancements and bug fixes* + +- *Save None* now writes no .wav files to disk, even temporarily. + +- An explicit entry for *WW Digi Contest* has been added to *Special + operating activities* on the *Settings | Advanced* tab. + +- The contest mode FT4 now always uses RR73 for the Tx4 message. + +- *Keyboard shortcuts* have been added as an aid to accessibility: +*Alt+R* sets Tx4 message to RR73, *Ctrl+R* sets it to RRR. + +- The *Status bar* now displays the number of decodes found in the +most recent Rx sequence. + +- As an aid for partial color-blindness, the "`inverted goal posts`" +marking Rx frequency on the Wide Graph's frequency scale are now in a +darker shade of green. === Documentation Conventions @@ -34,6 +92,5 @@ your interests known to the development team. The project's source-code repository can be found at {devrepo}, and communication among the developers takes place on the email reflector {devmail}. Bug reports and suggestions for new features, improvements to the -_WSJT-X_ User Guide, etc., may also be sent to the {wsjt_yahoo_group} -email reflector. You must join the relevant group before posting to -either email list. +_WSJT-X_ User Guide, etc., may be sent there as well. You must join +the group before posting to the email list. diff --git a/doc/user_guide/en/vhf-features.adoc b/doc/user_guide/en/vhf-features.adoc index b16842112..88ec55db8 100644 --- a/doc/user_guide/en/vhf-features.adoc +++ b/doc/user_guide/en/vhf-features.adoc @@ -1,6 +1,5 @@ -_WSJT-X_ v{VERSION_MAJOR}.{VERSION_MINOR} supports a number of -features designed for use on the VHF and higher bands. These features -include: +_WSJT-X_ supports a number of features designed for use on the VHF and +higher bands. These features include: - *FT8*, a mode designed for making fast QSOs with weak, fading signals @@ -155,6 +154,7 @@ QSO using submode JT4F. image::JT4F.png[align="center",alt="JT4F"] +[[VHF_JT65]] === JT65 In many ways JT65 operation on VHF and higher bands is similar to HF diff --git a/lib/hint65.f90 b/lib/hint65.f90 index ec414a236..00eaf40c9 100644 --- a/lib/hint65.f90 +++ b/lib/hint65.f90 @@ -62,10 +62,6 @@ subroutine hint65(s3,mrs,mrs2,nadd,nflip,mycall,hiscall,hisgrid,qual,decoded) grid2(j)=grid enddo 10 ncalls=j - if(ncalls.lt.10) then - write(*,1010) ncalls -1010 format('CALL3.TXT very short (N =',i2,') or missing?') - endif close(23) ! NB: generation of test messages is not yet complete! @@ -146,19 +142,11 @@ subroutine hint65(s3,mrs,mrs2,nadd,nflip,mycall,hiscall,hisgrid,qual,decoded) endif enddo -!### Just in case ??? -! rewind 77 -! write(77,*) u1,u2,ipk,ipk2 -! call flush(77) -!### - decoded=' ' bias=max(1.12*u2,0.35) if(nadd.ge.4) bias=max(1.08*u2,0.45) if(nadd.ge.8) bias=max(1.04*u2,0.60) qual=100.0*(u1-bias) -! write(*,3301) u1,u2,u1/u2,bias,qual,nadd,ipk,ipk2 -!3301 format(5f6.2,i3,2i6) qmin=1.0 if(qual.ge.qmin) decoded=msg0(ipk) diff --git a/lib/sumsim.f90 b/lib/sumsim.f90 new file mode 100644 index 000000000..e05f8d4d0 --- /dev/null +++ b/lib/sumsim.f90 @@ -0,0 +1,41 @@ +program sumsim + +! Sum a number of *.wav files so that multiple signals are present + + use wavhdr + parameter (NMAX=60*12000) + type(hdr) h !Header for the .wav file + integer*2 iwave(NMAX) !i*2 data + real wave(NMAX) !r*4 data + character*80 fname + + nargs=iargc() + if(nargs.lt.1) then + print*,'Usage: sumsim file1 [file2, ...]' + go to 999 + endif + wave=0. + + do ifile=1,nargs + call getarg(ifile,fname) + open(10,file=trim(fname),status='old',access='stream') + read(10) h + npts=h%ndata/2 + nfsample=h%nsamrate + read(10) iwave(1:npts) + n=len(trim(fname)) + wave(1:npts)=wave(1:npts)+iwave(1:npts) + rms=sqrt(dot_product(wave(1:npts),wave(1:npts))/npts) + write(*,1000) ifile,npts,float(npts)/nfsample,rms,fname(n-14:n) +1000 format(i3,i8,f6.1,f10.3,2x,a15) + close(10) + enddo + + fac=1.0/sqrt(float(nargs)) + iwave(1:npts)=nint(fac*wave(1:npts)) + + open(12,file='000000_0000.wav',access='stream',status='unknown') + write(12) h,iwave(1:npts) + close(12) + +999 end program sumsim diff --git a/lib/sync65.f90 b/lib/sync65.f90 index 974bdc2da..cfb3accb7 100644 --- a/lib/sync65.f90 +++ b/lib/sync65.f90 @@ -55,8 +55,6 @@ subroutine sync65(nfa,nfb,ntol,nqsym,ca,ncand,nrobust,bVHF) do i=ia,ib freq=i*df itry=0 -! if(naggressive.gt.0 .and. ntol.lt.1000 .and. ccfmax.ge.thresh0) then -! if(naggressive.gt.0 .and. ccfmax.ge.thresh0) then if(bVHF) then if(i.ne.ipk .or. ccfmax.lt.thresh0) cycle itry=1 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 5ce930f96..f9379bf4d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4591,17 +4591,22 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie || (firstcall == "DE")) { QString w2; - if(w.size()>=3) w2=w.at(2); - QString w34; - if(w.size()>=4) w34=w.at(3); + int nw=w.size(); + if(nw>=3) w2=w.at(2); int nrpt=w2.toInt(); - if(w2=="R") { - nrpt=w34.toInt(); - w34=w.at(4); + QString w34; + if(nw>=4) { +// w34=w.at(nw-2); + nrpt=w.at(nw-2).toInt(); + w34=w.at(nw-1); } + bool bRTTY = (nrpt>=529 and nrpt<=599); bool bEU_VHF_w2=(nrpt>=520001 and nrpt<=594000); if(bEU_VHF_w2 and SpecOp::EU_VHF!=m_config.special_op_id()) { - MessageBox::information_message (this, tr ("Should you switch to EU VHF Contest mode?")); + auto const& msg = tr("Should you switch to EU VHF Contest mode?\n\n" + "To do so, check 'Special operating activity' and\n" + "'EU VHF Contest' on the Settings | Advanced tab."); + MessageBox::information_message (this, msg); } QStringList t=message.string().split(' ', QString::SkipEmptyParts); @@ -4620,9 +4625,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie MessageBox::information_message (this, tr ("Should you switch to ARRL Field Day mode?")); } - n=w34.toInt(); - bool bRTTY = (n>=529 and n<=599); - if(bRTTY and SpecOp::RTTY != m_config.special_op_id()) { // ### Should be in RTTY contest mode ??? ### MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?")); @@ -4638,7 +4640,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie && (message_words.at(1).contains(m_baseCall) || "DE" == message_words.at(1)) && (message_words.at(2).contains(qso_partner_base_call) or m_bDoubleClicked or bEU_VHF_w2 or (m_QSOProgress==CALLING))) { - if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) { if(SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()){ gen_msg=setTxMsg(3); @@ -4653,6 +4654,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } } } else if(w34.contains(grid_regexp) and SpecOp::EU_VHF==m_config.special_op_id()) { + if(nrpt==0) { gen_msg=setTxMsg(2); m_QSOProgress=REPORT; @@ -4666,11 +4668,15 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie } } } else if(SpecOp::RTTY == m_config.special_op_id() and bRTTY) { - gen_msg=setTxMsg(3); - m_QSOProgress=ROGER_REPORT; - int n=t.size(); - int nRpt=t[n-2].toInt(); - if(nRpt>=529 and nRpt<=599) m_xRcvd=t[n-2] + " " + t[n-1]; + if(w2=="R") { + gen_msg=setTxMsg(4); + m_QSOProgress=ROGERS; + } else { + gen_msg=setTxMsg(3); + m_QSOProgress=ROGER_REPORT; + } + m_xRcvd=t[n-2] + " " + t[n-1]; +// qDebug() << "bb" << w2 << w34 << t0 << m_xRcvd; } else if(SpecOp::FIELD_DAY==m_config.special_op_id() and bFieldDay_msg) { if(t0=="R") { gen_msg=setTxMsg(4); diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index 74fc2c020..b4aecbde5 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -330,7 +330,8 @@ void CPlotter::DrawOverlay() //DrawOverlay() double df = m_binsPerPixel*m_fftBinWidth; QPen penOrange(QColor(255,165,0),3); - QPen penGreen(Qt::green, 3); //Mark Tol range with green line +// QPen penGreen(Qt::green, 3); //Mark Tol range with green line + QPen penGreen(QColor(15,153,105), 3); //Mark Tol range or BW with dark green line QPen penRed(Qt::red, 3); //Mark Tx freq with red QPainter painter(&m_OverlayPixmap); painter.setBackground (palette ().brush (backgroundRole ()));