mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 12:30:23 -04:00 
			
		
		
		
	Removed many files not needed for map65, and fixed Makefile accordingly.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@327 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
		
							parent
							
								
									0e9621482f
								
							
						
					
					
						commit
						cdcec61396
					
				
							
								
								
									
										91
									
								
								Announce.txt
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								Announce.txt
									
									
									
									
									
								
							| @ -1,91 +0,0 @@ | |||||||
| To:      Users of WSJT |  | ||||||
| From:    Joe Taylor, K1JT |  | ||||||
| Subject: WSJT 5.9.0 |  | ||||||
| Date:    November 14, 2005 |  | ||||||
| 
 |  | ||||||
| I am pleased to announce that WSJT 5.9.0 is available for free |  | ||||||
| download from the WSJT Home Page, |  | ||||||
| http://pulsar.princeton.edu/~joe/K1JT.  It should appear soon |  | ||||||
| on the European mirror site, http://www.dk5ya.de, as well. |  | ||||||
| 
 |  | ||||||
| I believe that all reported bugs found in beta-release version 5.8.6 |  | ||||||
| have been fixed.  In addition, new enhancements have taken the program |  | ||||||
| well beyond the capabilities of the baseline comparison versions, |  | ||||||
| 4.9.8 and 5.8.6. |  | ||||||
| 
 |  | ||||||
| The new WSJT 5.9.0 is faster and better than previous versions in a |  | ||||||
| number of ways.  A brief description of the enhancements since version |  | ||||||
| 5.8.6 can be found at |  | ||||||
| http://pulsar.princeton.edu/~joe/K1JT/UpdateHistory.txt.  There are |  | ||||||
| many program changes, so be sure to read this information carefully |  | ||||||
| before trying to use WSJT 5.9.0! |  | ||||||
| 
 |  | ||||||
| Of course there may be some new bugs, and perhaps I have overlooked an |  | ||||||
| existing problem that you already know about.  Please let me know if |  | ||||||
| you find shortcomings in version 5.9.0, or if you have suggestions for |  | ||||||
| further improvements. |  | ||||||
| 
 |  | ||||||
| Sorry, I have not yet found time to implement EME Echo mode.  When |  | ||||||
| that is done, and when I have finished some further enhancements to |  | ||||||
| the decoders, WSJT 6.0 will be born.  With some luck, there may also |  | ||||||
| be a new User's Guide at about that time. |  | ||||||
| 
 |  | ||||||
| With best wishes, |  | ||||||
| 			-- 73, Joe, K1JT |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Additional Information for Programmers |  | ||||||
| ----------------------------------------------------------------------- |  | ||||||
| 
 |  | ||||||
| WSJT versions 5.8+ are the result of a complete re-write of the user |  | ||||||
| interface, timing control, and audio I/O portions of WSJT 4.9.8.  My |  | ||||||
| principal motivation was to make the program multi-threaded, both for |  | ||||||
| real-time operational convenience and for performance reasons. |  | ||||||
| Another strong motivation was a desire to move the program away from |  | ||||||
| its dependence on a proprietary compiler (Microsoft Visual Basic) and |  | ||||||
| a single computer platform (Windows). |  | ||||||
| 
 |  | ||||||
| The user interface of WSJT 5.8+ is written in Python -- an elegant, |  | ||||||
| open, cross-platform language that has been a pleasure for me to |  | ||||||
| learn.  The remainder of the program is written mostly in Fortran, |  | ||||||
| with some routines coded in C; much of that code has been carried over |  | ||||||
| directly from WSJT 4.9.8.   |  | ||||||
| 
 |  | ||||||
| I hope soon to release the source code for WSJT under the GNU General |  | ||||||
| Public License (GPL).  To this end, I have separated out the one piece |  | ||||||
| of proprietary code formerly in the program -- the soft-decision Reed |  | ||||||
| Solomon decoder licensed from CodeVector Technologies (CVT).  A driver |  | ||||||
| for this decoder, optimized for JT65, has been compiled into a |  | ||||||
| stand-alone executable that is now distributed as part of the WSJT |  | ||||||
| installation package, but not part of the program itself.  With this |  | ||||||
| approach I can honor all provisions of the CVT license, and at the |  | ||||||
| same time release everything else as an open source program under the |  | ||||||
| GPL. |  | ||||||
| 
 |  | ||||||
| WSJT 5.9.0 now includes an open source hard-decision Reed Solomon |  | ||||||
| decoder based on code written by Phil Karn, KA9Q .  WSJT uses this |  | ||||||
| decoder automatically if the proprietary CVT decoder is unavailable. |  | ||||||
| In such instances the "deep search" decodes retain their full |  | ||||||
| sensitivity, but fully general decoding independent of the callsign |  | ||||||
| database will be less sensitive by 2 or more dB, depending on signal |  | ||||||
| fading characteristics.  Separation of the program into two executable |  | ||||||
| units is transparent to the user. |  | ||||||
| 
 |  | ||||||
| WSJT 5.9.0 uses the following open source libraries, which are also |  | ||||||
| available under the GPL: |  | ||||||
| 
 |  | ||||||
|   1. FFTW, by Matteo Frigo and Steven Johnson, for computing Fourier |  | ||||||
|      transforms |  | ||||||
| 
 |  | ||||||
|   2. "Secret Rabbit Code" or "libsamplerate", by Erik de Castro, for |  | ||||||
|      accomplishing band-limited resampling of data |  | ||||||
| 
 |  | ||||||
|   3. RS, by Phil Karn, KA9Q, for Reed Solomon encoding and |  | ||||||
|      hard-decision decoding. |  | ||||||
| 
 |  | ||||||
| I hope that the open release of WSJT source code will encourage others |  | ||||||
| to read and understand the code, get involved in improving WSJT, and |  | ||||||
| perhaps porting it to other platforms.  Versions of the CVT |  | ||||||
| soft-decision decoder for Linux or Macintosh will be easy to compile |  | ||||||
| and distribute, if there is demand for them. |  | ||||||
| 
 |  | ||||||
| @ -1,185 +0,0 @@ | |||||||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |  | ||||||
| <HTML> |  | ||||||
| <HEAD> |  | ||||||
| 	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8"> |  | ||||||
| 	<TITLE></TITLE> |  | ||||||
| 	<META NAME="GENERATOR" CONTENT="OpenOffice.org 2.0-pre  (Linux)"> |  | ||||||
| 	<META NAME="CREATED" CONTENT="20060311;19474000"> |  | ||||||
| 	<META NAME="CHANGED" CONTENT="20060311;20035200"> |  | ||||||
| 	<STYLE> |  | ||||||
| 	<!-- |  | ||||||
| 		PRE { font-family: "Thorndale AMT" } |  | ||||||
| 	--> |  | ||||||
| 	</STYLE> |  | ||||||
| </HEAD> |  | ||||||
| <BODY LANG="de-DE" DIR="LTR"> |  | ||||||
| <PRE>HowTo for Linux SuSE 10.0 ( DL3LST) |  | ||||||
| 
 |  | ||||||
| Use Yast  to install the following packages  from the Linux  Distribution DVD |  | ||||||
| 
 |  | ||||||
| Compiler |  | ||||||
|       cpp |  | ||||||
|       gcc |  | ||||||
|       gcc-c++ |  | ||||||
|       liggcc |  | ||||||
| 
 |  | ||||||
| Tcl/tk |  | ||||||
|       tcl-devel |  | ||||||
|       tk-devel |  | ||||||
|       alsa-devel |  | ||||||
| 
 |  | ||||||
| Python |  | ||||||
|         python |  | ||||||
|         python-devel |  | ||||||
|         python-imaging |  | ||||||
|         python-numeric |  | ||||||
|         python-tk |  | ||||||
| 
 |  | ||||||
| -------------------------------------------------------------------------------------------------- |  | ||||||
| 
 |  | ||||||
| // Fortran compiler |  | ||||||
| Page:                   <A HREF="http://www.g95.org/"> http://www.g95.org/</A> |  | ||||||
| Downloadpage:   <A HREF="http://ftp.g95.org/"> http://ftp.g95.org/</A> |  | ||||||
| Page:                   <A HREF="http://ftp.g95.org/g95-x86-linux.tgz"> http://ftp.g95.org/g95-x86-linux.tgz</A> |  | ||||||
| 
 |  | ||||||
| install: g95 |  | ||||||
| 
 |  | ||||||
| follow instruction File:  Install  |  | ||||||
|   |  | ||||||
| How to install g95:      |  | ||||||
| 
 |  | ||||||
| File Install:  |  | ||||||
| 1) Unpack the downloaded tarball (e.g. g95-x86-linux.tgz) in a directory |  | ||||||
| of your choice: |  | ||||||
| 
 |  | ||||||
|    tar -zxvf g95-x86-linux.tgz |  | ||||||
| 
 |  | ||||||
| 2) For your convenience, you can create another symbolic link from a |  | ||||||
| directory in your $PATH (e.g. ~/bin) to the executable |  | ||||||
| 
 |  | ||||||
