mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-21 11:38:34 -04:00
Merge branch 'develop' into qmap
This commit is contained in:
commit
e0078bf01e
33
INSTALL
33
INSTALL
@ -27,7 +27,7 @@ the Boost C++ libraries. For MS Windows see the section "Building
|
||||
from Source on MS Windows" below. For Apple Mac see the section
|
||||
"Building from Source on Apple Mac".
|
||||
|
||||
Qt v5, preferably v5.9 or later is required to build WSJT-X.
|
||||
Qt v5, preferably v5.12 or later is required to build WSJT-X.
|
||||
|
||||
Qt v5 multimedia support, serial port, and Linguist is necessary as
|
||||
well as the core Qt v5 components, normally installing the Qt
|
||||
@ -50,15 +50,13 @@ normally you can choose not to install libusb-1.0-dev but if you have
|
||||
a SoftRock USB or similar SDR that uses a custom USB interface then it
|
||||
is required.
|
||||
|
||||
The Hamlib library is required. Currently WSJT-X needs to be built
|
||||
using a forked version of the Hamlib git master. This fork contains
|
||||
patches not yet accepted by the Hamlib development team which are
|
||||
essential for correct operation of WSJT-X. To build the Hamlib fork
|
||||
from sources something like the following recipe should suffice:
|
||||
The Hamlib library is required. WSJT-X can be built with any version
|
||||
of the Hamlib git master. To build Hamlib from sources something
|
||||
like the following recipe should suffice:
|
||||
|
||||
$ mkdir ~/hamlib-prefix
|
||||
$ cd ~/hamlib-prefix
|
||||
$ git clone git://git.code.sf.net/u/bsomervi/hamlib src
|
||||
$ git clone https://github.com/Hamlib/Hamlib src
|
||||
$ cd src
|
||||
$ git checkout integration
|
||||
$ ./bootstrap
|
||||
@ -113,13 +111,13 @@ Building from Source on MS Windows
|
||||
|
||||
Because building on MS Windows is quite complicated there is an
|
||||
Software Development Kit available that provides all the prerequisite
|
||||
libraries and tools for building WSJT-X. This SDK is called JT-SDK-QT
|
||||
libraries and tools for building WSJT-X. This SDK is called HAMLIB SDK
|
||||
which is documented here:
|
||||
|
||||
http://physics.princeton.edu/pulsar/K1JT/wsjtx-doc/dev-guide-main.html
|
||||
https://sourceforge.net/projects/hamlib-sdk/
|
||||
|
||||
If you need to build Hamlib rather than use the Hamlib kit included in
|
||||
the JT-SDK the following recipe should help. Reasons for building
|
||||
the HAMLIB SDK the following recipe should help. Reasons for building
|
||||
Hamlib from source might include picking up the very latest patches or
|
||||
building a different branch that you wish to contribute to.
|
||||
|
||||
@ -143,7 +141,7 @@ In an MSYS shell:-
|
||||
|
||||
$ mkdir ~/hamib-prefix
|
||||
$ cd ~/hamlib-prefix
|
||||
$ git clone git://git.code.sf.net/u/bsomervi/hamlib src
|
||||
$ git clone https://github.com/Hamlib/Hamlib src
|
||||
$ cd src
|
||||
$ git checkout integration
|
||||
$ ./bootstrap
|
||||
@ -178,10 +176,6 @@ Hamlib binary location as one of the paths in CMAKE_PREFIX_PATH.
|
||||
Building from Source on Apple Mac
|
||||
=================================
|
||||
|
||||
These instructions are adapted from my Evernote page at:
|
||||
|
||||
https://www.evernote.com/pub/bsomervi/wsjt-xmacbuilds
|
||||
|
||||
There are several ways to get the required GNU and other open source
|
||||
tools and libraries installed, my preference is MacPorts because it is
|
||||
easy to use and does everything we need.
|
||||
@ -228,12 +222,11 @@ instructions are here:
|
||||
|
||||
Hamlib
|
||||
------
|
||||
First fetch hamlib from the repository, in this case my fork of Hamlib
|
||||
3 until the official repository has all the fixes we need:
|
||||
First fetch hamlib from the git master repository:
|
||||
|
||||
$ mkdir -p ~/hamlib-prefix/build
|
||||
$ cd ~/hamlib-prefix
|
||||
$ git clone git://git.code.sf.net/u/bsomervi/hamlib src
|
||||
$ git clone https://github.com/Hamlib/Hamlib src
|
||||
$ cd src
|
||||
$ git checkout integration
|
||||
$ ./bootstrap
|
||||
@ -352,8 +345,8 @@ which installs the WSJT-X application bundle into ~/wsjtx-prefix
|
||||
Updating and Rebuilding Hamlib
|
||||
==============================
|
||||
|
||||
From time to time new fixes will be pushed to the Hamlib fork
|
||||
repository integration branch. To pick them up type:
|
||||
From time to time new fixes will be pushed to the Hamlib git
|
||||
master repository. To pick them up type:
|
||||
|
||||
$ cd ~/hamlib-prefix/src
|
||||
$ git pull
|
||||
|
2
NEWS
2
NEWS
@ -9,7 +9,7 @@
|
||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||
|
||||
|
||||
Copyright 2001 - 2023 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||
Copyright 2001 - 2024 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||
|
||||
Release: WSJT-X 2.7.0-rc2
|
||||
July 7, 2023
|
||||
|
@ -9,9 +9,83 @@
|
||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||
|
||||
|
||||
Copyright 2001 - 2023 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||
Copyright 2001 - 2024 by Joe Taylor, K1JT, and the WSJT Development Team
|
||||
|
||||
Release: WSJT-X 2.7.0-rc2
|
||||
Release: WSJT-X 2.7.0-rc3
|
||||
January 1, 2024
|
||||
-------------------------
|
||||
|
||||
WSJT-X 2.7.0 Release Candidate 3 brings some new features, as well as
|
||||
numerous detail improvements and bug fixes, such as:
|
||||
|
||||
- Added a new "Update Hamlib" function. On Windows, it allows the user to
|
||||
update Hamlib directly from the program. The previously used version is
|
||||
backed up, so the user can easily revert a hamlib update.
|
||||
|
||||
- The Hamlib version in use is now displayed (also on Linux and macOS).
|
||||
|
||||
- The FT Roundup Messages protocol has been enhanced. It now allows also
|
||||
the exchange of static 4-digit numbers instead of serial numbers. This
|
||||
extends the usability of the FT RU protocol for other contest types.
|
||||
|
||||
- Improved direct switching between modes. Submode, as well as the status
|
||||
of the "Sh" and "Fast" checkboxes are now saved and restored by mode.
|
||||
|
||||
- Some right-click events were made more intuitive and consistent.
|
||||
- Right-clicking the Q65 button enables Q65 Pileup mode, a left-click
|
||||
brings you back to the normal Q65 mode.
|
||||
- Right-click the JT65 button to switch to JT9 mode.
|
||||
|
||||
- For Q65, all messages for us are now displayed in the right window.
|
||||
|
||||
- Message averaging is now allowed only when VHF features are
|
||||
enabled, and label texts are changed to "Single Period Decodes" and
|
||||
"Average Decodes" only if averaging is enabled.
|
||||
|
||||
- Some improvements to the Hamlib Transceiver code. Behavior is now
|
||||
more stable when Rig Split has been selected.
|
||||
|
||||
- Prevented redundant network communication between WSJT-X and DX Lab
|
||||
Suite Commander.
|
||||
|
||||
- Download of the LotW file now works without OpenSSL libraries.
|
||||
|
||||
- Made the spot counter work for WSPR.
|
||||
|
||||
- Prevented insertion of an individual contest name when in Fox mode.
|
||||
|
||||
- WAE entities are now assigned to the correct DXCC when "Include
|
||||
extra WAE entities" is not selected.
|
||||
|
||||
- Added a utility program 'cablog' which can be used to convert the
|
||||
wsjtx.log file to Cabrillo format for the ARRL EME contest.
|
||||
|
||||
- Minor improvements to the Active Stations window.
|
||||
|
||||
- The Rx/Tx frequency for Echo mode has been fixed at 1500 Hz.
|
||||
|
||||
- Some corrections and updates to the INSTALL instructions for Linux.
|
||||
|
||||
- Updated CTY.DAT file.
|
||||
|
||||
|
||||
/////// NOT YET USED TEXT MODULES
|
||||
|
||||
QMAP:
|
||||
- Use AlignCenter for Max Age and Max N controls in Active Stations window.
|
||||
- Must define 'offset' as a Fortran integer. Increase NJUNK by 1.
|
||||
- Protect against wacky settings of nfa, nfb, in Q65 mode.
|
||||
|
||||
WSJT-X:
|
||||
- ldpcsim174_91: Add the option to simulate the (174,91) code with noncoherent 8FSK on AWGN and block Rayleigh channels.
|
||||
- protect against invalid argument in pctile().
|
||||
- Change the label texts to "Single Period Decodes" and "Average Decodes" only if averaging is enabled.
|
||||
|
||||
////////
|
||||
|
||||
|
||||
|
||||
Release: WSJT-X 2.7.0-rc2
|
||||
July 7, 2023
|
||||
-------------------------
|
||||
|
||||
|
@ -1,68 +1,60 @@
|
||||
[[NEW_FEATURES]]
|
||||
=== New in Version {VERSION_MAJOR}.{VERSION_MINOR}
|
||||
|
||||
- _WSJT-X 2.6_ implements new features supporting the ARRL
|
||||
International Digital Contest and its distance based scoring. The
|
||||
*Call 1st* checkbox has been replaced by a drop-down control offering
|
||||
*CQ Max Dist* as an alternative. A new window labeled *Active
|
||||
Stations* displays a list of received but unworked callsigns, sorted
|
||||
in decreasing order of potential contest points. With option *CQ Max
|
||||
Dist* selected, the program will select the reply to your CQ that
|
||||
yields the most contest points. You can click on a line in the Active
|
||||
Stations window to call that station.
|
||||
_WSJT-X 2.7_ introduces a new program called *QMAP*, a new Special
|
||||
Operating Activity *Q65 Pileup*, an option to *Update Hamlib* at the
|
||||
click of a button, and a number of other enhancements and bug fixes.
|
||||
|
||||
- Decoding performance for FT8 and Q65 has been improved in a variety
|
||||
of situations with available _a priori_ (AP) information.
|
||||
- QMAP and Q65 Pileup mode are of particular interest to those engaged
|
||||
in Earth-Moon-Earth (EME) communication, but other applications may
|
||||
be found for them as well. QMAP is currently available for Windows
|
||||
only; it is derived from MAP65, an older program used since 2007 for
|
||||
EME. QMAP provides single-polarization receive-only capabilities for
|
||||
any one of the 60-second submodes of Q65. It allows you to monitor
|
||||
all traffic in a 90 kHz sub-band while conducting EME QSOs in the
|
||||
usual way with _WSJT-X_. Q65 Pileup mode helps DX operators using
|
||||
Q65 in pileup circumstances with many simultaneous callers and very
|
||||
weak signals, such as those experienced by 6-meter EME DXpeditions.
|
||||
Further details on QMAP and Q65 Pileup mode are available in a
|
||||
Quick-Start guide posted here:
|
||||
https://wsjt.sourceforge.io/Quick_Start_WSJT-X_2.7_QMAP.pdf
|
||||
|
||||
- *Echo* mode now offers a *Clear Avg* button and produces reliable
|
||||
measurements of SNR even when Doppler spread is large. Its *Monitor*
|
||||
function can be used to measure SNR for a received unmodulated carrier
|
||||
such as a key-down test signal emitted by another station and
|
||||
reflected from the Moon, and also to measure Sun, Moon, and ground
|
||||
noise as aids for optimizing an EME station's performance.
|
||||
- A button *Update Hamlib* now appears on the *Settings -> Radio* tab.
|
||||
On Windows it allows the user to automatically download and install
|
||||
the latest version of the rig-control features in Hamlib. The
|
||||
previously used version is backed up, so you can easily revert the
|
||||
procedure if necessary. Names and dates of the active and backup
|
||||
versions are clearly displayed.
|
||||
|
||||
- New buttons on the main window allow quick changes between modes
|
||||
FT4, FT8, MSK144, Q65, and JT65, and toggling FT8 Hound mode ON/OFF.
|
||||
- Spotting to *PSK Reporter* has been made more efficient. Redundant
|
||||
spots are omitted, and all posts are spread more widely in time. If
|
||||
your station locator is changed, for example during portable
|
||||
operations, your new locator will be sent automatically to PSK
|
||||
Reporter.
|
||||
|
||||
- New convenience features allow Fox operators to react more quickly
|
||||
to particular QSO situations. A two-column table in Tab 2 provides an
|
||||
overview of the queue and of callsigns with QSOs in progress. Fox
|
||||
operator can change the ordering of callsigns in the queue, allowing
|
||||
reaction to changes in propagation. Fox now responds automatically
|
||||
for another two cycles to stations whose report has not been received,
|
||||
increasing the success rate for difficult QSOs.
|
||||
- *Fox* mode now provides more convenient handling of the two callsign
|
||||
queues, and Fox's Log window displays statistical data on recent QSO
|
||||
rate. Multi-streamed messages transmitted by _MSHV_ are now handled
|
||||
properly when _WSJT-X_ is in *Hound* mode.
|
||||
|
||||
- The Working frequency table now offers save/restore capability and
|
||||
better handling of more than one frequency per mode-band
|
||||
combination. You can set preferred frequencies, and WSJT-X will select
|
||||
these when you change band or mode. You can label a tabled frequency
|
||||
with a description, for example a DXpedition callsign, and set Start
|
||||
and End date and time so the frequencies automatically appear and
|
||||
disappear from the displayed options. You can load a publicly
|
||||
available frequency table from a file, to easily make such DXpedition
|
||||
data available to the program.
|
||||
- The cty.dat file can now be updated by clicking a button on the
|
||||
*Settings -> Colors* tab.
|
||||
|
||||
- Optional color highlighting is provided for specified DX Call and DX
|
||||
Grid, and for messages containing RR73 or 73.
|
||||
- The FT Roundup message protocol now allows the exchange of static
|
||||
4-digit numbers in place of serial numbers. This extends the
|
||||
usability of the FT RU protocol for other contest types.
|
||||
|
||||
- New options are provided for writing to file ALL.TXT. You can
|
||||
request automatic starting of a new file every month or every year,
|
||||
and you can disable writing altogether.
|
||||
- Features for main-window switching between modes have been enhanced
|
||||
so that submode and status of the *Sh* and *Fast* checkboxes are
|
||||
saved and restored by mode. Right-click events were made more
|
||||
intuitive and consistent. Right-clicking the Q65 button enables Q65
|
||||
Pileup mode, and a left-click brings you back to the normal Q65
|
||||
mode. Right-click on the JT65 button switches to JT9 mode.
|
||||
|
||||
- Settings for T/R period and Submode are remembered by mode when you
|
||||
switch directly between modes: for example, MSK144-15, Q65-60A, or
|
||||
FST4-120.
|
||||
- Message averaging is now allowed only when *VHF features* are
|
||||
enabled. Main window text box labels are changed to read "`Single
|
||||
Period Decodes`" and "`Average Decodes`" when averaging is enabled.
|
||||
|
||||
- Tx and Rx audio frequencies are remembered and restored when you
|
||||
return from a mode that sets a default frequency 1500 Hz (MSK144,
|
||||
FST4W, Echo, WSPR, FreqCal), then switching back to FT4, FT8, Q65,
|
||||
FST4, or JT65.
|
||||
Further details on minor changes can be found in the Release Notes,
|
||||
accessible from the _WSJT-X_ *Help* menu.
|
||||
|
||||
- Rig control is provided for some new radios, and bug fixes for
|
||||
controlling others.
|
||||
|
||||
- New features in _MAP65_ (available for Windows only) include an aid
|
||||
for measuring antenna pointing errors and an ability to read the file
|
||||
wsjtx.log (kept by _WSJT-X_) to recognize EME contest dupes. In
|
||||
addition, _MAP65_ now sends additional information to file azel.dat
|
||||
and offers optional digital scaling of input I/Q data.
|
||||
|
@ -2,38 +2,50 @@ program ldpcsim174_91
|
||||
! End to end test of the (174,91)/crc14 encoder and decoder.
|
||||
use packjt77
|
||||
|
||||
integer, parameter:: N=174, K=91, M=N-K
|
||||
character*37 msg,msgsent,msgreceived
|
||||
integer, parameter:: N=174, K=91, M=N-K, NN=58
|
||||
character*37 msg,msgsent
|
||||
character*77 c77
|
||||
character*8 arg
|
||||
character*6 grid
|
||||
character*96 tmpchar
|
||||
integer*1, allocatable :: codeword(:), decoded(:), message(:)
|
||||
integer*1 msgbits(77)
|
||||
integer*1 message77(77),message91(91)
|
||||
integer*1 message91(91)
|
||||
integer*1 apmask(N), cw(N)
|
||||
integer lmax(1)
|
||||
integer modtype, itone(79), itonecw(58), graymap(0:7)
|
||||
integer nerrtot(0:N),nerrdec(0:N)
|
||||
integer channeltype
|
||||
logical unpk77_success
|
||||
logical one(0:511,0:8)
|
||||
real*8, allocatable :: rxdata(:)
|
||||
real, allocatable :: llr(:)
|
||||
real llr(174),llra(174),llrb(174),llrc(174),llrd(174)
|
||||
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
|
||||
complex cs(0:7,NN)
|
||||
real s2(0:511)
|
||||
data graymap/0,1,3,2,5,6,4,7/
|
||||
|
||||
nerrtot=0
|
||||
nerrdec=0
|
||||
|
||||
!
|
||||
|
||||
nargs=iargc()
|
||||
if(nargs.ne.6) then
|
||||
print*,'Usage: ldpcsim niter ndepth #trials s Keff nbposd'
|
||||
print*,'eg: ldpcsim 10 2 1000 0.84 91 1'
|
||||
print*,'niter: max BP iterations'
|
||||
print*,'ndepth: OSD order'
|
||||
print*,'s: noise sigma; if negative value is ignored and sigma is calculated from SNR.'
|
||||
print*,'nbposd=0, no coupling. nbposd>0, maxsuper=nbposd; nbposd<0, no OSD'
|
||||
if(nargs.ne.7) then
|
||||
print*,'Usage: ldpcsim maxosd norder #trials s Keff modtype channel'
|
||||
print*,'eg: ldpcsim 10 2 1000 0.84 91 1 0'
|
||||
print*,' maxosd<0: do bp only'
|
||||
print*,' maxosd=0: do bp and then call osd once with channel llrs'
|
||||
print*,' maxosd>1: do bp and then call osd maxosd times with saved bp outputs'
|
||||
print*,' norder : osd decoding depth'
|
||||
print*,' s : BPSK only, noise sigma, if s<0 value is ignored and sigma is calculated from SNR.'
|
||||
print*,' Keff : Keff must be in the range [77,91]; Keff-77 is the # of bits to use as CRC.'
|
||||
print*,' modtype : 0, coherent BPSK; 1 noncoherent 8FSK'
|
||||
print*,' channel : 0, AWGN; 1, block Rayleigh (Rayleigh only works with 8FSK!)'
|
||||
return
|
||||
endif
|
||||
call getarg(1,arg)
|
||||
read(arg,*) max_iterations
|
||||
read(arg,*) maxosd
|
||||
call getarg(2,arg)
|
||||
read(arg,*) ndepth
|
||||
read(arg,*) norder
|
||||
call getarg(3,arg)
|
||||
read(arg,*) ntrials
|
||||
call getarg(4,arg)
|
||||
@ -41,16 +53,24 @@ program ldpcsim174_91
|
||||
call getarg(5,arg)
|
||||
read(arg,*) Keff
|
||||
call getarg(6,arg)
|
||||
read(arg,*) nbposd
|
||||
read(arg,*) modtype
|
||||
call getarg(7,arg)
|
||||
read(arg,*) channeltype
|
||||
|
||||
! scale Eb/No for a (174,91) code
|
||||
rate=real(K)/real(N)
|
||||
|
||||
write(*,*) "rate: ",rate
|
||||
write(*,*) "niter= ",max_iterations," s= ",s
|
||||
|
||||
allocate ( codeword(N), decoded(K), message(K) )
|
||||
allocate ( rxdata(N), llr(N) )
|
||||
allocate ( rxdata(N) )
|
||||
|
||||
one=.false.
|
||||
do i=0,511
|
||||
do j=0,8
|
||||
if(iand(i,2**j).ne.0) one(i,j)=.true.
|
||||
enddo
|
||||
enddo
|
||||
|
||||
msg="K9ABC K1ABC FN20"
|
||||
i3=0
|
||||
@ -65,47 +85,144 @@ program ldpcsim174_91
|
||||
|
||||
call init_random_seed()
|
||||
|
||||
iq=1
|
||||
if(modtype.gt.0) then ! MFSK - get tones
|
||||
i3=-1
|
||||
n3=-1
|
||||
call genft8(msg,i3,n3,msgsent,msgbits,itone)
|
||||
write(*,*) 'message tones'
|
||||
write(*,'(79(i1,1x))') itone
|
||||
itonecw(1:29)=itone(8:36)
|
||||
itonecw(30:58)=itone(44:72)
|
||||
iq=3 ! bits per symbol
|
||||
endif
|
||||
call encode174_91(msgbits,codeword)
|
||||
write(*,*) 'crc14'
|
||||
write(*,'(14i1)') codeword(78:91)
|
||||
write(*,*) 'codeword'
|
||||
write(*,'(22(8i1,1x))') codeword
|
||||
|
||||
write(*,*) "Eb/N0 Es/N0 ngood nundetected sigma psymerr"
|
||||
do idb = 10,-4,-1
|
||||
write(*,*) 'Eb/N0 Es/N0 SNR2500 ngood nundetected sigma psymerr pbiterr'
|
||||
do idb = 20,-4,-1
|
||||
nsymerr=0
|
||||
nbiterr=0
|
||||
db=idb/2.0-1.0
|
||||
sigma=1/sqrt( 2*rate*(10**(db/10.0)) )
|
||||
sigma=1/sqrt( 2*rate*iq*(10**(db/10.0)) )
|
||||
ngood=0
|
||||
nue=0
|
||||
nsumerr=0
|
||||
|
||||
do itrial=1, ntrials
|
||||
! Create a realization of a noisy received word
|
||||
do i=1,N
|
||||
rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran()
|
||||
enddo
|
||||
nerr=0
|
||||
do i=1,N
|
||||
if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1
|
||||
enddo
|
||||
if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1
|
||||
if(modtype.eq.0) then
|
||||
do i=1,N
|
||||
rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran()
|
||||
enddo
|
||||
nerr=0
|
||||
do i=1,N
|
||||
if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1
|
||||
enddo
|
||||
if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1
|
||||
|
||||
rxav=sum(rxdata)/N
|
||||
rx2av=sum(rxdata*rxdata)/N
|
||||
rxsig=sqrt(rx2av-rxav*rxav)
|
||||
rxdata=rxdata/rxsig
|
||||
if( s .lt. 0 ) then
|
||||
ss=sigma
|
||||
rxav=sum(rxdata)/N
|
||||
rx2av=sum(rxdata*rxdata)/N
|
||||
rxsig=sqrt(rx2av-rxav*rxav)
|
||||
rxdata=rxdata/rxsig
|
||||
if( s .lt. 0 ) then
|
||||
ss=sigma
|
||||
else
|
||||
ss=s
|
||||
endif
|
||||
llr=2.0*rxdata/(ss*ss)
|
||||
else
|
||||
ss=s
|
||||
! noncoherent MFSK
|
||||
do i=1,58
|
||||
do j=0,7
|
||||
if(j.eq.itonecw(i)) then
|
||||
if(channeltype.eq.0) then
|
||||
A=1.0
|
||||
elseif(channeltype.eq.1) then
|
||||
xI=gran()**2 + gran()**2
|
||||
A=sqrt(xI/2)
|
||||
endif
|
||||
cs(j,i)= A + sigma*gran() + cmplx(0,1)*sigma*gran()
|
||||
elseif(j.ne.itonecw(i)) then
|
||||
cs(j,i)= sigma*gran() + cmplx(0,1)*sigma*gran()
|
||||
endif
|
||||
enddo
|
||||
lmax=maxloc(abs(cs(:,i)))
|
||||
if(lmax(1)-1.ne.itonecw(i) ) nsymerr=nsymerr+1
|
||||
enddo
|
||||
do nsym=1,3
|
||||
nt=2**(3*nsym)
|
||||
do ks=1,58,nsym
|
||||
amax=-1.0
|
||||
do i=0,nt-1
|
||||
i1=i/64
|
||||
i2=iand(i,63)/8
|
||||
i3=iand(i,7)
|
||||
if(nsym.eq.1) then
|
||||
s2(i)=abs(cs(graymap(i3),ks))
|
||||
elseif(nsym.eq.2) then
|
||||
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
|
||||
elseif(nsym.eq.3) then
|
||||
if(ks.ne.58) then
|
||||
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
|
||||
else
|
||||
s2(i)=abs(cs(graymap(i1),ks))
|
||||
endif
|
||||
else
|
||||
print*,"Error - nsym must be 1, 2, or 3."
|
||||
endif
|
||||
enddo
|
||||
|
||||
i32=1+(ks-1)*3
|
||||
if(nsym.eq.1) ibmax=2
|
||||
if(nsym.eq.2) ibmax=5
|
||||
if(nsym.eq.3) ibmax=8
|
||||
do ib=0,ibmax
|
||||
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
|
||||
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
|
||||
if(i32+ib .gt.174) cycle
|
||||
if(nsym.eq.1) then
|
||||
bmeta(i32+ib)=bm
|
||||
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
|
||||
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
|
||||
if(den.gt.0.0) then
|
||||
cm=bm/den
|
||||
else ! erase it
|
||||
cm=0.0
|
||||
endif
|
||||
bmetd(i32+ib)=cm
|
||||
elseif(nsym.eq.2) then
|
||||
bmetb(i32+ib)=bm
|
||||
elseif(nsym.eq.3) then
|
||||
bmetc(i32+ib)=bm
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
call normalizebmet(bmeta,174)
|
||||
call normalizebmet(bmetb,174)
|
||||
call normalizebmet(bmetc,174)
|
||||
call normalizebmet(bmetd,174)
|
||||
|
||||
scalefac=2.83
|
||||
llra=scalefac*bmeta
|
||||
llrb=scalefac*bmetb
|
||||
llrc=scalefac*bmetc
|
||||
llrd=scalefac*bmetd
|
||||
|
||||
llr=llrc
|
||||
endif
|
||||
|
||||
llr=2.0*rxdata/(ss*ss)
|
||||
do i=1, 174
|
||||
if(llr(i)*(codeword(i)-0.5).lt.0) nbiterr=nbiterr+1
|
||||
enddo
|
||||
|
||||
nap=0 ! number of AP bits
|
||||
llr(1:nap)=5*(2.0*msgbits(1:nap)-1.0)
|
||||
apmask=0
|
||||
apmask(1:nap)=1
|
||||
call decode174_91(llr,Keff,nbposd,ndepth,apmask,message91,cw,ntype,nharderrors,dmin)
|
||||
call decode174_91(llr,Keff,maxosd,norder,apmask,message91,cw,ntype,nharderrors,dmin)
|
||||
! If the decoder finds a valid codeword, nharderrors will be .ge. 0.
|
||||
if( nharderrors.ge.0 ) then
|
||||
nhw=count(cw.ne.codeword)
|
||||
@ -119,9 +236,12 @@ program ldpcsim174_91
|
||||
nsumerr=nsumerr+nerr
|
||||
enddo
|
||||
|
||||
esn0=db+10.0*log10(rate)
|
||||
pberr=real(nsumerr)/(real(ntrials*N))
|
||||
write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,esn0,ngood,nue,ss,pberr
|
||||
esn0=db+10.0*log10(iq*rate) ! iq=3 bits per symbol for 8FSK
|
||||
snr2500=esn0-10.0*log10(2500/6.25)
|
||||
! pberr=real(nsumerr)/(real(ntrials*N))
|
||||
psymerr=real(nsymerr)/(ntrials*174.0/iq)
|
||||
pbiterr=real(nbiterr)/(ntrials*174.0)
|
||||
write(*,"(f4.1,4x,f5.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3,8x,e10.3)") db,esn0,snr2500,ngood,nue,ss,psymerr,pbiterr
|
||||
|
||||
enddo
|
||||
|
||||
@ -132,3 +252,18 @@ program ldpcsim174_91
|
||||
close(23)
|
||||
|
||||
end program ldpcsim174_91
|
||||
|
||||
subroutine normalizebmet(bmet,n)
|
||||
real bmet(n)
|
||||
|
||||
bmetav=sum(bmet)/real(n)
|
||||
bmet2av=sum(bmet*bmet)/real(n)
|
||||
var=bmet2av-bmetav*bmetav
|
||||
if( var .gt. 0.0 ) then
|
||||
bmetsig=sqrt(var)
|
||||
else
|
||||
bmetsig=sqrt(bmet2av)
|
||||
endif
|
||||
bmet=bmet/bmetsig
|
||||
return
|
||||
end subroutine normalizebmet
|
||||
|
@ -50,7 +50,7 @@ subroutine sun(y,m,DD,UT,lon,lat,RA,Dec,LST,Az,El,mjd,day)
|
||||
MM = mod(356.0470d0 + 0.9856002585d0 * d + 360000.d0,360.d0)
|
||||
Ls = mod(w+MM+720.0,360.0)
|
||||
|
||||
EE = MM + e*rad*sin(MM/rad) * (1.0 + e*cos(M/rad))
|
||||
EE = MM + e*rad*sin(MM/rad) * (1.0 + e*cos(MM/rad))
|
||||
EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.0 - e*cos(EE/rad))
|
||||
|
||||
xv = cos(EE/rad) - e
|
||||
|
@ -446,8 +446,8 @@ auto AD1CCty::lookup (QString const& call) const -> Record
|
||||
if (p != m_->prefixes_.end ())
|
||||
{
|
||||
impl::entity_by_id::iterator e = m_->lookup_entity (call, *p);
|
||||
if ((m_->configuration_->include_WAE_entities () || !e->WAE_only_)
|
||||
&& (!p->exact_ || call.size () == search_prefix.size ()))
|
||||
// always lookup WAE entities, we substitute them later in displaytext.cpp if "Include extra WAE entites" is not selected
|
||||
if (!p->exact_ || call.size () == search_prefix.size ())
|
||||
{
|
||||
return m_->fixup (*p, *e);
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
|
||||
|
||||
"WSJT-X implements a number of digital modes designed for <br />"
|
||||
"weak-signal Amateur Radio communication. <br /><br />"
|
||||
"© 2001-2023 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
||||
"© 2001-2024 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
||||
"Steve Franke, K9AN, Nico Palermo, IV3NWV, <br />"
|
||||
"Uwe Risse, DG2YCB, and Brian Moran, N9ADG <br /><br />"
|
||||
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
|
||||
|
@ -387,6 +387,17 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons
|
||||
countryName.replace ("European", "EU");
|
||||
countryName.replace ("African", "AF");
|
||||
|
||||
// assign WAE entities to the correct DXCC when "Include extra WAE entities" is not selected
|
||||
if (!(m_config->include_WAE_entities())) {
|
||||
countryName.replace ("Bear Is.", "Svalbard");
|
||||
countryName.replace ("Shetland Is.", "Scotland");
|
||||
countryName.replace ("AF Italy", "Italy");
|
||||
countryName.replace ("Sicily", "Italy");
|
||||
countryName.replace ("Vienna Intl Ctr", "Austria");
|
||||
countryName.replace ("AF Turkey", "Turkey");
|
||||
countryName.replace ("EU Turkey", "Turkey");
|
||||
}
|
||||
|
||||
extra += countryName;
|
||||
}
|
||||
}
|
||||
|
@ -1110,9 +1110,9 @@ void MainWindow::not_GA_warning_message ()
|
||||
MessageBox::critical_message (this,
|
||||
"This is a pre-release version of WSJT-X " + version (false) + " made\n"
|
||||
"available for testing purposes. By design it will\n"
|
||||
"be nonfunctional after July 1, 2024.");
|
||||
"be nonfunctional after September 30, 2024.");
|
||||
auto now = QDateTime::currentDateTimeUtc ();
|
||||
if (now >= QDateTime {{2024, 07, 1}, {23, 59, 59, 999}, Qt::UTC}) {
|
||||
if (now >= QDateTime {{2024, 9, 30}, {23, 59, 59, 999}, Qt::UTC}) {
|
||||
Q_EMIT finished ();
|
||||
}
|
||||
}
|
||||
@ -2881,7 +2881,7 @@ void MainWindow::on_actionCopyright_Notice_triggered()
|
||||
"\"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, MSK144 are Copyright (C) "
|
||||
"2001-2023 by one or more of the following authors: Joseph Taylor, "
|
||||
"2001-2024 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; Uwe Risse, DG2YCB; Brian Moran, N9ADG; "
|
||||
@ -3304,7 +3304,7 @@ void MainWindow::on_actionSpecial_mouse_commands_triggered()
|
||||
<td><b>Click</b> to set Rx frequency.<br/>
|
||||
<b>Shift-click</b> to set Tx frequency.<br/>
|
||||
<b>Ctrl-click</b> or <b>Right-click</b> to set Rx and Tx frequencies.<br/>
|
||||
<b>Double-click</b> to also decode at Rx frequency.<br/>
|
||||
<b>Double-click</b> to also decode at Rx frequency.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -3315,7 +3315,7 @@ void MainWindow::on_actionSpecial_mouse_commands_triggered()
|
||||
messages.<br/>
|
||||
If <b>Hold Tx Freq</b> is checked or first callsign in message<br/>
|
||||
is your own call, Tx frequency is not changed unless <br/>
|
||||
<b>Ctrl</b> is held down.<br/>
|
||||
<b>Ctrl</b> is held down.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -3324,6 +3324,18 @@ void MainWindow::on_actionSpecial_mouse_commands_triggered()
|
||||
<b>Double-click</b> to erase QSO and Band Activity windows.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">Q65 Button:</td>
|
||||
<td><b>Click</b> to switch to Q65 Mode.<br/>
|
||||
<b>Right-click</b> to switch to Q65 Pileup Mode.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">JT65 Button:</td>
|
||||
<td><b>Click</b> to switch to JT65 Mode.<br/>
|
||||
<b>Right-click</b> to switch to JT9 Mode.
|
||||
</td>
|
||||
</tr>
|
||||
</table>)"), font});
|
||||
}
|
||||
m_mouseCmnds->showNormal ();
|
||||
@ -6614,18 +6626,14 @@ void MainWindow::on_RoundRobin_currentTextChanged(QString text)
|
||||
|
||||
void MainWindow::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if(ui->q65Button->hasFocus() && (event->button() & Qt::RightButton)) {
|
||||
m_specOp=m_config.special_op_id();
|
||||
if (m_specOp==SpecOp::Q65_PILEUP) {
|
||||
m_config.setSpecial_None();
|
||||
ui->tx1->setEnabled(true);
|
||||
ui->txb1->setEnabled(true);
|
||||
} else {
|
||||
m_config.setSpecial_Q65_Pileup();
|
||||
}
|
||||
if(ui->q65Button->hasFocus() && (event->button() & Qt::RightButton)) { // switch to Q65_Pileup mode
|
||||
m_config.setSpecial_Q65_Pileup();
|
||||
m_specOp=m_config.special_op_id();
|
||||
on_actionQ65_triggered();
|
||||
}
|
||||
if(ui->jt65Button->hasFocus() && (event->button() & Qt::RightButton)) { // switch to JT9 mode
|
||||
on_actionJT9_triggered();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_dxCallEntry_textChanged (QString const& call)
|
||||
@ -10800,29 +10808,33 @@ void MainWindow::on_houndButton_clicked (bool checked)
|
||||
|
||||
void MainWindow::on_ft8Button_clicked()
|
||||
{
|
||||
if(m_specOp==SpecOp::HOUND) {
|
||||
if (m_specOp==SpecOp::HOUND) {
|
||||
m_config.setSpecial_None();
|
||||
m_specOp=m_config.special_op_id();
|
||||
}
|
||||
on_actionFT8_triggered();
|
||||
on_actionFT8_triggered();
|
||||
}
|
||||
|
||||
void MainWindow::on_ft4Button_clicked()
|
||||
{
|
||||
on_actionFT4_triggered();
|
||||
on_actionFT4_triggered();
|
||||
}
|
||||
|
||||
void MainWindow::on_msk144Button_clicked()
|
||||
{
|
||||
on_actionMSK144_triggered();
|
||||
on_actionMSK144_triggered();
|
||||
}
|
||||
|
||||
void MainWindow::on_q65Button_clicked()
|
||||
{
|
||||
on_actionQ65_triggered();
|
||||
if (m_specOp==SpecOp::Q65_PILEUP) {
|
||||
m_config.setSpecial_None();
|
||||
m_specOp=m_config.special_op_id();
|
||||
}
|
||||
on_actionQ65_triggered();
|
||||
}
|
||||
|
||||
void MainWindow::on_jt65Button_clicked()
|
||||
{
|
||||
on_actionJT65_triggered();
|
||||
on_actionJT65_triggered();
|
||||
}
|
||||
|
@ -3017,7 +3017,7 @@ QLabel[oob="true"] {
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Switch to Q65 mode. Right-click to toggle Q65 Pileup mode On/Off.</p></body></html></string>
|
||||
<string><html><head/><body><p>Switch to Q65 mode.<br> Right-click to switch to Q65 Pileup mode.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Q65</string>
|
||||
@ -3038,8 +3038,11 @@ QLabel[oob="true"] {
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Switch to JT65 mode</string>
|
||||
<string><html><head/><body><p>Switch to JT65 mode. <br>Right-click to switch to JT9 mode.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>JT65</string>
|
||||
|
Loading…
Reference in New Issue
Block a user