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) | ||||
|   enddo | ||||
| 
 | ||||
|   if(nblank.ne.0) call blanker(d2d,jz) | ||||
| 
 | ||||
|   nseg=1 | ||||
|   if(mode(1:4).eq.'JT65') then | ||||
|      i=index(FileID,'.')-3 | ||||
| @ -78,23 +76,7 @@ subroutine decode3(d2,jz,istart,filename) | ||||
|    | ||||
|   nclearave=0 | ||||
|   nagain=0 | ||||
|   if(mode(1:4).eq.'JT65') then | ||||
|      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 | ||||
|   call pix2d65(d2d,jz) | ||||
| 
 | ||||
| 999 return | ||||
| 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=2048*npts | ||||
|      kread=0 | ||||
|      if(nspeed.ge.6) then | ||||
|         call hscroll(a,nx) | ||||
|         nx=0 | ||||
|      endif | ||||
|   endif | ||||
|   if(npts.lt.0) npts=npts+nmax | ||||
|   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 | ||||
| 
 | ||||
|   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) | ||||
| 
 | ||||
|   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 | ||||
|  	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 | ||||
|         call s2shape(s2,nchan,nz,tbest) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										123
									
								
								wsjtgen.F90
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								wsjtgen.F90
									
									
									
									
									
								
							| @ -117,121 +117,34 @@ subroutine wsjtgen | ||||
|   dt=1.d0/fsample_out | ||||
|   LTone=2 | ||||
| 
 | ||||
|   if(mode(1:4).eq.'JT65') then | ||||
| !  We're in JT65 mode. | ||||
|      if(mode(5:5).eq.'A') mode65=1 | ||||
|      if(mode(5:5).eq.'B') mode65=2 | ||||
|      if(mode(5:5).eq.'C') mode65=4 | ||||
|      call gen65(msg,mode65,samfacout,iwave,nwave,sendingsh,msgsent) | ||||
|   if(mode(5:5).eq.'A') mode65=1 | ||||
|   if(mode(5:5).eq.'B') mode65=2 | ||||
|   if(mode(5:5).eq.'C') mode65=4 | ||||
|   call gen65(msg,mode65,samfacout,iwave,nwave,sendingsh,msgsent) | ||||
| 
 | ||||
|      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 | ||||
|   if(lcwid) then | ||||
| !  Generate and insert the CW ID. | ||||
|      wpm=25. | ||||
|      freqcw=440. | ||||
|      freqcw=800. | ||||
|      idmsg=MyCall//'          ' | ||||
|      call gencwid(idmsg,wpm,freqcw,samfacout,icwid,ncwid) | ||||
|      k=0 | ||||
|      do i=ncwid+1,int(trperiod*fsample_out) | ||||
|         k=k+1 | ||||
|         if(k.gt.nwave) k=k-nwave | ||||
|         iwave(i)=iwave(k) | ||||
|      enddo | ||||
|      k=nwave | ||||
|      do i=1,ncwid | ||||
|         iwave(i)=icwid(i) | ||||
|         k=k+1 | ||||
|         iwave(k)=icwid(i) | ||||
|      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 | ||||
| 
 | ||||
| 900 sending=txmsg | ||||
|   if(sendingsh.ne.1) sending=msgsent | ||||
|   nmsg=nmsg0 | ||||
| 
 | ||||
| 999  return | ||||
| end subroutine wsjtgen | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user