|    ln -s $PWD/g95-install/bin/*g95* ~/bin/g95 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| You should now be able to run g95 and create executables. |  | ||||||
| To get a list of environment variables that control the library, run a |  | ||||||
| compiled binary with the --help option, ie: |  | ||||||
| 
 |  | ||||||
|   ./a.out <20>help |  | ||||||
| 
 |  | ||||||
| From console try the g95 command . |  | ||||||
| The system should answer |  | ||||||
| g95:  no input files  |  | ||||||
|   |  | ||||||
| 
 |  | ||||||
| I changed the SymLink to /usr/bin where i installed the g77 packages too |  | ||||||
| ln -s $PWD/g95-install/bin/*g95* /usr/bin/g95 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| gcc-g77 compiler |  | ||||||
| Page:               <A HREF="http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=82721&release_id=15880">http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=82721&release_id=15880</A> |  | ||||||
| Download:       <A HREF="http://prdownloads.sourceforge.net/mingw/gcc-g77-3.4.2-20040916-1.tar.gz?download">http://prdownloads.sourceforge.net/mingw/gcc-g77-3.4.2-20040916-1.tar.gz?download</A> |  | ||||||
| 
 |  | ||||||
| From  gcc-g77-3.4.2-20040916-1.tar.gz  we need the /libexec folder  for l2g  |  | ||||||
| copy from the archive  the folder |  | ||||||
| /libexec        to      /usr/libexec |  | ||||||
|   |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| other packages |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| Install: PortaudioV1.19  |  | ||||||
| 
 |  | ||||||
| Page:                <A HREF="http://www.portaudio.com/usingsvn.html">http://www.portaudio.com/usingsvn.html</A> |  | ||||||
| Download:        <A HREF="http://www.portaudio.com/archives/pa_previous_snapshot_v19.tar.gz">http://www.portaudio.com/archives/pa_previous_snapshot_v19.tar.gz</A> |  | ||||||
| ./configure |  | ||||||
| make  all |  | ||||||
| make  install |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| FFT3 |  | ||||||
| Page    :            <A HREF="http://www.fftw.org/">http://www.fftw.org/ </A>  |  | ||||||
| Download :       <A HREF="http://www.fftw.org/fftw-3.1.1.tar.g">http://www.fftw.org/fftw-3.1.1.tar.g</A>z |  | ||||||
| ./configure |  | ||||||
| ./make  all |  | ||||||
| ./ make install |  | ||||||
| 
 |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| libsamplerate |  | ||||||
| libsamplerate-0.1.2. |  | ||||||
| Download:         <A HREF="http://www.mega-nerd.com/SRC/download.html">http://www.mega-nerd.com/SRC/download.html</A> |  | ||||||
| ./configure |  | ||||||
| ./make  all |  | ||||||
| ./ make install |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| reed-solomon-4.0 |  | ||||||
| .Page:  <A HREF="http://www.ka9q.net/code/fec/">http://www.ka9q.net/code/fec/</A> |  | ||||||
| Download:       <A HREF="http://www.ka9q.net/code/fec/reed-solomon-4.0.tar.gz">http://www.ka9q.net/code/fec/reed-solomon-4.0.tar.gz</A> |  | ||||||
| /configure |  | ||||||
| ./make  |  | ||||||
| ./ make install |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| F2PY  ( Fortran to Python ) |  | ||||||
| Download:       <A HREF="http://cens.ioc.ee/projects/f2py2e/2.x/F2PY-2-latest.tar.gz">http://cens.ioc.ee/projects/f2py2e/2.x/F2PY-2-latest.tar.gz</A> |  | ||||||
| python setup.py install |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Scipy_Distutils |  | ||||||
| Page:                                     <A HREF="http://cens.ioc.ee/projects/f2py2e/2.x/">http://cens.ioc.ee/projects/f2py2e/2.x/</A> |  | ||||||
| Download:                            <A HREF="http://cens.ioc.ee/projects/f2py2e/2.x/scipy_distutils-latest.tar.gz"> http://cens.ioc.ee/projects/f2py2e/2.x/scipy_distutils-latest.tar.gz</A> |  | ||||||
| python setup.py install |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| WSJT source code |  | ||||||
| K1JT Page:                           <A HREF="http://pulsar.princeton.edu/~joe/K1JT/">http://pulsar.princeton.edu/~joe/K1JT/</A> |  | ||||||
| Download page:                    <A HREF="http://developer.berlios.de/projects/wsjt/">http://developer.berlios.de/projects/wsjt/</A> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ./configure |  | ||||||
| make |  | ||||||
| python wsjt.py |  | ||||||
| 
 |  | ||||||
| that<EFBFBD>s all  - have fun  |  | ||||||
| 
 |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| If you need the packages for other Linux distributions  see linkpages below |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| 
 |  | ||||||
| Python: |  | ||||||
| Page.                                    <A HREF="http://www.python.org/download/releases/2.4.3">http://www.python.org/download/releases/2.4.3</A> |  | ||||||
| Download:                            <A HREF="http://www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz">http://www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz</A>    |  | ||||||
| /configure |  | ||||||
| ./make   |  | ||||||
| ./ make install |  | ||||||
| than run |  | ||||||
| python setup.py install |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Numeric  |  | ||||||
| Page:                        <A HREF="http://numeric.scipy.org/"> http://numeric.scipy.org</A>/ |  | ||||||
| Download:                 <A HREF="http://prdownloads.sourceforge.net/numpy/Numeric-24.2.tar.gz?download">http://prdownloads.sourceforge.net/numpy/Numeric-24.2.tar.gz?download</A> |  | ||||||
| install |  | ||||||
| 
 |  | ||||||
| Iimaging  (be sure  Tcl/Ck  Lib was installed before) |  | ||||||
| Page:                         <A HREF="http://www.pythonware.com/products/pil/">http://www.pythonware.com/products/pil/</A> |  | ||||||
| Download:                 <A HREF="http://effbot.org/downloads/Imaging-1.1.5.tar.gz">http://effbot.org/downloads/Imaging-1.1.5.tar.gz</A> |  | ||||||
| python setup.py install |  | ||||||
| 
 |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| other sites  |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| for gcc compiler try |  | ||||||
| <A HREF="http://gcc.gnu.org/mirrors.html">http://gcc.gnu.org/mirrors.html</A> |  | ||||||
| 
 |  | ||||||
| Example German server |  | ||||||
| <A HREF="ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.1.0/">ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.1.0/</A> |  | ||||||
| <A HREF="ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.1.1/">ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.1.1/</A> |  | ||||||
| 
 |  | ||||||
| the full program  ( !!! filesize is 21 MB  ) |  | ||||||
| <A HREF="ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.1.0/gcc-core-4.1.0.tar.gz">ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.1.0/gcc-core-4.1.0.tar.gz</A> |  | ||||||
| ./configure |  | ||||||
| make |  | ||||||
| make install |  | ||||||
| </PRE> |  | ||||||
| </BODY> |  | ||||||
| </HTML> |  | ||||||
							
								
								
									
										46
									
								
								JT65code.f
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								JT65code.f
									
									
									
									
									
								
							| @ -1,46 +0,0 @@ | |||||||
|       program JT65karn |  | ||||||
| 
 |  | ||||||
| C  Provides examples of message packing, bit and symbol ordering, |  | ||||||
| C  Reed Solomon encoding, and other necessary details of the JT65 |  | ||||||
| C  protocol. |  | ||||||
| 
 |  | ||||||
|       character*22 msg0,msg,decoded,cok*3 |  | ||||||
|       integer dgen(12),sent(63),recd(12),era(51) |  | ||||||
| 
 |  | ||||||
|       nargs=iargc() |  | ||||||
|       if(nargs.ne.1) then |  | ||||||
|          print*,'Usage: JT65code "message"' |  | ||||||
|          go to 999 |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
|       call getarg(1,msg0)                     !Get message from command line |  | ||||||
|       msg=msg0 |  | ||||||
| 
 |  | ||||||
|       call chkmsg(msg,cok,nspecial,flip)      !See if it includes "OOO" report |  | ||||||
|       if(nspecial.gt.0) then                  !or is a shorthand message |  | ||||||
|          write(*,1010)  |  | ||||||
|  1010    format('Shorthand message.') |  | ||||||
|          go to 999 |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
|       call packmsg(msg,dgen)                  !Pack message into 72 bits |  | ||||||
|       write(*,1020) msg0 |  | ||||||
|  1020 format('Message:   ',a22)               !Echo input message |  | ||||||
|       if(iand(dgen(10),8).ne.0) write(*,1030)  !Is the plain text bit set? |  | ||||||
|  1030 format('Plain text.')          |  | ||||||
|       write(*,1040) dgen |  | ||||||
|  1040 format('Packed message, 6-bit symbols: ',12i3) !Display packed symbols |  | ||||||
| 
 |  | ||||||
|       call rs_encode(dgen,sent)               !RS encode |  | ||||||
|       call interleave63(sent,1)               !Interleave channel symbols |  | ||||||
|       call graycode(sent,63,1)                !Apply Gray code |  | ||||||
|       write(*,1050) sent |  | ||||||
|  1050 format('Channel symbols, including FEC:'/(i5,20i3)) |  | ||||||
| 
 |  | ||||||
|       call graycode(sent,63,-1) |  | ||||||
|       call interleave63(sent,-1) |  | ||||||
|       call rs_decode(sent,era,0,recd,nerr) |  | ||||||
|       call unpackmsg(recd,decoded)            !Unpack the user message |  | ||||||
|       write(*,1060) decoded,cok |  | ||||||
|  1060 format('Decoded message: ',a22,2x,a3) |  | ||||||
|  999  end |  | ||||||
| @ -1,20 +0,0 @@ | |||||||
| 	include 'JT65code.f' |  | ||||||
| 	include 'nchar.f' |  | ||||||
| 	include 'grid2deg.f' |  | ||||||
| 	include 'packmsg.f' |  | ||||||
| 	include 'packtext.f' |  | ||||||
| 	include 'packcall.f' |  | ||||||
| 	include 'packgrid.f' |  | ||||||
| 	include 'unpackmsg.f' |  | ||||||
| 	include 'unpacktext.f' |  | ||||||
| 	include 'unpackcall.f' |  | ||||||
| 	include 'unpackgrid.f' |  | ||||||
| 	include 'deg2grid.f' |  | ||||||
| 	include 'chkmsg.f' |  | ||||||
| 	include 'getpfx1.f' |  | ||||||
| 	include 'getpfx2.f' |  | ||||||
| 	include 'k2grid.f' |  | ||||||
| 	include 'grid2k.f' |  | ||||||
| 	include 'interleave63.f' |  | ||||||
| 	include 'graycode.f' |  | ||||||
| 	include 'set.f' |  | ||||||
							
								
								
									
										126
									
								
								Makefile.in.joe
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								Makefile.in.joe
									
									
									
									
									
								
							| @ -1,126 +0,0 @@ | |||||||
| CC ?= @CC@ |  | ||||||
| FFLAGS	= @FFLAGS@ |  | ||||||
| LDFLAGS	= @LDFLAGS@ |  | ||||||
| CPPFLAGS = @CPPFLAGS@ |  | ||||||
| CFLAGS	= @CFLAGS@ |  | ||||||
| CFLAGS += -DBIGSYM |  | ||||||
| 
 |  | ||||||
| # WSJT specific Fortran flags
 |  | ||||||
| #FFLAGS += -Wall -fbounds-check -cpp -fno-second-underscore
 |  | ||||||
| FFLAGS = -O2 -cpp -w -fno-second-underscore |  | ||||||
| 
 |  | ||||||
| OS=@OS@ |  | ||||||
| G95=@G95@ |  | ||||||
| COMPILER=@G95_LIB_PATH@ |  | ||||||
| FC=@G95@ |  | ||||||
| 
 |  | ||||||
| LDFLAGS	+= -L${COMPILER} |  | ||||||
| LDFLAGS	+= -lg2c |  | ||||||
| 
 |  | ||||||
| PYTHON	?= @PYTHON@ |  | ||||||
| RM	?= @RM@ |  | ||||||
| F2PY	= @F2PY@ |  | ||||||
| F2PY_PY	= "f2py.py" |  | ||||||
| 
 |  | ||||||
| %.o : %.f90 |  | ||||||
| 	$(FC) -c $(FFLAGS) $< -o $@ |  | ||||||
| 
 |  | ||||||
| OBJS1 = JT65code.o nchar.o grid2deg.o packmsg.o packtext.o \
 |  | ||||||
| 	packcall.o packgrid.o unpackmsg.o unpacktext.o unpackcall.o \
 |  | ||||||
| 	unpackgrid.o deg2grid.o packdxcc.o chkmsg.o getpfx1.o \
 |  | ||||||
| 	getpfx2.o k2grid.o grid2k.o interleave63.o graycode.o set.o \
 |  | ||||||
| 	igray.o init_rs.o encode_rs.o decode_rs.o \
 |  | ||||||
| 	wrapkarn.o |  | ||||||
| 
 |  | ||||||
| F2PYONLY = ftn_init ftn_quit audio_init spec getfile azdist0 astro0 |  | ||||||
| 
 |  | ||||||
| SRCS2F90 = a2d.f90 abc441.f90 astro0.f90 audio_init.f90 azdist0.f90 \
 |  | ||||||
| 	blanker.f90 decode1.f90 decode2.f90 decode3.f90 ftn_init.f90 \
 |  | ||||||
| 	ftn_quit.f90 get_fname.f90 getfile.f90 horizspec.f90 hscroll.f90 \
 |  | ||||||
| 	i1tor4.f90 pix2d.f90 pix2d65.f90 rfile.f90 savedata.f90 spec.f90 \
 |  | ||||||
| 	wsjtgen.f90 runqqq.f90 fivehz.f90 |  | ||||||
| 
 |  | ||||||
| OBJS2F90 = a2d.o abc441.o astro0.o audio_init.o azdist0.o \
 |  | ||||||
| 	blanker.o decode1.o decode2.o decode3.o ftn_init.o \
 |  | ||||||
| 	ftn_quit.o get_fname.o getfile.o horizspec.o hscroll.o \
 |  | ||||||
| 	i1tor4.o pix2d.o pix2d65.o rfile.o savedata.o spec.o \
 |  | ||||||
| 	wsjtgen.o runqqq.o fivehz.o |  | ||||||
| 
 |  | ||||||
| SRCS2F77 = wsjt1.f astro.f astropak.f \
 |  | ||||||
|         avesp2.f bzap.f spec441.f spec2d.f mtdecode.f stdecode.f \
 |  | ||||||
|         indexx.f s2shape.f flat2.f gen65.f chkmsg.f gen6m.f gentone.f \
 |  | ||||||
|         syncf0.f syncf1.f synct.f decode6m.f avemsg6m.f \
 |  | ||||||
|         set.f flatten.f db.f pctile.f sort.f ssort.f ps.f smooth.f \
 |  | ||||||
|         ping.f longx.f peakup.f sync.f detect.f avemsg65.f decode65.f \
 |  | ||||||
|         demod64a.f encode65.f extract.f flat1.f four2.f rfile2.f \
 |  | ||||||
|         gencw.f getpfx1.f getpfx2.f getsnr.f graycode.f grid2k.f \
 |  | ||||||
|         interleave63.f k2grid.f limit.f lpf1.f deep65.f morse.f \
 |  | ||||||
|         nchar.f packcall.f packgrid.f packmsg.f packtext.f setup65.f \
 |  | ||||||
|         short65.f slope.f spec2d65.f sync65.f unpackcall.f \
 |  | ||||||
|         unpackgrid.f unpackmsg.f unpacktext.f xcor.f xfft.f wsjt65.f |  | ||||||
| 
 |  | ||||||
| OBJS2F77 = wsjt1.o astro.o astropak.o \
 |  | ||||||
|         avesp2.o bzap.o spec441.o spec2d.o mtdecode.o stdecode.o \
 |  | ||||||
|         indexx.o s2shape.o flat2.o gen65.o chkmsg.o gen6m.o gentone.o \
 |  | ||||||
|         syncf0.o syncf1.o synct.o decode6m.o avemsg6m.o \
 |  | ||||||
|         set.o flatten.o db.o pctile.o sort.o ssort.o ps.o smooth.o \
 |  | ||||||
|         ping.o longx.o peakup.o sync.o detect.o avemsg65.o decode65.o \
 |  | ||||||
|         demod64a.o encode65.o extract.o flat1.o four2.o rfile2.o \
 |  | ||||||
|         gencw.o getpfx1.o getpfx2.o getsnr.o graycode.o grid2k.o \
 |  | ||||||
|         interleave63.o k2grid.o limit.o lpf1.o deep65.o morse.o \
 |  | ||||||
|         nchar.o packcall.o packgrid.o packmsg.o packtext.o setup65.o \
 |  | ||||||
|         short65.o slope.o spec2d65.o sync65.o unpackcall.o \
 |  | ||||||
|         unpackgrid.o unpackmsg.o unpacktext.o xcor.o xfft.o wsjt65.o |  | ||||||
| 
 |  | ||||||
| #OBJS2F90 = a2d.o abc441.o astro0.o audio_init.o azdist0.o \
 |  | ||||||
| #	blanker.o decode1.o decode2.o decode3.o ftn_init.o \
 |  | ||||||
| #	ftn_quit.o get_fname.o getfile.o horizspec.o hscroll.o \
 |  | ||||||
| #	i1tor4.o pix2d.o pix2d65.o rfile.o savedata.o spec.o \
 |  | ||||||
| #	wsjtgen.o runqqq.o fivehz.o
 |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # ok, so far for now
 |  | ||||||
| # Windows @AUDIO@ will be jtaudio.c since it uses portaudio
 |  | ||||||
| #            for *nix @AUDIO@ will also be jtaudio.c and start_threads.c 
 |  | ||||||
| #		for portaudio
 |  | ||||||
| #            for *nix @AUDIO@ will be start_threads.c for alsa
 |  | ||||||
| #            for *nix @AUDIO@ will be ?? for oss
 |  | ||||||
| #
 |  | ||||||
| # ptt_unix.c vs. ptt.c I'll sort out later. 
 |  | ||||||
| # ditto for cutil.c (only used on *nix)
 |  | ||||||
| # --db
 |  | ||||||
| # jtaudio.c/start_threads.c mess will have to be sorted out later
 |  | ||||||
| # to minimise #ifdef's 
 |  | ||||||
| # --db
 |  | ||||||
| #
 |  | ||||||
| OBJS2C  = init_rs.o encode_rs.o decode_rs.o |  | ||||||
| SRCS3C	= ptt_unix.c igray.c wrapkarn.c cutil.c |  | ||||||
| SRCS3C	+=  @AUDIO@ |  | ||||||
| 
 |  | ||||||
| all:	JT65code wsjt6 |  | ||||||
| 
 |  | ||||||
| JT65code: $(OBJS1) |  | ||||||
| 	$(FC) -o JT65code $(OBJS1) |  | ||||||
| 
 |  | ||||||
| wsjt6:	Audio.so #wsjt.spec
 |  | ||||||
| #	${PYTHON} c:\python23\installer\Build.py wsjt.spec
 |  | ||||||
| #	${RM} wsjt6
 |  | ||||||
| 
 |  | ||||||
| Audio.so: $(OBJS2C) $(OBJS2F77) $(SRCS2F90) ${SRCS3C}  |  | ||||||
| 	 ${PYTHON} ${F2PY_PY} -c --quiet --opt="-O -cpp -D${CFLAGS} \
 |  | ||||||
| 	-fno-second-underscore"	$(OBJS2C) $(OBJS2F77) -m Audio \
 |  | ||||||
| 	--f77exec=${G95} --f90exec=${G95} ${CPPFLAGS} ${LDFLAGS} \
 |  | ||||||
| 	only: $(F2PYONLY) : \
 |  | ||||||
| 	$(SRCS2F90) \
 |  | ||||||
| 	${SRCS3C}  |  | ||||||
| 
 |  | ||||||
| wsjt.spec: wsjt.py astro.py g.py options.py palettes.py smeter.py specjt.py |  | ||||||
| #	${PYTHON} c:\python23\installer\makespec.py --icon wsjt.ico \
 |  | ||||||
| #	--tk --onefile wsjt.py
 |  | ||||||
| 
 |  | ||||||
| four2.o: four2.f |  | ||||||
| 	$(FC) -c -O2 four2.f |  | ||||||
| 
 |  | ||||||
| .PHONY : clean |  | ||||||
| clean: |  | ||||||
| 	${RM} -f *.o *.so JT65code wsjt6 |  | ||||||
							
								
								
									
										2662
									
								
								UpdateHistory.txt
									
									
									
									
									
								
							
							
						
						
									
										2662
									
								
								UpdateHistory.txt
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								WSJT592.iss
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								WSJT592.iss
									
									
									
									
									
								
							| @ -1,24 +0,0 @@ | |||||||
| [Setup] |  | ||||||
| AppName=WSJT |  | ||||||
| AppVerName=WSJT Version 5.9.2 r77 |  | ||||||
| AppCopyright=Copyright (C) 2001-2005 by Joe Taylor, K1JT |  | ||||||
| DefaultDirName={pf}\WSJT6 |  | ||||||
| DefaultGroupName=WSJT6 |  | ||||||
| 
 |  | ||||||
| [Files] |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\WSJT6.EXE";         DestDir: "{app}" |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\README_592.TXT";    DestDir: "{app}" |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\CALL3.TXT";         DestDir: "{app}"; Flags: onlyifdoesntexist |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\wsjt.ico";          DestDir: "{app}"; Flags: onlyifdoesntexist |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\TSKY.DAT";          DestDir: "{app}"; Flags: onlyifdoesntexist |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\libsamplerate.dll"; DestDir: "{app}"; Flags: onlyifdoesntexist |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\kvasd.exe";         DestDir: "{app}"; |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\wsjtrc.win";        DestDir: "{app}"; |  | ||||||
| Source: "c:\k1jt\svn\wsjt\release-5.9.2\Tutorial_592.txt";  DestDir: "{app}"; |  | ||||||
| Source: "c:\k1jt\python\wsjt\rxwav\samples\W8WN_010809_110400.WAV";  DestDir: "{app}\RxWav\Samples\"; Flags: onlyifdoesntexist |  | ||||||
| 
 |  | ||||||
| [Icons] |  | ||||||
| Name: "{group}\WSJT6";        Filename: "{app}\WSJT6.EXE"; WorkingDir: {app} |  | ||||||
| Name: "{userdesktop}\WSJT6";  Filename: "{app}\WSJT6.EXE"; WorkingDir: {app} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @ -1,283 +0,0 @@ | |||||||
| 			WSJT DEVELOPMENT OVERVIEW |  | ||||||
| 			------------------------- |  | ||||||
| 
 |  | ||||||
| 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 compiled for Linux, FreeBSD, unix, or OS/X, |  | ||||||
| as well as Windows.  Platform-dependent versions of FFTW, PortAudio, |  | ||||||
| and libsamplerate may need to be installed. |  | ||||||
| 
 |  | ||||||
| Methods are provided for creating additional threads and setting their |  | ||||||
| runtime priorities in Windows, Linux, and FreeBSD. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 6  Partial List of Functions and Subroutines, and their purposes |  | ||||||
| ---------------------------------------------------------------------- |  | ||||||
|    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 (a;ternative to using FFTW) |  | ||||||
|      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  g2.bat   Uses McMillan Installer to create an f2py specification  |  | ||||||
| 		file, wsjt.spec |  | ||||||
|    g3  g3.bat	Uses Installer to produce a distributable file WSJT6.EXE |  | ||||||
| 		(Windows). |  | ||||||
|    g99 g99.bat  Runs all of the g[0-3] scripts. |  | ||||||
| 
 |  | ||||||
| These steps produce a distributable file WSJT6.EXE (Windows) or wsjt6 |  | ||||||
| (Linux) that contains all necessary software components, so that the |  | ||||||
| end user does not need to install Python or any of its other |  | ||||||
| extensions, or the compilers. |  | ||||||
| 
 |  | ||||||
| A configuration script and Makefile facility is also provided. |  | ||||||
| Assuming that all of the pre-requisites are properly installed, WSJT |  | ||||||
| can now be compiled in Windows as follows: |  | ||||||
| 
 |  | ||||||
|   C> copy Makefile.win Makefile |  | ||||||
|   C> nmake |  | ||||||
| 
 |  | ||||||
| In Linux or FreeBSD, do the following: |  | ||||||
| 
 |  | ||||||
|   $ ./configure --enable-portaudio (or --enable-alsa or --enable-oss) |  | ||||||
|   $ make |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 8  Present status (January 17, 2006) |  | ||||||
| ---------------------------------------------------------------------- |  | ||||||
| 
 |  | ||||||
| WSJT version 5.9.2 (built from SVN revision 115) has been released for |  | ||||||
| Windows.  It is is fully functional in Linux and BSD, as well, but |  | ||||||
| presently need to be compiled locally.  In due course we plan to |  | ||||||
| provide distributions for standard *nix distributions. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										30
									
								
								abc441.F90
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								abc441.F90
									
									
									
									
									
								
							| @ -1,30 +0,0 @@ | |||||||
| subroutine abc441(msg,nmsg,itone,ndits) |  | ||||||
| 
 |  | ||||||
|   character msg*28 |  | ||||||
|   integer itone(84) |  | ||||||
|   integer lookup(0:91) |  | ||||||
|   character cc*43 |  | ||||||
|   data cc/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.,?/#$'/ |  | ||||||
|   data lookup/13, 15, 17, 46, 47, 45, 44, 12, 11, 14, & |  | ||||||
|                1,  2,  3,  4,  5,  6,  7,  8,  9, 10, & |  | ||||||
|               16, 48, 18, 19, 20, 21, 22, 23, 24, 25, & |  | ||||||
|               26, 27, 15, 29, 30, 14, 16, 42, 46, 35, & |  | ||||||
|               36, 37, 21,  0, 11, 41, 10, 13, 43,  1, & |  | ||||||
|                2,  3,  4,  5,  6,  7,  8,  9, 49, 56, & |  | ||||||
|               52, 55, 54, 12, 63, 17, 18, 19, 20, 44, & |  | ||||||
|               22, 23, 24, 25, 26, 27, 28, 29, 30, 31, & |  | ||||||
|               32, 33, 34, 35, 36, 37, 38, 39, 40, 41, & |  | ||||||
|               45, 63/ |  | ||||||
|   save |  | ||||||
| 
 |  | ||||||
|   do i=1,nmsg |  | ||||||
|      n=ichar(msg(i:i)) |  | ||||||
|      if(n.lt.0 .or. n.gt.91) n=32 !Replace illegal char with blank  |  | ||||||
|      n=lookup(n) |  | ||||||
|      itone(3*i-2)=n/16 + 1 |  | ||||||
|      itone(3*i-1)=mod(n/4,4) + 1 |  | ||||||
|      itone(3*i)=mod(n,4) + 1 |  | ||||||
|   enddo |  | ||||||
|   ndits=3*nmsg |  | ||||||
|   return |  | ||||||
| end subroutine abc441 |  | ||||||
							
								
								
									
										110
									
								
								avemsg6m.f
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								avemsg6m.f
									
									
									
									
									
								
							| @ -1,110 +0,0 @@ | |||||||
|       subroutine avemsg6m(s2db,nz,nslim,NFixLen,cfile6,lcum, |  | ||||||
|      +  f0,lumsg,npkept) |  | ||||||
| 
 |  | ||||||
| C  Attempts to find message length and then decodes an average message. |  | ||||||
| 
 |  | ||||||
|       real s2db(0:43,nz) |  | ||||||
|       real s2dc(0:43,22) |  | ||||||
|       real wgt(22) |  | ||||||
|       real acf(0:430) |  | ||||||
|       logical lcum |  | ||||||
|       character*43 pua |  | ||||||
|       character*6 cfile6 |  | ||||||
|       character*22 avemsg,blanks |  | ||||||
|       data pua/'0123456789., /#?$ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ |  | ||||||
|       data blanks/'                      '/ |  | ||||||
|       data twopi/6.283185307/ |  | ||||||
|       data offset/20.6/ |  | ||||||
| 
 |  | ||||||
| C  Adjustable sig limit, depending on length of data to average. |  | ||||||
|       nslim2=nslim - 9 + 4.0*log10(624.0/nz)       !### +10 was here |  | ||||||
| 
 |  | ||||||
|       k=0 |  | ||||||
|       sum=0. |  | ||||||
|       nsum=0 |  | ||||||
|       do j=1,nz |  | ||||||
|          if(mod(j,3).eq.1) then |  | ||||||
|             sum=sum+s2db(0,j)        !Measure avg sig strength for sync tone |  | ||||||
|             nsum=nsum+1 |  | ||||||
|          else |  | ||||||
|             k=k+1 |  | ||||||
|             call move(s2db(0,j),s2db(0,k),44)  !Save data spectra |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
|       sig=sum/nsum                                 !Signal strength estimate |  | ||||||
|       nsig=nint(db(sig)-offset) |  | ||||||
| 
 |  | ||||||
| C  Most of the time in this routine is in this loop. |  | ||||||
|       kz=k |  | ||||||
|       do lag=0,kz-1 |  | ||||||
|          sum=0. |  | ||||||
|          do j=1,kz-lag |  | ||||||
|             do i=0,43 |  | ||||||
|                sum=sum+s2db(i,j)*s2db(i,j+lag) |  | ||||||
|             enddo |  | ||||||
|          enddo |  | ||||||
|          acf(lag)=sum |  | ||||||
|       enddo |  | ||||||
|       acf0=acf(0) |  | ||||||
|       do lag=0,kz-1 |  | ||||||
|          acf(lag)=acf(lag)/acf0 |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       lmsg1=NFixLen/256 |  | ||||||
|       lmsg2=NFixLen-256*lmsg1 |  | ||||||
|       if(mod(lmsg1,2).eq.1) lmsg1=lmsg1+1 |  | ||||||
|       if(mod(lmsg2,2).eq.1) lmsg2=lmsg2+1 |  | ||||||
|       smax=-1.e9 |  | ||||||
|       do ip=4,22,2               !Compute periodogram for allowed msg periods |  | ||||||
|          if(NFixLen.ne.0 .and. ip.ne.4 .and. ip.ne.lmsg1  |  | ||||||
|      +     .and. ip.ne.lmsg2) go to 5 |  | ||||||
|          f=1.0/ip |  | ||||||
|          s=0. |  | ||||||
|          do lag=0,kz-1 |  | ||||||
|             s=s+acf(lag)*cos(twopi*f*lag) |  | ||||||
|          enddo |  | ||||||
|          if(s.gt.smax) then |  | ||||||
|             smax=s |  | ||||||
|             msglen=ip                            !Save best message length |  | ||||||
|          endif |  | ||||||
|  5    enddo |  | ||||||
| 
 |  | ||||||
| C  Average the symbols from s2db into s2dc. |  | ||||||
| 
 |  | ||||||
|       call zero(s2dc,44*22) |  | ||||||
|       call zero(wgt,22) |  | ||||||
|       do j=1,kz |  | ||||||
|          k=mod(j-1,msglen)+1 |  | ||||||
|          call add(s2db(0,j),s2dc(0,k),s2dc(0,k),44) |  | ||||||
|          wgt(k)=wgt(k)+1.0 |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       do j=1,msglen                            !Hard-decode the avg msg, |  | ||||||
|          smax=-1.e9                            !picking max bin for each char |  | ||||||
|          do i=1,43 |  | ||||||
|             s2dc(i,j)=s2dc(i,j)/wgt(j) |  | ||||||
|             if(s2dc(i,j).gt.smax) then |  | ||||||
|                smax=s2dc(i,j) |  | ||||||
|                ipk=i |  | ||||||
|             endif |  | ||||||
|          enddo |  | ||||||
|          k=mod(ipk,3) |  | ||||||
|          i=ipk |  | ||||||
|          avemsg(j:j)=pua(i:i) |  | ||||||
|       enddo |  | ||||||
|       ndf0=nint(f0-1076.66) |  | ||||||
|       do i=1,msglen |  | ||||||
|          if(avemsg(i:i).eq.' ') goto 10 |  | ||||||
|       enddo |  | ||||||
|       go to 20 |  | ||||||
|  10   avemsg=avemsg(i+1:msglen)//avemsg(1:i) |  | ||||||
|  20   if(nsig.gt.nslim2) then |  | ||||||
|          npkept=npkept+1 |  | ||||||
|          avemsg=avemsg(1:msglen)//blanks |  | ||||||
|          write(lumsg,1020) cfile6,nsig,ndf0,avemsg,msglen |  | ||||||
|          if(lcum) write(21,1020) cfile6,nsig,ndf0,avemsg,msglen |  | ||||||
|  1020    format(a6,8x,i6,i5,7x,a22,19x,'*',i4) |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										18
									
								
								blanker.f90
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								blanker.f90
									
									
									
									
									
								
							| @ -1,18 +0,0 @@ | |||||||
| subroutine blanker(d2d,jz) |  | ||||||
| 
 |  | ||||||
|   integer*2 d2d(jz) |  | ||||||
| 
 |  | ||||||
|   avg=700. |  | ||||||
|   threshold=5.0 |  | ||||||
|   do i=1,jz |  | ||||||
|      xmag=abs(d2d(i)) |  | ||||||
|      xmed=0.75*xmed + 0.25*d2d(i) |  | ||||||
|      avg=0.999*avg + 0.001*xmag |  | ||||||
|      if(xmag.gt.threshold*avg) then |  | ||||||
| !        d2d(i)=nint(xmed) |  | ||||||
|         d2d(i)=0 |  | ||||||
|      endif |  | ||||||
|   enddo |  | ||||||
| 
 |  | ||||||
|   return |  | ||||||
| end subroutine blanker |  | ||||||
							
								
								
									
										20
									
								
								decode3.F90
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								decode3.F90
									
									
									
									
									
								
							| @ -37,8 +37,6 @@ subroutine decode3(d2,jz,istart,filename) | |||||||
|      d2d(i)=d2(i) |      d2d(i)=d2(i) | ||||||
|   enddo |   enddo | ||||||
| 
 | 
 | ||||||
|   if(nblank.ne.0) call blanker(d2d,jz) |  | ||||||
| 
 |  | ||||||
|   nseg=1 |   nseg=1 | ||||||
|   if(mode(1:4).eq.'JT65') then |   if(mode(1:4).eq.'JT65') then | ||||||
|      i=index(FileID,'.')-3 |      i=index(FileID,'.')-3 | ||||||
| @ -78,23 +76,7 @@ subroutine decode3(d2,jz,istart,filename) | |||||||
|    |    | ||||||
|   nclearave=0 |   nclearave=0 | ||||||
|   nagain=0 |   nagain=0 | ||||||
|   if(mode(1:4).eq.'JT65') then |   call pix2d65(d2d,jz) | ||||||
|      call pix2d65(d2d,jz) |  | ||||||
|   else if(mode.eq.'FSK441') then |  | ||||||
|      nz=s2(1,1) |  | ||||||
|      call pix2d(d2d,jz,mousebutton,MouseDF,NFreeze,mode,s2,64,nz,b) |  | ||||||
|   else if(mode(1:4).eq.'JT6M' .and. mousebutton.eq.0) then |  | ||||||
|      nz=s2(1,1) |  | ||||||
|      call pix2d(d2d,jz,mousebutton,MouseDF,NFreeze,mode,s2,64,nz,b) |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
| ! Compute red and magenta cutves for small plot area, FSK441/JT6M only |  | ||||||
|   if(mode.eq.'FSK441' .or. mode.eq.'JT6M') then |  | ||||||
|      do i=1,128 |  | ||||||
|         if(mode.eq.'FSK441' .and. ps0(i).gt.0.0) ps0(i)=10.0*log10(ps0(i)) |  | ||||||
|         if(psavg(i).gt.0.0) psavg(i)=10.0*log10(psavg(i)) |  | ||||||
|      enddo |  | ||||||
|   endif |  | ||||||
| 
 | 
 | ||||||
| 999 return | 999 return | ||||||
| end subroutine decode3 | end subroutine decode3 | ||||||
|  | |||||||
							
								
								
									
										159
									
								
								decode6m.f
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								decode6m.f
									
									
									
									
									
								
							| @ -1,159 +0,0 @@ | |||||||
|       subroutine decode6m(data,jz,cfile6,MinSigdB,istart, |  | ||||||
|      +  NFixLen,lcum,f0,lumsg,npkept,yellow) |  | ||||||
| 
 |  | ||||||
| C  Decode a JT6M message.  Data must start at the beginning of a  |  | ||||||
| C  sync symbol; sync frequency is assumed to be f0. |  | ||||||
| 
 |  | ||||||
|       parameter (NMAX=30*11025) |  | ||||||
|       real data(jz)              !Raw data |  | ||||||
|       real s2db(0:43,646)        !Spectra of symbols |  | ||||||
| c      real s2(128,646) |  | ||||||
|       real syncsig(646) |  | ||||||
|       real yellow(216) |  | ||||||
|       real ref(0:43) |  | ||||||
|       logical lcum |  | ||||||
|       character*43 pua |  | ||||||
|       character*48 msg |  | ||||||
|       character*6 cfile6 |  | ||||||
|       real*8 dpha,twopi |  | ||||||
|       complex*16 z,dz |  | ||||||
|       complex zz |  | ||||||
|       complex ct(0:511) |  | ||||||
|       complex c |  | ||||||
|       common/hcom/c(NMAX) |  | ||||||
|       data pua/'0123456789., /#?$ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ |  | ||||||
|       data offset/20.6/ |  | ||||||
| 
 |  | ||||||
|       ps(zz)=real(zz)**2 + aimag(zz)**2          !Power spectrum function |  | ||||||
| 
 |  | ||||||
| C  Convert data to baseband (complex result) using quadrature LO. |  | ||||||
|       twopi=8*atan(1.d0) |  | ||||||
|       dpha=twopi*f0/11025.d0 |  | ||||||
|       dz=cmplx(cos(dpha),-sin(dpha)) |  | ||||||
|       z=1.d0/dz |  | ||||||
|       do i=1,jz |  | ||||||
|          z=z*dz |  | ||||||
|          c(i)=data(i)*z |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Get spectrum for each symbol. |  | ||||||
| C  NB: for decoding pings, could do FFTs first for sync intervals only,  |  | ||||||
| C  and then for data symbols only where the sync amplitude is above  |  | ||||||
| C  threshold.  However, for the average message we want all FFTs computed. |  | ||||||
| 
 |  | ||||||
|       call zero(ref,44) |  | ||||||
| 
 |  | ||||||
|       nz=jz/512 - 1 |  | ||||||
|       fac=1.0/512.0 |  | ||||||
|       do j=1,nz         |  | ||||||
|          i0=512*(j-1) + 1 |  | ||||||
|           do i=0,511 |  | ||||||
|             ct(i)=fac*c(i0+i) |  | ||||||
|          enddo |  | ||||||
|          call four2a(ct,512,1,-1,1) |  | ||||||
| 
 |  | ||||||
| C  Save PS for each symbol |  | ||||||
|          do i=0,127 |  | ||||||
|             xps=ps(ct(i)) |  | ||||||
|             if(i.le.43) s2db(i,j)=xps |  | ||||||
| c            s2(i+1,j)=xps |  | ||||||
|          enddo |  | ||||||
|          if(mod(j,3).eq.1) call add(ref,s2db(0,j),ref,44) !Accumulate ref spec |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Return sync-tone amplitudes for plotting. |  | ||||||
|       iz=nz/3 -1 |  | ||||||
|       do i=1,iz |  | ||||||
|          j=3*i-2 |  | ||||||
|          yellow(i)=s2db(0,j)-0.5*(s2db(0,j+1)+s2db(0,j+2)) |  | ||||||
|       enddo |  | ||||||
|       yellow(216)=iz |  | ||||||
| 
 |  | ||||||
|       fac=3.0/nz |  | ||||||
|       do i=0,43                               !Normalize the ref spectrum |  | ||||||
|          ref(i)=fac*ref(i) |  | ||||||
|       enddo |  | ||||||
|       ref(0)=ref(2)                           !Sync bin uses bin 2 as ref |  | ||||||
| 
 |  | ||||||
|       do j=1,nz                               !Compute strength of sync |  | ||||||
|          m=mod(j-1,3)                         !signal at each j. |  | ||||||
|          ja=j-m-3 |  | ||||||
|          jb=ja+3 |  | ||||||
|          if(ja.lt.1) ja=ja+3 |  | ||||||
|          if(jb.gt.nz) jb=jb-3 |  | ||||||
|          syncsig(j)=0.5*(s2db(0,ja)+s2db(0,jb))/ref(0) |  | ||||||
|          syncsig(j)=db(syncsig(j)) - offset |  | ||||||
|          do i=0,43                            !Normalize s2db |  | ||||||
|             s2db(i,j)=s2db(i,j)/ref(i) |  | ||||||
|          enddo |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Decode any message of 2 or more consecutive characters bracketed by |  | ||||||
| C  sync-tones above a threshold. |  | ||||||
| C  Use hard-decoding (i.e., pick max bin). |  | ||||||
| 
 |  | ||||||
|       nslim=MinSigdB                       !Signal limit for decoding |  | ||||||
|       ndf0=nint(f0-1076.77)                !Freq offset DF, in Hz |  | ||||||
|       n=0                                  !Number of decoded characters |  | ||||||
|       j0=0 |  | ||||||
|       sbest=-1.e9 |  | ||||||
|       do j=2,nz-1,3 |  | ||||||
|          if(syncsig(j).ge.float(nslim)) then |  | ||||||
| 
 |  | ||||||
| C  Is it time to write out the results? |  | ||||||
|             if((n.eq.48) .or. (j.ne.j0+3 .and. j0.ne.0)) then |  | ||||||
|                nsig=nint(sbest) |  | ||||||
|                width=(512./11025.)*(1.5*n+1.0) |  | ||||||
|                if(nsig.ge.nslim) then |  | ||||||
|                   npkept=npkept+1 |  | ||||||
|                   write(lumsg,1010) cfile6,tping,width, |  | ||||||
|      +            nsig,ndf0,(msg(k:k),k=1,n) |  | ||||||
|                   if(lcum) write(21,1010) cfile6,tping,width, |  | ||||||
|      +              nsig,ndf0,(msg(k:k),k=1,n) |  | ||||||
|  1010             format(a6,2f5.1,i4,i5,6x,48a1)       !### 6x was 7x ### |  | ||||||
|                endif |  | ||||||
|                n=0 |  | ||||||
|                sbest=-1.e9 |  | ||||||
|             endif |  | ||||||
|             j0=j |  | ||||||
|             smax1=-1.e9 |  | ||||||
|             do i=1,43                         !Pick max bin for 1st char |  | ||||||
|                if(s2db(i,j).gt.smax1) then |  | ||||||
|                   smax1=s2db(i,j) |  | ||||||
|                   ipk=i |  | ||||||
|                endif |  | ||||||
|             enddo |  | ||||||
|             n=n+1 |  | ||||||
|             if(n.eq.1) tping=j*512./11025. + (istart-1)/11025.0 !Start of ping |  | ||||||
|             msg(n:n)=pua(ipk:ipk)                        !Decoded character |  | ||||||
| 
 |  | ||||||
|             smax2=-1.e9 |  | ||||||
|             do i=1,43 |  | ||||||
|                if(s2db(i,j+1).gt.smax2) then |  | ||||||
|                   smax2=s2db(i,j+1) |  | ||||||
|                   ipk=i |  | ||||||
|                endif |  | ||||||
|             enddo |  | ||||||
|             n=n+1 |  | ||||||
|             msg(n:n)=pua(ipk:ipk) |  | ||||||
|             sig0=10.0**(0.1*(syncsig(j)+offset)) |  | ||||||
|             sig=db(0.5*sig0 + 0.25*(smax1+smax2))-offset |  | ||||||
|             sbest=max(sbest,sig) |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       nsig=nint(sbest) |  | ||||||
|       width=(512./11025.)*(1.5*n+1.0) |  | ||||||
|       if(n.ne.0 .and. nsig.ge.nslim) then |  | ||||||
|          npkept=npkept+1 |  | ||||||
|          write(lumsg,1010) cfile6,tping, |  | ||||||
|      +     width,nsig,ndf0,(msg(k:k),k=1,n) |  | ||||||
|          if(lcum) write(21,1010) cfile6,tping, |  | ||||||
|      +     width,nsig,ndf0,(msg(k:k),k=1,n) |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
| C  Decode average message for the whole record. |  | ||||||
|       call avemsg6m(s2db,nz,nslim,NFixLen,cfile6,lcum,f0,lumsg,npkept) |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										3
									
								
								g0
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								g0
									
									
									
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| gcc -c -DBIGSYM=1 init_rs.c |  | ||||||
| gcc -c -DBIGSYM=1 encode_rs.c |  | ||||||
| gcc -c -DBIGSYM=1 decode_rs.c |  | ||||||
							
								
								
									
										5
									
								
								g1
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								g1
									
									
									
									
									
								
							| @ -1,5 +0,0 @@ | |||||||
| G95=/usr/local/bin/g95 |  | ||||||
| COMPILER=//usr/local/lib/gcc-lib/i386-unknown-freebsd5.4/4.0.1/ |  | ||||||
| python f2py.py -c --quiet --opt="-O -cpp -DFreeBSD -fno-second-underscore" init_rs.o encode_rs.o decode_rs.o -m Audio --f77exec=$G95 --f90exec=$G95 -L$COMPILER -lpthread -lg2c only: ftn_init ftn_quit audio_init spec getfile azdist0 astro0 : a2d.f90 abc441.f90 astro0.f90 audio_init.f90 azdist0.f90 blanker.f90 decode1.f90 decode2.f90 decode3.f90 ftn_init.f90 ftn_quit.f90 get_fname.f90 getfile.f90 horizspec.f90 hscroll.f90 i1tor4.f90 pix2d.f90 pix2d65.f90 rfile.f90 savedata.f90 spec.f90 wsjtgen.f90 runqqq.f90 wsjt1.f fsubs1.f fsubs.f astro.f astropak.f jtaudio.c ptt_bsd.c igray.c wrapkarn.c start_threads.c cutil.c fivehz.f90 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
							
								
								
									
										49
									
								
								gen6m.f
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								gen6m.f
									
									
									
									
									
								
							| @ -1,49 +0,0 @@ | |||||||
|       subroutine gen6m(msg,samfac,iwave,nwave) |  | ||||||
| 
 |  | ||||||
| C  Encodes a message into a wavefile for transmitting JT6M signals. |  | ||||||
| 
 |  | ||||||
|       parameter (NMAX=21504)     !NMAX=28*512*3/2: number of waveform samples |  | ||||||
|       character*28 msg           !Message to be generated |  | ||||||
|       real*8 samfac |  | ||||||
|       real*4 x(NMAX)             !Data for wavefile |  | ||||||
|       integer*2 iwave(NMAX)      !Generated wave file |  | ||||||
|       integer*4 imsg(28) |  | ||||||
| 
 |  | ||||||
|       do i=27,1,-1                           !Get message length |  | ||||||
|          if(msg(i:i).ne.' ') go to 10 |  | ||||||
|       enddo |  | ||||||
|       i=1 |  | ||||||
|  10   nmsg=i+1 |  | ||||||
|       if(mod(nmsg,2).eq.1) nmsg=nmsg+1       !Make it even |  | ||||||
| 
 |  | ||||||
|       nwave=nmsg*512*3/2 |  | ||||||
|       do m=1,nmsg                            !Get character code numbers |  | ||||||
|          ic=m |  | ||||||
|          n=ichar(msg(ic:ic)) |  | ||||||
| C  Calculate i in range 0-42: |  | ||||||
|          if(n.ge.ichar('0') .and. n.le.ichar('9')) i=n-ichar('0') |  | ||||||
|          if(msg(ic:ic).eq.'.') i=10 |  | ||||||
|          if(msg(ic:ic).eq.',') i=11 |  | ||||||
|          if(msg(ic:ic).eq.' ') i=12 |  | ||||||
|          if(msg(ic:ic).eq.'/') i=13 |  | ||||||
|          if(msg(ic:ic).eq.'#') i=14 |  | ||||||
|          if(msg(ic:ic).eq.'?') i=15 |  | ||||||
|          if(msg(ic:ic).eq.'$') i=16 |  | ||||||
|          if(n.ge.ichar('a') .and. n.le.ichar('z')) i=n-ichar('a')+17 |  | ||||||
|          if(n.ge.ichar('A') .and. n.le.ichar('Z')) i=n-ichar('A')+17 |  | ||||||
|          imsg(m)=i |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       k=1 |  | ||||||
|       do i=1,nmsg,2 |  | ||||||
|          call gentone(x(k),-1,k)               !Generate a sync tone |  | ||||||
|          call gentone(x(k),imsg(i),k)          !First character |  | ||||||
|          call gentone(x(k),imsg(i+1),k)        !Second character |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       do i=1,nwave |  | ||||||
|          iwave(i)=nint(32767.0*x(i)) |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										92
									
								
								glpr
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								glpr
									
									
									
									
									
								
							| @ -1,92 +0,0 @@ | |||||||
| lpr astro.f |  | ||||||
| lpr Audio.f90  |  | ||||||
| lpr avemsg65.f |  | ||||||
| lpr avemsg6m.f |  | ||||||
| lpr avesp2.f |  | ||||||
| lpr azdist.f |  | ||||||
| lpr bzap.f |  | ||||||
| lpr chkmsg.f |  | ||||||
| lpr coord.f |  | ||||||
| lpr db.f |  | ||||||
| lpr dcoord.f |  | ||||||
| lpr decode65.f |  | ||||||
| lpr decode6m.f |  | ||||||
| lpr deep65.f |  | ||||||
| lpr deg2grid.f |  | ||||||
| lpr demod64a.f |  | ||||||
| lpr detect.f |  | ||||||
| lpr dot.f |  | ||||||
| lpr encode65.f |  | ||||||
| lpr extract.f |  | ||||||
| lpr fivehz.f90 |  | ||||||
| lpr flat1.f |  | ||||||
| lpr flat2.f |  | ||||||
| lpr flatten.f |  | ||||||
| lpr four2a.f |  | ||||||
| lpr fsubs1.f  |  | ||||||
| lpr fsubs.f  |  | ||||||
| lpr ftsky.f |  | ||||||
| lpr gasdev.f |  | ||||||
| lpr gen65.f |  | ||||||
| lpr gen6m.f |  | ||||||
| lpr gencw.f |  | ||||||
| lpr gentone.f |  | ||||||
| lpr geocentric.f |  | ||||||
| lpr geodist.f |  | ||||||
| lpr getpfx1.f |  | ||||||
| lpr getpfx2.f |  | ||||||
| lpr getsnr.f |  | ||||||
| lpr graycode.f |  | ||||||
| lpr grid2deg.f |  | ||||||
| lpr grid2k.f |  | ||||||
| lpr igray.f |  | ||||||
| lpr indexx.f |  | ||||||
| lpr interleave63.f |  | ||||||
| lpr jtaudio.c  |  | ||||||
| lpr k2grid.f |  | ||||||
| lpr limit.f |  | ||||||
| lpr longx.f |  | ||||||
| lpr lpf1.f |  | ||||||
| lpr moon2.f |  | ||||||
| lpr MoonDop.f |  | ||||||
| lpr morse.f |  | ||||||
| lpr mtdecode.f |  | ||||||
| lpr nchar.f |  | ||||||
| lpr packcall.f |  | ||||||
| lpr packgrid.f |  | ||||||
| lpr packmsg.f |  | ||||||
| lpr packtext.f |  | ||||||
| lpr pctile.f |  | ||||||
| lpr peakup.f |  | ||||||
| lpr ping.f |  | ||||||
| lpr ps.f |  | ||||||
| lpr ptt.c  |  | ||||||
| lpr ran1.f |  | ||||||
| lpr resample.c  |  | ||||||
| lpr s2shape.f |  | ||||||
| lpr set.f |  | ||||||
| lpr setup65.f |  | ||||||
| lpr short65.f |  | ||||||
| lpr slope.f |  | ||||||
| lpr smooth.f |  | ||||||
| lpr sort.f |  | ||||||
| lpr spec2d65.f |  | ||||||
| lpr spec2d.f |  | ||||||
| lpr spec441.f |  | ||||||
| lpr stdecode.f |  | ||||||
| lpr sun.f |  | ||||||
| lpr sync65.f |  | ||||||
| lpr sync.f |  | ||||||
| lpr syncf0.f |  | ||||||
| lpr syncf1.f |  | ||||||
| lpr synct.f |  | ||||||
| lpr toxyz.f |  | ||||||
| lpr unpackcall.f |  | ||||||
| lpr unpackgrid.f |  | ||||||
| lpr unpackmsg.f |  | ||||||
| lpr unpacktext.f |  | ||||||
| lpr wrapkarn.c  |  | ||||||
| lpr wsjt1.f |  | ||||||
| lpr wsjt65.f |  | ||||||
| lpr xcor.f |  | ||||||
| lpr xfft.f  |  | ||||||
							
								
								
									
										3
									
								
								go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go
									
									
									
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| gcc -c wrapkarn.c |  | ||||||
| gcc -c igray.c |  | ||||||
| f77 -o JT65code -fno-second-underscore JT65code_all.f igray.o wrapkarn.o init_rs.o encode_rs.o decode_rs.o |  | ||||||
| @ -1,88 +0,0 @@ | |||||||
| 
 |  | ||||||
| !------------------------------------------------------ horizspec |  | ||||||
| subroutine horizspec(x,brightness,contrast,a) |  | ||||||
| 
 |  | ||||||
|   real x(4096) |  | ||||||
|   integer brightness,contrast |  | ||||||
|   integer*2 a(750,300) |  | ||||||
|   real y(512),ss(128) |  | ||||||
|   complex c(0:256) |  | ||||||
|   equivalence (y,c) |  | ||||||
|   include 'gcom1.f90' |  | ||||||
|   include 'gcom2.f90' |  | ||||||
|   save |  | ||||||
| 
 |  | ||||||
|   nfft=512 |  | ||||||
|   nq=nfft/4 |  | ||||||
|   gain=50.0 * 3.0**(0.36+0.01*contrast) |  | ||||||
|   offset=0.5*(brightness+30.0) |  | ||||||
|   df=11025.0/512.0 |  | ||||||
|   if(ntr.ne.ntr0) then |  | ||||||
|      if(lauto.eq.0 .or. ntr.eq.TxFirst) then |  | ||||||
|         call hscroll(a,nx) |  | ||||||
|         nx=0 |  | ||||||
|      endif |  | ||||||
|      ntr0=ntr |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   i0=0 |  | ||||||
|   do iter=1,5 |  | ||||||
|      if(nx.lt.750) nx=nx+1 |  | ||||||
|      do i=1,nfft |  | ||||||
|         y(i)=1.4*x(i+i0) |  | ||||||
|      enddo |  | ||||||
|      call xfft2(y,nfft) |  | ||||||
|      nq=nfft/4 |  | ||||||
|      do i=1,nq |  | ||||||
|         ss(i)=real(c(i))**2 + aimag(c(i))**2 |  | ||||||
|      enddo |  | ||||||
| 
 |  | ||||||
|      p=0. |  | ||||||
|      do i=21,120 |  | ||||||
|         p=p+ss(i) |  | ||||||
|         n=0 |  | ||||||
|         if(ss(i).gt.0.) n=gain*log10(0.05*ss(i)) + offset |  | ||||||
|         n=min(252,max(0,n)) |  | ||||||
|         j=121-i |  | ||||||
|         a(nx,j)=n |  | ||||||
|      enddo |  | ||||||
|      if(nx.eq.7 .or. nx.eq.378 .or. nx.eq.750) then |  | ||||||
| ! Put in yellow ticks at the standard tone frequencies for FSK441, or |  | ||||||
| ! at the sync-tone frequency for JT65, JT6M. |  | ||||||
|         do i=nx-4,nx |  | ||||||
|            if(mode.eq.'FSK441') then |  | ||||||
|               do n=2,5 |  | ||||||
|                  j=121-nint(n*441/df) |  | ||||||
|                  a(i,j)=254 |  | ||||||
|               enddo |  | ||||||
|            else if(mode(1:4).eq.'JT65') then |  | ||||||
|               j=121-nint(1270.46/df) |  | ||||||
|               a(i,j)=254 |  | ||||||
|            else if(mode.eq.'JT6M') then |  | ||||||
|               j=121-nint(1076.66/df) |  | ||||||
|               a(i,j)=254 |  | ||||||
|            endif |  | ||||||
|         enddo |  | ||||||
|      endif |  | ||||||
| 
 |  | ||||||
|      ng=140 - 30*log10(0.00033*p+0.001) |  | ||||||
|      ng=min(ng,150) |  | ||||||
|      if(nx.eq.1) ng0=ng |  | ||||||
|      if(abs(ng-ng0).le.1) then |  | ||||||
|         a(nx,ng)=255 |  | ||||||
|      else |  | ||||||
|         ist=1 |  | ||||||
|         if(ng.lt.ng0) ist=-1 |  | ||||||
|         jmid=(ng+ng0)/2 |  | ||||||
|         i=max(1,nx-1) |  | ||||||
|         do j=ng0+ist,ng,ist |  | ||||||
|            a(i,j)=255 |  | ||||||
|            if(j.eq.jmid) i=i+1 |  | ||||||
|         enddo |  | ||||||
|         ng0=ng |  | ||||||
|      endif |  | ||||||
|      i0=i0+441 |  | ||||||
|   enddo |  | ||||||
| 
 |  | ||||||
|   return |  | ||||||
| end subroutine horizspec |  | ||||||
							
								
								
									
										14
									
								
								hscroll.f90
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								hscroll.f90
									
									
									
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| 
 |  | ||||||
| !------------------------------------------------- hscroll |  | ||||||
| subroutine hscroll(a,nx) |  | ||||||
|   integer*2 a(750,300) |  | ||||||
| 
 |  | ||||||
|   do j=1,150 |  | ||||||
|      do i=1,750 |  | ||||||
|         if(nx.gt.50) a(i,150+j)=a(i,j) |  | ||||||
|         a(i,j)=0 |  | ||||||
|      enddo |  | ||||||
|   enddo |  | ||||||
|   return |  | ||||||
| 
 |  | ||||||
| end subroutine hscroll |  | ||||||
							
								
								
									
										128
									
								
								longx.f
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								longx.f
									
									
									
									
									
								
							| @ -1,128 +0,0 @@ | |||||||
|       subroutine longx(dat,npts0,ps,DFTolerance,noffset, |  | ||||||
|      +    msg,msglen,bauderr) |  | ||||||
| 
 |  | ||||||
| C  Look for 441-baud modulation, synchronize to it, and decode message. |  | ||||||
| C  Longest allowed data analysis is 1 second. |  | ||||||
| 
 |  | ||||||
|       parameter (NMAX=11025) |  | ||||||
|       parameter (NDMAX=NMAX/25) |  | ||||||
|       real dat(npts0) |  | ||||||
|       real ps(128),psmo(20) |  | ||||||
|       integer DFTolerance |  | ||||||
|       real y1(NMAX) |  | ||||||
|       real y2(NMAX) |  | ||||||
|       real y3(NMAX) |  | ||||||
|       real y4(NMAX) |  | ||||||
|       real wgt(-2:2) |  | ||||||
|       integer dit(NDMAX) |  | ||||||
|       integer n4(0:2) |  | ||||||
|       character msg*40 |  | ||||||
|       character c*48 |  | ||||||
|       common/acom/a1,a2,a3,a4 |  | ||||||
|       data c/' 123456789.,?/# $ABCD FGHIJKLMNOPQRSTUVWXY 0EZ  '/ |  | ||||||
|       data wgt/1.0,4.0,6.0,4.0,1.0/ |  | ||||||
| 
 |  | ||||||
|       NSPD=25                                !Change if FSK110 is implemented |  | ||||||
|       LTone=2 |  | ||||||
|       NBaud=11025/NSPD |  | ||||||
|       npts=min(NMAX,npts0) |  | ||||||
|       df=11025.0/256.0 |  | ||||||
|       smax=0. |  | ||||||
| 
 |  | ||||||
| C  Find the frequency offset of this ping. |  | ||||||
| C  NB: this might be improved by including a bandpass correction to ps. |  | ||||||
| 
 |  | ||||||
|       ia=nint((LTone*NBaud-DFTolerance)/df) |  | ||||||
|       ib=nint((LTone*NBaud+DFTolerance)/df) |  | ||||||
| 
 |  | ||||||
|       do i=ia,ib                            !Search for correct DF |  | ||||||
|          sum=0. |  | ||||||
|          do j=1,4                           !Sum over the 4 tones |  | ||||||
|             m=nint((i*df+(j-1)*NBaud)/df) |  | ||||||
|             do k=-2,2                       !Weighted averages over 5 bins |  | ||||||
|                sum=sum+wgt(k)*ps(m+k) |  | ||||||
|             enddo |  | ||||||
|          enddo |  | ||||||
|          k=i-ia+1 |  | ||||||
|          psmo(k)=sum |  | ||||||
|          kpk=0 |  | ||||||
|          if(sum.gt.smax) then |  | ||||||
|             smax=sum |  | ||||||
|             noffset=nint(i*df-LTone*NBaud) |  | ||||||
|             kpk=k |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       if(kpk.gt.1 .and. kpk.lt.20) then |  | ||||||
|          call peakup(psmo(kpk-1),psmo(kpk),psmo(kpk+1),dx) |  | ||||||
|          noffset=nint(noffset+dx*df) |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
| C  Do square-law detection in each of four filters. |  | ||||||
|       f1=LTone*NBaud+noffset |  | ||||||
|       f2=(LTone+1)*NBaud+noffset |  | ||||||
|       f3=(LTone+2)*NBaud+noffset |  | ||||||
|       f4=(LTone+3)*NBaud+noffset |  | ||||||
|       call detect(dat,npts,f1,y1) |  | ||||||
|       call detect(dat,npts,f2,y2) |  | ||||||
|       call detect(dat,npts,f3,y3) |  | ||||||
|       call detect(dat,npts,f4,y4) |  | ||||||
| 
 |  | ||||||
| C  Bandpass correction: |  | ||||||
|       npts=npts-(NSPD-1) |  | ||||||
|       do i=1,npts |  | ||||||
|          y1(i)=y1(i)*a1 |  | ||||||
|          y2(i)=y2(i)*a2 |  | ||||||
|          y3(i)=y3(i)*a3 |  | ||||||
|          y4(i)=y4(i)*a4 |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       call sync(y1,y2,y3,y4,npts,jpk,baud,bauderr) |  | ||||||
| 
 |  | ||||||
| C  Decimate y arrays by NSPD |  | ||||||
|       ndits=npts/NSPD - 1 |  | ||||||
|       do i=1,ndits |  | ||||||
|          y1(i)=y1(jpk+(i-1)*NSPD) |  | ||||||
|          y2(i)=y2(jpk+(i-1)*NSPD) |  | ||||||
|          y3(i)=y3(jpk+(i-1)*NSPD) |  | ||||||
|          y4(i)=y4(jpk+(i-1)*NSPD) |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Now find the mod3 phase that has no tone 3's |  | ||||||
|       n4(0)=0 |  | ||||||
|       n4(1)=0 |  | ||||||
|       n4(2)=0 |  | ||||||
|       do i=1,ndits |  | ||||||
|          ymax=max(y1(i),y2(i),y3(i),y4(i)) |  | ||||||
|          if(y1(i).eq.ymax) dit(i)=0 |  | ||||||
|          if(y2(i).eq.ymax) dit(i)=1 |  | ||||||
|          if(y3(i).eq.ymax) dit(i)=2 |  | ||||||
|          if(y4(i).eq.ymax) then |  | ||||||
|             dit(i)=3 |  | ||||||
|             k=mod(i,3) |  | ||||||
|             n4(k)=n4(k)+1 |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       n4min=min(n4(0),n4(1),n4(2)) |  | ||||||
|       if(n4min.eq.n4(0)) jsync=3 |  | ||||||
|       if(n4min.eq.n4(1)) jsync=1 |  | ||||||
|       if(n4min.eq.n4(2)) jsync=2 |  | ||||||
| C  Might want to notify if n4min>0 or if one of the others is equal |  | ||||||
| C  to n4min.  In both cases, could then decode 2 or 3 times, using |  | ||||||
| C  other starting phases. |  | ||||||
| 
 |  | ||||||
| C  Finally, decode the message. |  | ||||||
|       msg='                                        ' |  | ||||||
|       msglen=ndits/3 |  | ||||||
|       msglen=min(msglen,40) |  | ||||||
|       do i=1,msglen |  | ||||||
|          j=(i-1)*3+jsync |  | ||||||
|          nc=16*dit(j) + 4*dit(j+1) +dit(j+2) |  | ||||||
|          msg(i:i)=' ' |  | ||||||
|          if(nc.le.47) msg(i:i)=c(nc+1:nc+1) |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										144
									
								
								mtdecode.f
									
									
									
									
									
								
							
							
						
						
									
										144
									
								
								mtdecode.f
									
									
									
									
									
								
							| @ -1,144 +0,0 @@ | |||||||
|       subroutine mtdecode(dat,jz,nz,MinSigdB,MinWidth, |  | ||||||
|      +    NQRN,DFTolerance,istart,pick,cfile6,ps0) |  | ||||||
| 
 |  | ||||||
| C  Decode Multi-Tone FSK441 mesages. |  | ||||||
| 
 |  | ||||||
|       real dat(jz)                !Raw audio data |  | ||||||
|       integer NQRN |  | ||||||
|       integer DFTolerance |  | ||||||
|       logical pick |  | ||||||
|       character*6 cfile6,cf*1 |  | ||||||
| 
 |  | ||||||
|       real sigdb(3100)             !Detected signal in dB, sampled at 20 ms |  | ||||||
|       real work(3100) |  | ||||||
|       integer indx(3100) |  | ||||||
|       real pingdat(3,100) |  | ||||||
|       real ps(128) |  | ||||||
|       real ps0(128) |  | ||||||
|       character msg*40,msg3*3 |  | ||||||
|       character*90 line |  | ||||||
|       common/ccom/nline,tping(100),line(100) |  | ||||||
| 
 |  | ||||||
|       slim=MinSigdB |  | ||||||
|       wmin=0.001*MinWidth * (19.95/20.0) |  | ||||||
|       nf1=-DFTolerance |  | ||||||
|       nf2=DFTolerance |  | ||||||
|       msg3='   ' |  | ||||||
|       dt=1.0/11025.0 |  | ||||||
| 
 |  | ||||||
| C  Find signal power at suitable intervals to search for pings. |  | ||||||
|       istep=221 |  | ||||||
|       dtbuf=istep/11025. |  | ||||||
|       do n=1,nz |  | ||||||
|          s=0. |  | ||||||
|          ib=n*istep |  | ||||||
|          ia=ib-istep+1 |  | ||||||
|          do i=ia,ib |  | ||||||
|             s=s+dat(i)**2 |  | ||||||
|          enddo |  | ||||||
|          sigdb(n)=s/istep |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| !##################################################################### |  | ||||||
|       if(.not.pick) then |  | ||||||
| ! Remove initial transient from sigdb |  | ||||||
|          call indexx(nz,sigdb,indx) |  | ||||||
|          imax=0 |  | ||||||
|          do i=1,50 |  | ||||||
|             if(indx(i).gt.50) go to 10 |  | ||||||
|             imax=max(imax,indx(i)) |  | ||||||
|          enddo |  | ||||||
|  10      do i=1,50 |  | ||||||
|             if(indx(nz+1-i).gt.50) go to 20 |  | ||||||
|             imax=max(imax,indx(nz+1-i)) |  | ||||||
|          enddo |  | ||||||
|  20      imax=imax+6            !Safety margin |  | ||||||
|          base1=sigdb(indx(nz/2)) |  | ||||||
|          do i=1,imax |  | ||||||
|             sigdb(i)=base1 |  | ||||||
|          enddo |  | ||||||
|       endif |  | ||||||
| !################################################################## |  | ||||||
| 
 |  | ||||||
|       call smooth(sigdb,nz) |  | ||||||
| 
 |  | ||||||
| C  Remove baseline and one dB for good measure. |  | ||||||
|       call pctile (sigdb,work,nz,50,base1) |  | ||||||
|       do i=1,nz |  | ||||||
|          sigdb(i)=dB(sigdb(i)/base1) - 1.0 |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       call ping(sigdb,nz,dtbuf,slim,wmin,pingdat,nping) |  | ||||||
| 
 |  | ||||||
| C  If this is a "mouse pick" and no ping was found, force a pseudo-ping  |  | ||||||
| C  at center of data. |  | ||||||
| 	if(pick.and.nping.eq.0) then |  | ||||||
|            if(nping.le.99) nping=nping+1 |  | ||||||
| 	   pingdat(1,nping)=0.5*jz*dt |  | ||||||
| 	   pingdat(2,nping)=0.16 |  | ||||||
| 	   pingdat(3,nping)=1.0 |  | ||||||
| 	endif |  | ||||||
| 
 |  | ||||||
|       bigpeak=0. |  | ||||||
|       do iping=1,nping |  | ||||||
| C  Find starting place and length of data to be analyzed: |  | ||||||
|          tstart=pingdat(1,iping) |  | ||||||
|          width=pingdat(2,iping) |  | ||||||
|          peak=pingdat(3,iping) |  | ||||||
|          mswidth=10*nint(100.0*width) |  | ||||||
|          jj=(tstart-0.02)/dt |  | ||||||
|          if(jj.lt.1) jj=1 |  | ||||||
|          jjz=nint((width+0.02)/dt)+1 |  | ||||||
|          jjz=min(jjz,jz+1-jj) |  | ||||||
| 
 |  | ||||||
| C  Compute average spectrum of this ping. |  | ||||||
|          call spec441(dat(jj),jjz,ps,f0) |  | ||||||
| 
 |  | ||||||
| C  Decode the message. |  | ||||||
|          msg=' ' |  | ||||||
|          call longx(dat(jj),jjz,ps,DFTolerance,noffset,msg, |  | ||||||
|      +     msglen,bauderr) |  | ||||||
|          qrnlimit=4.4*1.5**(5.0-NQRN) |  | ||||||
|          if(NQRN.eq.0) qrnlimit=99. |  | ||||||
|          if(msglen.eq.0) go to 100 |  | ||||||
| 
 |  | ||||||
| C  Assemble a signal report: |  | ||||||
|          nwidth=0 |  | ||||||
|          if(width.ge.0.04) nwidth=1     !These might depend on NSPD |  | ||||||
|          if(width.ge.0.12) nwidth=2 |  | ||||||
|          if(width.gt.1.00) nwidth=3 |  | ||||||
|          nstrength=6 |  | ||||||
|          if(peak.ge.11.0) nstrength=7 |  | ||||||
|          if(peak.ge.17.0) nstrength=8 |  | ||||||
|          if(peak.ge.23.0) nstrength=9 |  | ||||||
| 
 |  | ||||||
| !         if(peak.gt.5.0 .and.mswidth.ge.100) then |  | ||||||
| !            call specsq(dat(jj),jjz,DFTolerance,0,noffset2) |  | ||||||
| !            noffset=noffset2 |  | ||||||
| !         endif |  | ||||||
| 
 |  | ||||||
| C  Discard this ping if DF outside tolerance limits or bauderr too big. |  | ||||||
| C  (However, if the ping was mouse-picked, proceed anyway.) |  | ||||||
| 
 |  | ||||||
|          if(.not.pick .and. ((noffset.lt.nf1 .or. noffset.gt.nf2) .or. |  | ||||||
|      +      (abs(bauderr).gt.qrnlimit))) goto 100  |  | ||||||
| 
 |  | ||||||
| C  If it's the best ping yet, save the spectrum: |  | ||||||
|          if(peak.gt.bigpeak) then |  | ||||||
|             bigpeak=peak |  | ||||||
|             do i=1,128 |  | ||||||
|                ps0(i)=ps(i) |  | ||||||
|             enddo |  | ||||||
|          endif |  | ||||||
|     |  | ||||||
|          tstart=tstart + dt*(istart-1) |  | ||||||
|          cf=' ' |  | ||||||
|          if(nline.le.99) nline=nline+1 |  | ||||||
|          tping(nline)=tstart |  | ||||||
|          write(line(nline),1050) cfile6,tstart,mswidth,int(peak), |  | ||||||
|      +        nwidth,nstrength,noffset,msg3,msg,cf |  | ||||||
|  1050    format(a6,f5.1,i5,i3,1x,2i1,i5,1x,a3,1x,a40,1x,a1) |  | ||||||
|  100  enddo |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										136
									
								
								pix2d.f90
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								pix2d.f90
									
									
									
									
									
								
							| @ -1,136 +0,0 @@ | |||||||
| subroutine pix2d(d2,jz,mousebutton,mousedf,nfreeze,mode,s2,nchan,nz,b) |  | ||||||
| 
 |  | ||||||
| ! Compute pixels to represent the 2-d spectrum s2(nchan,nz), and the |  | ||||||
| ! green line. |  | ||||||
| 
 |  | ||||||
|   integer*2 d2(jz)                   !Raw input data |  | ||||||
|   character*6 mode |  | ||||||
|   real s2(nchan,nz)                  !2-d spectrum |  | ||||||
|   integer*2 b(60000)                 !Pixels corresponding to 2-d spectrum |  | ||||||
|   data nx0/0/ |  | ||||||
|   save |  | ||||||
| 
 |  | ||||||
|   tbest=s2(2,1) |  | ||||||
|   s2(1,1)=s2(3,1) |  | ||||||
|   s2(2,1)=s2(3,1) |  | ||||||
| 
 |  | ||||||
|   gain=100. |  | ||||||
|   offset=0.0 |  | ||||||
| 
 |  | ||||||
|   if(mousebutton.eq.0) then |  | ||||||
|      k=0 |  | ||||||
|      do i=54,7,-1 |  | ||||||
|         do j=1,nz |  | ||||||
|            k=k+1 |  | ||||||
|            n=0 |  | ||||||
|            if(s2(i,j).gt.0) n=gain*log10(s2(i,j)) + offset |  | ||||||
|            n=min(252,max(0,n)) |  | ||||||
|            b(k)=n |  | ||||||
|         enddo |  | ||||||
|         k=k+500-nz |  | ||||||
|      enddo |  | ||||||
|      do i=k+1,60000 |  | ||||||
|         b(i)=0 |  | ||||||
|      enddo |  | ||||||
| 
 |  | ||||||
|   else |  | ||||||
| ! This is a mouse-picked decode, so we compute the "zoomed" region. |  | ||||||
|      k=50*500 |  | ||||||
|      do i=54,7,-1 |  | ||||||
|         do j=1,nz |  | ||||||
|            k=k+1 |  | ||||||
|            n=0 |  | ||||||
|            if(s2(i,j).gt.0) n=gain*log10(s2(i,j)) + offset |  | ||||||
|            n=min(252,max(0,n)) |  | ||||||
|            b(k)=n |  | ||||||
|         enddo |  | ||||||
|         k=k+500-nz |  | ||||||
|      enddo |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   if(mousebutton.eq.0) then |  | ||||||
| ! Compute the green curve |  | ||||||
|      sum=0. |  | ||||||
|      do i=1,jz |  | ||||||
|         sum=sum+d2(i) |  | ||||||
|      enddo |  | ||||||
|      nave=nint(sum/jz) |  | ||||||
|      nadd=661 |  | ||||||
|      ngreen=min(jz/nadd,500) |  | ||||||
|      k=0 |  | ||||||
|      j=0 |  | ||||||
|      do i=1,ngreen |  | ||||||
|         sq=0. |  | ||||||
|         do n=1,nadd |  | ||||||
|            k=k+1 |  | ||||||
|            d2(k)=d2(k)-nave |  | ||||||
|            x=d2(k) |  | ||||||
|            sq=sq + x*x |  | ||||||
|         enddo |  | ||||||
|         x=0.0001*sq/nadd |  | ||||||
|         j=j+1 |  | ||||||
|         x=120.0-40.0*log10(0.01*x) |  | ||||||
|         if(x.lt.1.0) x=1.0 |  | ||||||
|         if(x.gt.119.) x=119. |  | ||||||
|         ng=nint(x) |  | ||||||
|         ng=min(ng,120) |  | ||||||
|         nx=i |  | ||||||
|         if(nx.eq.1) ng0=ng |  | ||||||
|         if(abs(ng-ng0).le.1) then |  | ||||||
|            b((ng-1)*500+nx)=255 |  | ||||||
|         else |  | ||||||
|            ist=1 |  | ||||||
|            if(ng.lt.ng0) ist=-1 |  | ||||||
|            jmid=(ng+ng0)/2 |  | ||||||
|            ii=max(1,nx-1) |  | ||||||
|            do j=ng0+ist,ng,ist |  | ||||||
|               b((j-1)*500+ii)=255 |  | ||||||
|               if(j.eq.jmid) ii=ii+1 |  | ||||||
|            enddo |  | ||||||
|            ng0=ng |  | ||||||
|         endif |  | ||||||
|      enddo |  | ||||||
| 
 |  | ||||||
|      if(mode.eq.'FSK441') then |  | ||||||
| ! Insert yellow tick marks at frequencies of the FSK441 tones |  | ||||||
|         do i=2,5 |  | ||||||
|            f=441*i |  | ||||||
|            ich=58-nint(f/43.066) |  | ||||||
|            do j=1,5 |  | ||||||
|               b((ich-1)*500+j+2)=254 |  | ||||||
|               b((ich-1)*500+j+248)=254 |  | ||||||
|               b((ich-1)*500+j+495)=254 |  | ||||||
|            enddo |  | ||||||
|         enddo |  | ||||||
|      else if(mode.eq.'JT6M') then |  | ||||||
| ! Insert yellow tick marks at frequencies of the JT6M sync tone |  | ||||||
|         f=1076.66 |  | ||||||
|         ich=60-nint(f/43.066)     !Why 58 for FSK441, above? |  | ||||||
|         do j=1,5 |  | ||||||
|            b((ich-1)*500+j+2)=254 |  | ||||||
|            b((ich-1)*500+j+248)=254 |  | ||||||
|            b((ich-1)*500+j+495)=254 |  | ||||||
|         enddo |  | ||||||
| ! Insert green tick at frequency indicated by MouseDF |  | ||||||
|         if(NFreeze.gt.0) then |  | ||||||
|            f=1076.66+mousedf |  | ||||||
|            ich=60-nint(f/43.066)     !Why 58 for FSK441, above? |  | ||||||
|            do j=1,7 |  | ||||||
|               b((ich-1)*500+j+2)=255 |  | ||||||
|            enddo |  | ||||||
|         endif |  | ||||||
|      endif |  | ||||||
| 
 |  | ||||||
| ! Mark the best ping with a red tick |  | ||||||
|      if(tbest.gt.0.0) then |  | ||||||
|         nx=tbest/0.060 + 1 |  | ||||||
|         do j=110,120 |  | ||||||
|            b((j-1)*500+nx0)=0 |  | ||||||
|            b((j-1)*500+nx)=253 |  | ||||||
|         enddo |  | ||||||
|         nx0=nx |  | ||||||
|      endif |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   return |  | ||||||
| end subroutine pix2d |  | ||||||
							
								
								
									
										18
									
								
								spec.f90
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								spec.f90
									
									
									
									
									
								
							| @ -63,10 +63,6 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a) | |||||||
|      npts=jzc/2048 |      npts=jzc/2048 | ||||||
|      npts=2048*npts |      npts=2048*npts | ||||||
|      kread=0 |      kread=0 | ||||||
|      if(nspeed.ge.6) then |  | ||||||
|         call hscroll(a,nx) |  | ||||||
|         nx=0 |  | ||||||
|      endif |  | ||||||
|   endif |   endif | ||||||
|   if(npts.lt.0) npts=npts+nmax |   if(npts.lt.0) npts=npts+nmax | ||||||
|   if(npts.lt.nfft) go to 900               !Not enough data available |   if(npts.lt.nfft) go to 900               !Not enough data available | ||||||
| @ -118,20 +114,6 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a) | |||||||
|      endif |      endif | ||||||
|   endif |   endif | ||||||
| 
 | 
 | ||||||
|   if(nspeed.ge.6) then |  | ||||||
|      call horizspec(x,brightness,contrast,a) |  | ||||||
|      ncall=Mod(ncall+1,5) |  | ||||||
|      if(ncall.eq.1 .or. nspeed.eq.7) newdat=1 |  | ||||||
|      if(ndiskdat.eq.1) then |  | ||||||
|         npts=jzc-kread |  | ||||||
|      else |  | ||||||
|         npts=iwrite-iread |  | ||||||
|         if(npts.lt.0) npts=npts+nmax |  | ||||||
|      endif |  | ||||||
|      if(npts.ge.4096) go to 10 |  | ||||||
|      go to 900 |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   call xfft2(x,nfft) |   call xfft2(x,nfft) | ||||||
| 
 | 
 | ||||||
|   do i=1,nh                               !Accumulate power spectrum |   do i=1,nh                               !Accumulate power spectrum | ||||||
|  | |||||||
							
								
								
									
										128
									
								
								spec2d.f
									
									
									
									
									
								
							
							
						
						
									
										128
									
								
								spec2d.f
									
									
									
									
									
								
							| @ -1,128 +0,0 @@ | |||||||
| 	subroutine spec2d(data,jz,nstep,s2,nchan,nz,psavg0,sigma) |  | ||||||
| 
 |  | ||||||
| C  Computes 2d spectrogram for FSK441 single-tone search and waterfall |  | ||||||
| C  display. |  | ||||||
| 
 |  | ||||||
| 	parameter (NFFT=256) |  | ||||||
| 	parameter (NR=NFFT+2) |  | ||||||
| 	parameter (NH=NFFT/2) |  | ||||||
| 	parameter (NQ=NFFT/4) |  | ||||||
| 
 |  | ||||||
| 	real data(jz) |  | ||||||
| 	real s2(nchan,nz) |  | ||||||
| 	real x(NR) |  | ||||||
| 	real w1(7),w2(7) |  | ||||||
| 	real psavg(128) |  | ||||||
| 	real psavg0(128) |  | ||||||
| 	real ps2(128) |  | ||||||
| 	complex c(0:NH) |  | ||||||
| 	common/acom/a1,a2,a3,a4 |  | ||||||
| 	common/fcom/s(3100),indx(3100) |  | ||||||
| 	equivalence (x,c) |  | ||||||
| 	save |  | ||||||
| 
 |  | ||||||
| 	df=11025.0/NFFT |  | ||||||
| 
 |  | ||||||
| C  Compute the 2d spectrogram s2(nchan,nz).  Note that in s2 the frequency |  | ||||||
| C  bins are shifted down 5 bins from their natural positions. |  | ||||||
| 
 |  | ||||||
| 	call set(0.0,psavg,NH) |  | ||||||
| 	do n=1,nz |  | ||||||
| 	   j=1 + (n-1)*nstep |  | ||||||
| 	   call move(data(j),x,NFFT) |  | ||||||
| 	   call xfft(x,NFFT) |  | ||||||
| 
 |  | ||||||
| 	   sum=0. |  | ||||||
| 	   do i=1,NQ |  | ||||||
| 	      s2(i,n)=real(c(5+i))**2 + aimag(c(5+i))**2 |  | ||||||
| 	      sum=sum+s2(i,n) |  | ||||||
| 	   enddo |  | ||||||
| 	   s(n)=sum/NQ |  | ||||||
| 
 |  | ||||||
| C  Accumulate average spectrum for the whole file. |  | ||||||
| 	   do i=1,nh |  | ||||||
| 	      psavg0(i) = psavg0(i)+ real(c(i))**2 + aimag(c(i))**2 |  | ||||||
| 	   enddo |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
| C  Normalize and save a copy of psavg0 for plotting.  Roll off the |  | ||||||
| C  spectrum at 300 and 3000 Hz. |  | ||||||
| 	do i=1,nh |  | ||||||
| 	   psavg0(i)=3.e-5*psavg0(i)/nz |  | ||||||
| 	   f=df*i |  | ||||||
| 	   fac=1.0 |  | ||||||
| 	   if(f.lt.300.0) fac=f/300.0 |  | ||||||
| 	   if(f.gt.3000.0) fac=max(0.00333,(3300.0-f)/300.0) |  | ||||||
| 	   psavg0(i)=(fac**2)*psavg0(i) |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
| C  Compute an average spectrum from the weakest 25% of time slices. |  | ||||||
| 	call indexx(nz,s,indx) |  | ||||||
| 	call zero(ps2,NQ) |  | ||||||
| 	do j=1,nz/4 |  | ||||||
| 	   k=indx(j) |  | ||||||
| 	   do i=1,NQ |  | ||||||
| 	      ps2(i+5)=ps2(i+5)+s2(i,k) |  | ||||||
| 	   enddo |  | ||||||
| 	enddo |  | ||||||
| 	ps2(1)=ps2(5) |  | ||||||
| 	ps2(2)=ps2(5) |  | ||||||
| 	ps2(3)=ps2(5) |  | ||||||
| 	ps2(4)=ps2(5) |  | ||||||
| 	sum=0. |  | ||||||
| 	do i=6,59 |  | ||||||
| 	   sum=sum+ps2(i) |  | ||||||
| 	enddo |  | ||||||
| 	if(sum.eq.0.0) then |  | ||||||
| 	   sigma=-999. |  | ||||||
| 	   go to 999 |  | ||||||
| 	endif |  | ||||||
| 
 |  | ||||||
| C  Compute a smoothed spectrum without local peaks, and find its max. |  | ||||||
| 	smaxx=0. |  | ||||||
| 	do i=4,NQ |  | ||||||
| 	   sum=0. |  | ||||||
| 	   do k=1,7 |  | ||||||
| 	      w1(k)=ps2(i+k-4) |  | ||||||
| 	      sum=sum+w1(k) |  | ||||||
| 	   enddo |  | ||||||
| 	   ave=sum/7.0 |  | ||||||
| 	   if(i.ge.14 .and. i.le.58) then |  | ||||||
| 	      call pctile(w1,w2,7,50,base) |  | ||||||
| 	      ave=0.25*(w2(1)+w2(2)+w2(3)+w2(4)) |  | ||||||
| 	   endif |  | ||||||
| 	   psavg(i)=ave |  | ||||||
| 	   smaxx=max(psavg(i),smaxx) |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
| C  Save scale factors for flattening spectra of pings. |  | ||||||
| 	a1=1.0 |  | ||||||
| 	a2=psavg(nint(2*441/df))/psavg(nint(3*441/df)) |  | ||||||
| 	a3=psavg(nint(2*441/df))/psavg(nint(4*441/df)) |  | ||||||
| 	a4=psavg(nint(2*441/df))/psavg(nint(5*441/df)) |  | ||||||
| 	afac=4.0/(a1+a2+a3+a4) |  | ||||||
| 	a1=afac*a1 |  | ||||||
| 	a2=afac*a2 |  | ||||||
| 	a3=afac*a3 |  | ||||||
| 	a4=afac*a4 |  | ||||||
| 
 |  | ||||||
| C  Normalize 2D spectrum by the average based on weakest 25% of time |  | ||||||
| C  slices, smoothed, and with local peaks removed. |  | ||||||
| 
 |  | ||||||
| 	do i=1,NQ |  | ||||||
| 	   do j=1,nz |  | ||||||
| 	      s2(i,j)=s2(i,j)/max(psavg(i+5),0.01*smaxx) |  | ||||||
| 	   enddo |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
| C  Find average of active spectral region, over the whole file. |  | ||||||
| 	sum=0. |  | ||||||
| 	do i=9,52 |  | ||||||
| 	   do j=1,nz |  | ||||||
| 	      sum=sum+s2(i,j) |  | ||||||
| 	   enddo |  | ||||||
| 	enddo |  | ||||||
| 	sigma=sum/(44*nz) |  | ||||||
| 
 |  | ||||||
|  999	return |  | ||||||
| 	end |  | ||||||
							
								
								
									
										37
									
								
								spec441.f
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								spec441.f
									
									
									
									
									
								
							| @ -1,37 +0,0 @@ | |||||||
| 	subroutine spec441(dat,jz,s,f0) |  | ||||||
| 
 |  | ||||||
| C  Computes average spectrum over a range of dat, e.g. for a ping. |  | ||||||
| C  Returns spectral array and frequency of peak value. |  | ||||||
| 
 |  | ||||||
| 	parameter (NFFT=256) |  | ||||||
| 	parameter (NR=NFFT+2) |  | ||||||
| 	parameter (NH=NFFT/2) |  | ||||||
| 	real*4 dat(jz) |  | ||||||
| 	real*4 x(NR),s(NH) |  | ||||||
| 	complex c(0:NH) |  | ||||||
| 	equivalence (x,c) |  | ||||||
| 
 |  | ||||||
| 	call zero(s,NH) |  | ||||||
| 	nz=jz/NFFT |  | ||||||
| 	do n=1,nz |  | ||||||
| 	   j=1 + (n-1)*NFFT |  | ||||||
| 	   call move(dat(j),x,NFFT) |  | ||||||
| 	   call xfft(x,NFFT) |  | ||||||
| 	   do i=1,NH |  | ||||||
| 	      s(i)=s(i)+real(c(i))**2 + aimag(c(i))**2 |  | ||||||
| 	   enddo |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
| 	smax=0. |  | ||||||
| 	df=11025.0/NFFT |  | ||||||
| 	fac=1.0/(100.0*nfft*nz) |  | ||||||
| 	do i=1,nh |  | ||||||
| 	   s(i)=fac*s(i) |  | ||||||
| 	   if(s(i).gt.smax) then |  | ||||||
| 	      smax=s(i) |  | ||||||
| 	      f0=i*df |  | ||||||
| 	   endif |  | ||||||
| 	enddo |  | ||||||
| 
 |  | ||||||
|  	return |  | ||||||
| 	end |  | ||||||
							
								
								
									
										56
									
								
								syncf0.f
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								syncf0.f
									
									
									
									
									
								
							| @ -1,56 +0,0 @@ | |||||||
|       subroutine syncf0(data,jz,NFreeze,NTol,jstart,f0,smax) |  | ||||||
| 
 |  | ||||||
| C  Does 512-pt FFTs of data with 256-pt step size. |  | ||||||
| C  Finds sync tone and determines aproximate values for jstart and f0. |  | ||||||
| 
 |  | ||||||
|       real data(jz)               !Raw data |  | ||||||
|       real s2(128,6)              !Average spectra at half-symbol spacings |  | ||||||
|       real x(512) |  | ||||||
|       complex cx(0:511) |  | ||||||
|       complex z |  | ||||||
|       equivalence (x,cx) |  | ||||||
| 
 |  | ||||||
|       ps(z)=real(z)**2 + aimag(z)**2          !Power spectrum function |  | ||||||
| 
 |  | ||||||
|       call zero(s2,6*128)                    !Clear average |  | ||||||
|       df=11025./512. |  | ||||||
| 
 |  | ||||||
|       ia=(f0-400)/df |  | ||||||
|       ib=(f0+400)/df + 0.999 |  | ||||||
|       if(NFreeze.eq.1) then |  | ||||||
|          ia=(f0-NTol)/df |  | ||||||
|          ib=(f0+Ntol)/df + 0.999 |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
| C  Most of the time in this routine is in this loop. |  | ||||||
| 
 |  | ||||||
|       nblk=jz/256 - 6 |  | ||||||
|       do n=1,nblk                            !Accumulate avg spectrum for |  | ||||||
|          j=256*(n-1)+1                       !512-pt blocks, stepping by 256 |  | ||||||
|          call move(data(j),x,512) |  | ||||||
|          call xfft(x,512) |  | ||||||
|          do i=ia,ib |  | ||||||
|             x(i)=ps(cx(i)) |  | ||||||
|          enddo |  | ||||||
|          k=mod(n-1,6)+1 |  | ||||||
|          call add(s2(ia,k),x(ia),s2(ia,k),ib-ia+1)  !Average at each step |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Look for best spectral peak, using the "sync off" phases as reference. |  | ||||||
|       smax=0. |  | ||||||
|       do i=ia,ib |  | ||||||
|          do k=1,6 |  | ||||||
|             k1=mod(k+1,6)+1 |  | ||||||
|             k2=mod(k+3,6)+1 |  | ||||||
|             r=0.5*(s2(i,k1)+s2(i,k2)) |  | ||||||
|             s=s2(i,k)/r |  | ||||||
|             if(s.gt.smax) then |  | ||||||
|                smax=s |  | ||||||
|                jstart=(k-1)*256 + 1      !Best starting place for sync |  | ||||||
|                f0=i*df                   !Best sync frequency |  | ||||||
|             endif |  | ||||||
|          enddo |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										117
									
								
								syncf1.f
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								syncf1.f
									
									
									
									
									
								
							| @ -1,117 +0,0 @@ | |||||||
|       subroutine syncf1(data,jz,jstart,f0,NFreeze,DFTolerance,smax,red) |  | ||||||
| 
 |  | ||||||
| C  Does 16k FFTs of data with stepsize 15360, using only "sync on" intervals. |  | ||||||
| C  Returns a refined value of f0, the sync-tone frequency. |  | ||||||
| 
 |  | ||||||
|       parameter (NFFT=16384) |  | ||||||
|       parameter (NH=NFFT/2) |  | ||||||
|       parameter (NQ=NFFT/4) |  | ||||||
|       parameter (NB3=3*512) |  | ||||||
|       real data(jz)                          !Raw data |  | ||||||
|       integer DFTolerance |  | ||||||
|       real x(NFFT) |  | ||||||
|       real red(512) |  | ||||||
|       real s(NQ)     !Ref spectrum for flattening and birdie-zapping |  | ||||||
| 
 |  | ||||||
|       complex c(0:NH) |  | ||||||
|       complex z |  | ||||||
|       equivalence (x,c) |  | ||||||
| 
 |  | ||||||
|       ps(z)=real(z)**2 + aimag(z)**2          !Power spectrum ASF |  | ||||||
| 
 |  | ||||||
| C  Accumulate a high-resolution average spectrum |  | ||||||
|       df=11025.0/NFFT |  | ||||||
|       jstep=10*NB3 |  | ||||||
|       nz=(jz-jstart)/jstep -1 |  | ||||||
|       call zero(s,NQ) |  | ||||||
|       do n=1,nz |  | ||||||
|          call zero(x,NFFT) |  | ||||||
|          k=(n-1)*jstep |  | ||||||
|          do i=1,10 |  | ||||||
|             j=(i-1)*NB3 + 1 |  | ||||||
|             call move(data(jstart+k+j),x(j),512) |  | ||||||
|          enddo |  | ||||||
|          call xfft(x,NFFT) |  | ||||||
|          do i=1,NQ |  | ||||||
|             x(i)=ps(c(i)) |  | ||||||
|          enddo |  | ||||||
|          call add(s,x,s,NQ) |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
|       fac=(1.0/NFFT)**2 |  | ||||||
|       do i=1,NQ                                !Normalize |  | ||||||
|          s(i)=fac*s(i) |  | ||||||
|       enddo |  | ||||||
|       call smooth(s,NQ) |  | ||||||
| 
 |  | ||||||
| C  NB: could also compute a "blue" spectrum, using the sync-off intervals. |  | ||||||
|       n8=NQ/8 |  | ||||||
|       do i=1,n8 |  | ||||||
|          red(i)=0. |  | ||||||
|          do k=8*i-7,8*i |  | ||||||
|             red(i)=red(i)+s(k) |  | ||||||
|          enddo |  | ||||||
|          red(i)=10.0*red(i)/(8.0*nz) |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       dftol=min(DFTolerance,25) |  | ||||||
|       if(nfreeze.eq.1) dftol=DFTolerance |  | ||||||
| C  Find improved value for f0 |  | ||||||
|       smax=0. |  | ||||||
|       ia=(f0-dftol)/df |  | ||||||
|       ib=(f0+dftol)/df + 0.999 |  | ||||||
| !      if(NFreeze.eq.1) then |  | ||||||
| !         ia=(f0-5.)/df |  | ||||||
| !         ib=(f0+5.)/df |  | ||||||
| !      endif |  | ||||||
|       do i=ia,ib |  | ||||||
|          if(s(i).gt.smax) then |  | ||||||
|             smax=s(i) |  | ||||||
|             ipk=i |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
|       f0=ipk*df |  | ||||||
| 
 |  | ||||||
| C  Remove line at f0 from spectrum -- if it's strong enough. |  | ||||||
|       ia=(f0-150)/df |  | ||||||
|       ib=(f0+150)/df |  | ||||||
|       a1=0. |  | ||||||
|       a2=0. |  | ||||||
|       nsum=50 |  | ||||||
|       do i=1,nsum |  | ||||||
|          a1=a1+s(ia-i) |  | ||||||
|          a2=a2+s(ib+i) |  | ||||||
|       enddo |  | ||||||
|       a1=a1/nsum |  | ||||||
|       a2=a2/nsum |  | ||||||
|       smax=2.0*smax/(a1+a2) |  | ||||||
| 
 |  | ||||||
|       if(smax.gt.3.0) then |  | ||||||
|          b=(a2-a1)/(ib-ia) |  | ||||||
|          do i=ia,ib |  | ||||||
|             s(i)=a1 + (i-ia)*b |  | ||||||
|          enddo |  | ||||||
|       endif |  | ||||||
| 
 |  | ||||||
| C  Make a smoothed version of the spectrum. |  | ||||||
|       nsum=50 |  | ||||||
|       fac=1./(2*nsum+1) |  | ||||||
|       call zero(x,nsum) |  | ||||||
|       call zero(s,50) |  | ||||||
|       call zero(s(NQ-nsum),nsum) |  | ||||||
|       sum=0. |  | ||||||
|       do i=nsum+1,NQ-nsum |  | ||||||
|          sum=sum+s(i+nsum)-s(i-nsum) |  | ||||||
|          x(i)=fac*sum |  | ||||||
|       enddo |  | ||||||
|       call zero(x(NQ-nsum),nsum+1) |  | ||||||
| 
 |  | ||||||
| C  To zap birdies, compare s(i) and x(i).  If s(i) is larger by more |  | ||||||
| C  than some limit, replace x(i) by s(i).  That will put narrow birdies |  | ||||||
| C  on top of the smoothed spectrum. |  | ||||||
| 
 |  | ||||||
|       call move(x,s,NQ)                 !Copy smoothed spectrum into s |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										69
									
								
								synct.f
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								synct.f
									
									
									
									
									
								
							| @ -1,69 +0,0 @@ | |||||||
|       subroutine synct(data,jz,jstart,f0,smax) |  | ||||||
| 
 |  | ||||||
| C  Gets a refined value of jstart. |  | ||||||
| 
 |  | ||||||
|       parameter (NMAX=30*11025) |  | ||||||
|       parameter (NB3=3*512) |  | ||||||
|       real data(jz) |  | ||||||
|       real*8 dpha,twopi |  | ||||||
|       complex*16 z,dz |  | ||||||
|       complex c,c1,zz |  | ||||||
|       common/hcom/c(NMAX) |  | ||||||
| 
 |  | ||||||
|       ps(zz)=real(zz)**2 + aimag(zz)**2          !Power spectrum function |  | ||||||
| 
 |  | ||||||
| C  Convert data to baseband (complex result) using quadrature LO. |  | ||||||
|       twopi=8*atan(1.d0) |  | ||||||
|       dpha=twopi*f0/11025.d0 |  | ||||||
|       dz=cmplx(cos(dpha),-sin(dpha)) |  | ||||||
|       z=1.d0/dz |  | ||||||
|       do i=1,jz |  | ||||||
|          z=z*dz |  | ||||||
|          c(i)=data(i)*z |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Detect zero-beat sync tone in 512-sample chunks, stepped by 1. |  | ||||||
| C  Sums replace original values in c(i). |  | ||||||
| 
 |  | ||||||
|       zz=0 |  | ||||||
|       do i=1,512                      !Compute first sum |  | ||||||
|          zz=zz+c(i) |  | ||||||
|       enddo |  | ||||||
|       c1=c(1) |  | ||||||
|       c(1)=zz |  | ||||||
|       do i=2,jz-512                   !Compute the rest recursively |  | ||||||
|          zz=c(i-1)+c(i+511)-c1 |  | ||||||
|          c1=c(i)                      !Save original value |  | ||||||
|          c(i)=zz                      !Save the sum |  | ||||||
|       enddo |  | ||||||
| 
 |  | ||||||
| C  Iterate to find the best jstart. |  | ||||||
|       jstart=jstart+NB3 |  | ||||||
|       nz=(jz-jstart)/NB3 -1 |  | ||||||
|       smax=0. |  | ||||||
|       jstep=256 |  | ||||||
|       jbest=jstart |  | ||||||
| 
 |  | ||||||
|  10   jstep=jstep/2 |  | ||||||
|       jstart=jbest |  | ||||||
|       do j=jstart-jstep,jstart+jstep,jstep |  | ||||||
|          s=0. |  | ||||||
|          r=0. |  | ||||||
|          do n=1,nz |  | ||||||
|             k=(n-1)*NB3 + j |  | ||||||
|             s=s + ps(c(k)) |  | ||||||
|             r=r + ps(c(k+512)) + ps(c(k+1024)) |  | ||||||
|          enddo |  | ||||||
|          s=2*s/r                               !Better to use s/r or s-r? |  | ||||||
|          if(s.gt.smax) then |  | ||||||
|             smax=s |  | ||||||
|             jbest=j |  | ||||||
|          endif |  | ||||||
|       enddo |  | ||||||
|       if(jstep.gt.1) go to 10 |  | ||||||
| 
 |  | ||||||
|       jstart=jbest |  | ||||||
|       if(jstart.gt.NB3) jstart=jstart-NB3 |  | ||||||
| 
 |  | ||||||
|       return |  | ||||||
|       end |  | ||||||
							
								
								
									
										110
									
								
								wsjt1.F
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								wsjt1.F
									
									
									
									
									
								
							| @ -197,116 +197,6 @@ C  Intentionally degrade SNR by -nclip dB. | |||||||
|  	   goto 900 |  	   goto 900 | ||||||
|  	endif |  	endif | ||||||
| 
 | 
 | ||||||
| ! If we're in JT6M mode, call the 6M decoding routines. |  | ||||||
| 	if(mode.eq.4) then |  | ||||||
| 	   do i=1,jz                    !### Why is it level-sensitive? |  | ||||||
| 	      dat(i)=dat(i)/25.0 |  | ||||||
| 	   enddo |  | ||||||
| ! For waterfall plot |  | ||||||
| 	   call spec2d(dat,jz,nstep,s2,nchan,nz,psavg,sigma) |  | ||||||
| 	   if(sigma.lt.0.0) basevb=-99.0 |  | ||||||
| 	   if(jz/11025.0.lt.3.9 .or. sigma.lt.0.0) go to 900 |  | ||||||
| 
 |  | ||||||
| 	   f0=1076.66 |  | ||||||
| 	   if(NFreeze.eq.1) f0=1076.66 + MouseDF |  | ||||||
| 	   f00=f0 |  | ||||||
| 	   call syncf0(dat,jz,NFreeze,DFTolerance,jstart,f0,smax) |  | ||||||
| 	   call synct(dat,jz,jstart,f0,smax) |  | ||||||
| 	   call syncf1(dat,jz,jstart,f0,NFreeze,DFTolerance,smax,red) |  | ||||||
| 
 |  | ||||||
| 	   do i=1,512 |  | ||||||
| 	      ccf(i-6)=dB(red(i)) |  | ||||||
| 	   enddo |  | ||||||
| 	   df=11025./256. |  | ||||||
| 	   do i=1,64 |  | ||||||
| 	      sum=0. |  | ||||||
| 	      do k=8*i-7,8*i |  | ||||||
| 		 sum=sum+red(k) |  | ||||||
| 	      enddo |  | ||||||
| 	      psavg(i)=5.0*sum |  | ||||||
| 	      fac=1.0 |  | ||||||
| 	      freq=i*df |  | ||||||
| 	      if(freq.gt.2500.0) fac=((freq-2500.)/20.0)**(-1.0) |  | ||||||
| 	      psavg(i)=fac*psavg(i) |  | ||||||
| 	      psavg(i+64)=0.001 |  | ||||||
| 	   enddo |  | ||||||
| 
 |  | ||||||
| 	   jz=jz-jstart+1 |  | ||||||
| 	   nslim=MinSigdB |  | ||||||
| 	   NFixLen=0 |  | ||||||
| 
 |  | ||||||
| C  Call the decoder if DF is in range or Freeze is off. |  | ||||||
|  	   if(NFreeze.eq.0 .or.  |  | ||||||
|      +         abs(f0-f00).lt.float(DFTolerance)) then |  | ||||||
| 	      call decode6m(dat(jstart),jz,cfile6,nslim,istart, |  | ||||||
|      +            NFixLen,lcum,f0,lumsg,npkept,yellow) |  | ||||||
| 	   endif |  | ||||||
| 
 |  | ||||||
| 	   if(pick) then |  | ||||||
| 	      do i=1,216 |  | ||||||
| 		 ps0(i)=yellow0(i) |  | ||||||
| 	      enddo |  | ||||||
| 	   else |  | ||||||
| 	      ps0(216)=yellow(216) |  | ||||||
| 	      yellow0(216)=yellow(216) |  | ||||||
| 	      do i=1,215 |  | ||||||
| 		 ps0(i)=2*yellow(i) |  | ||||||
| 		 yellow0(i)=ps0(i) |  | ||||||
| 	      enddo |  | ||||||
| 	   endif |  | ||||||
| 	   goto 800 |  | ||||||
| 	endif |  | ||||||
| 
 |  | ||||||
| !  We're in FSK441 mode. Compute the 2D spectrum. |  | ||||||
| 	df=11025.0/256.0            !FFT resolution ~43 Hz |  | ||||||
| 	dtbuf=nstep/11025.0 |  | ||||||
| 	stlim=nslim2                !Single-tone threshold |  | ||||||
| 	call spec2d(dat,jz,nstep,s2,nchan,nz,psavg,sigma) |  | ||||||
| 	if(sigma.lt.0.0) basevb=-99.0 |  | ||||||
| 	if(sigma.lt.0.0) go to 900 |  | ||||||
| 	nline0=nline |  | ||||||
| 	STfound=.false. |  | ||||||
| 	npkept=0 |  | ||||||
| 
 |  | ||||||
| C  Look for single-tone messages |  | ||||||
| 	if((.not.pick) .or. MouseButton.eq.1) then |  | ||||||
| 	   call stdecode(s2,nchan,nz,sigma,dtbuf,df,stlim, |  | ||||||
|      +       DFTolerance,cfile6,pick,istart) |  | ||||||
| 	endif |  | ||||||
| 	if(nline.gt.nline0) STfound=.true.  !ST message(s) found |  | ||||||
| 
 |  | ||||||
| C  Now the multi-tone decoding |  | ||||||
| 	call mtdecode(dat,jz,nz,MinSigdB,MinWidth, |  | ||||||
|      +    NQRN,DFTolerance,istart,pick,cfile6,ps0) |  | ||||||
| 
 |  | ||||||
| 	npkept=nline             !Number of pings that were kept |  | ||||||
| 	smax=0. |  | ||||||
| 	stbest=.false. |  | ||||||
| 	if(npkept.gt.0) then |  | ||||||
| 	   call indexx(npkept,tping,indx) !Merge the ST and MT decodes |  | ||||||
| 	   do i=1,npkept |  | ||||||
| 	      j=indx(i) |  | ||||||
| 	      if(pick .and. STFound .and. |  | ||||||
|      +          line(j)(29:31).eq.'   ') goto 10 |  | ||||||
| 	      write(lumsg,1050) line(j)	!Write to decoded.txt |  | ||||||
|  1050	      format(a79) |  | ||||||
| 	      if(lcum) write(21,1050) line(j) !Write to ALL.TXT |  | ||||||
| 	      read(line(j),1060) sig,msg3 |  | ||||||
|  1060	      format(16x,f3.0,9x,a3) |  | ||||||
| 	      if(sig.gt.smax) then |  | ||||||
| 		 smax=sig |  | ||||||
| 		 tbest=tping(j) |  | ||||||
| 		 stbest = (msg3.ne.'   ') |  | ||||||
| 	      endif |  | ||||||
|  10	   enddo |  | ||||||
| 	endif |  | ||||||
| 
 |  | ||||||
| 	dt=1.0/11025.0                !Compute spectrum for pink curve |  | ||||||
| 	if(stbest) then |  | ||||||
| 	   jj=nint(tbest/dt) |  | ||||||
| 	   call spec441(dat(jj),1102,ps0,f0) |  | ||||||
| 	endif |  | ||||||
| 
 |  | ||||||
|  800	continue |  800	continue | ||||||
|         call s2shape(s2,nchan,nz,tbest) |         call s2shape(s2,nchan,nz,tbest) | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										123
									
								
								wsjtgen.F90
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								wsjtgen.F90
									
									
									
									
									
								
							| @ -117,121 +117,34 @@ subroutine wsjtgen | |||||||
|   dt=1.d0/fsample_out |   dt=1.d0/fsample_out | ||||||
|   LTone=2 |   LTone=2 | ||||||
| 
 | 
 | ||||||
|   if(mode(1:4).eq.'JT65') then |  | ||||||
| !  We're in JT65 mode. | !  We're in JT65 mode. | ||||||
|      if(mode(5:5).eq.'A') mode65=1 |   if(mode(5:5).eq.'A') mode65=1 | ||||||
|      if(mode(5:5).eq.'B') mode65=2 |   if(mode(5:5).eq.'B') mode65=2 | ||||||
|      if(mode(5:5).eq.'C') mode65=4 |   if(mode(5:5).eq.'C') mode65=4 | ||||||
|      call gen65(msg,mode65,samfacout,iwave,nwave,sendingsh,msgsent) |   call gen65(msg,mode65,samfacout,iwave,nwave,sendingsh,msgsent) | ||||||
| 
 | 
 | ||||||
|      if(lcwid) then |   if(lcwid) then | ||||||
| !  Generate and insert the CW ID. |  | ||||||
|         wpm=25. |  | ||||||
|         freqcw=800. |  | ||||||
|         idmsg=MyCall//'          ' |  | ||||||
|         call gencwid(idmsg,wpm,freqcw,samfacout,icwid,ncwid) |  | ||||||
|         k=nwave |  | ||||||
|         do i=1,ncwid |  | ||||||
|            k=k+1 |  | ||||||
|            iwave(k)=icwid(i) |  | ||||||
|         enddo |  | ||||||
|         do i=1,2205                   !Add 0.2 s of silence |  | ||||||
|            k=k+1 |  | ||||||
|            iwave(k)=0 |  | ||||||
|         enddo |  | ||||||
|         nwave=k |  | ||||||
|      endif |  | ||||||
| 
 |  | ||||||
|      goto 900 |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   if(mode(1:4).eq.'Echo') then |  | ||||||
| !  We're in Echo mode. |  | ||||||
| !     dither=AmpA |  | ||||||
| !     call echogen(dither,wavefile,nbytes,f1) |  | ||||||
| !     AmpB=f1 |  | ||||||
|      goto 900 |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   if(mode(1:4).eq.'JT6M') then |  | ||||||
| !  We're in JT6M mode. |  | ||||||
|      call gen6m(msg,samfacout,iwave,nwave) |  | ||||||
|      goto 900 |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
|   if(mode(1:2).eq.'CW') then |  | ||||||
| !  We're in CW mode |  | ||||||
|      wpm=15. |  | ||||||
|      freqcw=800. |  | ||||||
|      call gencw(msg,wpm,freqcw,samfacout,TRPeriod,iwave,nwave) |  | ||||||
|      goto 900 |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
| !  We're in FSK441 mode. |  | ||||||
|   if(nmsg.lt.28) nmsg=nmsg+1          !Add trailing blank if nmsg < 28 |  | ||||||
| 
 |  | ||||||
| !  Check for shorthand messages |  | ||||||
|   sendingsh = 0 |  | ||||||
|   if(shok.eq.1 .and. nmsg.le.4) then |  | ||||||
|      if (msg(1:3).eq.'R26') then |  | ||||||
|         msg='++' |  | ||||||
|         nmsg=2 |  | ||||||
|         sendingsh = 1 |  | ||||||
|      else if (msg(1:3).eq.'R27') then |  | ||||||
|         msg='**' |  | ||||||
|         nmsg=2 |  | ||||||
|         sendingsh = 1 |  | ||||||
|      else if (msg(1:3).eq.'RRR') then |  | ||||||
|         msg='%%' |  | ||||||
|         nmsg=2 |  | ||||||
|         sendingsh = 1 |  | ||||||
|      else if (msg(1:2).eq.'73') then |  | ||||||
|         msg='@@' |  | ||||||
|         nmsg=2 |  | ||||||
|         sendingsh = 1 |  | ||||||
|      endif |  | ||||||
|   endif |  | ||||||
| 
 |  | ||||||
| !  Encode the message |  | ||||||
|   call abc441(msg,nmsg,itone,ndits) |  | ||||||
|   ndata=ndits*nspd |  | ||||||
| 
 |  | ||||||
| ! Generate iwave |  | ||||||
|   k=0 |  | ||||||
|   df=11025.0/NSPD |  | ||||||
|   do m=1,ndits |  | ||||||
|      freq=(LTone-1+itone(m))*df |  | ||||||
|      dpha=twopi*freq*dt |  | ||||||
|      do i=1,NSPD |  | ||||||
|         k=k+1 |  | ||||||
|         pha=pha+dpha |  | ||||||
|         iwave(k)=nint(32767.0*sin(pha)) |  | ||||||
|      enddo |  | ||||||
|   enddo |  | ||||||
|   nwave=k |  | ||||||
|    |  | ||||||
| 900 sending=txmsg |  | ||||||
|   if(mode(1:4).eq.'JT65' .and. sendingsh.ne.1) sending=msgsent |  | ||||||
|   nmsg=nmsg0 |  | ||||||
| 
 |  | ||||||
|   if(lcwid .and. (mode.eq.'FSK441' .or. mode(1:4).eq.'JT6M')) then |  | ||||||
| !  Generate and insert the CW ID. | !  Generate and insert the CW ID. | ||||||
|      wpm=25. |      wpm=25. | ||||||
|      freqcw=440. |      freqcw=800. | ||||||
|      idmsg=MyCall//'          ' |      idmsg=MyCall//'          ' | ||||||
|      call gencwid(idmsg,wpm,freqcw,samfacout,icwid,ncwid) |      call gencwid(idmsg,wpm,freqcw,samfacout,icwid,ncwid) | ||||||
|      k=0 |      k=nwave | ||||||
|      do i=ncwid+1,int(trperiod*fsample_out) |  | ||||||
|         k=k+1 |  | ||||||
|         if(k.gt.nwave) k=k-nwave |  | ||||||
|         iwave(i)=iwave(k) |  | ||||||
|      enddo |  | ||||||
|      do i=1,ncwid |      do i=1,ncwid | ||||||
|         iwave(i)=icwid(i) |         k=k+1 | ||||||
|  |         iwave(k)=icwid(i) | ||||||
|      enddo |      enddo | ||||||
|      nwave=trperiod*fsample_out |      do i=1,2205                   !Add 0.2 s of silence | ||||||
|  |         k=k+1 | ||||||
|  |         iwave(k)=0 | ||||||
|  |      enddo | ||||||
|  |      nwave=k | ||||||
|   endif |   endif | ||||||
| 
 | 
 | ||||||
|  | 900 sending=txmsg | ||||||
|  |   if(sendingsh.ne.1) sending=msgsent | ||||||
|  |   nmsg=nmsg0 | ||||||
|  | 
 | ||||||
| 999  return | 999  return | ||||||
| end subroutine wsjtgen | end subroutine wsjtgen | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user