1 Introduction WSJT is a computer program designed to facilitate Amateur Radio communication under extreme weak-signal conditions. Three very different coding and modulation methods are provided: one for communication by "meteor scatter" techniques on the VHF bands; one for meteor and ionospheric scatter, primarily on the 6 meter band; and one for the very challenging EME (Earth-Moon-Earth) path. 2 Program Overview WSJT's user interface is written in Python. The major Python source-code files include: 1. wsjt.py Defines the main-screen GUI for user interactions; acts as "traffic cop" for orchestrating all event-driven and time-shared activities. 2. specjt.py Provides real-time display of received signals as two-dimensional "waterfall" spectra. 3. options.py Provides entry fields for user-defined parameters. 4. astro.py Displays astronomical data for sun, moon, sky temperature, etc. Smaller Python files serve various utility purposes. Both wsjt.py and specjt.py make calls to external procedures compiled from Fortran and C. A variety of global data is shared among modules through common blocks defined in Fortran. The Python code runs in a single thread, although timers make the functions of the several main modules appear concurrent. Fortran routines create additional threads to be used for soundcard I/O and the decoding of received messages. As a small part of its overall task, the decoder for JT65 invokes an external program named KVASD.EXE or KVASD, located in the main WSJT directory. If this program is present it uses information on received 64-FSK symbols and attempts to decipher it according to a Reed Solomon (63,12) code, using the algebraic soft-decision algorithm of Koetter and Vardy. If KVASD is not present, WSJT uses its own internal hard-decision Reed Solomon decoder instead. Interprocess communication between WSJT and KVASD takes place through a shared disk file. KVASD is not an integral part of WSJT. Its algorithm is patented, and the source code is the property of CodeVector Technologies, LLC. However, compiled versions of KVASD may be freely used in conjunction with WSJT for the purposes of amateur radio weak-signal communication. 3 Some Functional Details WSJT execution starts at the top of Python file wsjt.py. The other Python modules are loaded and executed as needed. Fortran routines are called to start a high-priority thread to handle continuous A/D and D/A streams, and a background thread to decode received or previously recorded signals. The top-level Python code determines the overall state of program operation, e.g., Idle, Monitoring, or Transmitting. In normal usage the operator puts the program into Auto mode, resulting in a timed sequence of alternating transmission and reception intervals. 4 Other Open-Source Software used in WSJT WSJT 5.9 uses the following open source libraries: 1. FFTW, by Matteo Frigo and Steven Johnson, for computing Fourier transforms 2. PortAudio, by Ross Bencina and Phil Burk, for audio I/O 3. "Secret Rabbit Code" or "libsamplerate", by Erik de Castro, for accomplishing band-limited resampling of data 4. RS, by Phil Karn, KA9Q, for Reed Solomon encoding and hard-decision decoding. 5 Platform-Dependent Notes The Python code should run on any supported Python platform. Most of the remaining code can be recompiled for Linux or OS/X, instead of Windows. Platform-dependent versions of FFTW, PortAudio, and libsamplerate need to be installed. Methods are provided for creating additional threads and setting their runtime priorities in both Windows and Linux. 6 Partial List of Functions and Subroutines, and their purposes Audio.f90 Routines for audio startup, decoding, display computations blanker.f90 Noise blanker fivehz.f90 Called by PortAudio callback flat2.f Flatten the spectrum for waterfall display pix2d65.f90 Computes pixels for waterfall display pix2d.f90 Computes pixels for waterfall display runqqq.f90 Executes another process wsjtgen.f90 Generates Tx waveforms abc441.f90 Part of FSK441 generator gen65.f Generate JT65 waveform chkmsg.f Check a JT65 message for presence of 'OOO' encode65.f Encode a JT65 message getpfx1.f Handle extra DXCC prefixes getpfx2.f ... graycode.f Convert binary to/from Gray code nchar.f Convert number, letter, space to 0-36 packcall.f Routines for JT65 source encoding packdxcc.f ... packgrid.f ... packmsg.f ... packtext.f ... pfx.f ... gen6m.f Generate JT6M waveform gentone.f Generate tone for JT6M message gencw.f Generate CW waveform morse.f Convert ascii to morse dits gencwid.f Generate a CW ID message grid2k.f Convert grid locator to integer interleave63.f Interleave JT65 symbols gcom1.f90 Global commons for sharing data among Fortran routines gcom2.f90 and between Fortran and Python gcom3.f90 gcom4.f90 makedate.f90 Gererates makedate_sub.f90 Astronomical calculations: astro.f Computes Az, El, Doppler for Sun, Moon, etc. astropak.f "Includes" for astro supoport routines azdist.f Computes azimuth, distance, etc., between two locators coord.f Spherical trig utility dcoord.f Spherical trig utility in double precision deg2grid.f Convert lat/long (degrees) to grid locator dot.f Compute dot product ftsky.f Get sky temperature from data file geocentric.f Convert geodetic to geocentric coords GeoDist.f Compute azimuth and distance between two locators grid2deg.f Convert grid locator to lat/long moon2.f Compute moon location at specified date and time MoonDop.f Compute lunar doppler shift and related quantities sun.f Compure sun location at specified date and time toxyz.f Convert between polar and cartesian coords Utilities: db.f Compute decibels from ratio gasdev.f Generate Gaussian random numbers igray.f Gray code indexx.f Sort routine set.f Move, add, zero, ... pctile.f Sort an array and get specified percentile ran1.f Uniform random numbers rfile2.f Read a binary file (Linux) sort.f Sort an array FFTs: fftw3.f Fortran definitions for FFTW four2a.f Wrapper to make FFTW look like four2 four2.f FFT in Fortran ps.f Compute power spectrum xfft.f Real to complex FFT wrapper Routines for Decoding: wsjt1.f Top-level decoding routine; handles FSK441 especially avesp2.f Computes average spectrum bzap.f Find and remove birdies detect.f Measure power in FSK441 tones flatten.f Flatten the spectrum longx.f Decode normal FSK441 messages lpf1.f Quick-and-dirty lowpass filter mtdecode.f Multi-tone decoding ping.f Find pings s2shape.f Flatten the 2d spectrum smooth.f Smooth by boxcar averaging spec2d.f Compute 2d spectrum for FSK441 stdecode.f Decode FSK441 shorthand messages sync.f Synchronize FSK441 data wsjt65.f JT65 decoder afc65.f AFC for JT65 avemsg65.f Decode average message decode65.f Decode JT65 message deep65.f Deep search decoder demod64a.f Compute probabilities of transmitted symbols extract.f Extract message from JT65 symbol probabilities flat1.f Flatten the passband getsnr.f Compute snr or shorthand message k2grid.f Convert integer to 4-digit grid locator limit.f Clipper for JT65 peakup.f Interpolate to find fractional-bin peak setup65.f Initialize pseudorandom sync vector short65.f Detect JT65 shorthand messages slope.f Remove a straight-line slope spec2d65.f Compute 2d spectrum for JT65 spec441.f Compute spectra for FSK441 decoding sync65.f Synchronize a JT65 signal unpackcall.f Unpack JT65 message parts ... unpackgrid.f ... unpackmsg.f ... unpacktext.f ... xcor.f Compute cross-correlation for JT65 sync decode6m.f Decode JT65 signal syncf0.f First frequency sync syncf1.f Second freq sync synct.f First time sync avemsg6m.f Get average JT65 message JT65code.f Program to illustrate and test JT65 coding Hard-Decision Reed Solomon Codec decode_rs.c Decoder encode_rs.c Encoder init_rs.c Initialization routine wrapkarn.c Wapper for Fortran cutil.c Fortran wrappers for some basic C functions jtaudio.c Audio I/O, calls PortAudio routines padevsub.c Select desired audio device ptt.c PTT via serial port DTR/RTS ptt_linux.c Ditto for Linux (dummy at present) resample.c Wrapper for resample routine start_threads.c Start audio and decoder threads 7 Compiling Instructions Scripts are provided for compiling WSJT in both Windows and Linux. They are presently set up to use Compaq Visual Fortran (v6.6) and Microsoft C (v6.0) in Windows, and g95 and gcc in Linux. My installation has Python 2.3. Additional tools include f2py, which compiles Fortran and C to make Python extensions; the Python Imaging Library; Numeric Python; and the SciPy distribution utilities. Linux Windows Function ------------------------------------------------------------------- g0 g0.bat Compiles the hard-decision Reed Solomon Decoder Needs to be done only once. g1 g1.bat Compiles the remaining Fortran and C to produce Python extension module audio.pyd (Windows) or audio.so (Linux). g2.bat Uses McMillan Installer to create an f2py specification file, wsjt.spec g3.bat Uses Installer to produce a distributable file WSJT6.EXE (Windows). The final two build steps have not yet been tried in Linux. In Windows, these steps produce a distributable file WSJT6.EXE that contains all necessary software components, so that the user does not need to install Python or any of its other extensions. 8 Present status (December 20, 2005) WSJT version 5-9-2d is fully functional in Windows. The Linux version can be used to decoded recorded files, but real-time audio I/O has not yet been implemented.