From 6a6ce480d9771128ef016a854aa8962d42ffafb6 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 2 Jun 2020 01:59:27 +0100 Subject: [PATCH 01/19] Update NEWS --- NEWS | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index b2bb80c7f..626f697db 100644 --- a/NEWS +++ b/NEWS @@ -10,7 +10,75 @@ \$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$ -Copyright 2001 - 2019 by Joe Taylor, K1JT. +Copyright 2001 - 2020 by Joe Taylor, K1JT. + + + Release: WSJT-X 2.2 + June 2, 2020 + ------------------- + +WSJT-X 2.2 is a program upgrade that provides a number of new features +and capabilities. Here is a brief summary; for further details see +the notes for candidate releases 2.2.0-rc1, -rc2, and -rc3, below, and +of course the updated WSJT-X 2.2 User Guide. + + - Significant improvements to the decoders for FT4, FT8, JT4, JT65, + and WSPR. + + - New format for "EU VHF Contest" Tx2 and Tx3 messages + + When "EU VHF Contest" is selected, the Tx2 and Tx3 messages (those + conveying signal report, serial number, and 6-character locator) + now use hashcodes for both callsigns. This change is NOT backward + compatible with earlier versions of _WSJT-X_, so all users of EU + VHF Contest messages should be sure to upgrade to version 2.2.0. + + - Accessibility + + Keyboard shortcuts have been added as an aid to accessibility: + Alt+R sets Tx4 message to RR73, Ctrl+R sets it to RRR. + + As an aid for partial color-blindness, the "inverted goal posts" + marking Rx frequency on the Wide Graph's frequency scale are now + rendered in a darker shade of green. + + - User Interface Translations have been enabled. Translations are + now available for Catalan, Spanish, Japanese, Chinese, and Hong + Kong Chinese. Additiional languages will follow, when available. + + Note that UI translation is automatic, based on your system primary + language. If you do not want the WSJT-X UI translated to your local + language then start WSJT-X with the '--language=en' command line + option: + + wsjtx --language=en + + If you wish to contribute by authoring WSJT-X UI translations + please join the new discussion group wsjtx-l10n@Groups.io + (https://groups.io/g/wsjtx-l10n), where help from other translation + authors and coordination with the development team is available. + + - Minor enhancements and bug fixes + + "Save None" now writes no .wav files to disk, even temporarily. + + An explicit entry for "WW Digi Contest" has been added to + "Special operating activities" on the "Settings | Advanced" tab. + + Contest mode FT4 now always uses RR73 for the Tx4 message. + + The Status bar now displays the number of decodes found in the + most recent Rx sequence. + + The "Highlight Callsign" UDP message has been enhanced to allow + clearing of old highlighting for a specified callsign. Please note + a recommended restriction on the use of this message in the + documentation here: https://tinyurl.com/y85nc3tg + + - Hamlib - this library which we use for direct rig control has had + many defect repairs and enhancements, we thank the contributors to + that project for their work. + Release: WSJT-X 2.2.0-rc3 May 30, 2020 From 451b6747b7af3e6c05c70eaa72f97da75821ac4f Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 15:27:49 +0100 Subject: [PATCH 02/19] Spring cleaning --- lib/fsk4hf/Makefile | 50 -- lib/fsk4hf/Makefile.win | 84 --- lib/fsk4hf/bitflip128_90.f90 | 59 --- lib/fsk4hf/bpdecode120.f90 | 306 ----------- lib/fsk4hf/bpdecode168.f90 | 380 ------------- lib/fsk4hf/bpdecode174_101.f90 | 111 ---- lib/fsk4hf/bpdecode174_74.f90 | 113 ---- lib/fsk4hf/bpdecode174b.f90 | 393 -------------- lib/fsk4hf/bpdecode204.f90 | 482 ----------------- lib/fsk4hf/bpdecode240_101.f90 | 111 ---- lib/fsk4hf/bpdecode280_101.f90 | 111 ---- lib/fsk4hf/bpdecode300.f90 | 708 ------------------------- lib/fsk4hf/chkcrc10.f90 | 27 - lib/fsk4hf/chkcrc12.f90 | 27 - lib/fsk4hf/costasxcorr.m | 14 - lib/fsk4hf/cpolyfit.f90 | 76 --- lib/fsk4hf/cpolyfitw.f90 | 68 --- lib/fsk4hf/dbpsksim.f90 | 241 --------- lib/fsk4hf/decode174_101.f90 | 128 ----- lib/fsk4hf/decode174_74.f90 | 128 ----- lib/fsk4hf/decode240_101.f90 | 133 ----- lib/fsk4hf/decode280_101.f90 | 133 ----- lib/fsk4hf/dopspread.f90 | 62 --- lib/fsk4hf/encode120.f90 | 116 ---- lib/fsk4hf/encode168.f90 | 141 ----- lib/fsk4hf/encode174_101.f90 | 46 -- lib/fsk4hf/encode174_74.f90 | 47 -- lib/fsk4hf/encode204.f90 | 48 -- lib/fsk4hf/encode240_101.f90 | 46 -- lib/fsk4hf/encode280_101.f90 | 46 -- lib/fsk4hf/encode300.f90 | 308 ----------- lib/fsk4hf/encode4K25A.f90 | 56 -- lib/fsk4hf/extractmessage168.f90 | 48 -- lib/fsk4hf/fftw3.f90 | 64 --- lib/fsk4hf/four2a.f90 | 115 ---- lib/fsk4hf/fsk4hf.f90 | 145 ----- lib/fsk4hf/fsk4sim.f90 | 185 ------- lib/fsk4hf/ft280d.f90 | 427 --------------- lib/fsk4hf/ft280sim.f90 | 113 ---- lib/fsk4hf/ft2_params.f90 | 12 - lib/fsk4hf/ft2d.f90 | 335 ------------ lib/fsk4hf/ft2sim.f90 | 154 ------ lib/fsk4hf/ft4d.f90 | 329 ------------ lib/fsk4hf/ft4s280_params.f90 | 16 - lib/fsk4hf/ft4s_params.f90 | 16 - lib/fsk4hf/ft4sd.f90 | 473 ----------------- lib/fsk4hf/ft4slowsim.f90 | 113 ---- lib/fsk4hf/gen_wspr4wave.f90 | 68 --- lib/fsk4hf/genbpsk.f90 | 44 -- lib/fsk4hf/genfsk4.f90 | 36 -- lib/fsk4hf/genfsk4hf.f90 | 51 -- lib/fsk4hf/genft2.f90 | 86 --- lib/fsk4hf/genft280.f90 | 95 ---- lib/fsk4hf/genft4slow.f90 | 98 ---- lib/fsk4hf/genmskhf.f90 | 126 ----- lib/fsk4hf/genwspr4.f90 | 95 ---- lib/fsk4hf/genwspr5.f90 | 107 ---- lib/fsk4hf/genwspr_fsk8.f90 | 45 -- lib/fsk4hf/genwsprcpm.f90 | 76 --- lib/fsk4hf/genwsprdpsk.f90 | 63 --- lib/fsk4hf/genwsprlf.f90 | 137 ----- lib/fsk4hf/get_crc24.f90 | 25 - lib/fsk4hf/get_ft280_bitmetrics.f90 | 117 ---- lib/fsk4hf/get_ft4s_bitmetrics.f90 | 133 ----- lib/fsk4hf/get_wspr4_bitmetrics.f90 | 118 ----- lib/fsk4hf/getcandidates2.f90 | 63 --- lib/fsk4hf/getfc1.f90 | 58 -- lib/fsk4hf/getfc1w.f90 | 47 -- lib/fsk4hf/getfc2.f90 | 74 --- lib/fsk4hf/getfc2w.f90 | 82 --- lib/fsk4hf/gran.c | 28 - lib/fsk4hf/ldpc_174_101_generator.f90 | 76 --- lib/fsk4hf/ldpc_174_101_parity.f90 | 258 --------- lib/fsk4hf/ldpc_174_74_generator.f90 | 105 ---- lib/fsk4hf/ldpc_174_74_parity.f90 | 288 ---------- lib/fsk4hf/ldpc_174_91_a_colorder.f90 | 11 - lib/fsk4hf/ldpc_174_91_a_generator.f90 | 87 --- lib/fsk4hf/ldpc_174_91_a_params.f90 | 100 ---- lib/fsk4hf/ldpc_174_91_a_parity.f90 | 269 ---------- lib/fsk4hf/ldpc_204_68_params.f90 | 154 ------ lib/fsk4hf/ldpc_240_101_generator.f90 | 142 ----- lib/fsk4hf/ldpc_240_101_parity.f90 | 393 -------------- lib/fsk4hf/ldpc_280_101_generator.f90 | 182 ------- lib/fsk4hf/ldpc_280_101_parity.f90 | 476 ----------------- lib/fsk4hf/ldpc_300_60_params.f90 | 262 --------- lib/fsk4hf/ldpcsim120.f90 | 238 --------- lib/fsk4hf/ldpcsim168.f90 | 233 -------- lib/fsk4hf/ldpcsim174.f90 | 233 -------- lib/fsk4hf/ldpcsim174_101.f90 | 144 ----- lib/fsk4hf/ldpcsim174_74.f90 | 159 ------ lib/fsk4hf/ldpcsim204.f90 | 205 ------- lib/fsk4hf/ldpcsim240_101.f90 | 144 ----- lib/fsk4hf/ldpcsim280_101.f90 | 144 ----- lib/fsk4hf/ldpcsim300.f90 | 254 --------- lib/fsk4hf/msksoftsym.f90 | 81 --- lib/fsk4hf/msksoftsymw.f90 | 78 --- lib/fsk4hf/osd174_101.f90 | 403 -------------- lib/fsk4hf/osd174_74.f90 | 405 -------------- lib/fsk4hf/osd204.f90 | 372 ------------- lib/fsk4hf/osd240_101.f90 | 403 -------------- lib/fsk4hf/osd280_101.f90 | 403 -------------- lib/fsk4hf/osd300.f90 | 365 ------------- lib/fsk4hf/osdtbcc.f90 | 372 ------------- lib/fsk4hf/osdwspr.f90 | 373 ------------- lib/fsk4hf/polyfit4.f90 | 109 ---- lib/fsk4hf/spb.m | 89 ---- lib/fsk4hf/spb_128_90.dat | 19 - lib/fsk4hf/spec4.f90 | 35 -- lib/fsk4hf/spec8.f90 | 31 -- lib/fsk4hf/tccsim.f90 | 194 ------- lib/fsk4hf/tweak1.f90 | 23 - lib/fsk4hf/wavhdr.f90 | 110 ---- lib/fsk4hf/wspr4_params.f90 | 16 - lib/fsk4hf/wspr4d.f90 | 424 --------------- lib/fsk4hf/wspr4sim.f90 | 114 ---- lib/fsk4hf/wspr5_downsample.f90 | 29 - lib/fsk4hf/wspr5_wav.f90 | 48 -- lib/fsk4hf/wspr5d.f90 | 220 -------- lib/fsk4hf/wspr5d_exp.f90 | 570 -------------------- lib/fsk4hf/wspr5sim.f90 | 111 ---- lib/fsk4hf/wspr_fsk8_downsample.f90 | 27 - lib/fsk4hf/wspr_fsk8_params.f90 | 14 - lib/fsk4hf/wspr_fsk8_sim.f90 | 107 ---- lib/fsk4hf/wspr_fsk8_wav.f90 | 44 -- lib/fsk4hf/wspr_fsk8d.f90 | 197 ------- lib/fsk4hf/wspr_params.f90 | 23 - lib/fsk4hf/wspr_wav.f90 | 49 -- lib/fsk4hf/wsprcpm_params.f90 | 14 - lib/fsk4hf/wsprcpm_wav.f90 | 44 -- lib/fsk4hf/wsprcpmd.f90 | 586 -------------------- lib/fsk4hf/wsprcpmsim.f90 | 107 ---- lib/fsk4hf/wsprdpsk_params.f90 | 14 - lib/fsk4hf/wsprdpskd.f90 | 439 --------------- lib/fsk4hf/wsprdpsksim.f90 | 175 ------ lib/fsk4hf/wsprlf.f90 | 110 ---- lib/fsk4hf/wsprlf_params.f90 | 14 - lib/fsk4hf/wsprlfsim.f90 | 286 ---------- lib/fsk4hf/wsprsimf.f90 | 113 ---- 138 files changed, 21533 deletions(-) delete mode 100644 lib/fsk4hf/Makefile delete mode 100644 lib/fsk4hf/Makefile.win delete mode 100644 lib/fsk4hf/bitflip128_90.f90 delete mode 100644 lib/fsk4hf/bpdecode120.f90 delete mode 100644 lib/fsk4hf/bpdecode168.f90 delete mode 100644 lib/fsk4hf/bpdecode174_101.f90 delete mode 100644 lib/fsk4hf/bpdecode174_74.f90 delete mode 100644 lib/fsk4hf/bpdecode174b.f90 delete mode 100644 lib/fsk4hf/bpdecode204.f90 delete mode 100644 lib/fsk4hf/bpdecode240_101.f90 delete mode 100644 lib/fsk4hf/bpdecode280_101.f90 delete mode 100644 lib/fsk4hf/bpdecode300.f90 delete mode 100644 lib/fsk4hf/chkcrc10.f90 delete mode 100644 lib/fsk4hf/chkcrc12.f90 delete mode 100644 lib/fsk4hf/costasxcorr.m delete mode 100644 lib/fsk4hf/cpolyfit.f90 delete mode 100644 lib/fsk4hf/cpolyfitw.f90 delete mode 100644 lib/fsk4hf/dbpsksim.f90 delete mode 100644 lib/fsk4hf/decode174_101.f90 delete mode 100644 lib/fsk4hf/decode174_74.f90 delete mode 100644 lib/fsk4hf/decode240_101.f90 delete mode 100644 lib/fsk4hf/decode280_101.f90 delete mode 100644 lib/fsk4hf/dopspread.f90 delete mode 100644 lib/fsk4hf/encode120.f90 delete mode 100644 lib/fsk4hf/encode168.f90 delete mode 100644 lib/fsk4hf/encode174_101.f90 delete mode 100644 lib/fsk4hf/encode174_74.f90 delete mode 100644 lib/fsk4hf/encode204.f90 delete mode 100644 lib/fsk4hf/encode240_101.f90 delete mode 100644 lib/fsk4hf/encode280_101.f90 delete mode 100644 lib/fsk4hf/encode300.f90 delete mode 100644 lib/fsk4hf/encode4K25A.f90 delete mode 100644 lib/fsk4hf/extractmessage168.f90 delete mode 100644 lib/fsk4hf/fftw3.f90 delete mode 100644 lib/fsk4hf/four2a.f90 delete mode 100644 lib/fsk4hf/fsk4hf.f90 delete mode 100644 lib/fsk4hf/fsk4sim.f90 delete mode 100644 lib/fsk4hf/ft280d.f90 delete mode 100644 lib/fsk4hf/ft280sim.f90 delete mode 100644 lib/fsk4hf/ft2_params.f90 delete mode 100644 lib/fsk4hf/ft2d.f90 delete mode 100644 lib/fsk4hf/ft2sim.f90 delete mode 100644 lib/fsk4hf/ft4d.f90 delete mode 100644 lib/fsk4hf/ft4s280_params.f90 delete mode 100644 lib/fsk4hf/ft4s_params.f90 delete mode 100644 lib/fsk4hf/ft4sd.f90 delete mode 100644 lib/fsk4hf/ft4slowsim.f90 delete mode 100644 lib/fsk4hf/gen_wspr4wave.f90 delete mode 100644 lib/fsk4hf/genbpsk.f90 delete mode 100644 lib/fsk4hf/genfsk4.f90 delete mode 100644 lib/fsk4hf/genfsk4hf.f90 delete mode 100644 lib/fsk4hf/genft2.f90 delete mode 100644 lib/fsk4hf/genft280.f90 delete mode 100644 lib/fsk4hf/genft4slow.f90 delete mode 100644 lib/fsk4hf/genmskhf.f90 delete mode 100644 lib/fsk4hf/genwspr4.f90 delete mode 100644 lib/fsk4hf/genwspr5.f90 delete mode 100644 lib/fsk4hf/genwspr_fsk8.f90 delete mode 100644 lib/fsk4hf/genwsprcpm.f90 delete mode 100644 lib/fsk4hf/genwsprdpsk.f90 delete mode 100644 lib/fsk4hf/genwsprlf.f90 delete mode 100644 lib/fsk4hf/get_crc24.f90 delete mode 100644 lib/fsk4hf/get_ft280_bitmetrics.f90 delete mode 100644 lib/fsk4hf/get_ft4s_bitmetrics.f90 delete mode 100644 lib/fsk4hf/get_wspr4_bitmetrics.f90 delete mode 100644 lib/fsk4hf/getcandidates2.f90 delete mode 100644 lib/fsk4hf/getfc1.f90 delete mode 100644 lib/fsk4hf/getfc1w.f90 delete mode 100644 lib/fsk4hf/getfc2.f90 delete mode 100644 lib/fsk4hf/getfc2w.f90 delete mode 100644 lib/fsk4hf/gran.c delete mode 100644 lib/fsk4hf/ldpc_174_101_generator.f90 delete mode 100644 lib/fsk4hf/ldpc_174_101_parity.f90 delete mode 100644 lib/fsk4hf/ldpc_174_74_generator.f90 delete mode 100644 lib/fsk4hf/ldpc_174_74_parity.f90 delete mode 100644 lib/fsk4hf/ldpc_174_91_a_colorder.f90 delete mode 100644 lib/fsk4hf/ldpc_174_91_a_generator.f90 delete mode 100644 lib/fsk4hf/ldpc_174_91_a_params.f90 delete mode 100644 lib/fsk4hf/ldpc_174_91_a_parity.f90 delete mode 100644 lib/fsk4hf/ldpc_204_68_params.f90 delete mode 100644 lib/fsk4hf/ldpc_240_101_generator.f90 delete mode 100644 lib/fsk4hf/ldpc_240_101_parity.f90 delete mode 100644 lib/fsk4hf/ldpc_280_101_generator.f90 delete mode 100644 lib/fsk4hf/ldpc_280_101_parity.f90 delete mode 100644 lib/fsk4hf/ldpc_300_60_params.f90 delete mode 100644 lib/fsk4hf/ldpcsim120.f90 delete mode 100644 lib/fsk4hf/ldpcsim168.f90 delete mode 100644 lib/fsk4hf/ldpcsim174.f90 delete mode 100644 lib/fsk4hf/ldpcsim174_101.f90 delete mode 100644 lib/fsk4hf/ldpcsim174_74.f90 delete mode 100644 lib/fsk4hf/ldpcsim204.f90 delete mode 100644 lib/fsk4hf/ldpcsim240_101.f90 delete mode 100644 lib/fsk4hf/ldpcsim280_101.f90 delete mode 100644 lib/fsk4hf/ldpcsim300.f90 delete mode 100644 lib/fsk4hf/msksoftsym.f90 delete mode 100644 lib/fsk4hf/msksoftsymw.f90 delete mode 100644 lib/fsk4hf/osd174_101.f90 delete mode 100644 lib/fsk4hf/osd174_74.f90 delete mode 100644 lib/fsk4hf/osd204.f90 delete mode 100644 lib/fsk4hf/osd240_101.f90 delete mode 100644 lib/fsk4hf/osd280_101.f90 delete mode 100644 lib/fsk4hf/osd300.f90 delete mode 100644 lib/fsk4hf/osdtbcc.f90 delete mode 100644 lib/fsk4hf/osdwspr.f90 delete mode 100644 lib/fsk4hf/polyfit4.f90 delete mode 100644 lib/fsk4hf/spb.m delete mode 100644 lib/fsk4hf/spb_128_90.dat delete mode 100644 lib/fsk4hf/spec4.f90 delete mode 100644 lib/fsk4hf/spec8.f90 delete mode 100644 lib/fsk4hf/tccsim.f90 delete mode 100644 lib/fsk4hf/tweak1.f90 delete mode 100644 lib/fsk4hf/wavhdr.f90 delete mode 100644 lib/fsk4hf/wspr4_params.f90 delete mode 100644 lib/fsk4hf/wspr4d.f90 delete mode 100644 lib/fsk4hf/wspr4sim.f90 delete mode 100644 lib/fsk4hf/wspr5_downsample.f90 delete mode 100644 lib/fsk4hf/wspr5_wav.f90 delete mode 100644 lib/fsk4hf/wspr5d.f90 delete mode 100644 lib/fsk4hf/wspr5d_exp.f90 delete mode 100644 lib/fsk4hf/wspr5sim.f90 delete mode 100644 lib/fsk4hf/wspr_fsk8_downsample.f90 delete mode 100644 lib/fsk4hf/wspr_fsk8_params.f90 delete mode 100644 lib/fsk4hf/wspr_fsk8_sim.f90 delete mode 100644 lib/fsk4hf/wspr_fsk8_wav.f90 delete mode 100644 lib/fsk4hf/wspr_fsk8d.f90 delete mode 100644 lib/fsk4hf/wspr_params.f90 delete mode 100644 lib/fsk4hf/wspr_wav.f90 delete mode 100644 lib/fsk4hf/wsprcpm_params.f90 delete mode 100644 lib/fsk4hf/wsprcpm_wav.f90 delete mode 100644 lib/fsk4hf/wsprcpmd.f90 delete mode 100644 lib/fsk4hf/wsprcpmsim.f90 delete mode 100644 lib/fsk4hf/wsprdpsk_params.f90 delete mode 100644 lib/fsk4hf/wsprdpskd.f90 delete mode 100644 lib/fsk4hf/wsprdpsksim.f90 delete mode 100644 lib/fsk4hf/wsprlf.f90 delete mode 100644 lib/fsk4hf/wsprlf_params.f90 delete mode 100644 lib/fsk4hf/wsprlfsim.f90 delete mode 100644 lib/fsk4hf/wsprsimf.f90 diff --git a/lib/fsk4hf/Makefile b/lib/fsk4hf/Makefile deleted file mode 100644 index 9372821bc..000000000 --- a/lib/fsk4hf/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# Compilers -CC = gcc -CXX = g++ -FC = gfortran - -FFLAGS = -O2 -fbounds-check -Wall -Wno-conversion -CFLAGS = -O2 -I. - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: wsprlf - -OBJS0 = testpsk.o four2a.o bpfilter.o nonlinear.o tweak1.o spectrum.o smo.o -testpsk: $(OBJS0) - $(FC) -o testpsk $(OBJS0) -lfftw3f - -OBJS1 = gmsk8.o four2a.o gaussfilt.o -gmsk8: $(OBJS1) - $(FC) -o gmsk8 $(OBJS1) -lfftw3f - -OBJS2 = testfsk.o four2a.o smo.o -testfsk: $(OBJS2) - $(FC) -o testfsk $(OBJS2) -lfftw3f - -OBJS3 = fsk2sim.o four2a.o smo.o wavhdr.o gran.o -fsk2sim: $(OBJS3) - $(FC) -o fsk2sim $(OBJS3) -lfftw3f - -OBJS4 = fsk4sim.o four2a.o wavhdr.o gran.o tweak1.o -fsk4sim: $(OBJS4) - $(FC) -o fsk4sim $(OBJS4) -lfftw3f - -OBJS5 = wsprlf.o four2a.o -wsprlf: $(OBJS5) - $(FC) -o wsprlf $(OBJS5) -lfftw3f - -.PHONY : clean - -clean: - $(RM) *.o testpsk testfsk fsk2sim fsk4sim wsprlf diff --git a/lib/fsk4hf/Makefile.win b/lib/fsk4hf/Makefile.win deleted file mode 100644 index ab383557d..000000000 --- a/lib/fsk4hf/Makefile.win +++ /dev/null @@ -1,84 +0,0 @@ -# Compilers -CC = gcc -CXX = g++ -FC = gfortran - -FFLAGS = -O2 -fbounds-check -Wall -Wno-conversion -CFLAGS = -O2 -I. - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: dbpsksim.exe - -OBJS0 = testpsk.o four2a.o bpfilter.o nonlinear.o tweak1.o spectrum.o smo.o -testpsk: $(OBJS0) - $(FC) -o testpsk $(OBJS0) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS1 = gmsk8.o four2a.o gaussfilt.o -gmsk8: $(OBJS1) - $(FC) -o gmsk8 $(OBJS1) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS2 = testfsk.o four2a.o smo.o -testfsk: $(OBJS2) - $(FC) -o testfsk $(OBJS2) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS3 = fsk2sim.o four2a.o smo.o wavhdr.o gran.o -fsk2sim: $(OBJS3) - $(FC) -o fsk2sim $(OBJS3) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS4 = fsk4sim.o four2a.o gran.o genfsk4.o smo.o getsnr.o spec4.o \ - watterson.o db.o snr2_wsprlf.o pctile.o shell.o snr_wsprlf.o -fsk4sim.exe: $(OBJS4) - $(FC) -o fsk4sim.exe $(OBJS4) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS5 = wsprlf.o four2a.o downsample.o -wsprlf.exe: $(OBJS5) - $(FC) -o wsprlf.exe $(OBJS5) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS6 = wspr_gmsk.o four2a.o gaussfilt.o -wspr_gmsk.exe: $(OBJS6) - $(FC) -o wspr_gmsk.exe $(OBJS6) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS7 = wspr_msk.o four2a.o bpfilter.o -wspr_msk.exe: $(OBJS7) - $(FC) -o wspr_msk.exe $(OBJS7) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS8 = dbpsksim.o four2a.o gran.o genbpsk.o watterson.o db.o \ - encode120.o bpdecode120.o platanh.o -dbpsksim.exe: $(OBJS8) - $(FC) -o dbpsksim.exe $(OBJS8) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS9 = fsk4a.o four2a.o gran.o genfsk4a.o spec4.o \ - watterson.o db.o -fsk4a.exe: $(OBJS9) - $(FC) -o fsk4a.exe $(OBJS9) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS10 = gmsk8.o gaussfilt.o four2a.o -gmsk8.exe: $(OBJS10) - $(FC) -o gmsk8.exe $(OBJS10) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS11 = gmsksim.o four2a.o gran.o gengmsk.o genbpsk.o watterson.o db.o \ - encode168.o bpdecode168.o platanh.o gaussfilt.o tweak1.o smo121.o -gmsksim.exe: $(OBJS11) - $(FC) -o gmsksim.exe $(OBJS11) C:\JTSDK\fftw3f\libfftw3f-3.dll - -OBJS12 = mskhfsim.o four2a.o gran.o genmskhf.o watterson.o db.o \ - encode168.o bpdecode168.o platanh.o twkfreq1.o smo121.o \ - polyfit4.o -mskhfsim.exe: $(OBJS12) - $(FC) -o mskhfsim.exe $(OBJS12) C:\JTSDK\fftw3f\libfftw3f-3.dll - -.PHONY : clean - -clean: - $(RM) *.o testpsk.exe testfsk.exe fsk2sim.exe fsk4sim.exe wsprlf.exe diff --git a/lib/fsk4hf/bitflip128_90.f90 b/lib/fsk4hf/bitflip128_90.f90 deleted file mode 100644 index a4d73a1c6..000000000 --- a/lib/fsk4hf/bitflip128_90.f90 +++ /dev/null @@ -1,59 +0,0 @@ -subroutine bitflip128_90(llr,message77,cw,nharderror) -! -! A hard-decision bit flipping decoder for the (128,90) code. -! - - use iso_c_binding, only: c_loc,c_size_t - use crc - integer, parameter:: N=128, K=90, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message77(77) - integer Nm(11,M) - integer Mn(3,N) - integer nrw(M) - integer synd(M) - integer nuns(N) - real zn(N) - real llr(N) - - include "ldpc_128_90_reordered_parity.f90" - - decoded=0 - zn=llr - - do iter=0,0 - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - nuns=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) then - ncheck=ncheck+1 - do j=1,nrw(i) - nuns(Nm(j,i))=nuns(Nm(j,i))+1 - enddo - endif - enddo - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - decoded=cw(1:K) - call chkcrc13a(decoded,nbadcrc) - if(nbadcrc.eq.0) then - message77=decoded(1:77) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - return - endif - endif -! flip the sign on the symbols that show up in the largest number -! of un-satisfied parity checks - where( nuns .eq. maxval(nuns) ) zn=-zn - - enddo - llr=zn - nharderror=-1 - return - -end subroutine bitflip128_90 diff --git a/lib/fsk4hf/bpdecode120.f90 b/lib/fsk4hf/bpdecode120.f90 deleted file mode 100644 index c9b11ac39..000000000 --- a/lib/fsk4hf/bpdecode120.f90 +++ /dev/null @@ -1,306 +0,0 @@ -subroutine bpdecode120(llr,apmask,maxiterations,decoded,niterations,cw) - -! A log-domain belief propagation decoder for the (120,60) code. - -integer, parameter:: N=120, K=60, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(7,M) ! 5, 6, or 7 bits per check -integer Mn(3,N) ! 3 checks per bit -integer synd(M) -real tov(3,N) -real toc(7,M) -real tanhtoc(7,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) - -data colorder/ & - 0,1,2,21,3,4,5,6,7,8,20,10,9,11,12,23,13,28,14,31, & - 15,16,22,26,17,30,18,29,25,32,41,34,19,33,27,36,38,43,42,24, & - 37,39,45,40,35,44,47,46,50,51,53,48,52,56,54,57,55,49,58,61, & - 60,59,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, & - 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99, & - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119/ - -data Mn/ & - 1, 18, 48, & - 2, 4, 51, & - 3, 23, 47, & - 5, 36, 42, & - 6, 43, 49, & - 7, 24, 55, & - 8, 35, 60, & - 9, 26, 30, & - 10, 29, 45, & - 11, 13, 46, & - 12, 53, 54, & - 14, 20, 57, & - 15, 16, 58, & - 17, 39, 44, & - 19, 37, 41, & - 21, 28, 34, & - 22, 50, 59, & - 25, 31, 52, & - 27, 32, 38, & - 33, 40, 56, & - 1, 11, 47, & - 2, 10, 16, & - 3, 12, 27, & - 4, 24, 28, & - 5, 23, 60, & - 6, 29, 39, & - 7, 31, 54, & - 8, 50, 56, & - 9, 13, 14, & - 15, 22, 41, & - 17, 26, 40, & - 18, 25, 45, & - 19, 20, 55, & - 21, 30, 36, & - 32, 49, 59, & - 33, 53, 58, & - 34, 38, 46, & - 29, 35, 57, & - 37, 43, 48, & - 42, 51, 52, & - 7, 11, 44, & - 1, 42, 58, & - 2, 13, 49, & - 3, 20, 40, & - 4, 18, 56, & - 5, 45, 55, & - 6, 21, 31, & - 8, 46, 52, & - 9, 12, 48, & - 10, 37, 38, & - 14, 15, 25, & - 16, 17, 60, & - 19, 39, 53, & - 22, 44, 51, & - 23, 28, 41, & - 24, 32, 35, & - 26, 45, 59, & - 27, 33, 36, & - 30, 47, 54, & - 34, 50, 57, & - 33, 43, 55, & - 1, 41, 57, & - 2, 40, 54, & - 3, 6, 24, & - 4, 11, 59, & - 5, 13, 56, & - 7, 16, 34, & - 8, 19, 26, & - 9, 31, 58, & - 10, 21, 53, & - 12, 22, 60, & - 14, 38, 51, & - 15, 43, 46, & - 17, 48, 50, & - 18, 27, 39, & - 20, 28, 44, & - 23, 25, 49, & - 4, 29, 36, & - 30, 32, 52, & - 35, 37, 47, & - 39, 42, 59, & - 1, 21, 40, & - 2, 50, 55, & - 3, 8, 10, & - 5, 31, 37, & - 6, 14, 60, & - 7, 36, 49, & - 9, 34, 39, & - 11, 19, 25, & - 12, 52, 57, & - 13, 22, 29, & - 15, 30, 56, & - 16, 18, 20, & - 17, 24, 46, & - 23, 38, 58, & - 26, 28, 43, & - 2, 27, 41, & - 5, 32, 44, & - 33, 47, 51, & - 35, 48, 53, & - 42, 43, 54, & - 34, 45, 47, & - 1, 8, 49, & - 3, 14, 59, & - 4, 31, 46, & - 6, 20, 50, & - 7, 26, 53, & - 9, 10, 36, & - 11, 58, 60, & - 12, 21, 45, & - 13, 28, 33, & - 15, 17, 35, & - 16, 38, 52, & - 18, 41, 54, & - 19, 23, 32, & - 22, 40, 55, & - 24, 25, 42, & - 26, 27, 56, & - 29, 44, 54, & - 30, 37, 55/ - -data Nm/ & - 1, 21, 42, 62, 82, 103, 0, & - 2, 22, 43, 63, 83, 97, 0, & - 3, 23, 44, 64, 84, 104, 0, & - 2, 24, 45, 65, 78, 105, 0, & - 4, 25, 46, 66, 85, 98, 0, & - 5, 26, 47, 64, 86, 106, 0, & - 6, 27, 41, 67, 87, 107, 0, & - 7, 28, 48, 68, 84, 103, 0, & - 8, 29, 49, 69, 88, 108, 0, & - 9, 22, 50, 70, 84, 108, 0, & - 10, 21, 41, 65, 89, 109, 0, & - 11, 23, 49, 71, 90, 110, 0, & - 10, 29, 43, 66, 91, 111, 0, & - 12, 29, 51, 72, 86, 104, 0, & - 13, 30, 51, 73, 92, 112, 0, & - 13, 22, 52, 67, 93, 113, 0, & - 14, 31, 52, 74, 94, 112, 0, & - 1, 32, 45, 75, 93, 114, 0, & - 15, 33, 53, 68, 89, 115, 0, & - 12, 33, 44, 76, 93, 106, 0, & - 16, 34, 47, 70, 82, 110, 0, & - 17, 30, 54, 71, 91, 116, 0, & - 3, 25, 55, 77, 95, 115, 0, & - 6, 24, 56, 64, 94, 117, 0, & - 18, 32, 51, 77, 89, 117, 0, & - 8, 31, 57, 68, 96, 107, 118, & - 19, 23, 58, 75, 97, 118, 0, & - 16, 24, 55, 76, 96, 111, 0, & - 9, 26, 38, 78, 91, 119, 0, & - 8, 34, 59, 79, 92, 120, 0, & - 18, 27, 47, 69, 85, 105, 0, & - 19, 35, 56, 79, 98, 115, 0, & - 20, 36, 58, 61, 99, 111, 0, & - 16, 37, 60, 67, 88, 102, 0, & - 7, 38, 56, 80, 100, 112, 0, & - 4, 34, 58, 78, 87, 108, 0, & - 15, 39, 50, 80, 85, 120, 0, & - 19, 37, 50, 72, 95, 113, 0, & - 14, 26, 53, 75, 81, 88, 0, & - 20, 31, 44, 63, 82, 116, 0, & - 15, 30, 55, 62, 97, 114, 0, & - 4, 40, 42, 81, 101, 117, 0, & - 5, 39, 61, 73, 96, 101, 0, & - 14, 41, 54, 76, 98, 119, 0, & - 9, 32, 46, 57, 102, 110, 0, & - 10, 37, 48, 73, 94, 105, 0, & - 3, 21, 59, 80, 99, 102, 0, & - 1, 39, 49, 74, 100, 0, 0, & - 5, 35, 43, 77, 87, 103, 0, & - 17, 28, 60, 74, 83, 106, 0, & - 2, 40, 54, 72, 99, 0, 0, & - 18, 40, 48, 79, 90, 113, 0, & - 11, 36, 53, 70, 100, 107, 0, & - 11, 27, 59, 63, 101, 114, 119, & - 6, 33, 46, 61, 83, 116, 120, & - 20, 28, 45, 66, 92, 118, 0, & - 12, 38, 60, 62, 90, 0, 0, & - 13, 36, 42, 69, 95, 109, 0, & - 17, 35, 57, 65, 81, 104, 0, & - 7, 25, 52, 71, 86, 109, 0/ - -data nrw/ & -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, & -6,6,6,6,6,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6, & -6,6,6,6,6,6,6,5,6,6,5,6,6,7,7,6,5,6,6,6/ - -ncw=3 - -toc=0 -tov=0 -tanhtoc=0 -!write(*,*) llr -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -!write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - niterations=iter - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 3 .and. iter .ge. 5 .and. ncheck .gt. 10) then - niterations=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:7,i)=tanh(-toc(1:7,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -niterations=-1 -return -end subroutine bpdecode120 diff --git a/lib/fsk4hf/bpdecode168.f90 b/lib/fsk4hf/bpdecode168.f90 deleted file mode 100644 index d527f71d2..000000000 --- a/lib/fsk4hf/bpdecode168.f90 +++ /dev/null @@ -1,380 +0,0 @@ -subroutine bpdecode168(llr,apmask,maxiterations,decoded,niterations) -! -! A log-domain belief propagation decoder for the (168,84) code. -! -integer, parameter:: N=168, K=84, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(7,M) ! 5, 6, or 7 bits per check -integer Mn(3,N) ! 3 checks per bit -integer synd(M) -real tov(3,N) -real toc(7,M) -real tanhtoc(7,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) - -data colorder/0,1,2,3,28,4,5,6,7,8,9,10,11,34,12,32,13,14,15,16,17, & - 18,36,29,42,31,20,21,41,40,30,38,22,19,47,37,46,35,44,33,49,24, & - 43,51,25,26,27,50,52,57,69,54,55,45,59,58,56,61,60,53,48,23,62, & - 63,64,67,66,65,68,39,70,71,72,74,73,75,76,77,80,81,78,82,79,83, & - 84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, & - 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, & - 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146, & - 147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167/ - -data Mn/ & - 1,24,67, & - 2,5,71, & - 3,31,66, & - 4,50,58, & - 6,60,65, & - 7,32,76, & - 8,49,83, & - 9,36,41, & - 10,40,63, & - 11,14,62, & - 12,72,75, & - 13,23,78, & - 15,16,80, & - 17,54,64, & - 18,51,59, & - 19,30,48, & - 20,68,81, & - 21,29,70, & - 22,25,43, & - 26,34,73, & - 27,35,37, & - 28,39,44, & - 33,53,55, & - 38,52,84, & - 42,56,57, & - 45,74,82, & - 46,69,79, & - 47,61,77, & - 1,4,5, & - 2,48,52, & - 3,47,82, & - 6,26,76, & - 7,9,16, & - 8,10,78, & - 11,36,56, & - 12,38,65, & - 13,43,81, & - 14,33,68, & - 15,18,44, & - 17,59,77, & - 19,27,69, & - 20,21,58, & - 22,45,79, & - 23,34,54, & - 24,28,40, & - 25,80,84, & - 29,37,51, & - 30,42,83, & - 31,63,72, & - 32,50,66, & - 35,67,73, & - 39,55,74, & - 41,61,71, & - 46,60,62, & - 49,70,74, & - 53,64,75, & - 25,57,67, & - 1,46,64, & - 2,51,63, & - 3,14,80, & - 4,15,78, & - 5,27,74, & - 6,13,70, & - 7,19,20, & - 8,38,77, & - 9,75,83, & - 10,36,69, & - 11,22,29, & - 12,58,82, & - 16,35,60, & - 17,32,43, & - 18,42,45, & - 21,53,84, & - 23,39,48, & - 24,52,68, & - 26,33,61, & - 28,56,76, & - 30,65,66, & - 31,34,49, & - 37,47,81, & - 16,40,54, & - 41,44,65, & - 50,73,79, & - 55,59,60, & - 54,57,71, & - 23,62,72, & - 1,36,47, & - 2,32,70, & - 3,28,69, & - 4,7,33, & - 5,20,26, & - 6,14,63, & - 8,22,68, & - 9,13,67, & - 10,55,71, & - 11,15,19, & - 12,51,56, & - 17,27,52, & - 18,34,46, & - 21,41,42, & - 24,50,80, & - 25,39,75, & - 29,54,76, & - 30,40,84, & - 31,35,58, & - 37,79,83, & - 38,43,73, & - 44,72,81, & - 7,45,62, & - 47,48,49, & - 53,57,78, & - 20,59,66, & - 28,61,64, & - 11,75,77, & - 33,54,82, & - 1,14,44, & - 2,62,73, & - 3,9,26, & - 4,37,84, & - 5,56,80, & - 6,45,71, & - 8,67,72, & - 10,76,81, & - 12,32,78, & - 13,59,82, & - 15,17,79, & - 16,42,69, & - 18,61,70, & - 19,31,64, & - 21,39,63, & - 22,30,58, & - 23,27,66, & - 24,41,49, & - 25,36,60, & - 29,65,67, & - 34,36,53, & - 35,48,76, & - 15,38,55, & - 40,43,74, & - 46,52,57, & - 50,63,77, & - 51,68,69, & - 2,44,83, & - 1,30,55, & - 3,29,78, & - 4,34,65, & - 5,31,38, & - 6,52,58, & - 7,25,51, & - 8,16,66, & - 9,46,74, & - 10,70,75, & - 11,32,84, & - 12,48,79, & - 13,50,64, & - 14,37,57, & - 17,42,72, & - 18,43,48, & - 19,24,60, & - 20,54,83, & - 21,47,62, & - 22,28,59, & - 23,61,80, & - 8,26,39, & - 27,44,53, & - 33,49,56, & - 35,68,71, & - 12,26,40/ - -data Nm/ & - 1,29,58,87,116,144,0,& - 2,30,59,88,117,143,0,& - 3,31,60,89,118,145,0,& - 4,29,61,90,119,146,0,& - 2,29,62,91,120,147,0,& - 5,32,63,92,121,148,0,& - 6,33,64,90,109,149,0,& - 7,34,65,93,122,150,164,& - 8,33,66,94,118,151,0,& - 9,34,67,95,123,152,0,& - 10,35,68,96,114,153,0,& - 11,36,69,97,124,154,168,& - 12,37,63,94,125,155,0,& - 10,38,60,92,116,156,0,& - 13,39,61,96,126,138,0,& - 13,33,70,81,127,150,0,& - 14,40,71,98,126,157,0,& - 15,39,72,99,128,158,0,& - 16,41,64,96,129,159,0,& - 17,42,64,91,112,160,0,& - 18,42,73,100,130,161,0,& - 19,43,68,93,131,162,0,& - 12,44,74,86,132,163,0,& - 1,45,75,101,133,159,0,& - 19,46,57,102,134,149,0,& - 20,32,76,91,118,164,168,& - 21,41,62,98,132,165,0,& - 22,45,77,89,113,162,0,& - 18,47,68,103,135,145,0,& - 16,48,78,104,131,144,0,& - 3,49,79,105,129,147,0,& - 6,50,71,88,124,153,0,& - 23,38,76,90,115,166,0,& - 20,44,79,99,136,146,0,& - 21,51,70,105,137,167,0,& - 8,35,67,87,134,136,0,& - 21,47,80,106,119,156,0,& - 24,36,65,107,138,147,0,& - 22,52,74,102,130,164,0,& - 9,45,81,104,139,168,0,& - 8,53,82,100,133,0,0,& - 25,48,72,100,127,157,0,& - 19,37,71,107,139,158,0,& - 22,39,82,108,116,143,165,& - 26,43,72,109,121,0,0,& - 27,54,58,99,140,151,0,& - 28,31,80,87,110,161,0,& - 16,30,74,110,137,154,158,& - 7,55,79,110,133,166,0,& - 4,50,83,101,141,155,0,& - 15,47,59,97,142,149,0,& - 24,30,75,98,140,148,0,& - 23,56,73,111,136,165,0,& - 14,44,81,85,103,115,160,& - 23,52,84,95,138,144,0,& - 25,35,77,97,120,166,0,& - 25,57,85,111,140,156,0,& - 4,42,69,105,131,148,0,& - 15,40,84,112,125,162,0,& - 5,54,70,84,134,159,0,& - 28,53,76,113,128,163,0,& - 10,54,86,109,117,161,0,& - 9,49,59,92,130,141,0,& - 14,56,58,113,129,155,0,& - 5,36,78,82,135,146,0,& - 3,50,78,112,132,150,0,& - 1,51,57,94,122,135,0,& - 17,38,75,93,142,167,0,& - 27,41,67,89,127,142,0,& - 18,55,63,88,128,152,0,& - 2,53,85,95,121,167,0,& - 11,49,86,108,122,157,0,& - 20,51,83,107,117,0,0,& - 26,52,55,62,139,151,0,& - 11,56,66,102,114,152,0,& - 6,32,77,103,123,137,0,& - 28,40,65,114,141,0,0,& - 12,34,61,111,124,145,0,& - 27,43,83,106,126,154,0,& - 13,46,60,101,120,163,0,& - 17,37,80,108,123,0,0,& - 26,31,69,115,125,0,0,& - 7,48,66,106,143,160,0,& - 24,46,73,104,119,153,0/ - -data nrw/ & -6,6,6,6,6,6,6,7,6,6,6,7,6,6,6,6,6,6,6,6,6, & -6,6,6,6,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,6, & -6,7,5,6,6,7,6,6,6,6,6,7,6,6,6,6,6,6,6,6,6, & -6,6,6,6,6,6,6,6,6,5,6,6,6,5,6,6,6,5,5,6,6/ - -ncw=3 - -toc=0 -tov=0 -tanhtoc=0 -!write(*,*) llr -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -!write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - niterations=iter - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 3 .and. iter .ge. 5 .and. ncheck .gt. 10) then - niterations=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:7,i)=tanh(-toc(1:7,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -niterations=-1 -return -end subroutine bpdecode168 diff --git a/lib/fsk4hf/bpdecode174_101.f90 b/lib/fsk4hf/bpdecode174_101.f90 deleted file mode 100644 index 5ef96be3a..000000000 --- a/lib/fsk4hf/bpdecode174_101.f90 +++ /dev/null @@ -1,111 +0,0 @@ -subroutine bpdecode174_101(llr,apmask,maxiterations,message101,cw,nharderror,iter,ncheck) -! -! A log-domain belief propagation decoder for the (174,101) code. -! - integer, parameter:: N=174, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(8,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(8,M) - real tanhtoc(8,M) - real zn(N) - real llr(N) - real Tmn - - include "ldpc_174_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:101) - call get_crc24(decoded,101,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - return - endif - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:8,i)=tanh(-toc(1:8,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo - nharderror=-1 - return -end subroutine bpdecode174_101 diff --git a/lib/fsk4hf/bpdecode174_74.f90 b/lib/fsk4hf/bpdecode174_74.f90 deleted file mode 100644 index 190138753..000000000 --- a/lib/fsk4hf/bpdecode174_74.f90 +++ /dev/null @@ -1,113 +0,0 @@ -subroutine bpdecode174_74(llr,apmask,maxiterations,message50,cw,nharderror,iter,ncheck) -! -! A log-domain belief propagation decoder for the (174,74) code. -! - - integer, parameter:: N=174, K=74, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message50(50) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N) - real llr(N) - real Tmn - - include "ldpc_174_74_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:74) - call get_crc24(decoded,74,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message50=decoded(1:50) - return - endif - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo - nharderror=-1 - return -end subroutine bpdecode174_74 diff --git a/lib/fsk4hf/bpdecode174b.f90 b/lib/fsk4hf/bpdecode174b.f90 deleted file mode 100644 index 8291e7603..000000000 --- a/lib/fsk4hf/bpdecode174b.f90 +++ /dev/null @@ -1,393 +0,0 @@ -subroutine bpdecode174b(llr,apmask,maxiterations,decoded,cw,nharderror,iter) -! -! A log-domain belief propagation decoder for the (174,91) code. -! -integer, parameter:: N=174, K=91, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(7,M) -integer Mn(3,N) ! 3 checks per bit -integer synd(M) -real tov(3,N) -real toc(7,M) -real tanhtoc(7,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) - -data colorder/ & - 0, 1, 2, 3, 28, 4, 5, 6, 7, 8, 9, 10, 11, 34, 12, 32, 13, 14, 15, 16,& - 17, 18, 36, 29, 40, 19, 20, 38, 21, 41, 30, 42, 22, 44, 37, 47, 48, 23, 33, 43,& - 49, 45, 56, 39, 25, 26, 46, 50, 51, 52, 24, 57, 58, 61, 31, 54, 64, 35, 27, 62,& - 59, 53, 60, 63, 55, 70, 66, 67, 68, 65, 71, 74, 72, 73, 77, 75, 69, 76, 79, 82,& - 83, 78, 81, 80, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,& - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,& - 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,& - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,& - 160,161,162,163,164,165,166,167,168,169,170,171,172,173/ - -data Mn/ & - 1, 24, 66, & - 2, 5, 70, & - 3, 31, 65, & - 4, 49, 58, & - 6, 60, 67, & - 7, 32, 75, & - 8, 48, 82, & - 9, 35, 41, & - 10, 39, 62, & - 11, 14, 61, & - 12, 71, 74, & - 13, 23, 78, & - 15, 16, 79, & - 17, 54, 63, & - 18, 50, 57, & - 19, 30, 47, & - 20, 64, 80, & - 21, 28, 69, & - 22, 25, 43, & - 26, 34, 72, & - 27, 36, 37, & - 29, 40, 44, & - 33, 52, 53, & - 38, 55, 83, & - 42, 51, 59, & - 45, 76, 81, & - 46, 68, 77, & - 56, 67, 73, & - 1, 4, 5, & - 2, 47, 51, & - 3, 46, 82, & - 6, 24, 76, & - 7, 9, 16, & - 8, 10, 78, & - 11, 35, 55, & - 12, 38, 64, & - 13, 42, 83, & - 14, 27, 54, & - 15, 21, 34, & - 17, 44, 53, & - 18, 25, 28, & - 19, 33, 57, & - 20, 22, 73, & - 23, 40, 81, & - 26, 49, 68, & - 29, 71, 75, & - 30, 65, 79, & - 31, 36, 60, & - 32, 43, 77, & - 37, 62, 70, & - 39, 69, 74, & - 41, 52, 66, & - 45, 50, 61, & - 48, 63, 80, & - 56, 59, 72, & - 58, 64, 65, & - 1, 13, 28, & - 2, 48, 75, & - 3, 53, 69, & - 4, 11, 44, & - 5, 73, 79, & - 6, 12, 17, & - 7, 57, 60, & - 8, 15, 61, & - 9, 39, 59, & - 10, 19, 49, & - 14, 43, 52, & - 16, 54, 68, & - 18, 41, 63, & - 20, 36, 45, & - 21, 67, 77, & - 10, 22, 55, & - 23, 65, 72, & - 24, 27, 82, & - 25, 26, 29, & - 30, 35, 37, & - 31, 51, 66, & - 17, 32, 78, & - 33, 42, 76, & - 34, 70, 83, & - 38, 46, 81, & - 40, 62, 80, & - 45, 47, 74, & - 50, 56, 71, & - 7, 37, 58, & - 1, 16, 71, & - 2, 6, 61, & - 3, 22, 50, & - 4, 59, 77, & - 5, 41, 81, & - 8, 58, 74, & - 9, 20, 26, & - 11, 21, 31, & - 12, 66, 79, & - 13, 14, 57, & - 15, 33, 40, & - 18, 44, 82, & - 19, 69, 83, & - 23, 49, 63, & - 24, 29, 39, & - 25, 47, 56, & - 27, 55, 72, & - 28, 64, 70, & - 30, 48, 77, & - 32, 34, 45, & - 35, 68, 80, & - 36, 38, 52, & - 42, 43, 62, & - 46, 60, 78, & - 51, 54, 67, & - 53, 73, 75, & - 14, 73, 76, & - 1, 22, 30, & - 2, 35, 43, & - 3, 47, 63, & - 4, 25, 76, & - 5, 33, 78, & - 6, 20, 83, & - 7, 12, 72, & - 8, 54, 70, & - 9, 61, 65, & - 10, 34, 51, & - 11, 46, 75, & - 13, 39, 68, & - 15, 17, 56, & - 16, 23, 36, & - 18, 32, 55, & - 19, 31, 81, & - 21, 37, 71, & - 24, 57, 64, & - 26, 38, 48, & - 27, 49, 50, & - 28, 52, 59, & - 29, 41, 58, & - 40, 60, 74, & - 42, 44, 79, & - 51, 53, 80, & - 62, 67, 82, & - 23, 66, 69, & - 1, 53, 61, & - 2, 18, 39, & - 3, 4, 12, & - 5, 26, 74, & - 6, 30, 52, & - 7, 82, 83, & - 8, 35, 73, & - 9, 19, 67, & - 10, 64, 75, & - 11, 20, 33, & - 13, 45, 48, & - 3, 14, 40, & - 15, 43, 49, & - 16, 55, 76, & - 17, 62, 65, & - 21, 47, 78, & - 22, 59, 81, & - 24, 34, 63, & - 25, 37, 66, & - 27, 79, 80, & - 28, 60, 79, & - 29, 31, 70, & - 32, 58, 69, & - 10, 36, 77, & - 38, 50, 51, & - 13, 41, 56, & - 42, 63, 71, & - 44, 47, 68, & - 1, 46, 72, & - 54, 57, 75, & - 2, 33, 58, & - 4, 17, 83, & - 5, 14, 55, & - 6, 23, 48, & - 7, 52, 56/ - -data Nm/ & - 1, 29, 57, 86, 113, 140, 168, & - 2, 30, 58, 87, 114, 141, 170, & - 3, 31, 59, 88, 115, 142, 151, & - 4, 29, 60, 89, 116, 142, 171, & - 2, 29, 61, 90, 117, 143, 172, & - 5, 32, 62, 87, 118, 144, 173, & - 6, 33, 63, 85, 119, 145, 174, & - 7, 34, 64, 91, 120, 146, 0, & - 8, 33, 65, 92, 121, 147, 0, & - 9, 34, 66, 72, 122, 148, 163, & - 10, 35, 60, 93, 123, 149, 0, & - 11, 36, 62, 94, 119, 142, 0, & - 12, 37, 57, 95, 124, 150, 165, & - 10, 38, 67, 95, 112, 151, 172, & - 13, 39, 64, 96, 125, 152, 0, & - 13, 33, 68, 86, 126, 153, 0, & - 14, 40, 62, 78, 125, 154, 171, & - 15, 41, 69, 97, 127, 141, 0, & - 16, 42, 66, 98, 128, 147, 0, & - 17, 43, 70, 92, 118, 149, 0, & - 18, 39, 71, 93, 129, 155, 0, & - 19, 43, 72, 88, 113, 156, 0, & - 12, 44, 73, 99, 126, 139, 173, & - 1, 32, 74, 100, 130, 157, 0, & - 19, 41, 75, 101, 116, 158, 0, & - 20, 45, 75, 92, 131, 143, 0, & - 21, 38, 74, 102, 132, 159, 0, & - 18, 41, 57, 103, 133, 160, 0, & - 22, 46, 75, 100, 134, 161, 0, & - 16, 47, 76, 104, 113, 144, 0, & - 3, 48, 77, 93, 128, 161, 0, & - 6, 49, 78, 105, 127, 162, 0, & - 23, 42, 79, 96, 117, 149, 170, & - 20, 39, 80, 105, 122, 157, 0, & - 8, 35, 76, 106, 114, 146, 0, & - 21, 48, 70, 107, 126, 163, 0, & - 21, 50, 76, 85, 129, 158, 0, & - 24, 36, 81, 107, 131, 164, 0, & - 9, 51, 65, 100, 124, 141, 0, & - 22, 44, 82, 96, 135, 151, 0, & - 8, 52, 69, 90, 134, 165, 0, & - 25, 37, 79, 108, 136, 166, 0, & - 19, 49, 67, 108, 114, 152, 0, & - 22, 40, 60, 97, 136, 167, 0, & - 26, 53, 70, 83, 105, 150, 0, & - 27, 31, 81, 109, 123, 168, 0, & - 16, 30, 83, 101, 115, 155, 167, & - 7, 54, 58, 104, 131, 150, 173, & - 4, 45, 66, 99, 132, 152, 0, & - 15, 53, 84, 88, 132, 164, 0, & - 25, 30, 77, 110, 122, 137, 164, & - 23, 52, 67, 107, 133, 144, 174, & - 23, 40, 59, 111, 137, 140, 0, & - 14, 38, 68, 110, 120, 169, 0, & - 24, 35, 72, 102, 127, 153, 172, & - 28, 55, 84, 101, 125, 165, 174, & - 15, 42, 63, 95, 130, 169, 0, & - 4, 56, 85, 91, 134, 162, 170, & - 25, 55, 65, 89, 133, 156, 0, & - 5, 48, 63, 109, 135, 160, 0, & - 10, 53, 64, 87, 121, 140, 0, & - 9, 50, 82, 108, 138, 154, 0, & - 14, 54, 69, 99, 115, 157, 166, & - 17, 36, 56, 103, 130, 148, 0, & - 3, 47, 56, 73, 121, 154, 0, & - 1, 52, 77, 94, 139, 158, 0, & - 5, 28, 71, 110, 138, 147, 0, & - 27, 45, 68, 106, 124, 167, 0, & - 18, 51, 59, 98, 139, 162, 0, & - 2, 50, 80, 103, 120, 161, 0, & - 11, 46, 84, 86, 129, 166, 0, & - 20, 55, 73, 102, 119, 168, 0, & - 28, 43, 61, 111, 112, 146, 0, & - 11, 51, 83, 91, 135, 143, 0, & - 6, 46, 58, 111, 123, 148, 169, & - 26, 32, 79, 112, 116, 153, 0, & - 27, 49, 71, 89, 104, 163, 0, & - 12, 34, 78, 109, 117, 155, 0, & - 13, 47, 61, 94, 136, 159, 160, & - 17, 54, 82, 106, 137, 159, 0, & - 26, 44, 81, 90, 128, 156, 0, & - 7, 31, 74, 97, 138, 145, 0, & - 24, 37, 80, 98, 118, 145, 171/ - -data nrw/ & - 7,7,7,7,7,7,7,6,6,7,6,6,7,7,6,6,7,6, & - 6,6,6,6,7,6,6,6,6,6,6,6,6,6,7,6,6,6, & - 6,6,6,6,6,6,6,6,6,6,7,7,6,6,7,7,6,6, & - 7,7,6,7,6,6,6,6,7,6,6,6,6,6,6,6,6,6, & - 6,6,7,6,6,6,7,6,6,6,7/ - -ncw=3 - -decoded=0 -toc=0 -tov=0 -tanhtoc=0 -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - nerr=0 - do i=1,N - if( (2*cw(i)-1)*llr(i) .lt. 0.0 ) nerr=nerr+1 - enddo - nharderror=nerr - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -nharderror=-1 -return -end subroutine bpdecode174b diff --git a/lib/fsk4hf/bpdecode204.f90 b/lib/fsk4hf/bpdecode204.f90 deleted file mode 100644 index 160b51a91..000000000 --- a/lib/fsk4hf/bpdecode204.f90 +++ /dev/null @@ -1,482 +0,0 @@ -subroutine bpdecode204(llr,apmask,maxiterations,decoded,cw,nharderror,iter) -! -! A log-domain belief propagation decoder for the (204,68) code. -! -integer, parameter:: N=204, K=68, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(6,M) ! 4, 5, or 6 bits per check -integer Mn(3,N) ! 3 checks per bit -integer synd(M) -real tov(3,N) -real toc(6,M) -real tanhtoc(6,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) - -data colorder/ & - 0, 1, 2, 3, 4, 5, 47, 6, 7, 8, 9, 10, 11, 12, 58, 55, 13, & - 14, 15, 46, 17, 18, 60, 19, 20, 21, 22, 23, 24, 25, 57, 26, 27, 49, & - 28, 52, 65, 16, 50, 73, 59, 68, 63, 29, 30, 31, 32, 51, 62, 56, 66, & - 45, 33, 34, 53, 67, 35, 36, 37, 61, 69, 54, 38, 71, 82, 39, 77, 80, & - 83, 78, 84, 48, 41, 85, 40, 64, 75, 96, 74, 72, 76, 86, 87, 89, 90, & - 79, 70, 92, 99, 93,101, 95,100, 97, 94, 42, 98,103,105,102, 43,104, & - 88, 44,106, 81,107,110,108,111,112,109,113,114,117,118,116,121,115, & - 119,122,120,125,129,124,127,126,128, 91,123,133,131,130,134,135,137, & - 136,132,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, & - 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, & - 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, & - 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203/ - -data Mn/ & - 1, 38, 107, & - 2, 7, 114, & - 3, 48, 106, & - 4, 79, 94, & - 5, 97, 108, & - 6, 50, 122, & - 8, 78, 134, & - 9, 55, 65, & - 10, 62, 100, & - 11, 16, 99, & - 12, 113, 119, & - 13, 31, 125, & - 14, 15, 127, & - 17, 87, 103, & - 18, 81, 98, & - 19, 43, 77, & - 20, 102, 130, & - 21, 36, 111, & - 22, 23, 60, & - 24, 39, 112, & - 25, 37, 42, & - 26, 41, 51, & - 27, 67, 70, & - 28, 64, 136, & - 29, 61, 68, & - 30, 91, 124, & - 32, 80, 121, & - 33, 40, 117, & - 34, 35, 90, & - 44, 88, 93, & - 45, 128, 133, & - 46, 56, 69, & - 47, 49, 52, & - 53, 76, 131, & - 54, 104, 116, & - 57, 84, 86, & - 58, 120, 135, & - 59, 75, 92, & - 63, 71, 109, & - 66, 74, 126, & - 72, 85, 105, & - 73, 82, 95, & - 83, 89, 123, & - 96, 115, 118, & - 101, 110, 129, & - 52, 99, 132, & - 1, 3, 20, & - 2, 77, 89, & - 4, 72, 75, & - 5, 34, 79, & - 6, 24, 130, & - 7, 48, 88, & - 8, 36, 116, & - 9, 71, 114, & - 10, 87, 101, & - 11, 22, 121, & - 12, 50, 64, & - 13, 39, 53, & - 14, 41, 78, & - 15, 68, 96, & - 16, 83, 90, & - 17, 23, 45, & - 18, 47, 126, & - 19, 70, 91, & - 21, 57, 76, & - 25, 110, 117, & - 26, 82, 135, & - 27, 46, 58, & - 28, 37, 56, & - 29, 66, 102, & - 30, 62, 125, & - 31, 85, 93, & - 32, 104, 113, & - 33, 81, 92, & - 35, 100, 118, & - 38, 95, 133, & - 40, 86, 109, & - 42, 61, 124, & - 43, 59, 119, & - 44, 49, 134, & - 51, 97, 122, & - 54, 105, 107, & - 55, 128, 136, & - 60, 67, 84, & - 63, 112, 115, & - 65, 74, 131, & - 69, 80, 94, & - 73, 98, 123, & - 103, 130, 134, & - 46, 106, 111, & - 1, 84, 108, & - 120, 129, 132, & - 65, 75, 127, & - 2, 80, 101, & - 3, 118, 119, & - 4, 52, 124, & - 5, 13, 68, & - 6, 27, 81, & - 7, 51, 76, & - 8, 77, 108, & - 9, 31, 58, & - 10, 18, 57, & - 11, 63, 105, & - 12, 14, 132, & - 15, 56, 123, & - 16, 21, 128, & - 17, 37, 59, & - 19, 85, 126, & - 20, 71, 91, & - 22, 26, 117, & - 23, 79, 98, & - 24, 32, 95, & - 25, 90, 93, & - 28, 49, 109, & - 29, 116, 120, & - 30, 54, 136, & - 33, 53, 107, & - 34, 64, 103, & - 35, 39, 67, & - 36, 71, 73, & - 38, 47, 125, & - 40, 66, 94, & - 41, 70, 104, & - 42, 55, 112, & - 43, 44, 82, & - 29, 45, 88, & - 48, 86, 127, & - 50, 72, 135, & - 60, 74, 96, & - 61, 121, 131, & - 62, 78, 92, & - 69, 100, 133, & - 83, 122, 129, & - 87, 97, 106, & - 89, 102, 113, & - 24, 99, 108, & - 20, 72, 110, & - 111, 115, 117, & - 35, 52, 114, & - 1, 44, 94, & - 2, 23, 107, & - 3, 81, 136, & - 4, 8, 96, & - 5, 37, 70, & - 6, 43, 131, & - 7, 103, 115, & - 9, 94, 122, & - 10, 68, 82, & - 11, 56, 88, & - 12, 46, 126, & - 13, 16, 75, & - 14, 79, 112, & - 15, 47, 110, & - 17, 36, 39, & - 18, 63, 120, & - 19, 22, 55, & - 21, 49, 113, & - 25, 54, 57, & - 26, 89, 125, & - 27, 101, 109, & - 28, 31, 60, & - 30, 74, 97, & - 32, 92, 93, & - 33, 83, 91, & - 34, 58, 121, & - 38, 65, 111, & - 40, 99, 118, & - 3, 41, 61, & - 42, 50, 100, & - 45, 78, 106, & - 48, 95, 129, & - 51, 85, 133, & - 53, 59, 69, & - 11, 62, 66, & - 64, 73, 124, & - 67, 123, 134, & - 76, 104, 132, & - 77, 100, 127, & - 36, 80, 119, & - 84, 102, 135, & - 86, 105, 124, & - 4, 87, 128, & - 90, 106, 116, & - 65, 98, 130, & - 92, 108, 114, & - 1, 52, 121, & - 2, 84, 117, & - 5, 83, 105, & - 6, 15, 63, & - 7, 28, 82, & - 8, 32, 135, & - 9, 104, 134, & - 9, 10, 89, & - 12, 62, 107, & - 13, 40, 103, & - 14, 31, 95, & - 16, 27, 74, & - 17, 90, 132, & - 18, 34, 69, & - 19, 103, 129, & - 20, 76, 87, & - 21, 22, 130, & - 23, 25, 99, & - 24, 101, 126/ - -data Nm/ & - 1, 47, 91, 140, 186, 0, & - 2, 48, 94, 141, 187, 0, & - 3, 47, 95, 142, 168, 0, & - 4, 49, 96, 143, 182, 0, & - 5, 50, 97, 144, 188, 0, & - 6, 51, 98, 145, 189, 0, & - 2, 52, 99, 146, 190, 0, & - 7, 53, 100, 143, 191, 0, & - 8, 54, 101, 147, 192, 193, & - 9, 55, 102, 148, 193, 0, & - 10, 56, 103, 149, 174, 0, & - 11, 57, 104, 150, 194, 0, & - 12, 58, 97, 151, 195, 0, & - 13, 59, 104, 152, 196, 0, & - 13, 60, 105, 153, 189, 0, & - 10, 61, 106, 151, 197, 0, & - 14, 62, 107, 154, 198, 0, & - 15, 63, 102, 155, 199, 0, & - 16, 64, 108, 156, 200, 0, & - 17, 47, 109, 137, 201, 0, & - 18, 65, 106, 157, 202, 0, & - 19, 56, 110, 156, 202, 0, & - 19, 62, 111, 141, 203, 0, & - 20, 51, 112, 136, 204, 0, & - 21, 66, 113, 158, 203, 0, & - 22, 67, 110, 159, 0, 0, & - 23, 68, 98, 160, 197, 0, & - 24, 69, 114, 161, 190, 0, & - 25, 70, 115, 126, 0, 0, & - 26, 71, 116, 162, 0, 0, & - 12, 72, 101, 161, 196, 0, & - 27, 73, 112, 163, 191, 0, & - 28, 74, 117, 164, 0, 0, & - 29, 50, 118, 165, 199, 0, & - 29, 75, 119, 139, 0, 0, & - 18, 53, 120, 154, 179, 0, & - 21, 69, 107, 144, 0, 0, & - 1, 76, 121, 166, 0, 0, & - 20, 58, 119, 154, 0, 0, & - 28, 77, 122, 167, 195, 0, & - 22, 59, 123, 168, 0, 0, & - 21, 78, 124, 169, 0, 0, & - 16, 79, 125, 145, 0, 0, & - 30, 80, 125, 140, 0, 0, & - 31, 62, 126, 170, 0, 0, & - 32, 68, 90, 150, 0, 0, & - 33, 63, 121, 153, 0, 0, & - 3, 52, 127, 171, 0, 0, & - 33, 80, 114, 157, 0, 0, & - 6, 57, 128, 169, 0, 0, & - 22, 81, 99, 172, 0, 0, & - 33, 46, 96, 139, 186, 0, & - 34, 58, 117, 173, 0, 0, & - 35, 82, 116, 158, 0, 0, & - 8, 83, 124, 156, 0, 0, & - 32, 69, 105, 149, 0, 0, & - 36, 65, 102, 158, 0, 0, & - 37, 68, 101, 165, 0, 0, & - 38, 79, 107, 173, 0, 0, & - 19, 84, 129, 161, 0, 0, & - 25, 78, 130, 168, 0, 0, & - 9, 71, 131, 174, 194, 0, & - 39, 85, 103, 155, 189, 0, & - 24, 57, 118, 175, 0, 0, & - 8, 86, 93, 166, 184, 0, & - 40, 70, 122, 174, 0, 0, & - 23, 84, 119, 176, 0, 0, & - 25, 60, 97, 148, 0, 0, & - 32, 87, 132, 173, 199, 0, & - 23, 64, 123, 144, 0, 0, & - 39, 54, 109, 120, 0, 0, & - 41, 49, 128, 137, 0, 0, & - 42, 88, 120, 175, 0, 0, & - 40, 86, 129, 162, 197, 0, & - 38, 49, 93, 151, 0, 0, & - 34, 65, 99, 177, 201, 0, & - 16, 48, 100, 178, 0, 0, & - 7, 59, 131, 170, 0, 0, & - 4, 50, 111, 152, 0, 0, & - 27, 87, 94, 179, 0, 0, & - 15, 74, 98, 142, 0, 0, & - 42, 67, 125, 148, 190, 0, & - 43, 61, 133, 164, 188, 0, & - 36, 84, 91, 180, 187, 0, & - 41, 72, 108, 172, 0, 0, & - 36, 77, 127, 181, 0, 0, & - 14, 55, 134, 182, 201, 0, & - 30, 52, 126, 149, 0, 0, & - 43, 48, 135, 159, 193, 0, & - 29, 61, 113, 183, 198, 0, & - 26, 64, 109, 164, 0, 0, & - 38, 74, 131, 163, 185, 0, & - 30, 72, 113, 163, 0, 0, & - 4, 87, 122, 140, 147, 0, & - 42, 76, 112, 171, 196, 0, & - 44, 60, 129, 143, 0, 0, & - 5, 81, 134, 162, 0, 0, & - 15, 88, 111, 184, 0, 0, & - 10, 46, 136, 167, 203, 0, & - 9, 75, 132, 169, 178, 0, & - 45, 55, 94, 160, 204, 0, & - 17, 70, 135, 180, 0, 0, & - 14, 89, 118, 146, 195, 200, & - 35, 73, 123, 177, 192, 0, & - 41, 82, 103, 181, 188, 0, & - 3, 90, 134, 170, 183, 0, & - 1, 82, 117, 141, 194, 0, & - 5, 91, 100, 136, 185, 0, & - 39, 77, 114, 160, 0, 0, & - 45, 66, 137, 153, 0, 0, & - 18, 90, 138, 166, 0, 0, & - 20, 85, 124, 152, 0, 0, & - 11, 73, 135, 157, 0, 0, & - 2, 54, 139, 185, 0, 0, & - 44, 85, 138, 146, 0, 0, & - 35, 53, 115, 183, 0, 0, & - 28, 66, 110, 138, 187, 0, & - 44, 75, 95, 167, 0, 0, & - 11, 79, 95, 179, 0, 0, & - 37, 92, 115, 155, 0, 0, & - 27, 56, 130, 165, 186, 0, & - 6, 81, 133, 147, 0, 0, & - 43, 88, 105, 176, 0, 0, & - 26, 78, 96, 175, 181, 0, & - 12, 71, 121, 159, 0, 0, & - 40, 63, 108, 150, 204, 0, & - 13, 93, 127, 178, 0, 0, & - 31, 83, 106, 182, 0, 0, & - 45, 92, 133, 171, 200, 0, & - 17, 51, 89, 184, 202, 0, & - 34, 86, 130, 145, 0, 0, & - 46, 92, 104, 177, 198, 0, & - 31, 76, 132, 172, 0, 0, & - 7, 80, 89, 176, 192, 0, & - 37, 67, 128, 180, 191, 0, & - 24, 83, 116, 142, 0, 0/ - -data nrw/ & - 5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5, & - 5,5,5,5,5,5,5,5,4,5,5,4,4,5,5,4,5, & - 4,5,4,4,4,5,4,4,4,4,4,4,4,4,4,4,4, & - 5,4,4,4,4,4,4,4,4,4,5,5,4,5,4,4,4, & - 5,4,4,4,4,5,4,5,4,4,4,4,4,5,5,5,4, & - 4,5,4,5,5,4,5,4,5,5,4,4,4,5,5,5,4, & - 6,5,5,5,5,5,4,4,4,4,4,4,4,4,5,4,4, & - 4,5,4,4,5,4,5,4,4,5,5,4,5,4,5,5,4/ - -ncw=3 - -decoded=0 -toc=0 -tov=0 -tanhtoc=0 -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - nerr=0 - do i=1,N - if( (2*cw(i)-1)*llr(i) .lt. 0.0 ) nerr=nerr+1 - enddo - nharderror=nerr - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -nharderror=-1 -return -end subroutine bpdecode204 diff --git a/lib/fsk4hf/bpdecode240_101.f90 b/lib/fsk4hf/bpdecode240_101.f90 deleted file mode 100644 index 1e2adbb68..000000000 --- a/lib/fsk4hf/bpdecode240_101.f90 +++ /dev/null @@ -1,111 +0,0 @@ -subroutine bpdecode240_101(llr,apmask,maxiterations,message101,cw,nharderror,iter,ncheck) -! -! A log-domain belief propagation decoder for the (240,101) code. -! - integer, parameter:: N=240, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N) - real llr(N) - real Tmn - - include "ldpc_240_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:101) - call get_crc24(decoded,101,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - return - endif - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo - nharderror=-1 - return -end subroutine bpdecode240_101 diff --git a/lib/fsk4hf/bpdecode280_101.f90 b/lib/fsk4hf/bpdecode280_101.f90 deleted file mode 100644 index a817a3d5c..000000000 --- a/lib/fsk4hf/bpdecode280_101.f90 +++ /dev/null @@ -1,111 +0,0 @@ -subroutine bpdecode280_101(llr,apmask,maxiterations,message101,cw,nharderror,iter,ncheck) -! -! A log-domain belief propagation decoder for the (280,101) code. -! - integer, parameter:: N=280, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N) - real llr(N) - real Tmn - - include "ldpc_280_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:101) - call get_crc24(decoded,101,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - return - endif - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion -! if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo - nharderror=-1 - return -end subroutine bpdecode280_101 diff --git a/lib/fsk4hf/bpdecode300.f90 b/lib/fsk4hf/bpdecode300.f90 deleted file mode 100644 index 22f7f885a..000000000 --- a/lib/fsk4hf/bpdecode300.f90 +++ /dev/null @@ -1,708 +0,0 @@ -subroutine bpdecode300(llr,apmask,maxiterations,decoded,niterations,cw) - -! A log-domain belief propagation decoder for the (300,60) code. - -integer, parameter:: N=300, K=60, M=N-K -integer*1 codeword(N),cw(N),apmask(N) -integer colorder(N) -integer*1 decoded(K) -integer Nm(5,M) ! 4, or 5 bits per check -integer Mn(7,N) ! 2, 3, or 7 checks per bit -integer synd(M) -real tov(7,N) -real toc(5,M) -real tanhtoc(5,M) -real zn(N) -real llr(N) -real Tmn -integer nrw(M) -integer ncw(N) - -data colorder/ & -0,1,2,3,4,5,6,7,8,9,10,11,123,12,13,14,15,16,17,18, & -19,20,21,22,23,24,25,138,26,145,27,28,29,30,31,32,33,34,35,36, & -37,154,38,39,40,41,42,43,44,144,46,47,48,49,50,51,52,53,143,54, & -125,56,57,58,124,59,120,140,157,160,55,60,61,62,156,162,141,64,65,153, & -181,183,66,170,67,68,69,130,70,164,71,72,73,74,75,63,76,77,135,78, & -79,80,176,169,82,83,84,167,180,85,136,158,129,166,175,142,134,146,121,165, & -88,89,192,90,45,91,92,93,182,189,94,95,96,173,81,97,98,178,122,126, & -132,99,100,152,186,193,101,102,151,103,104,172,159,168,150,190,147,148,201,107, & -205,177,108,198,197,174,127,109,185,110,202,87,199,171,179,187,139,137,106,131, & -206,194,112,149,155,113,128,184,196,86,114,203,212,195,208,105,188,161,163,191, & -200,209,214,204,115,218,133,111,207,117,213,216,211,217,116,215,219,220,210,221, & -118,222,223,225,224,228,226,229,231,227,233,119,234,235,232,230,237,239,236,238, & -240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259, & -260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279, & -280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299/ - -data Mn/ & - 1, 67, 0, 0, 0, 0, 0, & - 2, 189, 0, 0, 0, 0, 0, & - 3, 201, 0, 0, 0, 0, 0, & - 4, 13, 0, 0, 0, 0, 0, & - 5, 84, 0, 0, 0, 0, 0, & - 6, 188, 0, 0, 0, 0, 0, & - 7, 140, 0, 0, 0, 0, 0, & - 8, 167, 0, 0, 0, 0, 0, & - 9, 187, 0, 0, 0, 0, 0, & - 10, 173, 0, 0, 0, 0, 0, & - 11, 88, 0, 0, 0, 0, 0, & - 12, 213, 0, 0, 0, 0, 0, & - 14, 141, 0, 0, 0, 0, 0, & - 15, 236, 0, 0, 0, 0, 0, & - 16, 117, 0, 0, 0, 0, 0, & - 17, 99, 0, 0, 0, 0, 0, & - 18, 111, 0, 0, 0, 0, 0, & - 19, 178, 0, 0, 0, 0, 0, & - 20, 28, 0, 0, 0, 0, 0, & - 21, 177, 0, 0, 0, 0, 0, & - 22, 199, 0, 0, 0, 0, 0, & - 23, 209, 0, 0, 0, 0, 0, & - 24, 220, 0, 0, 0, 0, 0, & - 25, 59, 0, 0, 0, 0, 0, & - 26, 224, 0, 0, 0, 0, 0, & - 27, 30, 0, 0, 0, 0, 0, & - 29, 157, 0, 0, 0, 0, 0, & - 31, 184, 0, 0, 0, 0, 0, & - 32, 179, 0, 0, 0, 0, 0, & - 33, 149, 0, 0, 0, 0, 0, & - 34, 144, 0, 0, 0, 0, 0, & - 35, 80, 0, 0, 0, 0, 0, & - 36, 228, 0, 0, 0, 0, 0, & - 37, 185, 0, 0, 0, 0, 0, & - 38, 197, 0, 0, 0, 0, 0, & - 39, 69, 0, 0, 0, 0, 0, & - 40, 42, 0, 0, 0, 0, 0, & - 41, 112, 0, 0, 0, 0, 0, & - 43, 70, 0, 0, 0, 0, 0, & - 44, 198, 0, 0, 0, 0, 0, & - 45, 76, 0, 0, 0, 0, 0, & - 46, 68, 0, 0, 0, 0, 0, & - 47, 90, 0, 0, 0, 0, 0, & - 48, 75, 0, 0, 0, 0, 0, & - 49, 118, 0, 0, 0, 0, 0, & - 50, 125, 0, 0, 0, 0, 0, & - 51, 114, 0, 0, 0, 0, 0, & - 52, 239, 0, 0, 0, 0, 0, & - 53, 108, 0, 0, 0, 0, 0, & - 54, 120, 0, 0, 0, 0, 0, & - 55, 162, 0, 0, 0, 0, 0, & - 56, 218, 0, 0, 0, 0, 0, & - 57, 138, 0, 0, 0, 0, 0, & - 58, 212, 0, 0, 0, 0, 0, & - 60, 207, 0, 0, 0, 0, 0, & - 61, 71, 0, 0, 0, 0, 0, & - 62, 65, 0, 0, 0, 0, 0, & - 63, 161, 0, 0, 0, 0, 0, & - 64, 166, 0, 0, 0, 0, 0, & - 66, 158, 0, 0, 0, 0, 0, & - 72, 235, 0, 0, 0, 0, 0, & - 73, 225, 0, 0, 0, 0, 0, & - 74, 116, 0, 0, 0, 0, 0, & - 77, 96, 0, 0, 0, 0, 0, & - 78, 81, 0, 0, 0, 0, 0, & - 79, 82, 0, 0, 0, 0, 0, & - 83, 229, 0, 0, 0, 0, 0, & - 85, 134, 0, 0, 0, 0, 0, & - 86, 176, 0, 0, 0, 0, 0, & - 87, 203, 0, 0, 0, 0, 0, & - 89, 145, 0, 0, 0, 0, 0, & - 91, 152, 0, 0, 0, 0, 0, & - 92, 237, 0, 0, 0, 0, 0, & - 93, 215, 0, 0, 0, 0, 0, & - 94, 130, 0, 0, 0, 0, 0, & - 95, 156, 0, 0, 0, 0, 0, & - 97, 104, 0, 0, 0, 0, 0, & - 98, 182, 0, 0, 0, 0, 0, & - 100, 222, 0, 0, 0, 0, 0, & - 101, 123, 0, 0, 0, 0, 0, & - 102, 181, 0, 0, 0, 0, 0, & - 103, 135, 0, 0, 0, 0, 0, & - 105, 146, 0, 0, 0, 0, 0, & - 106, 115, 0, 0, 0, 0, 0, & - 107, 109, 0, 0, 0, 0, 0, & - 110, 194, 0, 0, 0, 0, 0, & - 113, 164, 0, 0, 0, 0, 0, & - 119, 172, 0, 0, 0, 0, 0, & - 121, 190, 0, 0, 0, 0, 0, & - 122, 169, 0, 0, 0, 0, 0, & - 124, 211, 0, 0, 0, 0, 0, & - 126, 165, 0, 0, 0, 0, 0, & - 127, 139, 0, 0, 0, 0, 0, & - 128, 129, 0, 0, 0, 0, 0, & - 131, 205, 0, 0, 0, 0, 0, & - 132, 196, 0, 0, 0, 0, 0, & - 133, 193, 0, 0, 0, 0, 0, & - 136, 200, 0, 0, 0, 0, 0, & - 137, 159, 0, 0, 0, 0, 0, & - 142, 204, 0, 0, 0, 0, 0, & - 143, 154, 0, 0, 0, 0, 0, & - 147, 238, 0, 0, 0, 0, 0, & - 148, 175, 0, 0, 0, 0, 0, & - 150, 216, 0, 0, 0, 0, 0, & - 151, 171, 0, 0, 0, 0, 0, & - 153, 231, 0, 0, 0, 0, 0, & - 155, 208, 0, 0, 0, 0, 0, & - 160, 230, 0, 0, 0, 0, 0, & - 163, 223, 0, 0, 0, 0, 0, & - 168, 217, 0, 0, 0, 0, 0, & - 170, 180, 0, 0, 0, 0, 0, & - 174, 233, 0, 0, 0, 0, 0, & - 183, 202, 0, 0, 0, 0, 0, & - 186, 214, 0, 0, 0, 0, 0, & - 191, 206, 0, 0, 0, 0, 0, & - 192, 219, 0, 0, 0, 0, 0, & - 195, 227, 0, 0, 0, 0, 0, & - 210, 226, 0, 0, 0, 0, 0, & - 221, 234, 0, 0, 0, 0, 0, & - 232, 240, 0, 0, 0, 0, 0, & - 1, 106, 0, 0, 0, 0, 0, & - 2, 119, 0, 0, 0, 0, 0, & - 3, 139, 0, 0, 0, 0, 0, & - 4, 14, 0, 0, 0, 0, 0, & - 5, 65, 0, 0, 0, 0, 0, & - 6, 61, 0, 0, 0, 0, 0, & - 7, 223, 0, 0, 0, 0, 0, & - 8, 171, 0, 0, 0, 0, 0, & - 9, 136, 0, 0, 0, 0, 0, & - 10, 113, 0, 0, 0, 0, 0, & - 11, 104, 0, 0, 0, 0, 0, & - 12, 175, 0, 0, 0, 0, 0, & - 13, 203, 0, 0, 0, 0, 0, & - 15, 149, 0, 0, 0, 0, 0, & - 16, 226, 0, 0, 0, 0, 0, & - 17, 219, 0, 0, 0, 0, 0, & - 18, 98, 0, 0, 0, 0, 0, & - 19, 211, 0, 0, 0, 0, 0, & - 20, 49, 0, 0, 0, 0, 0, & - 21, 214, 0, 0, 0, 0, 0, & - 22, 68, 0, 0, 0, 0, 0, & - 23, 77, 0, 0, 0, 0, 0, & - 24, 116, 0, 0, 0, 0, 0, & - 25, 235, 0, 0, 0, 0, 0, & - 26, 50, 0, 0, 0, 0, 0, & - 27, 124, 0, 0, 0, 0, 0, & - 28, 229, 0, 0, 0, 0, 0, & - 29, 83, 0, 0, 0, 0, 0, & - 30, 158, 0, 0, 0, 0, 0, & - 31, 220, 0, 0, 0, 0, 0, & - 32, 155, 0, 0, 0, 0, 0, & - 33, 152, 0, 0, 0, 0, 0, & - 34, 231, 0, 0, 0, 0, 0, & - 35, 207, 0, 0, 0, 0, 0, & - 36, 40, 0, 0, 0, 0, 0, & - 37, 142, 0, 0, 0, 0, 0, & - 38, 75, 0, 0, 0, 0, 0, & - 39, 90, 167, 0, 0, 0, 0, & - 41, 55, 125, 0, 0, 0, 0, & - 42, 153, 196, 0, 0, 0, 0, & - 43, 72, 112, 0, 0, 0, 0, & - 44, 183, 233, 0, 0, 0, 0, & - 45, 81, 178, 0, 0, 0, 0, & - 46, 187, 230, 0, 0, 0, 0, & - 47, 133, 176, 0, 0, 0, 0, & - 48, 54, 186, 0, 0, 0, 0, & - 51, 150, 224, 0, 0, 0, 0, & - 52, 53, 190, 0, 0, 0, 0, & - 56, 143, 228, 0, 0, 0, 0, & - 57, 97, 197, 0, 0, 0, 0, & - 58, 62, 89, 0, 0, 0, 0, & - 59, 174, 194, 0, 0, 0, 0, & - 60, 91, 93, 0, 0, 0, 0, & - 63, 85, 96, 0, 0, 0, 0, & - 64, 92, 205, 0, 0, 0, 0, & - 66, 67, 164, 0, 0, 0, 0, & - 69, 103, 159, 0, 0, 0, 0, & - 70, 117, 122, 0, 0, 0, 0, & - 71, 88, 160, 0, 0, 0, 0, & - 73, 148, 180, 0, 0, 0, 0, & - 74, 108, 109, 0, 0, 0, 0, & - 76, 102, 151, 0, 0, 0, 0, & - 78, 128, 206, 0, 0, 0, 0, & - 79, 215, 239, 0, 0, 0, 0, & - 80, 138, 221, 0, 0, 0, 0, & - 82, 162, 195, 0, 0, 0, 0, & - 84, 161, 184, 0, 0, 0, 0, & - 86, 213, 218, 0, 0, 0, 0, & - 87, 120, 240, 0, 0, 0, 0, & - 94, 100, 157, 0, 0, 0, 0, & - 95, 202, 217, 0, 0, 0, 0, & - 99, 199, 201, 0, 0, 0, 0, & - 101, 127, 225, 0, 0, 0, 0, & - 105, 168, 185, 0, 0, 0, 0, & - 107, 182, 237, 0, 0, 0, 0, & - 110, 147, 208, 0, 0, 0, 0, & - 111, 118, 172, 0, 0, 0, 0, & - 114, 140, 165, 0, 0, 0, 0, & - 115, 130, 141, 0, 0, 0, 0, & - 121, 144, 173, 0, 0, 0, 0, & - 123, 204, 209, 0, 0, 0, 0, & - 126, 137, 188, 0, 0, 0, 0, & - 129, 179, 189, 0, 0, 0, 0, & - 131, 192, 210, 0, 0, 0, 0, & - 132, 200, 238, 0, 0, 0, 0, & - 134, 177, 191, 0, 0, 0, 0, & - 135, 145, 222, 0, 0, 0, 0, & - 146, 229, 236, 0, 0, 0, 0, & - 154, 169, 232, 0, 0, 0, 0, & - 124, 156, 163, 0, 0, 0, 0, & - 166, 223, 234, 0, 0, 0, 0, & - 1, 11, 170, 0, 0, 0, 0, & - 3, 181, 227, 0, 0, 0, 0, & - 193, 198, 220, 0, 0, 0, 0, & - 10, 16, 212, 0, 0, 0, 0, & - 42, 96, 216, 0, 0, 0, 0, & - 2, 6, 215, 0, 0, 0, 0, & - 4, 208, 219, 0, 0, 0, 0, & - 5, 22, 35, 0, 0, 0, 0, & - 7, 12, 20, 0, 0, 0, 0, & - 8, 15, 75, 0, 0, 0, 0, & - 9, 74, 83, 0, 0, 0, 0, & - 13, 37, 50, 0, 0, 0, 0, & - 14, 52, 86, 0, 0, 0, 0, & - 17, 30, 177, 0, 0, 0, 0, & - 18, 25, 97, 0, 0, 0, 0, & - 19, 72, 157, 0, 0, 0, 0, & - 21, 58, 116, 0, 0, 0, 0, & - 23, 111, 226, 0, 0, 0, 0, & - 24, 26, 180, 0, 0, 0, 0, & - 27, 34, 39, 0, 0, 0, 0, & - 28, 32, 161, 0, 0, 0, 0, & - 29, 36, 60, 0, 0, 0, 0, & - 31, 76, 154, 0, 0, 0, 0, & - 33, 101, 238, 0, 0, 0, 0, & - 38, 95, 162, 0, 0, 0, 0, & - 40, 164, 183, 0, 0, 0, 0, & - 41, 92, 196, 0, 0, 0, 0, & - 43, 48, 99, 165, 190, 198, 204, & - 44, 129, 138, 145, 160, 203, 237, & - 45, 65, 66, 98, 127, 137, 146, & - 46, 131, 149, 181, 211, 218, 224, & - 47, 49, 55, 191, 194, 207, 232, & - 51, 69, 106, 109, 119, 184, 217, & - 53, 62, 104, 155, 166, 206, 231, & - 54, 61, 63, 73, 118, 151, 163, & - 56, 94, 110, 117, 185, 189, 214, & - 57, 81, 91, 115, 173, 175, 227, & - 59, 79, 103, 136, 171, 201, 212, & - 24, 64, 77, 93, 202, 235, 236, & - 67, 132, 142, 150, 156, 176, 222, & - 68, 153, 159, 169, 170, 186, 221, & - 70, 84, 89, 113, 174, 197, 205, & - 71, 125, 130, 140, 158, 200, 210, & - 8, 78, 143, 182, 192, 193, 216, & - 23, 80, 82, 90, 108, 139, 228, & - 85, 122, 123, 128, 141, 187, 188, & - 25, 87, 100, 152, 209, 213, 234, & - 88, 134, 147, 167, 172, 178, 239, & - 18, 40, 102, 114, 133, 144, 179, & - 4, 105, 108, 112, 148, 230, 240, & - 29, 33, 50, 62, 107, 195, 199, & - 3, 83, 113, 120, 126, 177, 216, & - 11, 55, 116, 121, 135, 168, 225, & - 1, 27, 28, 76, 187, 226, 233, & - 2, 4, 7, 10, 22, 75, 222, & - 5, 30, 131, 152, 156, 168, 215, & - 6, 13, 19, 58, 196, 228, 229, & - 9, 26, 144, 147, 158, 223, 240, & - 12, 31, 66, 79, 92, 96, 155, & - 14, 54, 103, 173, 202, 232, 238, & - 15, 17, 37, 69, 129, 164, 209, & - 16, 72, 91, 114, 163, 169, 237, & - 20, 45, 89, 99, 143, 180, 208, & - 21, 39, 60, 141, 171, 198, 234, & - 21, 32, 52, 78, 95, 148, 199, & - 34, 73, 84, 157, 200, 221, 236, & - 35, 36, 63, 97, 105, 119, 220, & - 38, 46, 93, 111, 136, 191, 203, & - 41, 51, 151, 160, 213, 214, 231, & - 42, 57, 65, 161, 167, 194, 204, & - 43, 109, 162, 175, 189, 210, 212, & - 44, 74, 100, 149, 170, 188, 197, & - 47, 64, 88, 107, 122, 165, 211, & - 48, 139, 179, 184, 218, 233, 239, & - 49, 94, 106, 112, 138, 142, 205, & - 53, 59, 102, 115, 134, 182, 225, & - 56, 68, 101, 150, 166, 178, 207, & - 61, 117, 126, 154, 195, 219, 224, & - 67, 80, 118, 174, 185, 190, 235, & - 70, 77, 86, 125, 153, 172, 193, & - 32, 71, 87, 90, 98, 110, 135, & - 41, 75, 81, 85, 124, 133, 201, & - 82, 120, 128, 140, 159, 176, 183, & - 22, 72, 104, 130, 146, 181, 217, & - 25, 89, 96, 121, 132, 186, 230, & - 118, 123, 145, 192, 196, 227, 240, & - 1, 14, 35, 38, 114, 127, 192, & - 7, 23, 43, 63, 116, 137, 206, & - 2, 37, 52, 57, 64, 76, 120/ - -data Nm/ & - 1, 121, 212, 265, 298, & - 2, 122, 217, 266, 300, & - 3, 123, 213, 263, 0, & - 4, 124, 218, 261, 266, & - 5, 125, 219, 267, 0, & - 6, 126, 217, 268, 0, & - 7, 127, 220, 266, 299, & - 8, 128, 221, 255, 0, & - 9, 129, 222, 269, 0, & - 10, 130, 215, 266, 0, & - 11, 131, 212, 264, 0, & - 12, 132, 220, 270, 0, & - 4, 133, 223, 268, 0, & - 13, 124, 224, 271, 298, & - 14, 134, 221, 272, 0, & - 15, 135, 215, 273, 0, & - 16, 136, 225, 272, 0, & - 17, 137, 226, 260, 0, & - 18, 138, 227, 268, 0, & - 19, 139, 220, 274, 0, & - 20, 140, 228, 275, 276, & - 21, 141, 219, 266, 295, & - 22, 142, 229, 256, 299, & - 23, 143, 230, 250, 0, & - 24, 144, 226, 258, 296, & - 25, 145, 230, 269, 0, & - 26, 146, 231, 265, 0, & - 19, 147, 232, 265, 0, & - 27, 148, 233, 262, 0, & - 26, 149, 225, 267, 0, & - 28, 150, 234, 270, 0, & - 29, 151, 232, 276, 292, & - 30, 152, 235, 262, 0, & - 31, 153, 231, 277, 0, & - 32, 154, 219, 278, 298, & - 33, 155, 233, 278, 0, & - 34, 156, 223, 272, 300, & - 35, 157, 236, 279, 298, & - 36, 158, 231, 275, 0, & - 37, 155, 237, 260, 0, & - 38, 159, 238, 280, 293, & - 37, 160, 216, 281, 0, & - 39, 161, 239, 282, 299, & - 40, 162, 240, 283, 0, & - 41, 163, 241, 274, 0, & - 42, 164, 242, 279, 0, & - 43, 165, 243, 284, 0, & - 44, 166, 239, 285, 0, & - 45, 139, 243, 286, 0, & - 46, 145, 223, 262, 0, & - 47, 167, 244, 280, 0, & - 48, 168, 224, 276, 300, & - 49, 168, 245, 287, 0, & - 50, 166, 246, 271, 0, & - 51, 159, 243, 264, 0, & - 52, 169, 247, 288, 0, & - 53, 170, 248, 281, 300, & - 54, 171, 228, 268, 0, & - 24, 172, 249, 287, 0, & - 55, 173, 233, 275, 0, & - 56, 126, 246, 289, 0, & - 57, 171, 245, 262, 0, & - 58, 174, 246, 278, 299, & - 59, 175, 250, 284, 300, & - 57, 125, 241, 281, 0, & - 60, 176, 241, 270, 0, & - 1, 176, 251, 290, 0, & - 42, 141, 252, 288, 0, & - 36, 177, 244, 272, 0, & - 39, 178, 253, 291, 0, & - 56, 179, 254, 292, 0, & - 61, 161, 227, 273, 295, & - 62, 180, 246, 277, 0, & - 63, 181, 222, 283, 0, & - 44, 157, 221, 266, 293, & - 41, 182, 234, 265, 300, & - 64, 142, 250, 291, 0, & - 65, 183, 255, 276, 0, & - 66, 184, 249, 270, 0, & - 32, 185, 256, 290, 0, & - 65, 163, 248, 293, 0, & - 66, 186, 256, 294, 0, & - 67, 148, 222, 263, 0, & - 5, 187, 253, 277, 0, & - 68, 174, 257, 293, 0, & - 69, 188, 224, 291, 0, & - 70, 189, 258, 292, 0, & - 11, 179, 259, 284, 0, & - 71, 171, 253, 274, 296, & - 43, 158, 256, 292, 0, & - 72, 173, 248, 273, 0, & - 73, 175, 238, 270, 0, & - 74, 173, 250, 279, 0, & - 75, 190, 247, 286, 0, & - 76, 191, 236, 276, 0, & - 64, 174, 216, 270, 296, & - 77, 170, 226, 278, 0, & - 78, 137, 241, 292, 0, & - 16, 192, 239, 274, 0, & - 79, 190, 258, 283, 0, & - 80, 193, 235, 288, 0, & - 81, 182, 260, 287, 0, & - 82, 177, 249, 271, 0, & - 77, 131, 245, 295, 0, & - 83, 194, 261, 278, 0, & - 84, 121, 244, 286, 0, & - 85, 195, 262, 284, 0, & - 49, 181, 256, 261, 0, & - 85, 181, 244, 282, 0, & - 86, 196, 247, 292, 0, & - 17, 197, 229, 279, 0, & - 38, 161, 261, 286, 0, & - 87, 130, 253, 263, 0, & - 47, 198, 260, 273, 298, & - 84, 199, 248, 287, 0, & - 63, 143, 228, 264, 299, & - 15, 178, 247, 289, 0, & - 45, 197, 246, 290, 297, & - 88, 122, 244, 278, 0, & - 50, 189, 263, 294, 300, & - 89, 200, 264, 296, 0, & - 90, 178, 257, 284, 0, & - 80, 201, 257, 297, 0, & - 91, 146, 210, 293, 0, & - 46, 159, 254, 291, 0, & - 92, 202, 263, 289, 0, & - 93, 193, 241, 298, 0, & - 94, 183, 257, 294, 0, & - 94, 203, 240, 272, 0, & - 75, 199, 254, 295, 0, & - 95, 204, 242, 267, 0, & - 96, 205, 251, 296, 0, & - 97, 165, 260, 293, 0, & - 68, 206, 259, 287, 0, & - 82, 207, 264, 292, 0, & - 98, 129, 249, 279, 0, & - 99, 202, 241, 299, 0, & - 53, 185, 240, 286, 0, & - 93, 123, 256, 285, 0, & - 7, 198, 254, 294, 0, & - 13, 199, 257, 275, 0, & - 100, 156, 251, 286, 0, & - 101, 169, 255, 274, 0, & - 31, 200, 260, 269, 0, & - 71, 207, 240, 297, 0, & - 83, 208, 241, 295, 0, & - 102, 196, 259, 269, 0, & - 103, 180, 261, 276, 0, & - 30, 134, 242, 283, 0, & - 104, 167, 251, 288, 0, & - 105, 182, 246, 280, 0, & - 72, 152, 258, 267, 0, & - 106, 160, 252, 291, 0, & - 101, 209, 234, 289, 0, & - 107, 151, 245, 270, 0, & - 76, 210, 251, 267, 0, & - 27, 190, 227, 277, 0, & - 60, 149, 254, 269, 0, & - 99, 177, 252, 294, 0, & - 108, 179, 240, 280, 0, & - 58, 187, 232, 281, 0, & - 51, 186, 236, 282, 0, & - 109, 210, 246, 273, 0, & - 87, 176, 237, 272, 0, & - 92, 198, 239, 284, 0, & - 59, 211, 245, 288, 0, & - 8, 158, 259, 281, 0, & - 110, 194, 264, 267, 0, & - 90, 209, 252, 273, 0, & - 111, 212, 252, 283, 0, & - 105, 128, 249, 275, 0, & - 88, 197, 259, 291, 0, & - 10, 200, 248, 271, 0, & - 112, 172, 253, 290, 0, & - 103, 132, 248, 282, 0, & - 69, 165, 251, 294, 0, & - 20, 206, 225, 263, 0, & - 18, 163, 259, 288, 0, & - 29, 203, 260, 285, 0, & - 111, 180, 230, 274, 0, & - 81, 213, 242, 295, 0, & - 78, 195, 255, 287, 0, & - 113, 162, 237, 294, 0, & - 28, 187, 244, 285, 0, & - 34, 194, 247, 290, 0, & - 114, 166, 252, 296, 0, & - 9, 164, 257, 265, 0, & - 6, 202, 257, 283, 0, & - 2, 203, 247, 282, 0, & - 89, 168, 239, 290, 0, & - 115, 206, 243, 279, 0, & - 116, 204, 255, 297, 298, & - 97, 214, 255, 291, 0, & - 86, 172, 243, 281, 0, & - 117, 186, 262, 289, 0, & - 96, 160, 238, 268, 297, & - 35, 170, 253, 283, 0, & - 40, 214, 239, 275, 0, & - 21, 192, 262, 276, 0, & - 98, 205, 254, 277, 0, & - 3, 192, 249, 293, 0, & - 113, 191, 250, 271, 0, & - 70, 133, 240, 279, 0, & - 100, 201, 239, 281, 0, & - 95, 175, 253, 286, 0, & - 115, 183, 245, 299, 0, & - 55, 154, 243, 288, 0, & - 107, 196, 218, 274, 0, & - 22, 201, 258, 272, 0, & - 118, 204, 254, 282, 0, & - 91, 138, 242, 284, 0, & - 54, 215, 249, 282, 0, & - 12, 188, 258, 280, 0, & - 114, 140, 247, 280, 0, & - 74, 184, 217, 267, 0, & - 104, 216, 255, 263, 0, & - 110, 191, 244, 295, 0, & - 52, 188, 242, 285, 0, & - 116, 136, 218, 289, 0, & - 23, 150, 214, 278, 0, & - 119, 185, 252, 277, 0, & - 79, 207, 251, 266, 0, & - 109, 127, 211, 269, 0, & - 25, 167, 242, 289, 0, & - 62, 193, 264, 287, 0, & - 118, 135, 229, 265, 0, & - 117, 213, 248, 297, 0, & - 33, 169, 256, 268, 0, & - 67, 147, 208, 268, 0, & - 108, 164, 261, 296, 0, & - 106, 153, 245, 280, 0, & - 120, 209, 243, 271, 0, & - 112, 162, 265, 285, 0, & - 119, 211, 258, 275, 0, & - 61, 144, 250, 290, 0, & - 14, 208, 250, 277, 0, & - 73, 195, 240, 273, 0, & - 102, 205, 235, 271, 0, & - 48, 184, 259, 285, 0, & - 120, 189, 261, 269, 297/ - -data nrw/ & -5,5,4,5,4,4,5,4,4,4,4,4,4,5,4,4,4,4,4,4, & -5,5,5,4,5,4,4,4,4,4,4,5,4,4,5,4,5,5,4,4, & -5,4,5,4,4,4,4,4,4,4,4,5,4,4,4,4,5,4,4,4, & -4,4,5,5,4,4,4,4,4,4,4,5,4,4,5,5,4,4,4,4, & -4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,5,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,5,4,5,4,5, & -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,5,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5/ - -data ncw/ & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3, & -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,7, & -7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, & -7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, & -7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7/ - -!ncw=3 - -toc=0 -tov=0 -tanhtoc=0 -!write(*,*) llr -! initialize messages to checks -do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo -enddo - -ncnt=0 - -do iter=0,maxiterations - -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw(i),i)) - else - zn(i)=llr(i) - endif - enddo - -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -!write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it -! niterations=iter - codeword=cw(colorder+1) - decoded=codeword(M+1:N) - nerr=0 - do i=1,N - if( (2*cw(i)-1)*llr(i) .lt. 0.0 ) nerr=nerr+1 - enddo - niterations=nerr - return - endif - - if( iter.gt.0 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 15 .and. ncheck .gt. 50) then - niterations=-1 - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) -! do kk=1,ncw(ibj) ! subtract off what the bit had received from the check - do kk=1,7 ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:5,i)=tanh(-toc(1:5,i)/2) - enddo - - do j=1,N - do i=1,ncw(j) - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - -enddo -niterations=-1 -return -end subroutine bpdecode300 diff --git a/lib/fsk4hf/chkcrc10.f90 b/lib/fsk4hf/chkcrc10.f90 deleted file mode 100644 index abe7bd79e..000000000 --- a/lib/fsk4hf/chkcrc10.f90 +++ /dev/null @@ -1,27 +0,0 @@ -subroutine chkcrc10(decoded,nbadcrc) - - use crc - integer*1 decoded(60) - integer*1, target:: i1Dec8BitBytes(9) - -! Check the CRC - do ibyte=1,6 - itmp=0 - do ibit=1,8 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit)) - enddo - i1Dec8BitBytes(ibyte)=itmp - enddo - i1Dec8BitBytes(7)=decoded(49)*128+decoded(50)*64 - -! Pack received CRC into bytes 8 and 9 for crc10_check - i1Dec8BitBytes(8)=decoded(51)*2+decoded(52) - i1Dec8BitBytes(9)=decoded(53)*128 + decoded(54)*64+decoded(55)*32 + & - decoded(56)*16 - i1Dec8BitBytes(9)=i1Dec8BitBytes(9) + decoded(57)*8+decoded(58)*4 + & - decoded(59)*2+decoded(60)*1 - nbadcrc=1 - if(crc10_check(c_loc(i1Dec8BitBytes),9)) nbadcrc=0 - - return -end subroutine chkcrc10 diff --git a/lib/fsk4hf/chkcrc12.f90 b/lib/fsk4hf/chkcrc12.f90 deleted file mode 100644 index a177fa110..000000000 --- a/lib/fsk4hf/chkcrc12.f90 +++ /dev/null @@ -1,27 +0,0 @@ -subroutine chkcrc12(decoded,nbadcrc) - - use crc - integer*1 decoded(84) - integer*1, target:: i1Dec8BitBytes(11) - -! Check the CRC -! Collapse 84 decoded bits to 11 bytes. Bytes 1-9 are the message, -! byte 10 and first half of byte 11 is the crc - do ibyte=1,9 - itmp=0 - do ibit=1,8 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit)) - enddo - i1Dec8BitBytes(ibyte)=itmp - enddo - -! Pack the crc into bytes 10 and 11 for crc12_check - i1Dec8BitBytes(10)=decoded(73)*8 + decoded(74)*4 + decoded(75)*2 + decoded(76) - i1Dec8BitBytes(11)=decoded(77)*128 + decoded(78)*64 + & - decoded(79)*32 + decoded(80)*16 + decoded(81)*8 + decoded(82)*4 + & - decoded(83)*2 + decoded(84) - nbadcrc=1 - if( crc12_check(c_loc (i1Dec8BitBytes), 11) ) nbadcrc=0 - - return -end subroutine chkcrc12 diff --git a/lib/fsk4hf/costasxcorr.m b/lib/fsk4hf/costasxcorr.m deleted file mode 100644 index 7d104c25d..000000000 --- a/lib/fsk4hf/costasxcorr.m +++ /dev/null @@ -1,14 +0,0 @@ -# Gnu Octave script to calculate -# cross correlation between 2 Costas arrays -costas1=[2,5,6,0,4,1,3]; -costas2=[3,1,4,0,6,5,2]; -array1=zeros(7,7); -array2=zeros(7,7); -for i=1:7 - array1(i,costas1(i)+1)=1; - array2(i,costas2(i)+1)=1; -endfor -xcorr2(array1,array1,"none") -xcorr2(array2,array2,"none") -xcorr2(array1,array2,"none") - diff --git a/lib/fsk4hf/cpolyfit.f90 b/lib/fsk4hf/cpolyfit.f90 deleted file mode 100644 index fd0d5987f..000000000 --- a/lib/fsk4hf/cpolyfit.f90 +++ /dev/null @@ -1,76 +0,0 @@ -subroutine cpolyfit(c,pp,id,maxn,aa,bb,zz,nhardsync) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) - parameter (NR=3) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (236) - parameter (NSPS=16) !Samples per MSK symbol (16) - parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) - parameter (N13=13*N2) !Samples in central sync vector (416) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - - complex c(0:NZ-1) !Complex waveform - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z,z0 - real x(NS),yi(NS),yq(NS) !For complex polyfit - real pp(2*NSPS) !Shaped pulse for OQPSK - real aa(20),bb(20) !Fitted polyco's - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - - ib=NSPS-1 - ib2=N2-1 - n=0 - do j=1,117 !First-pass demodulation - ia=ib+1 - ib=ia+N2-1 - zz(j)=sum(pp*c(ia:ib))/NSPS - if(abs(id(j)).eq.2) then !Save all sync symbols - n=n+1 - x(n)=float(ia+ib)/NZ - 1.0 - yi(n)=real(zz(j))*0.5*id(j) - yq(n)=aimag(zz(j))*0.5*id(j) -! write(54,1225) n,x(n),yi(n),yq(n) -!1225 format(i5,3f12.4) - endif - if(j.le.116) then - zz(j+117)=sum(pp*c(ia+NSPS:ib+NSPS))/NSPS - endif - enddo - - aa=0. - bb=0. - nterms=0 - chisqa=0. - chisqb=0. - if(maxn.gt.0) then - npts=n - mode=0 - nterms=maxn - call polyfit4(x,yi,yi,npts,nterms,mode,aa,chisqa) - call polyfit4(x,yq,yq,npts,nterms,mode,bb,chisqb) - endif - - nhardsync=0 - do j=1,117 - if(abs(id(j)).ne.2) cycle - xx=j*2.0/117.0 - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=real(z) - if(p*id(j).lt.0) nhardsync=nhardsync+1 - enddo - - return -end subroutine cpolyfit diff --git a/lib/fsk4hf/cpolyfitw.f90 b/lib/fsk4hf/cpolyfitw.f90 deleted file mode 100644 index 561052f8f..000000000 --- a/lib/fsk4hf/cpolyfitw.f90 +++ /dev/null @@ -1,68 +0,0 @@ -subroutine cpolyfitw(c,pp,id,maxn,aa,bb,zz,nhardsync) - - include 'wsprlf_params.f90' - - complex c(0:NZ-1) !Complex waveform - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z,z0 - real x(NS),yi(NS),yq(NS) !For complex polyfit - real pp(2*NSPS) !Shaped pulse for OQPSK - real aa(20),bb(20) !Fitted polyco's - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - - ib=NSPS-1 - ib2=N2-1 - n=0 - jz=(NS+ND+1)/2 - do j=1,jz !First-pass demodulation - ia=ib+1 - ib=ia+N2-1 - zz(j)=sum(pp*c(ia:ib))/NSPS - if(abs(id(j)).eq.2) then !Save all sync symbols - n=n+1 - x(n)=float(ia+ib)/NZ - 1.0 - yi(n)=real(zz(j))*0.5*id(j) - yq(n)=aimag(zz(j))*0.5*id(j) -! write(54,1225) n,x(n),yi(n),yq(n) -!1225 format(i5,3f12.4) - endif - if(j.lt.jz) then - zz(j+jz)=sum(pp*c(ia+NSPS:ib+NSPS))/NSPS - endif - enddo - - aa=0. - bb=0. - nterms=0 - chisqa=0. - chisqb=0. - if(maxn.gt.0) then - npts=n - mode=0 - nterms=maxn - call polyfit4(x,yi,yi,npts,nterms,mode,aa,chisqa) - call polyfit4(x,yq,yq,npts,nterms,mode,bb,chisqb) - endif - - nhardsync=0 - do j=1,205 - if(abs(id(j)).ne.2) cycle - xx=j*2.0/205.0 - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=real(z) - if(p*id(j).lt.0) nhardsync=nhardsync+1 - enddo - - return -end subroutine cpolyfitw diff --git a/lib/fsk4hf/dbpsksim.f90 b/lib/fsk4hf/dbpsksim.f90 deleted file mode 100644 index 8b9ea12c6..000000000 --- a/lib/fsk4hf/dbpsksim.f90 +++ /dev/null @@ -1,241 +0,0 @@ -program dbpsksim - - parameter (ND=121) !Data symbols: LDPC (120,60), r=1/2 - parameter (NN=ND) !Total symbols (121) - parameter (NSPS=28800) !Samples per symbol at 12000 sps - parameter (NZ=NSPS*NN) !Samples in waveform (3484800) - parameter (NFFT1=65536,NH1=NFFT1/2) - parameter (NFFT2=128,NH2=NFFT2/2) - - character*8 arg - complex c(0:NZ-1) !Complex waveform - complex c2(0:NFFT1-1) !Short spectra - complex cr(0:NZ-1) - complex ct(0:NZ-1) - complex cz(0:NFFT2-1) - complex z0,z,zp - real s(-NH1+1:NH1) - real s2(-NH2+1:NH2) - real xnoise(0:NZ-1) !Generated random noise - real ynoise(0:NZ-1) !Generated random noise - real rxdata(120),llr(120) - integer id(NN) !Encoded NRZ data (values +/-1) - integer id1(NN) !Recovered data (1st pass) - integer id2(NN) !Recovered data (2nd pass) -! integer icw(NN) - integer*1 msgbits(60),decoded(60),codeword(120),apmask(120),cw(120) - data msgbits/0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,& - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,1,0,1,0/ - - nnn=0 - nargs=iargc() - if(nargs.ne.6) then - print*,'Usage: dbpsksim f0(Hz) delay(ms) fspread(Hz) ndiff iters snr(dB)' - print*,'Example: dbpsksim 1500 0 0 10 -35' - print*,'Set snr=0 to cycle through a range' - go to 999 - endif - call getarg(1,arg) - read(arg,*) f0 !Low tone frequency - call getarg(2,arg) - read(arg,*) delay - call getarg(3,arg) - read(arg,*) fspread - call getarg(4,arg) - read(arg,*) ndiff - call getarg(5,arg) - read(arg,*) iters - call getarg(6,arg) - read(arg,*) snrdb - - twopi=8.d0*atan(1.d0) - fs=12000.d0 - dt=1.0/fs - ts=NSPS*dt - baud=1.d0/ts - txt=NZ*dt - bandwidth_ratio=2500.0/6000.0 - write(*,1000) baud,5*baud,txt,delay,fspread,ndiff -1000 format('Baud:',f6.3,' BW:',f4.1,' TxT:',f6.1,' Delay:',f5.2, & - ' fSpread:',f5.2,' ndiff:',i2/) - - write(*,1004) -1004 format(' SNR err ber fer fsigma'/35('-')) - - call encode120(msgbits,codeword) !Encode the test message - isna=-28 - isnb=-40 - if(snrdb.ne.0.0) then - isna=nint(snrdb) - isnb=isna - endif - do isnr=isna,isnb,-1 - snrdb=isnr - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - nhard=0 - nhardc=0 - nfe1=0 - nfe2=0 - sqf=0. - do iter=1,iters - nnn=nnn+1 - id(1)=1 !First bit is always 1 - id(2:NN)=2*codeword-1 - call genbpsk(id,f0,ndiff,0,c) !Generate the 4-FSK waveform - if(delay.ne.0.0 .or. fspread.ne.0.0) call watterson(c,delay,fspread) - c=sig*c !Scale to requested SNR - if(snrdb.lt.90) then - do i=0,NZ-1 !Generate gaussian noise - xnoise(i)=gran() - ynoise(i)=gran() - enddo - c=c + cmplx(xnoise,ynoise) !Add noise to signal - endif - -! First attempt at finding carrier frequency fc: 64k FFTs ==> avg power spectra - nspec=NZ/NFFT1 - df1=12000.0/NFFT1 - s=0. - do k=1,nspec - ia=(k-1)*NSPS - ib=ia+NSPS-1 - c2(0:NSPS-1)=c(ia:ib) - c2(NSPS:)=0. - call four2a(c2,NFFT1,1,-1,1) - do i=0,NFFT1-1 - j=i - if(j.gt.NH1) j=j-NFFT1 - s(j)=s(j) + real(c2(i))**2 + aimag(c2(i))**2 - enddo - enddo - s=1.e-6*s - smax=0. - ipk=0 - ia=(1400.0)/df1 - ib=(1600.0)/df1 - do i=ia,ib - f=i*df1 - if(s(i).gt.smax) then - smax=s(i) - ipk=i - fc=f - endif - enddo - a=(s(ipk+1)-s(ipk-1))/2.0 - b=(s(ipk+1)+s(ipk-1)-2.0*s(ipk))/2.0 - dx=-a/(2.0*b) - fc=fc + df1*dx !Estimated carrier frequency - sqf=sqf + (fc-f0)**2 - -! The following is for testing SNR calibration: -! sp5n=(s(ipk-2)+s(ipk-1)+s(ipk)+s(ipk+1)+s(ipk+2)) !Sig + 5*noise -! base=(sum(s)-sp5n)/(NFFT1-5.0) !Noise per bin -! psig=sp5n-5*base !Sig only -! pnoise=(2500.0/df1)*base !Noise in 2500 Hz -! xsnrdb=db(psig/pnoise) - - call genbpsk(id,fc,ndiff,1,cr) !Generate reference carrier - c=c*conjg(cr) !Mix signal to baseband - - z0=1.0 - do j=1,NN !Demodulate - ia=(j-1)*NSPS - ib=ia+NSPS-1 - z=sum(c(ia:ib)) - cz(j-1)=z - zp=z*conjg(z0) - p=1.e-4*real(zp) - id1(j)=-1 - if(p.ge.0.0) id1(j)=1 - if(j.ge.2) rxdata(j-1)=p - z0=z - enddo - - rxav=sum(rxdata)/120 - rx2av=sum(rxdata*rxdata)/120 - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - ss=0.84 - llr=2.0*rxdata/(ss*ss) - apmask=0 - max_iterations=10 - call bpdecode120(llr,apmask,max_iterations,decoded,niterations,cw) - -! Count frame errors - if(niterations.lt.0 .or. count(msgbits.ne.decoded).gt.0) nfe1=nfe1+1 - -! Find carrier frequency from squared cz array. - cz(121:)=0. - cz=cz*cz - call four2a(cz,NFFT2,1,-1,1) - s2max=0. - do i=0,NFFT2-1 - j=i - if(i.gt.NH2) j=j-NFFT2 - s2(j)=real(cz(i))**2 + aimag(cz(i))**2 - if(s2(j).gt.s2max) then - s2max=s2(j) - jpk=j - endif -! write(16,1200) j*baud/NFFT2,1.e-12*s2(j) -!1200 format(2f12.3) - enddo - a=(s2(jpk+1)-s2(jpk-1))/2.0 - b=(s2(jpk+1)+s2(jpk-1)-2.0*s2(jpk))/2.0 - dx=-a/(2.0*b) - fc2=0.5*(jpk+dx)*baud/NFFT2 - - call genbpsk(id,fc2,ndiff,1,cr) !Generate new ref carrier at fc2 - c=c*conjg(cr) - z0=1.0 - do j=1,NN !Demodulate - ia=(j-1)*NSPS - ib=ia+NSPS-1 - z=sum(c(ia:ib)) - if(j.eq.1) z0=z - zp=z*conjg(z0) - p=1.e-4*real(zp) - id2(j)=-1 - if(p.ge.0.0) id2(j)=1 - if(j.ge.2) rxdata(j-1)=p - ierr=0 - if(id2(j).ne.id(j)) ierr=1 - id3=-1 - if(real(z).ge.0.0) id3=1 - if(j.ge.2 .and. id3.ne.id(j)) nhardc=nhardc+1 - if(j.ge.2 .and. ndiff.eq.0) rxdata(j-1)=real(z) - z0=z - enddo - nhard=nhard + count(id2.ne.id) !Count hard errors - - rxav=sum(rxdata)/120 - rx2av=sum(rxdata*rxdata)/120 - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - ss=0.84 - llr=2.0*rxdata/(ss*ss) !Soft symbols - apmask=0 - max_iterations=10 - decoded=0 - call bpdecode120(llr,apmask,max_iterations,decoded,niterations,cw) -! if(niterations.lt.0) then -! llr=-llr -! call bpdecode120(llr,apmask,max_iterations,decoded,niterations,cw) -! if(niterations.ge.0) nhard=NN*iters-nhard -! endif - if(niterations.ge.0) call chkcrc10(decoded,nbadcrc) - if(niterations.lt.0 .or. count(msgbits.ne.decoded).gt.0 .or. & - nbadcrc.ne.0) nfe2=nfe2+1 - enddo - - if(ndiff.eq.0) nhard=nhardc - fsigma=sqrt(sqf/iters) - ber=float(nhard)/(NN*iters) - fer=float(nfe2)/iters - write(*,1050) snrdb,nhard,ber,fer,fsigma - write(14,1050) snrdb,nhard,ber,fer,fsigma -1050 format(f6.1,i5,f8.4,f7.3,f8.2) - enddo - -999 end program dbpsksim diff --git a/lib/fsk4hf/decode174_101.f90 b/lib/fsk4hf/decode174_101.f90 deleted file mode 100644 index 147e1065e..000000000 --- a/lib/fsk4hf/decode174_101.f90 +++ /dev/null @@ -1,128 +0,0 @@ -subroutine decode174_101(llr,Keff,ndeep,apmask,maxsuper,message101,cw,nharderror,iter,ncheck,dmin,isuper) -! -! A hybrid bp/osd decoder for the (174,101) code. -! - integer, parameter:: N=174, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(8,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(8,M) - real tanhtoc(8,M) - real zn(N),zsum(N) - real llr(N) - real Tmn - - include "ldpc_174_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - - maxiterations=1 - - zsum=0.0 - do isuper=1,maxsuper - - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - zsum=zsum+zn -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:K) - call get_crc24(decoded,74,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - dmin=0.0 - return - endif - endif - -! if( iter.gt.0 ) then ! this code block implements an early stopping criterion - if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:8,i)=tanh(-toc(1:8,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo ! bp iterations - llr=zsum - call osd174_101(llr,Keff,apmask,ndeep,message101,cw,nharderror,dmin) - if(nharderror.gt.0) then - return - endif - enddo ! super iterations - - nharderror=-1 - - return -end subroutine decode174_101 diff --git a/lib/fsk4hf/decode174_74.f90 b/lib/fsk4hf/decode174_74.f90 deleted file mode 100644 index 9d8020de2..000000000 --- a/lib/fsk4hf/decode174_74.f90 +++ /dev/null @@ -1,128 +0,0 @@ -subroutine decode174_74(llr,Keff,ndeep,apmask,maxsuper,message74,cw,nharderror,iter,ncheck,dmin,isuper) -! -! A hybrid bp/osd decoder for the (174,74) code. -! - integer, parameter:: N=174, K=74, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 message74(74) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N),zsum(N) - real llr(N) - real Tmn - - include "ldpc_174_74_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - - maxiterations=1 - - zsum=0.0 - do isuper=1,maxsuper - - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - zsum=zsum+zn -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:K) - call get_crc24(decoded,74,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message74=decoded(1:74) - dmin=0.0 - return - endif - endif - -! if( iter.gt.0 ) then ! this code block implements an early stopping criterion - if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo ! bp iterations - llr=zsum - call osd174_74(llr,Keff,apmask,ndeep,message74,cw,nharderror,dmin) - if(nharderror.gt.0) then - return - endif - enddo ! super iterations - - nharderror=-1 - - return -end subroutine decode174_74 diff --git a/lib/fsk4hf/decode240_101.f90 b/lib/fsk4hf/decode240_101.f90 deleted file mode 100644 index 71cbc8ff3..000000000 --- a/lib/fsk4hf/decode240_101.f90 +++ /dev/null @@ -1,133 +0,0 @@ -subroutine decode240_101(llr,Keff,ndeep,apmask,maxsuper,message101,cw,nharderror,iter,ncheck,dmin,isuper) -! -! A hybrid bp/osd decoder for the (240,101) code. -! - integer, parameter:: N=240, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 nxor(N),hdec(N) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N),zsum(N) - real llr(N) - real Tmn - - include "ldpc_240_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - - maxiterations=1 - - zsum=0.0 - do isuper=1,maxsuper - - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - zsum=zsum+zn -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:K) - call get_crc24(decoded,74,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - dmin=0.0 - return - endif - endif - -! if( iter.gt.0 ) then ! this code block implements an early stopping criterion - if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo ! bp iterations - - call osd240_101(zsum,Keff,apmask,ndeep,message101,cw,nharderror,dminosd) - if(nharderror.gt.0) then - hdec=0 - where(llr .ge. 0) hdec=1 - nxor=ieor(hdec,cw) - dmin=sum(nxor*abs(llr)) - return - endif - enddo ! super iterations - - nharderror=-1 - - return -end subroutine decode240_101 diff --git a/lib/fsk4hf/decode280_101.f90 b/lib/fsk4hf/decode280_101.f90 deleted file mode 100644 index 31bde307d..000000000 --- a/lib/fsk4hf/decode280_101.f90 +++ /dev/null @@ -1,133 +0,0 @@ -subroutine decode280_101(llr,Keff,ndeep,apmask,maxsuper,message101,cw,nharderror,iter,ncheck,dmin,isuper) -! -! A hybrid bp/osd decoder for the (280,101) code. -! - integer, parameter:: N=280, K=101, M=N-K - integer*1 cw(N),apmask(N) - integer*1 decoded(K) - integer*1 nxor(N),hdec(N) - integer*1 message101(101) - integer nrw(M),ncw - integer Nm(6,M) - integer Mn(3,N) ! 3 checks per bit - integer synd(M) - real tov(3,N) - real toc(6,M) - real tanhtoc(6,M) - real zn(N),zsum(N) - real llr(N) - real Tmn - - include "ldpc_280_101_parity.f90" - - decoded=0 - toc=0 - tov=0 - tanhtoc=0 -! initialize messages to checks - do j=1,M - do i=1,nrw(j) - toc(i,j)=llr((Nm(i,j))) - enddo - enddo - - ncnt=0 - nclast=0 - - maxiterations=1 - - zsum=0.0 - do isuper=1,maxsuper - - do iter=0,maxiterations -! Update bit log likelihood ratios (tov=0 in iteration 0). - do i=1,N - if( apmask(i) .ne. 1 ) then - zn(i)=llr(i)+sum(tov(1:ncw,i)) - else - zn(i)=llr(i) - endif - enddo - zsum=zsum+zn -! Check to see if we have a codeword (check before we do any iteration). - cw=0 - where( zn .gt. 0. ) cw=1 - ncheck=0 - do i=1,M - synd(i)=sum(cw(Nm(1:nrw(i),i))) - if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 -! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' - enddo -! write(*,*) 'number of unsatisfied parity checks ',ncheck - if( ncheck .eq. 0 ) then ! we have a codeword - if crc is good, return it - decoded=cw(1:K) - call get_crc24(decoded,74,nbadcrc) - nharderror=count( (2*cw-1)*llr .lt. 0.0 ) - if(nbadcrc.eq.0) then - message101=decoded(1:101) - dmin=0.0 - return - endif - endif - -! if( iter.gt.0 ) then ! this code block implements an early stopping criterion - if( iter.gt.10000 ) then ! this code block implements an early stopping criterion - nd=ncheck-nclast - if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased - ncnt=0 ! reset counter - else - ncnt=ncnt+1 - endif -! write(*,*) iter,ncheck,nd,ncnt - if( ncnt .ge. 5 .and. iter .ge. 10 .and. ncheck .gt. 15) then - nharderror=-1 - - return - endif - endif - nclast=ncheck - -! Send messages from bits to check nodes - do j=1,M - do i=1,nrw(j) - ibj=Nm(i,j) - toc(i,j)=zn(ibj) - do kk=1,ncw ! subtract off what the bit had received from the check - if( Mn(kk,ibj) .eq. j ) then - toc(i,j)=toc(i,j)-tov(kk,ibj) - endif - enddo - enddo - enddo - -! send messages from check nodes to variable nodes - do i=1,M - tanhtoc(1:6,i)=tanh(-toc(1:6,i)/2) - enddo - - do j=1,N - do i=1,ncw - ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j - Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) - call platanh(-Tmn,y) -! y=atanh(-Tmn) - tov(i,j)=2*y - enddo - enddo - - enddo ! bp iterations - - call osd280_101(zsum,Keff,apmask,ndeep,message101,cw,nharderror,dminosd) - if(nharderror.gt.0) then - hdec=0 - where(llr .ge. 0) hdec=1 - nxor=ieor(hdec,cw) - dmin=sum(nxor*abs(llr)) - return - endif - enddo ! super iterations - - nharderror=-1 - - return -end subroutine decode280_101 diff --git a/lib/fsk4hf/dopspread.f90 b/lib/fsk4hf/dopspread.f90 deleted file mode 100644 index cadfbecc6..000000000 --- a/lib/fsk4hf/dopspread.f90 +++ /dev/null @@ -1,62 +0,0 @@ -subroutine dopspread(c,fspread) - - parameter (NFFT=268800,NH=NFFT/2) - complex c(0:NFFT-1) - complex cspread(0:NFFT-1) - - df=12000.0/nfft - twopi=8*atan(1.0) - cspread(0)=1.0 - cspread(NH)=0. - b=6.0 !Lorenzian 3/28 onward - do i=1,NH - f=i*df - x=b*f/fspread - z=0. - a=0. - if(x.lt.3.0) then !Cutoff beyond x=3 - a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian - call random_number(r1) - phi1=twopi*r1 - z=a*cmplx(cos(phi1),sin(phi1)) - endif - cspread(i)=z - z=0. - if(x.lt.50.0) then - call random_number(r2) - phi2=twopi*r2 - z=a*cmplx(cos(phi2),sin(phi2)) - endif - cspread(NFFT-i)=z - enddo - - izh=fspread/df - do i=-izh,izh - f=i*df - j=i - if(j.lt.0) j=j+nfft - s=real(cspread(j))**2 + aimag(cspread(j))**2 -! write(23,3000) f,s,cspread(j) -!3000 format(f10.3,3f12.6) - enddo - - call four2a(cspread,NFFT,1,1,1) !Transform to time domain - - sum=0. - do i=0,NFFT-1 - p=real(cspread(i))**2 + aimag(cspread(i))**2 - sum=sum+p - enddo - avep=sum/NFFT - fac=sqrt(1.0/avep) - cspread=fac*cspread !Normalize to constant avg power - c=cspread*c !Apply Rayleigh fading to c() - - do i=0,NFFT-1 - p=real(cspread(i))**2 + aimag(cspread(i))**2 -! write(24,3010) i,p,cspread(i) -!3010 format(i8,3f12.6) - enddo - - return -end subroutine dopspread diff --git a/lib/fsk4hf/encode120.f90 b/lib/fsk4hf/encode120.f90 deleted file mode 100644 index 577bbe860..000000000 --- a/lib/fsk4hf/encode120.f90 +++ /dev/null @@ -1,116 +0,0 @@ -subroutine encode120(message,codeword) -! Encode an 60-bit message and return a 120-bit codeword. -! The generator matrix has dimensions (60,60). -! The code is a (120,60) regular ldpc code with column weight 3. -! The code was generated using the PEG algorithm. -! After creating the codeword, the columns are re-ordered according to -! "colorder" to make the codeword compatible with the parity-check matrix -! -character*15 g(60) -integer*1 codeword(120) -integer colorder(120) -integer*1 gen(60,60) -integer*1 itmp(120) -integer*1 message(60) -integer*1 pchecks(60) -logical first -data first/.true./ -data g/ & - "65541ad98feab6e",& - "27249940a5895a3",& - "c80eac7506bf794",& - "aa50393e3e18d3f",& - "28527e87d47dced",& - "5da0dcaf8db048c",& - "d6509a43ca9b01a",& - "9a7dadd9c94f1d4",& - "bb673d3ba07cf29",& - "65e190f2fbed447",& - "bc2062a4e520969",& - "9e357f3feed059b",& - "aa6b59212036a57",& - "f78a326722d6565",& - "416754bc34c6405",& - "f77000b3f04ff67",& - "d48fbd7d48c5ab9",& - "031ffb5db3a70cb",& - "125964e358c4df5",& - "bd02c32a5a241ea",& - "4c15ecdd8561abd",& - "7f0f1b352c7413e",& - "26edb94dfd0ae79",& - "ca1ba1ee0f8fb24",& - "49878a58cb4544c",& - "3dbcd0ff821b203",& - "c1f4440160d5345",& - "b5ea9dc7a5a70ab",& - "cebcf7d94976be4",& - "0968265f5977c88",& - "c5a36937faa78c3",& - "f0d4fef11e01c10",& - "e35fc0c779bebfe",& - "cf49c3eb41a31d5",& - "3f0b19352c7013e",& - "0e15eccd8521abd",& - "dda8dcaf9d3048c",& - "fee31438fba59ed",& - "ad74a27e939189c",& - "736ac01b439106e",& - "ab5d2729b29bfa1",& - "edf11fb02e5a426",& - "5f38be1c93ecc83",& - "1e4b3b8dc516b3e",& - "84443d8bee614c6",& - "d854d9f355ceac4",& - "a476b5ece51f0ea",& - "831c2b36c4c2f68",& - "f485c97a91615ae",& - "e9376d828ade9ba",& - "cac586f089d3185",& - "b8f8c67613dafe2",& - "1a3142b401b315d",& - "87dbedc43265d2e",& - "bb64ec6e652e7da",& - "e71bfd4c95dfd38",& - "31209af07ad4f75",& - "cff1a8ccc5f4978",& - "742eded1e1dfefd",& - "1cd7154a904dac4"/ - -data colorder/ & - 0,1,2,21,3,4,5,6,7,8,20,10,9,11,12,23,13,28,14,31, & - 15,16,22,26,17,30,18,29,25,32,41,34,19,33,27,36,38,43,42,24, & - 37,39,45,40,35,44,47,46,50,51,53,48,52,56,54,57,55,49,58,61, & - 60,59,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, & - 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99, & - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119/ - -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,60 - do j=1,15 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo -first=.false. -endif - -do i=1, 60 - nsum=0 - do j=1, 60 - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) -enddo -itmp(1:60)=pchecks -itmp(61:120)=message(1:60) -codeword(colorder+1)=itmp(1:120) - -return -end subroutine encode120 diff --git a/lib/fsk4hf/encode168.f90 b/lib/fsk4hf/encode168.f90 deleted file mode 100644 index bf1212154..000000000 --- a/lib/fsk4hf/encode168.f90 +++ /dev/null @@ -1,141 +0,0 @@ -subroutine encode168(message,codeword) -! Encode an 84-bit message and return a 168-bit codeword. -! The generator matrix has dimensions (84,84). -! The code is a (168,84) regular ldpc code with column weight 3. -! The code was generated using the PEG algorithm. -! After creating the codeword, the columns are re-ordered according to -! "colorder" to make the codeword compatible with the parity-check matrix -! -character*21 g(84) -integer*1 codeword(168) -integer colorder(168) -integer*1 gen(84,168) -integer*1 itmp(168) -integer*1 message(84) -integer*1 pchecks(84) -logical first -data first/.true./ -data g/ & !parity generator matrix for (168,84) code - "25c5bf31ef6710fde9a5a", & - "18038ef7899cd97a77d96", & - "270dde504dad076c02b1f", & - "ed37fe12616565bd7d500", & - "12b99aa49b5367aff3838", & - "41cc27f2fac8b228aac21", & - "2265b233a3cff0b9cee24", & - "292760cd4f7f4a526a2f1", & - "2b3db4c8bd831911680cc", & - "cef2b24ce203bdc60b266", & - "5045a24f9340915d807ab", & - "3592b7fc60ba85139502e", & - "9318023145637bd798f0e", & - "ad796023c3d58d1e6509c", & - "3da5eab57f040e75d7413", & - "27466d1d2734d0ff64830", & - "2ed50bb1ce313bbfb1ab0", & - "9a616bda01b25b7e6eeaf", & - "a84c8c1e9df103169d10d", & - "a40da29b4aca9234a8942", & - "dd258d02d79a5f209d3d0", & - "bdfdc06713511997b5621", & - "25c58f12f4096cd8ead1a", & - "b2638a478f21e10fe97de", & - "4051020f43c605d458156", & - "f651aad14322a526dae35", & - "a1c147e31bcc9d87330bf", & - "7524b53d996d48284647b", & - "a72e7d25ce31b27282e56", & - "a97f53b019022350b7519", & - "56106c6340c0810790984", & - "c63b8e03a57208635992b", & - "43a3de2aa3a2b1afb65dc", & - "9baa64847ead03b77fecc", & - "251cbd1895c8839c46b0d", & - "2858107dde2d173e13530", & - "20096f6a870f636b704e7", & - "7f833ccbceec52dd6eb79", & - "a9108dd77b8015b75242a", & - "689666a79e5579c916236", & - "aa5dff46459787f69911f", & - "794558c13138d08171089", & - "c937042857b291cee8dfd", & - "6f0bf3248bb9a231366b8", & - "1c09e756ef1656c96f2d2", & - "073b875b6774e71fba549", & - "f7d840aafc037febd2d5c", & - "dcc0e7d0da5fe17c99ad3", & - "98238ef7819cd97a77d94", & - "177c2594743477421a262", & - "7d01a833c19374fbaaa6e", & - "7bb800216660482ffd1c4", & - "39a92e2dba0d4cfda98d2", & - "44b8d88622698816456a8", & - "791db2334d6d86639229b", & - "ba6004b086bd38559ea48", & - "f94558e13138d18170089", & - "08ba145302cfbed7845ae", & - "fb8e64b6da3602168ed38", & - "1045a2cf1340915d8072b", & - "7592b6fc64ba85139582e", & - "3eb238a11bc6654452bae", & - "b69d8d23b1ea170f70214", & - "0123dfae84fb20462a614", & - "4131066ad52a339b3c0d7", & - "fd2cc26850951c43ed737", & - "a644d4eb7e56c40f0d050", & - "0c3bd9d5dab7c9ee2c8fc", & - "4a198b37af56d7ceffb56", & - "b6e946c429294cf0eed8b", & - "98384d75e758774f5ff3b", & - "5c58e5d9a4d0531d37384", & - "7a0af02719afed521fd06", & - "8cd5b2e694e7854abbc70", & - "1a2f061912d0ea19702d3", & - "6ffbce557d8fa691a50e8", & - "d43438e2e2ed5d9f14011", & - "8d502106083b809adba00", & - "67e22f9b9983aa715964d", & - "b31f3a3f3c1f406b1fd58", & - "529f60ac291f827d97331", & - "476a815424f2e2cbe641f", & - "81c82c89bcc3feec42458", & - "2c882d0e281b178e80364"/ - -data colorder/0,1,2,3,28,4,5,6,7,8,9,10,11,34,12,32,13,14,15,16,17, & - 18,36,29,42,31,20,21,41,40,30,38,22,19,47,37,46,35,44,33,49,24, & - 43,51,25,26,27,50,52,57,69,54,55,45,59,58,56,61,60,53,48,23,62, & - 63,64,67,66,65,68,39,70,71,72,74,73,75,76,77,80,81,78,82,79,83, & - 84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, & - 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, & - 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146, & - 147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167/ - -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,84 - do j=1,21 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo -first=.false. -endif - -do i=1, 84 - nsum=0 - do j=1, 84 - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) -enddo -itmp(1:84)=pchecks -itmp(85:168)=message(1:84) -codeword(colorder+1)=itmp(1:168) - -return -end subroutine encode168 diff --git a/lib/fsk4hf/encode174_101.f90 b/lib/fsk4hf/encode174_101.f90 deleted file mode 100644 index 3dd9be1d3..000000000 --- a/lib/fsk4hf/encode174_101.f90 +++ /dev/null @@ -1,46 +0,0 @@ -subroutine encode174_101(message,codeword) - use, intrinsic :: iso_c_binding - use iso_c_binding, only: c_loc,c_size_t - use crc - - integer, parameter:: N=174, K=101, M=N-K - character*24 c24 - integer*1 codeword(N) - integer*1 gen(M,K) - integer*1 message(K) - integer*1 pchecks(M) - integer*4 ncrc24 - include "ldpc_174_101_generator.f90" - logical first - data first/.true./ - save first,gen - - if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,26 - read(g(i)(j:j),"(Z1)") istr - ibmax=4 - if(j.eq.26) ibmax=1 - do jj=1, ibmax - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo - first=.false. - endif - - do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) - enddo - - codeword(1:K)=message - codeword(K+1:N)=pchecks - - return -end subroutine encode174_101 diff --git a/lib/fsk4hf/encode174_74.f90 b/lib/fsk4hf/encode174_74.f90 deleted file mode 100644 index ba8ab18b1..000000000 --- a/lib/fsk4hf/encode174_74.f90 +++ /dev/null @@ -1,47 +0,0 @@ -subroutine encode174_74(message,codeword) - use, intrinsic :: iso_c_binding - use iso_c_binding, only: c_loc,c_size_t - use crc - - integer, parameter:: N=174, K=74, M=N-K - character*24 c24 - integer*1 codeword(N) - integer*1 gen(M,K) - integer*1 message(K) - integer*1 pchecks(M) - integer*1, target :: i1MsgBytes(10) - integer*4 ncrc24 - include "ldpc_174_74_generator.f90" - logical first - data first/.true./ - save first,gen - - if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,19 - read(g(i)(j:j),"(Z1)") istr - ibmax=4 - if(j.eq.19) ibmax=2 - do jj=1, ibmax - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo - first=.false. - endif - - do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) - enddo - - codeword(1:K)=message - codeword(K+1:N)=pchecks - - return -end subroutine encode174_74 diff --git a/lib/fsk4hf/encode204.f90 b/lib/fsk4hf/encode204.f90 deleted file mode 100644 index b824196a7..000000000 --- a/lib/fsk4hf/encode204.f90 +++ /dev/null @@ -1,48 +0,0 @@ -subroutine encode204(message,codeword) -! Encode an 68-bit message and return a 204-bit codeword. -! The generator matrix has dimensions (136,68). -! The code is a (204,68) regular ldpc code with column weight 3. -! The code was generated using the PEG algorithm. -! After creating the codeword, the columns are re-ordered according to -! "colorder" to make the codeword compatible with the parity-check matrix -! - -include "ldpc_204_68_params.f90" - -integer*1 codeword(N) -integer*1 gen(M,K) -integer*1 itmp(N) -integer*1 message(K) -integer*1 pchecks(M) -logical first -data first/.true./ - -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,17 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo -first=.false. -endif - -do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) -enddo -itmp(1:M)=pchecks -itmp(M+1:N)=message(1:K) -codeword(colorder+1)=itmp(1:N) - -return -end subroutine encode204 diff --git a/lib/fsk4hf/encode240_101.f90 b/lib/fsk4hf/encode240_101.f90 deleted file mode 100644 index da0021df3..000000000 --- a/lib/fsk4hf/encode240_101.f90 +++ /dev/null @@ -1,46 +0,0 @@ -subroutine encode240_101(message,codeword) - use, intrinsic :: iso_c_binding - use iso_c_binding, only: c_loc,c_size_t - use crc - - integer, parameter:: N=240, K=101, M=N-K - character*24 c24 - integer*1 codeword(N) - integer*1 gen(M,K) - integer*1 message(K) - integer*1 pchecks(M) - integer*4 ncrc24 - include "ldpc_240_101_generator.f90" - logical first - data first/.true./ - save first,gen - - if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,26 - read(g(i)(j:j),"(Z1)") istr - ibmax=4 - if(j.eq.26) ibmax=1 - do jj=1, ibmax - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo - first=.false. - endif - - do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) - enddo - - codeword(1:K)=message - codeword(K+1:N)=pchecks - - return -end subroutine encode240_101 diff --git a/lib/fsk4hf/encode280_101.f90 b/lib/fsk4hf/encode280_101.f90 deleted file mode 100644 index 704816355..000000000 --- a/lib/fsk4hf/encode280_101.f90 +++ /dev/null @@ -1,46 +0,0 @@ -subroutine encode280_101(message,codeword) - use, intrinsic :: iso_c_binding - use iso_c_binding, only: c_loc,c_size_t - use crc - - integer, parameter:: N=280, K=101, M=N-K - character*24 c24 - integer*1 codeword(N) - integer*1 gen(M,K) - integer*1 message(K) - integer*1 pchecks(M) - integer*4 ncrc24 - include "ldpc_280_101_generator.f90" - logical first - data first/.true./ - save first,gen - - if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,26 - read(g(i)(j:j),"(Z1)") istr - ibmax=4 - if(j.eq.26) ibmax=1 - do jj=1, ibmax - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo - first=.false. - endif - - do i=1,M - nsum=0 - do j=1,K - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) - enddo - - codeword(1:K)=message - codeword(K+1:N)=pchecks - - return -end subroutine encode280_101 diff --git a/lib/fsk4hf/encode300.f90 b/lib/fsk4hf/encode300.f90 deleted file mode 100644 index f1d3bbaef..000000000 --- a/lib/fsk4hf/encode300.f90 +++ /dev/null @@ -1,308 +0,0 @@ -subroutine encode300(message,codeword) -! Encode an 60-bit message and return a 300-bit codeword. -! The generator matrix has dimensions (240,60). -! The code is a (300,60) irregular ldpc code with column weights: -! 52% column weight 2 -! 27% column weight 3 -! 21% column weight 7 -! The code was generated using the PEG algorithm. -! After creating the codeword, the columns are re-ordered according to -! "colorder" to make the codeword compatible with the parity-check matrix -! -character*15 g(240) -integer*1 codeword(300) -integer colorder(300) -integer*1 gen(240,60) -integer*1 itmp(300) -integer*1 message(60) -integer*1 pchecks(240) -logical first -data first/.true./ -data g/ & - "316fd3bb18bcefd", & - "a9c1c984f91244e", & - "9e04bd3d5d78d89", & - "f81617089621bd4", & - "12997ce2f44dbf4", & - "3ebddaf9b0fa1fc", & - "d0c114b0b0ef162", & - "f8c4f115f98bd92", & - "d0a79c0c5b8ca19", & - "477f6712f357b3b", & - "fa28b2444a7e66b", & - "bedcd4df8d95c64", & - "da30de73e57022c", & - "bc099bbb90fe09e", & - "cffc1e47e5708e8", & - "713d808563ca9a3", & - "70fcf1741d5d5d7", & - "32e80bc15112008", & - "804cef4df9b18ec", & - "3736881819d1033", & - "f4e37db7f9c5efe", & - "9e84b93d4d78d09", & - "2250c3518ec830a", & - "55a529a92e18021", & - "1cb80b14c9f6eae", & - "80c504b031ef926", & - "ece6636d0ac9c6d", & - "5d50a1690782cd0", & - "3d54a1fb30937a2", & - "ba8fe8006318041", & - "02917ce2fc45bf4", & - "abc1d984f95a44e", & - "fc05b4c4ab2d850", & - "467f7718f357b3b", & - "472cc094546c6b2", & - "fcdd94cf8c9cc64", & - "4dbc1647e970cc8", & - "6caa465c442aed1", & - "aead5af8b0da1be", & - "d8e1fa45a2e8431", & - "9d4dc4cc63abb7f", & - "9b2df6b48264637", & - "7335808563ca3a3", & - "36bf8d5cd93e6cc", & - "004ccf4db9b08ec", & - "90a71c8c598ca19", & - "f8c5d115f90bc92", & - "b95546c4e3f7934", & - "7d50a1690786cd0", & - "c90939921a0d7c6", & - "d0c504b030ef126", & - "ce3e6f9396fc542", & - "a0072a59f3707f5", & - "532d0a8fe3da1ea", & - "68b9e5cd7d142db", & - "fedc94df8c9dc64", & - "6da2465c448aed0", & - "3574aa19cb273c0", & - "1e54768c6bc6843", & - "691f65654498186", & - "fe2c92444a6ef6b", & - "9caad933e038cc4", & - "ad4e6f4defb28ec", & - "4f3d80947c6d2b2", & - "1caad933e0b8cc4", & - "b14fd3bf18bcafd", & - "ad091bbbb0f809e", & - "90b71c8c598da19", & - "f8c4d115f90bd92", & - "9d4dcccc63afb7f", & - "fa2c92444a6e76b", & - "1e14768c6bc6c43", & - "d1baf5aacb86087", & - "bdf762b92ee51c7", & - "caacec06ad8a90c", & - "804ccf4df9b08ec", & - "69e969f9da5cbd8", & - "814ccf4df9b086c", & - "cebe4f9796f4542", & - "491f65654499186", & - "8fbf5b9796f6d2a", & - "ce3e4f9396f4542", & - "47558560e7debc3", & - "94aadd33e038cc4", & - "a94eef4debb286e", & - "d8e5d115f91bcd2", & - "532d488fe3da0ab", & - "664e7bc4e23a80c", & - "94a2dd33a038cd4", & - "d8c5d115f91bc92", & - "0fef071eee60bd5", & - "9a89a09163c2b97", & - "0eaf071e6c60bd5", & - "bc0d1bbbb0fe0be", & - "f9babd3d12d0f31", & - "69a969f9da5c9d8", & - "6e4e7bc4e23a82c", & - "b0042659f3227f5", & - "2d51418f0f28347", & - "be0d5bbbb0da0be", & - "225003508ec8302", & - "8fbf4b9796f4d2a", & - "bead5af9b0da1be", & - "6ca2465c440aed1", & - "4fbc1e47ed708c8", & - "bd091bbbb0fc09e", & - "b0062259f3307f5", & - "a8072a59f3727f5", & - "a0062259f3707f5", & - "3c380b14c974eae", & - "30042659f3226f5", & - "48b9e4cd7d142db", & - "728bcd4b38308fb", & - "c0c504b031ef126", & - "314fd3bb18bcafd", & - "1c29148305faec1", & - "44c92a9c28ada63", & - "88e99b370aae32b", & - "695081690386ad8", & - "572d0a8de3da1ea", & - "467f6610f357b2b", & - "733d008563da1a3", & - "d1baf4aacb84087", & - "4315551d71c8ff0", & - "48bde4cd7d140db", & - "3ebd58f9b0da9fc", & - "51baf4aacb84083", & - "814e4f4de9b082c", & - "814ecf4de9b086c", & - "be0d1bbbb0fa0be", & - "4f7580947c792b3", & - "cdf2dce48c39c3b", & - "d8c5c115f91bc12", & - "a94e6f4debb28ee", & - "be2d5afbb0da1be", & - "cdd6dce48439c2b", & - "bebd5af9b0da1fe", & - "fa2892444a6e66b", & - "51bbf4aacb8c083", & - "baa73d81eebcd83", & - "79a2ce47f138cc9", & - "cc28cf198e6dbd4", & - "fcde94dfcc9cc64", & - "1016fcf59286717", & - "12917ce2fc4dbf4", & - "4fbc1647e9708c8", & - "3e382b1cc974fae", & - "d5bafdaad386087", & - "0fef473eee60bd5", & - "c0e504b031ee126", & - "8bbf5b9797f6d2a", & - "0eef071e6e60bd5", & - "1806fcf59386517", & - "fcdc94df8c9cc64", & - "141eca2bfa25656", & - "5fbc1767e9708e8", & - "5aa4c7803a6bdf1", & - "b14bd3b718bcafd", & - "3ebd5af9b0da1fc", & - "d0a7148c5b8ca09", & - "a94ecf4debb086e", & - "733d808563ca1a3", & - "fd9abd1d92d0f31", & - "bc091bbbb0fe09e", & - "d0c514b0b0ef122", & - "4f7d80947c7d2b3", & - "8b3f5b97b7f6d2a", & - "4fbc1767e9708c8", & - "cebf4f9796f4502", & - "9c76c880a864e67", & - "abc1c984f95244e", & - "795081690786ad8", & - "467f6710f357b3b", & - "1c380b14c9f4eae", & - "d5baf5aac386087", & - "bedc94df8c95c64", & - "553d0a8de2da1fa", & - "0315551d71d8ff0", & - "1c1eca2ffa25656", & - "d4bafdaad3c6087", & - "be2d5bfbb0da0be", & - "b0062659f3207f5", & - "5ffc1765e9708e8", & - "8d62e8bcd303e33", & - "cc08cf198e69bd4", & - "573d0a8de3da1fa", & - "cd56dce48639c2b", & - "472dc094546c2b2", & - "7950a16907868d8", & - "7283cf4b38308fb", & - "894ecf4de9b086e", & - "0f7580b47c792b3", & - "cfbf4b9796f4d0a", & - "3e380b14c974fae", & - "732d0085e3da1a3", & - "1816fcf59386717", & - "532d088fe3da1ab", & - "1c300b94c9fcaae", & - "d0a71c8c5b8ca19", & - "9e84bd3d5d78d09", & - "225083508ec830a", & - "f99abd1d12d0f31", & - "35f4aa19cb673c0", & - "cdd2dce48c39c2b", & - "0f7780b47c792bf", & - "0e33a5f114f5730", & - "bc05b4c4ab0d850", & - "1c300b14c9f4aae", & - "cfbc1e47ed708e8", & - "0f7180b47c392b3", & - "d8c7c115f91be12", & - "c09148adfa94e97", & - "9c66c880a844e67", & - "2226c13b73519f8", & - "cebf4b9796f4d02", & - "c0e706b031ee126", & - "6a6629715e53ce3", & - "73f9aa824e7d0b8", & - "473d80947c6c2b2", & - "1df140e0ddb5632", & - "473dc0945c6c2b2", & - "81b4d95f671971d", & - "663945ca758e2b6", & - "02ec3d98a2306fd", & - "5dadb0fa1275690", & - "4bb8aaa854948d0", & - "8359ba40886971c", & - "49cc3d2a2be2ee0", & - "bfdf13af137f318", & - "a1de773a2b1ff04", & - "8ff3945a2f465c7", & - "532d0087e3da1a3", & - "f3eaf7fa454d385", & - "a606aa5aeba07d9", & - "67f0627b0af8a53", & - "56698bed69d1c2c", & - "d5f420011fbf924", & - "2a8f86c810e2c62", & - "43cc1cf1208c206", & - "ee784c4900258de"/ - -data colorder/ & -0,1,2,3,4,5,6,7,8,9,10,11,123,12,13,14,15,16,17,18, & -19,20,21,22,23,24,25,138,26,145,27,28,29,30,31,32,33,34,35,36, & -37,154,38,39,40,41,42,43,44,144,46,47,48,49,50,51,52,53,143,54, & -125,56,57,58,124,59,120,140,157,160,55,60,61,62,156,162,141,64,65,153, & -181,183,66,170,67,68,69,130,70,164,71,72,73,74,75,63,76,77,135,78, & -79,80,176,169,82,83,84,167,180,85,136,158,129,166,175,142,134,146,121,165, & -88,89,192,90,45,91,92,93,182,189,94,95,96,173,81,97,98,178,122,126, & -132,99,100,152,186,193,101,102,151,103,104,172,159,168,150,190,147,148,201,107, & -205,177,108,198,197,174,127,109,185,110,202,87,199,171,179,187,139,137,106,131, & -206,194,112,149,155,113,128,184,196,86,114,203,212,195,208,105,188,161,163,191, & -200,209,214,204,115,218,133,111,207,117,213,216,211,217,116,215,219,220,210,221, & -118,222,223,225,224,228,226,229,231,227,233,119,234,235,232,230,237,239,236,238, & -240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259, & -260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279, & -280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299/ - -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,240 - do j=1,15 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - icol=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(i,icol)=1 - enddo - enddo - enddo -first=.false. -endif - -do i=1, 240 - nsum=0 - do j=1, 60 - nsum=nsum+message(j)*gen(i,j) - enddo - pchecks(i)=mod(nsum,2) -enddo -itmp(1:240)=pchecks -itmp(241:300)=message(1:60) -codeword(colorder+1)=itmp(1:300) - -return -end subroutine encode300 diff --git a/lib/fsk4hf/encode4K25A.f90 b/lib/fsk4hf/encode4K25A.f90 deleted file mode 100644 index cd1ae762a..000000000 --- a/lib/fsk4hf/encode4K25A.f90 +++ /dev/null @@ -1,56 +0,0 @@ -subroutine encode4K25A(message,codeword) -! A (280,70) rate 1/4 tailbiting convolutional code using -! the "4K25A" polynomials from EbNaut website. -! Code is transparent, has constraint length 25, and has dmin=58 -character*10 g1,g2,g3,g4 -integer*1 codeword(280) -!integer*1 p1(25),p2(25),p3(25),p4(25) -integer*1 p1(16),p2(16),p3(16),p4(16) -integer*1 gg(100) -integer*1 gen(280,70) -integer*1 itmp(280) -integer*1 message(70) -logical first -data first/.true./ -data g1/"106042635"/ -data g2/"125445117"/ -data g3/"152646773"/ -data g4/"167561761"/ -!data p1/1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,1,1,1,0,1/ -!data p2/1,0,1,0,1,0,1,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,1,1,1/ -!data p3/1,1,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,1,0,1,1/ -!data p4/1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1/ -data p1/1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1/ -data p2/1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,1/ -data p3/1,1,0,0,1,0,1,1,0,1,1,1,0,0,1,1/ -data p4/1,1,1,0,1,1,0,1,1,1,1,0,0,1,0,1/ - -save first,gen - -if( first ) then ! fill the generator matrix - gg=0 -! gg(1:25)=p1 -! gg(26:50)=p2 -! gg(51:75)=p3 -! gg(76:100)=p4 - gg(1:16)=p1 - gg(17:32)=p2 - gg(33:48)=p3 - gg(49:64)=p4 - gen=0 -! gen(1:100,1)=gg(1:100) - gen(1:64,1)=gg(1:64) - do i=2,70 - gen(:,i)=cshift(gen(:,i-1),-4,1) - enddo - first=.false. -endif - -codeword=0 -do i=1,70 - if(message(i).eq.1) codeword=codeword+gen(:,i) -enddo -codeword=mod(codeword,2) - -return -end subroutine encode4K25A diff --git a/lib/fsk4hf/extractmessage168.f90 b/lib/fsk4hf/extractmessage168.f90 deleted file mode 100644 index 466d2a638..000000000 --- a/lib/fsk4hf/extractmessage168.f90 +++ /dev/null @@ -1,48 +0,0 @@ -subroutine extractmessage168(decoded,msgreceived,ncrcflag,recent_calls,nrecent) - use iso_c_binding, only: c_loc,c_size_t - use crc - use packjt - - character*22 msgreceived - character*12 call1,call2 - character*12 recent_calls(nrecent) - integer*1 decoded(84) - integer*1, target:: i1Dec8BitBytes(11) - integer*4 i4Dec6BitWords(12) - -! Collapse 84 decoded bits to 11 bytes. Bytes 1-9 are the message, byte 10 and first half of byte 11 is the crc - do ibyte=1,9 - itmp=0 - do ibit=1,8 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit)) - enddo - i1Dec8BitBytes(ibyte)=itmp - enddo -! Need to pack the crc into bytes 10 and 11 for crc12_check - i1Dec8BitBytes(10)=decoded(73)*8+decoded(74)*4+decoded(75)*2+decoded(76) - i1Dec8BitBytes(11)=decoded(77)*128+decoded(78)*64+decoded(79)*2*32+decoded(80)*16 - i1Dec8BitBytes(11)=i1Dec8BitBytes(11)+decoded(81)*8+decoded(82)*4+decoded(83)*2+decoded(84) - - if( crc12_check(c_loc (i1Dec8BitBytes), 11) ) then -! CRC12 checks out --- unpack 72-bit message - do ibyte=1,12 - itmp=0 - do ibit=1,6 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*6+ibit)) - enddo - i4Dec6BitWords(ibyte)=itmp - enddo - call unpackmsg144(i4Dec6BitWords,msgreceived,call1,call2) - ncrcflag=1 - if( call1(1:2) .ne. 'CQ' .and. call1(1:2) .ne. ' ' ) then - call update_recent_calls(call1,recent_calls,nrecent) - endif - if( call2(1:2) .ne. ' ' ) then - call update_recent_calls(call2,recent_calls,nrecent) - endif - else - msgreceived=' ' - ncrcflag=-1 - endif - return - end subroutine extractmessage168 diff --git a/lib/fsk4hf/fftw3.f90 b/lib/fsk4hf/fftw3.f90 deleted file mode 100644 index 440ccc28c..000000000 --- a/lib/fsk4hf/fftw3.f90 +++ /dev/null @@ -1,64 +0,0 @@ - INTEGER FFTW_R2HC - PARAMETER (FFTW_R2HC=0) - INTEGER FFTW_HC2R - PARAMETER (FFTW_HC2R=1) - INTEGER FFTW_DHT - PARAMETER (FFTW_DHT=2) - INTEGER FFTW_REDFT00 - PARAMETER (FFTW_REDFT00=3) - INTEGER FFTW_REDFT01 - PARAMETER (FFTW_REDFT01=4) - INTEGER FFTW_REDFT10 - PARAMETER (FFTW_REDFT10=5) - INTEGER FFTW_REDFT11 - PARAMETER (FFTW_REDFT11=6) - INTEGER FFTW_RODFT00 - PARAMETER (FFTW_RODFT00=7) - INTEGER FFTW_RODFT01 - PARAMETER (FFTW_RODFT01=8) - INTEGER FFTW_RODFT10 - PARAMETER (FFTW_RODFT10=9) - INTEGER FFTW_RODFT11 - PARAMETER (FFTW_RODFT11=10) - INTEGER FFTW_FORWARD - PARAMETER (FFTW_FORWARD=-1) - INTEGER FFTW_BACKWARD - PARAMETER (FFTW_BACKWARD=+1) - INTEGER FFTW_MEASURE - PARAMETER (FFTW_MEASURE=0) - INTEGER FFTW_DESTROY_INPUT - PARAMETER (FFTW_DESTROY_INPUT=1) - INTEGER FFTW_UNALIGNED - PARAMETER (FFTW_UNALIGNED=2) - INTEGER FFTW_CONSERVE_MEMORY - PARAMETER (FFTW_CONSERVE_MEMORY=4) - INTEGER FFTW_EXHAUSTIVE - PARAMETER (FFTW_EXHAUSTIVE=8) - INTEGER FFTW_PRESERVE_INPUT - PARAMETER (FFTW_PRESERVE_INPUT=16) - INTEGER FFTW_PATIENT - PARAMETER (FFTW_PATIENT=32) - INTEGER FFTW_ESTIMATE - PARAMETER (FFTW_ESTIMATE=64) - INTEGER FFTW_ESTIMATE_PATIENT - PARAMETER (FFTW_ESTIMATE_PATIENT=128) - INTEGER FFTW_BELIEVE_PCOST - PARAMETER (FFTW_BELIEVE_PCOST=256) - INTEGER FFTW_DFT_R2HC_ICKY - PARAMETER (FFTW_DFT_R2HC_ICKY=512) - INTEGER FFTW_NONTHREADED_ICKY - PARAMETER (FFTW_NONTHREADED_ICKY=1024) - INTEGER FFTW_NO_BUFFERING - PARAMETER (FFTW_NO_BUFFERING=2048) - INTEGER FFTW_NO_INDIRECT_OP - PARAMETER (FFTW_NO_INDIRECT_OP=4096) - INTEGER FFTW_ALLOW_LARGE_GENERIC - PARAMETER (FFTW_ALLOW_LARGE_GENERIC=8192) - INTEGER FFTW_NO_RANK_SPLITS - PARAMETER (FFTW_NO_RANK_SPLITS=16384) - INTEGER FFTW_NO_VRANK_SPLITS - PARAMETER (FFTW_NO_VRANK_SPLITS=32768) - INTEGER FFTW_NO_VRECURSE - PARAMETER (FFTW_NO_VRECURSE=65536) - INTEGER FFTW_NO_SIMD - PARAMETER (FFTW_NO_SIMD=131072) diff --git a/lib/fsk4hf/four2a.f90 b/lib/fsk4hf/four2a.f90 deleted file mode 100644 index 57c7239e1..000000000 --- a/lib/fsk4hf/four2a.f90 +++ /dev/null @@ -1,115 +0,0 @@ -subroutine four2a(a,nfft,ndim,isign,iform) - -! IFORM = 1, 0 or -1, as data is -! complex, real, or the first half of a complex array. Transform -! values are returned in array DATA. They are complex, real, or -! the first half of a complex array, as IFORM = 1, -1 or 0. - -! The transform of a real array (IFORM = 0) dimensioned N(1) by N(2) -! by ... will be returned in the same array, now considered to -! be complex of dimensions N(1)/2+1 by N(2) by .... Note that if -! IFORM = 0 or -1, N(1) must be even, and enough room must be -! reserved. The missing values may be obtained by complex conjugation. - -! The reverse transformation of a half complex array dimensioned -! N(1)/2+1 by N(2) by ..., is accomplished by setting IFORM -! to -1. In the N array, N(1) must be the true N(1), not N(1)/2+1. -! The transform will be real and returned to the input array. - -! This version of four2a makes calls to the FFTW library to do the -! actual computations. - - parameter (NPMAX=2100) !Max numberf of stored plans - parameter (NSMALL=16384) !Max size of "small" FFTs - complex a(nfft) !Array to be transformed - complex aa(NSMALL) !Local copy of "small" a() - integer nn(NPMAX),ns(NPMAX),nf(NPMAX) !Params of stored plans - integer*8 nl(NPMAX),nloc !More params of plans - integer*8 plan(NPMAX) !Pointers to stored plans - logical found_plan - data nplan/0/ !Number of stored plans - common/patience/npatience,nthreads !Patience and threads for FFTW plans - include 'fftw3.f90' !FFTW definitions - save plan,nplan,nn,ns,nf,nl - - if(nfft.lt.0) go to 999 - - nloc=loc(a) - - found_plan = .false. - !$omp critical(four2a_setup) - do i=1,nplan - if(nfft.eq.nn(i) .and. isign.eq.ns(i) .and. & - iform.eq.nf(i) .and. nloc.eq.nl(i)) then - found_plan = .true. - exit - end if - enddo - - if(i.ge.NPMAX) stop 'Too many FFTW plans requested.' - - if (.not. found_plan) then - nplan=nplan+1 - i=nplan - - nn(i)=nfft - ns(i)=isign - nf(i)=iform - nl(i)=nloc - -! Planning: FFTW_ESTIMATE, FFTW_ESTIMATE_PATIENT, FFTW_MEASURE, -! FFTW_PATIENT, FFTW_EXHAUSTIVE - nflags=FFTW_ESTIMATE - if(npatience.eq.1) nflags=FFTW_ESTIMATE_PATIENT - if(npatience.eq.2) nflags=FFTW_MEASURE - if(npatience.eq.3) nflags=FFTW_PATIENT - if(npatience.eq.4) nflags=FFTW_EXHAUSTIVE - - if(nfft.le.NSMALL) then - jz=nfft - if(iform.eq.0) jz=nfft/2 - aa(1:jz)=a(1:jz) - endif - - !$omp critical(fftw) ! serialize non thread-safe FFTW3 calls - if(isign.eq.-1 .and. iform.eq.1) then - call sfftw_plan_dft_1d(plan(i),nfft,a,a,FFTW_FORWARD,nflags) - else if(isign.eq.1 .and. iform.eq.1) then - call sfftw_plan_dft_1d(plan(i),nfft,a,a,FFTW_BACKWARD,nflags) - else if(isign.eq.-1 .and. iform.eq.0) then - call sfftw_plan_dft_r2c_1d(plan(i),nfft,a,a,nflags) - else if(isign.eq.1 .and. iform.eq.-1) then - call sfftw_plan_dft_c2r_1d(plan(i),nfft,a,a,nflags) - else - stop 'Unsupported request in four2a' - endif - !$omp end critical(fftw) - - if(nfft.le.NSMALL) then - jz=nfft - if(iform.eq.0) jz=nfft/2 - a(1:jz)=aa(1:jz) - endif - end if - !$omp end critical(four2a_setup) - - call sfftw_execute(plan(i)) - return - -999 continue - - !$omp critical(four2a) - do i=1,nplan -! The test is only to silence a compiler warning: - if(ndim.ne.-999) then - !$omp critical(fftw) ! serialize non thread-safe FFTW3 calls - call sfftw_destroy_plan(plan(i)) - !$omp end critical(fftw) - end if - enddo - - nplan=0 - !$omp end critical(four2a) - - return -end subroutine four2a diff --git a/lib/fsk4hf/fsk4hf.f90 b/lib/fsk4hf/fsk4hf.f90 deleted file mode 100644 index 191e05c31..000000000 --- a/lib/fsk4hf/fsk4hf.f90 +++ /dev/null @@ -1,145 +0,0 @@ -program fsk4hf - -! Simulate characteristics of a potential mode using LDPC (168,84) code, -! 4-FSK modulation, and 30 s T/R sequences. - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=84) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=12) !Sync symbols (3 @ 4x4 Costas arrays) - parameter (NR=2) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (98) - parameter (NSPS=2688/84) !Samples per symbol (32) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - - character*8 arg - complex c0(0:NZ-1) !Complex waveform - complex c(0:NZ-1) !Complex waveform - real xnoise(0:NZ-1) !Generated random noise - real ynoise(0:NZ-1) !Generated random noise - real rxdata(2*ND),llr(2*ND) !Soft symbols - real s(0:NSPS,NN) - real savg(0:NSPS) - real ps(0:3) - integer id(ND) !Symbol values (0-3), data only - integer id1(ND) !Recovered data values - integer*1 msgbits(KK),decoded(KK),apmask(ND),cw(ND) - data msgbits/0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1, & - 1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,0,1,1, & - 1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,1,0/ - - nargs=iargc() - if(nargs.ne.5) then - print*,'Usage: fsk4hf f0(Hz) delay(ms) fspread(Hz) iters snr(dB)' - print*,'Example: fsk4hf 20 0 0 10 -20' - print*,'Set snr=0 to cycle through a range' - go to 999 - endif - call getarg(1,arg) - read(arg,*) f0 !Generated carrier frequency - call getarg(2,arg) - read(arg,*) delay !Delta_t (ms) for Watterson model - call getarg(3,arg) - read(arg,*) fspread !Fspread (Hz) for Watterson model - call getarg(4,arg) - read(arg,*) iters !Iterations at each SNR - call getarg(5,arg) - read(arg,*) snrdb !Specified SNR_2500 - - twopi=8.0*atan(1.0) - fs=12000.0/84.0 !Sample rate = 142.857... Hz - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - write(*,1000) f0,delay,fspread,iters,baud,4*baud,txt -1000 format('f0:',f5.1,' Delay:',f4.1,' fSpread:',f5.2, & - ' Iters:',i6/'Baud:',f7.3,' BW:',f5.1,' TxT:',f5.1,f5.2/) - write(*,1004) -1004 format(/' SNR sym bit ser ber fer fsigma'/50('-')) - - call genfsk4hf(msgbits,f0,id,c0) !Generate baseband waveform - isna=-10 - isnb=-30 - if(snrdb.ne.0.0) then - isna=nint(snrdb) - isnb=isna - endif - do isnr=isna,isnb,-1 !Loop over SNR range - snrdb=isnr - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - nhard=0 - nbit=0 - nfe=0 - sqf=0. - do iter=1,iters !Loop over requested iterations - c=c0 - if(delay.ne.0.0 .or. fspread.ne.0.0) then - call watterson(c,NZ,fs,delay,fspread) - endif - c=sig*c !Scale to requested SNR - if(snrdb.lt.90) then - do i=0,NZ-1 !Generate gaussian noise - xnoise(i)=gran() - ynoise(i)=gran() - enddo - c=c + cmplx(xnoise,ynoise) !Add AWGN noise - endif - df=fs/(2*NSPS) - i0=nint(f0/df) - call spec4(c,s,savg) - do i=0,NSPS - write(12,3001) i*df,savg(i),db(savg(i)) -3001 format(3f15.3) - enddo - - do j=1,ND - nlo=0 - nhi=0 - k=j+5 - if(j.ge.43) k=j+9 - ps=s(i0:i0+6:2,k) - ps=sqrt(ps) !### - rlo=max(ps(1),ps(3))-max(ps(0),ps(2)) - rhi=max(ps(2),ps(3))-max(ps(0),ps(1)) - if(rlo.ge.0.0) nlo=1 - if(rhi.ge.0.0) nhi=1 - rxdata(2*j-1)=rhi - rxdata(2*j)=rlo - id1(j)=2*nhi+nlo - enddo -! write(*,1001) id(1:70) -! write(*,1001) id1(1:70) -!1001 format(70i1) - nhard=nhard+count(id.ne.id1) - nbit=nbit + count(iand(id,1).ne.iand(id1,1)) + & - count(iand(id,2).ne.iand(id1,2)) - - rxav=sum(rxdata)/ND - rx2av=sum(rxdata*rxdata)/ND - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - ss=0.84 - llr=2.0*rxdata/(ss*ss) - apmask=0 - max_iterations=40 - ifer=0 - call bpdecode168(llr,apmask,max_iterations,decoded,niterations,cw) - nbadcrc=0 - if(niterations.ge.0) call chkcrc12(decoded,nbadcrc) - if(niterations.lt.0 .or. count(msgbits.ne.decoded).gt.0 .or. & - nbadcrc.ne.0) ifer=1 - nfe=nfe+ifer - enddo - - fsigma=sqrt(sqf/iters) - ser=float(nhard)/(ND*iters) - ber=float(nbit)/(2*ND*iters) - fer=float(nfe)/iters - write(*,1050) snrdb,nhard,nbit,ser,ber,fer,fsigma -! write(60,1050) snrdb,nhard,ber,fer,fsigma -1050 format(f6.1,2i6,2f8.4,f7.3,f8.2) - enddo - -999 end program fsk4hf diff --git a/lib/fsk4hf/fsk4sim.f90 b/lib/fsk4hf/fsk4sim.f90 deleted file mode 100644 index 9800616e9..000000000 --- a/lib/fsk4hf/fsk4sim.f90 +++ /dev/null @@ -1,185 +0,0 @@ -program fsk4sim - - parameter (ND=60) !Data symbols: LDPC (120,60), r=1/2 - parameter (NN=ND) !Total symbols (60) - parameter (NSPS=57600) !Samples per symbol at 12000 sps - parameter (NZ=NSPS*NN) !Samples in waveform (3456000) - - character*8 arg - complex c(0:NZ-1) !Complex waveform - complex cr(0:NZ-1) - complex cs(NSPS,NN) - complex cps(0:3) - complex ct(0:2*NN-1) - complex z,w,zsum - real r(0:NZ-1) - real s(NSPS,NN) - real savg(NSPS) - real tmp(NN) !For generating random data - real xnoise(0:NZ-1) !Generated random noise - real ps(0:3) - integer id(NN) !Encoded 2-bit data (values 0-3) - integer id2(NN) !Recovered data - equivalence (r,cr) - - nnn=0 - nargs=iargc() - if(nargs.ne.6) then - print*,'Usage: fsk8sim f0 delay(ms) fspread(Hz) nts iters snr(dB)' - go to 999 - endif - call getarg(1,arg) - read(arg,*) f0 !Low tone frequency - call getarg(2,arg) - read(arg,*) delay - call getarg(3,arg) - read(arg,*) fspread - call getarg(4,arg) - read(arg,*) nts - call getarg(5,arg) - read(arg,*) iters - call getarg(6,arg) - read(arg,*) snrdb - - twopi=8.d0*atan(1.d0) - fs=12000.d0 - dt=1.0/fs - ts=NSPS*dt - baud=1.d0/ts - txt=NZ*dt - bandwidth_ratio=2500.0/6000.0 - write(*,1000) baud,5*baud,txt,delay,fspread,nts -1000 format('Baud:',f6.3,' BW:',f5.1,' TxT:',f5.1,' Delay:',f5.2, & - ' fSpread:',f5.2,' nts:',i3/) - - write(*,1004) -1004 format(' SNR Sym Bit SER BER Sym Bit SER BER'/59('-')) - - isna=-25 - isnb=-40 - if(snrdb.ne.0.0) then - isna=nint(snrdb) - isnb=isna - endif - do isnr=isna,isnb,-1 - snrdb=isnr - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - nhard1=0 - nhard2=0 - nbit1=0 - nbit2=0 - nh2=0 - nb2=0 - do iter=1,iters - nnn=nnn+1 - id=0 - call random_number(tmp) - where(tmp.ge.0.25 .and. tmp.lt.0.50) id=1 - where(tmp.ge.0.50 .and. tmp.lt.0.75) id=2 - where(tmp.ge.0.75) id=3 - - call genfsk4(id,f0,nts,c) !Generate the 4-FSK waveform - call watterson(c,delay,fspread) - if(sig.ne.1.0) c=sig*c !Scale to requested SNR - if(snrdb.lt.90) then - do i=0,NZ-1 !Generate gaussian noise - xnoise(i)=gran() - enddo - endif - r(0:NZ-1)=real(c(0:NZ-1)) + xnoise !Add noise to signal - - call snr2_wsprlf(r,freq,snr2500,width,1) - write(*,3001) freq,snr2500,width -3001 format(40x,3f10.3) - - df=12000.0/(2*NSPS) -! i0=nint(f0/df) -! i0=nint((1500.0+freq)/df) - i0=nint((f0+freq)/df) - call spec4(r,cs,s,savg) - - do j=1,NN - nlo=0 - nhi=0 - ps=s(i0:i0+6*nts:2*nts,j) - cps=cs(i0:i0+6*nts:2*nts,j) - if(max(ps(1),ps(3)).ge.max(ps(0),ps(2))) nlo=1 - if(max(ps(2),ps(3)).ge.max(ps(0),ps(1))) nhi=1 - id2(j)=2*nhi+nlo - z=cps(id2(j)) - ct(j-1)=z - enddo - nh1=count(id.ne.id2) - nb1=count(iand(id,1).ne.iand(id2,1)) + count(iand(id,2).ne.iand(id2,2)) - - ct(NN:)=0. - call four2a(ct,2*NN,1,-1,1) - df2=baud/(2*NN) - ct=cshift(ct,NN) - ppmax=0. - dfpk=0. - do i=0,2*NN-1 - f=(i-NN)*df2 - pp=real(ct(i))**2 + aimag(ct(i))**2 - if(pp.gt.ppmax) then - ppmax=pp - dfpk=f - endif - enddo - - zsum=0. - do j=1,NN - phi=(j-1)*twopi*dfpk*ts - w=cmplx(cos(phi),sin(phi)) - cps=cs(i0:i0+6*nts:2*nts,j)*conjg(w) - z=cps(id2(j)) - ct(j)=z - zsum=zsum+z - write(12,1042) j,id(j),id2(j),20*ps,atan2(aimag(z),real(z)), & - atan2(aimag(zsum),real(zsum)),zsum -1042 format(3i2,6f8.3,2f8.1) - enddo - - phi0=atan2(aimag(zsum),real(zsum)) - zsum=0. - do j=1,NN - phi=(j-1)*twopi*dfpk*ts + phi0 - w=cmplx(cos(phi),sin(phi)) - nlo=0 - nhi=0 - cps=cs(i0:i0+6*nts:2*nts,j)*conjg(w) - ps=real(cps) - if(max(ps(1),ps(3)).ge.max(ps(0),ps(2))) nlo=1 - if(max(ps(2),ps(3)).ge.max(ps(0),ps(1))) nhi=1 - id2(j)=2*nhi+nlo - z=cps(id2(j)) - ct(j)=z - zsum=zsum+z - enddo - - nh2=count(id.ne.id2) - nb2=count(iand(id,1).ne.iand(id2,1)) + count(iand(id,2).ne.iand(id2,2)) - nhard1=nhard1+nh1 - nhard2=nhard2+nh2 - nbit1=nbit1+nb1 - nbit2=nbit2+nb2 - - fdiff=1500.0+freq - f0 - write(13,1040) snrdb,snr2500,f0,fdiff,width,nh1,nb1,nh2,nb2 -1040 format(2f7.1,f9.2,f7.2,f6.1,2(i8,i6)) -40 continue - enddo - - ser1=float(nhard1)/(NN*iters) - ser2=float(nhard2)/(NN*iters) - ber1=float(nbit1)/(2*NN*iters) - ber2=float(nbit2)/(2*NN*iters) - write(*,1050) snrdb,nhard1,nbit1,ser1,ber1,nhard2,nbit2,ser2,ber2 - write(14,1050) snrdb,nhard1,nbit1,ser1,ber1,nhard2,nbit2,ser2,ber2 -1050 format(f6.1,2(2i5,2f8.4)) - enddo - write(*,1060) NN*iters,2*NN*iters -1060 format(59('-')/'Max: ',2i5) - -999 end program fsk4sim diff --git a/lib/fsk4hf/ft280d.f90 b/lib/fsk4hf/ft280d.f90 deleted file mode 100644 index 2f97692e0..000000000 --- a/lib/fsk4hf/ft280d.f90 +++ /dev/null @@ -1,427 +0,0 @@ -program ft280d - -! Decode ft280 data read from *.c2 or *.wav files. - - use packjt77 - include 'ft4s280_params.f90' - parameter (NSPS2=NSPS/NDOWN) - character arg*8,cbits*50,infile*80,fname*16,datetime*11 - character ch1*1,ch4*4,cseq*31 - character*22 decodes(100) - character*37 msg - character*120 data_dir - character*77 c77 - complex c2(0:NMAX/NDOWN-1) !Complex waveform - complex cframe(0:164*NSPS2-1) !Complex waveform - complex cd(0:164*20-1) !Complex waveform - real*8 fMHz - real llr(280),llra(280),llrb(280),llrc(280),llrd(280) - real candidates(100,2) - real bitmetrics(328,4) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 apmask(280),cw(280) - integer*1 hbits(328) - integer*1 message101(101) - logical badsync,unpk77_success - - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - txt=NZ*dt !Transmission length (s) - hmod=1.0 - Keff=91 - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: ft280d [-a ] [-f fMHz] [-h hmod] [-k Keff] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-h') then - call getarg(iarg+1,arg) - read(arg,*) hmod - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-k') then - call getarg(iarg+1,arg) - read(arg,*) Keff - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-d') then - call getarg(iarg+1,arg) - read(arg,*) ndeep - iarg=iarg+2 - endif - - ngood=0 - ngoodsync=0 - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c2') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c2 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call ft280_downsample(iwave,c2) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=-100.0 - fb=100.0 - fs=12000.0/32.0 - npts=120*12000.0/32.0 - - call getcandidate_ft280(c2,npts,hmod,fs,fa,fb,ncand,candidates) !First approx for freq - - del=1.5*hmod*fs/300.0 - ndecodes=0 - do icand=1,ncand -! do icand=1,1 - fc0=candidates(icand,1) - xsnr=candidates(icand,2) -!write(*,*) 'candidates ',icand,fc0,xsnr - do isync=0,1 - - if(isync.eq.0) then - fc1=fc0-del - is0=375 - ishw=350 - isst=30 - ifhw=10 - df=.1 - else if(isync.eq.1) then - fc1=fc2 - is0=isbest - ishw=100 - isst=10 - ifhw=10 - df=.02 - endif - smax=0.0 - do if=-ifhw,ifhw - fc=fc1+df*if - do istart=max(1,is0-ishw),is0+ishw,isst - call coherent_sync_ft280(c2,istart,hmod,fc,1,sync) - if(sync.gt.smax) then - fc2=fc - isbest=istart - smax=sync - endif - enddo - enddo -! write(*,*) ifile,icand,isync,fc1+del,fc2+del,isbest,smax - enddo - -if(abs((isbest-429)/429.0) .lt. 0.07 .and. abs(fc2+del).lt.0.2) ngoodsync=ngoodsync+1 -!cycle -! if(smax .lt. 100.0 ) cycle -!isbest=429 -!fc2=-del - do ijitter=0,2 - if(ijitter.eq.0) ioffset=0 - if(ijitter.eq.1) ioffset=45 - if(ijitter.eq.2) ioffset=-45 - is0=isbest+ioffset - if(is0.lt.0) cycle - cframe=c2(is0:is0+164*300-1) - call downsample_ft280(cframe,fc2+del,hmod,cd) - s2=sum(cd*conjg(cd))/(20*144) - cd=cd/sqrt(s2) - call get_ft280_bitmetrics(cd,hmod,bitmetrics,badsync) - - hbits=0 - where(bitmetrics(:,1).ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 9: 16).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(157:164).eq.(/0,0,0,1,1,0,1,1/)) - ns4=count(hbits(165:172).eq.(/0,1,0,0,1,1,1,0/)) - ns5=count(hbits(313:320).eq.(/0,0,0,1,1,0,1,1/)) - ns6=count(hbits(321:328).eq.(/0,1,0,0,1,1,1,0/)) - nsync_qual=ns1+ns2+ns3+ns4+ns5+ns6 -! if(nsync_qual.lt. 20) cycle - - scalefac=2.83 - llra( 1:140)=bitmetrics( 17:156, 1) - llra(141:280)=bitmetrics(173:312, 1) - llra=scalefac*llra - llrb( 1:140)=bitmetrics( 17:156, 2) - llrb(141:280)=bitmetrics(173:312, 2) - llrb=scalefac*llrb - llrc( 1:140)=bitmetrics( 17:156, 3) - llrc(141:280)=bitmetrics(173:312, 3) - llrc=scalefac*llrc - llrd( 1:140)=bitmetrics( 17:156, 4) - llrd(141:280)=bitmetrics(173:312, 4) - llrd=scalefac*llrd - apmask=0 - max_iterations=40 - - do itry=4,1,-1 - if(itry.eq.1) llr=llra - if(itry.eq.2) llr=llrb - if(itry.eq.3) llr=llrc - if(itry.eq.4) llr=llrd - nhardbp=0 - nhardosd=0 - dmin=0.0 - call bpdecode280_101(llr,apmask,max_iterations,message101,cw,nhardbp,niterations,nchecks) -! if(nhardbp.lt.0) call osd280_101(llr,Keff,apmask,5,message101,cw,nhardosd,dmin) - maxsuperits=2 - if(nhardbp.lt.0) then -! call osd280_101(llr,Keff,apmask,ndeep,message101,cw,nhardosd,dmin) - call decode280_101(llr,Keff,ndeep,apmask,maxsuperits,message101,cw,nhardosd,iter,ncheck,dmin,isuper) - endif - if(nhardbp.ge.0 .or. nhardosd.ge.0) then - write(c77,'(77i1)') message101(1:77) - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success .and. index(msg,'K9AN').gt.0) then - ngood=ngood+1 - write(*,1100) ifile-2,icand,xsnr,isbest/375.0-1.0,1500.0+fc2+del,msg(1:20),itry,nhardbp,nhardosd,dmin,ijitter -1100 format(i5,2x,i5,2x,f6.1,2x,f6.2,2x,f8.2,2x,a20,i4,i4,i4,f7.2,i6) - goto 2002 - else - cycle - endif - endif - enddo ! metrics - enddo ! istart jitter - enddo !candidate list -2002 continue - enddo !files - nfiles=nargs-iarg+1 - write(*,*) 'nfiles: ',nfiles,' ngood: ',ngood,' ngoodsync: ',ngoodsync - write(*,1120) -1120 format("") - -999 end program ft280d - -subroutine coherent_sync_ft280(cd0,i0,hmod,f0,itwk,sync) - -! Compute sync power for a complex, downsampled FT4s signal. - - include 'ft4s280_params.f90' - parameter(NP=NMAX/NDOWN,NSS=NSPS/NDOWN) - complex cd0(0:NP-1) - complex csynca(8*NSS) - complex csync2(8*NSS) - complex ctwk(8*NSS) - complex z1,z2,z3,z4,z5,z6 - logical first - integer icos4(0:7) - data icos4/0,1,3,2,1,0,2,3/ - data first/.true./ - save first,twopi,csynca,fac - - p(z1)=(real(z1*fac)**2 + aimag(z1*fac)**2)**0.5 !Statement function for power - - if( first ) then - twopi=8.0*atan(1.0) - k=1 - phia=0.0 - do i=0,7 - dphia=twopi*hmod*icos4(i)/real(NSS) - do j=1,NSS - csynca(k)=cmplx(cos(phia),sin(phia)) - phia=mod(phia+dphia,twopi) - k=k+1 - enddo - enddo - first=.false. - fac=1.0/(8.0*NSS) - endif - - i1=i0 !four Costas arrays - i2=i0+78*NSS - i3=i0+156*NSS - - z1=0. - z2=0. - z3=0. - - if(itwk.eq.1) then - dt=1/(12000.0/32.0) - dphi=twopi*f0*dt - phi=0.0 - do i=1,8*NSS - ctwk(i)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dphi,twopi) - enddo - endif - - if(itwk.eq.1) csync2=ctwk*csynca !Tweak the frequency - if(i1.ge.0 .and. i1+8*NSS-1.le.NP-1) then - z1=sum(cd0(i1:i1+8*NSS-1)*conjg(csync2)) -! z1=abs(sum(cd0(i1:i1+4*NSS-1)*conjg(csync2(1:4*NSS))))**2 -! z1=z1+abs(sum(cd0(i1+4*NSS:i1+8*NSS-1)*conjg(csync2(4*NSS+1:8*NSS))))**2 - elseif( i1.lt.0 ) then - npts=(i1+8*NSS-1)/2 - if(npts.le.40) then - z1=0. - else - z1=sum(cd0(0:i1+8*NSS-1)*conjg(csync2(8*NSS-npts:))) - endif - endif - - if(i2.ge.0 .and. i2+8*NSS-1.le.NP-1) then - z2=sum(cd0(i2:i2+8*NSS-1)*conjg(csync2)) -! z2=abs(sum(cd0(i2:i2+4*NSS-1)*conjg(csync2(1:4*NSS))))**2 -! z2=z2+abs(sum(cd0(i2+4*NSS:i2+8*NSS-1)*conjg(csync2(4*NSS+1:8*NSS))))**2 - endif - - if(i3.ge.0 .and. i3+8*NSS-1.le.NP-1) then - z3=sum(cd0(i3:i3+8*NSS-1)*conjg(csync2)) -! z3=abs(sum(cd0(i3:i3+4*NSS-1)*conjg(csync2(1:4*NSS))))**2 -! z3=z3+abs(sum(cd0(i3+4*NSS:i3+8*NSS-1)*conjg(csync2(4*NSS+1:8*NSS))))**2 - elseif( i3+8*NSS-1.gt.NP-1 ) then - npts=(NP-1-i3+1) - if(npts.le.40) then - z3=0. - else - z3=sum(cd0(i3:i3+npts-1)*conjg(csync2(1:npts))) - endif - endif - - sync = p(z1) + p(z2) + p(z3) -!sync=z1+z2+z3 - return -end subroutine coherent_sync_ft280 - -subroutine downsample_ft280(ci,f0,hmod,co) - parameter(NI=164*300,NH=NI/2,NO=NI/15) ! downsample from 315 samples per symbol to 20 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0/28.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) -! b=16.0*hmod - b=16.0*hmod - icutoff=nint(24.0/df) - do i=1,NO/2 -! arg=(i*df/b)**2 -! filt=exp(-arg) - filt=0 - if(i.le.icutoff) filt=1 - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample_ft280 - -subroutine getcandidate_ft280(c,npts,hmod,fs,fa,fb,ncand,candidates) - parameter(NFFT1=120*12000/28,NH1=NFFT1/2,NFFT2=120*12000/300,NH2=NFFT2/2) - complex c(0:npts-1) !Complex waveform - complex cc(0:NFFT1-1) - complex csfil(0:NFFT2-1) - complex cwork(0:NFFT2-1) - real bigspec(0:NFFT2-1) - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - real ss(-NH1+1:NH1) !Smoothed coarse spectrum - real candidates(100,2) - integer indx(NFFT2-1) - logical first - data first/.true./ - save first,w,df,csfil - - if(first) then - df=10*fs/NFFT1 - csfil=cmplx(0.0,0.0) - do i=0,NFFT2-1 -! csfil(i)=exp(-((i-NH2)/32.0)**2) ! revisit this - csfil(i)=exp(-((i-NH2)/(hmod*28.0))**2) ! revisit this - enddo - csfil=cshift(csfil,NH2) - call four2a(csfil,NFFT2,1,-1,1) - first=.false. - endif - - cc=cmplx(0.0,0.0) - cc(0:npts-1)=c; - call four2a(cc,NFFT1,1,-1,1) - cc=abs(cc)**2 - call four2a(cc,NFFT1,1,-1,1) - cwork(0:NH2)=cc(0:NH2)*conjg(csfil(0:NH2)) - cwork(NH2+1:NFFT2-1)=cc(NFFT1-NH2+1:NFFT1-1)*conjg(csfil(NH2+1:NFFT2-1)) - - call four2a(cwork,NFFT2,1,+1,1) - bigspec=cshift(real(cwork),-NH2) - il=NH2+fa/df - ih=NH2+fb/df - nnl=ih-il+1 - call indexx(bigspec(il:il+nnl-1),nnl,indx) - xn=bigspec(il-1+indx(nint(0.3*nnl))) - bigspec=bigspec/xn - ncand=0 - do i=il,ih - if((bigspec(i).gt.bigspec(i-1)).and. & - (bigspec(i).gt.bigspec(i+1)).and. & - (bigspec(i).gt.1.15).and.ncand.lt.100) then - ncand=ncand+1 - candidates(ncand,1)=df*(i-NH2) - candidates(ncand,2)=10*log10(bigspec(i)-1)-26.5 - endif - enddo - return -end subroutine getcandidate_ft280 - -subroutine ft280_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 375 Hz - - include 'ft4s280_params.f90' - parameter (NFFT2=NMAX/28) - integer*2 iwave(NMAX) - complex c(0:NMAX/28-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/28-1) - return -end subroutine ft280_downsample - diff --git a/lib/fsk4hf/ft280sim.f90 b/lib/fsk4hf/ft280sim.f90 deleted file mode 100644 index 96a7251d0..000000000 --- a/lib/fsk4hf/ft280sim.f90 +++ /dev/null @@ -1,113 +0,0 @@ -program ft280sim - -! Generate simulated signals for experimental slow FT4 mode - - use wavhdr - use packjt77 - include 'ft4s280_params.f90' !Set various constants - type(hdr) h !Header for .wav file - character arg*12,fname*17 - character msg37*37,msgsent37*37 - character c77*77 - complex c0(0:NMAX-1) - complex c(0:NMAX-1) - real wave(NMAX) - integer itone(NN) - integer*1 msgbits(101) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: ft280sim "message" f0 DT h fdop del nfiles snr' - print*,'Examples: ft280sim "K1JT K9AN EN50" 1500 0.0 1.0 0.1 1.0 10 -15' - go to 999 - endif - call getarg(1,msg37) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Frequency (only used for single-signal) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) hmod !Modulation index, h - call getarg(5,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(6,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - nfiles=abs(nfiles) - twopi=8.0*atan(1.0) - fs=12000.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of symbols (s) - baud=1.0/tt !Keying rate (baud) - txt=NZ2*dt !Transmission length (s) - - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - - call genft280(msg37,0,msgsent37,msgbits,itone) - write(*,*) - write(*,'(a9,a37,3x,a7,i1,a1,i1)') 'Message: ',msgsent37,'i3.n3: ',i3,'.',n3 - write(*,1000) f0,xdt,hmod,txt,snrdb -1000 format('f0:',f9.3,' DT:',f6.2,' hmod:',f6.3,' TxT:',f6.1,' SNR:',f6.1) - write(*,*) - if(i3.eq.1) then - write(*,*) ' mycall hiscall hisgrid' - write(*,'(28i1,1x,i1,1x,28i1,1x,i1,1x,i1,1x,15i1,1x,3i1)') msgbits(1:77) - else - write(*,'(a14)') 'Message bits: ' - write(*,'(50i1,1x,24i1)') msgbits - endif - write(*,*) - write(*,'(a17)') 'Channel symbols: ' - write(*,'(10i1)') itone - write(*,*) - - call sgran() - - fsample=12000.0 - icmplx=1 - call gen_wspr4wave(itone,NN,NSPS,fsample,hmod,f0,c0,wave,icmplx,NMAX) - k=nint((xdt+1.0)/dt)-NSPS - c0=cshift(c0,-k) - if(k.gt.0) c0(0:k-1)=0.0 - if(k.lt.0) c0(NMAX+k:NMAX-1)=0.0 - - do ifile=1,nfiles - c=c0 - if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c,NMAX,NZ,fs,delay,fspread) - c=sig*c - wave=real(c) - if(snrdb.lt.90) then - do i=1,NMAX !Add gaussian noise at specified SNR - xnoise=gran() - wave(i)=wave(i) + xnoise - enddo - endif - gain=100.0 - if(snrdb.lt.90.0) then - wave=gain*wave - else - datpk=maxval(abs(wave)) - fac=32766.9/datpk - wave=fac*wave - endif - if(any(abs(wave).gt.32767.0)) print*,"Warning - data will be clipped." - iwave=nint(wave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i6.6,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a17) - enddo - -999 end program ft280sim diff --git a/lib/fsk4hf/ft2_params.f90 b/lib/fsk4hf/ft2_params.f90 deleted file mode 100644 index 351119b4b..000000000 --- a/lib/fsk4hf/ft2_params.f90 +++ /dev/null @@ -1,12 +0,0 @@ -! LDPC (128,90) code -parameter (KK=90) !Information bits (77 + CRC13) -parameter (ND=128) !Data symbols -parameter (NS=16) !Sync symbols (2x8) -parameter (NN=NS+ND) !Total channel symbols (144) -parameter (NSPS=160) !Samples per symbol at 12000 S/s -parameter (NZ=NSPS*NN) !Samples in full 1.92 s waveform (23040) -parameter (NMAX=2.5*12000) !Samples in iwave (36,000) -parameter (NFFT1=400, NH1=NFFT1/2) !Length of FFTs for symbol spectra -parameter (NSTEP=NSPS/4) !Rough time-sync step size -parameter (NHSYM=NMAX/NSTEP-3) !Number of symbol spectra (1/4-sym steps) -parameter (NDOWN=16) !Downsample factor diff --git a/lib/fsk4hf/ft2d.f90 b/lib/fsk4hf/ft2d.f90 deleted file mode 100644 index fda1f1826..000000000 --- a/lib/fsk4hf/ft2d.f90 +++ /dev/null @@ -1,335 +0,0 @@ -program ft2d - - use crc - use packjt77 - include 'ft2_params.f90' - character arg*8,message*37,c77*77,infile*80,fname*16,datetime*11 - character*37 decodes(100) - character*120 data_dir - character*90 dmsg - complex c2(0:NMAX/16-1) !Complex waveform - complex cb(0:NMAX/16-1) - complex cd(0:144*10-1) !Complex waveform - complex c1(0:9),c0(0:9) - complex ccor(0:1,144) - complex csum,cterm,cc0,cc1,csync1,csync2 - complex csync(16),csl(0:159) - real*8 fMHz - - real a(5) - real rxdata(128),llr(128) !Soft symbols - real llr2(128) - real sbits(144),sbits1(144),sbits3(144) - real ps(0:8191),psbest(0:8191) - real candidates(100,2) - real savg(NH1),sbase(NH1) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 message77(77),apmask(128),cw(128) - integer*1 hbits(144),hbits1(144),hbits3(144) - integer*1 s16(16),s45(45) - logical unpk77_success - data s16/0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0/ - data s45/0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,1,1,0,1,0,0,0,1,1,1,0,0/ - - fs=12000.0/NDOWN !Sample rate - dt=1/fs !Sample interval after downsample (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - twopi=8.0*atan(1.0) - h=0.800 !h=0.8 seems to be optimum for AWGN sensitivity (not for fading) - - dphi=twopi/2*baud*h*dt*16 ! dt*16 is samp interval after downsample - dphi0=-1*dphi - dphi1=+1*dphi - phi0=0.0 - phi1=0.0 - do i=0,9 - c1(i)=cmplx(cos(phi1),sin(phi1)) - c0(i)=cmplx(cos(phi0),sin(phi0)) - phi1=mod(phi1+dphi1,twopi) - phi0=mod(phi0+dphi0,twopi) - enddo - the=twopi*h/2.0 - cc1=cmplx(cos(the),-sin(the)) - cc0=cmplx(cos(the),sin(the)) - - k=0 - do j=1,16 - dphi1=(2*s16(j)-1)*dphi - phi1=0.0 - do i=0,9 - csl(k)=cmplx(cos(phi1),sin(phi1)) - phi1=mod(phi1+dphi1,twopi) - k=k+1 - enddo - enddo - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: ft2d [-a ] [-f fMHz] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - ncoh=1 - - do ifile=iarg,nargs - call getarg(ifile,infile) - j2=index(infile,'.wav') - open(10,file=infile,status='old',access='stream') - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - close(10) - candidates=0.0 - ncand=0 - call getcandidates2(iwave,375.0,3000.0,0.2,2200.0,100,savg,candidates,ncand,sbase) - ndecodes=0 - do icand=1,ncand - f0=candidates(icand,1) - xsnr=1.0 - if( f0.le.375.0 .or. f0.ge.(5000.0-375.0) ) cycle - call ft2_downsample(iwave,f0,c2) ! downsample from 160s/Symbol to 10s/Symbol - -!c2=c2/sqrt(sum(abs(c2(0:NMAX/16-1)))) -!ishift=-1 -!rccbest=-99. -!do is=0,435 -!rcc=0.0 -! do id=10,10 -! rcc=rcc+abs(sum(conjg(c2(is:is+159-id))*c2(is+id:is+159)*csl(0:159-id)*conjg(csl(id:159)))) -! enddo -! if(rcc.gt.rccbest) then -! rccbest=rcc -! ishift=is -! endif -!write(21,*) is,rcc -!enddo - -! 750 samples/second here - ibest=-1 - sybest=-99. - dfbest=-1. - do if=-30,+30 - df=if - a=0. - a(1)=-df - call twkfreq1(c2,NMAX/16,fs,a,cb) - do is=0,374 - csync1=0. - cterm=1 - do ib=1,16 -! do ib=1,45 - i1=(ib-1)*10+is - if(s16(ib).eq.1) then -! if(s45(ib).eq.1) then - csync1=csync1+sum(cb(i1:i1+9)*conjg(c1(0:9)))*cterm - cterm=cterm*cc1 - else - csync1=csync1+sum(cb(i1:i1+9)*conjg(c0(0:9)))*cterm - cterm=cterm*cc0 - endif - enddo - if(abs(csync1).gt.sybest) then - ibest=is - sybest=abs(csync1) - dfbest=df - endif - enddo - enddo - - a=0. -!dfbest=1500.0-f0 - a(1)=-dfbest - - call twkfreq1(c2,NMAX/16,fs,a,cb) - -!ibest=197 - ib=ibest - - cd=cb(ib:ib+144*10-1) - s2=sum(cd*conjg(cd))/(10*144) - cd=cd/sqrt(s2) - do nseq=1,4 - if( nseq.eq.1 ) then ! noncoherent single-symbol detection - sbits1=0.0 - do ibit=1,144 - ib=(ibit-1)*10 - ccor(1,ibit)=sum(cd(ib:ib+9)*conjg(c1(0:9))) - ccor(0,ibit)=sum(cd(ib:ib+9)*conjg(c0(0:9))) - sbits1(ibit)=abs(ccor(1,ibit))-abs(ccor(0,ibit)) - hbits1(ibit)=0 - if(sbits1(ibit).gt.0) hbits1(ibit)=1 - enddo - sbits=sbits1 - hbits=hbits1 - sbits3=sbits1 - hbits3=hbits1 - elseif( nseq.ge.2 ) then - nbit=2*nseq-1 - numseq=2**(nbit) - ps=0 - do ibit=nbit/2+1,144-nbit/2 - ps=0.0 - pmax=0.0 - do iseq=0,numseq-1 - csum=0.0 - cterm=1.0 - k=1 - do i=nbit-1,0,-1 - ibb=iand(iseq/(2**i),1) - csum=csum+ccor(ibb,ibit-(nbit/2+1)+k)*cterm - if(ibb.eq.0) cterm=cterm*cc0 - if(ibb.eq.1) cterm=cterm*cc1 - k=k+1 - enddo - ps(iseq)=abs(csum) - if( ps(iseq) .gt. pmax ) then - pmax=ps(iseq) - ibflag=1 - endif - enddo - if( ibflag .eq. 1 ) then - psbest=ps - ibflag=0 - endif - call getbitmetric(2**(nbit/2),psbest,numseq,sbits3(ibit)) - hbits3(ibit)=0 - if(sbits3(ibit).gt.0) hbits3(ibit)=1 - enddo - sbits=sbits3 - hbits=hbits3 - endif - nsync_qual=count(hbits(1:16).eq.s16) -! if(nsync_qual.lt.10) exit - rxdata=sbits(17:144) - rxav=sum(rxdata(1:128))/128.0 - rx2av=sum(rxdata(1:128)*rxdata(1:128))/128.0 - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - sigma=0.80 - llr(1:128)=2*rxdata/(sigma*sigma) -!xllrmax=maxval(abs(llr)) -!write(*,*) ifile,icand,nseq,nsync_qual - apmask=0 -!apmask(1:29)=1 -!llr(1:29)=xllrmax*(2*s45(17:45)-1) - max_iterations=40 - do ibias=0,0 - llr2=llr - if(ibias.eq.1) llr2=llr+0.4 - if(ibias.eq.2) llr2=llr-0.4 - call bpdecode128_90(llr2,apmask,max_iterations,message77,cw,nharderror,niterations) - if(nharderror.ge.0) exit - enddo - if(sum(message77).eq.0) cycle - if( nharderror.ge.0 ) then - write(c77,'(77i1)') message77(1:77) - call unpack77(c77,1,message,unpk77_success) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(idupe.eq.1) goto 888 - ndecodes=ndecodes+1 - decodes(ndecodes)=message - nsnr=nint(xsnr) - freq=f0+dfbest -1210 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1212) datetime(8:11),nsnr,ibest/750.0,freq,message,'*',nseq,nharderror,nsync_qual -1212 format(a4,i4,2x,f5.3,f11.1,2x,a22,a1,i5,i5,i5) - goto 888 - endif - enddo ! nseq -888 continue - enddo !candidate list - enddo !files - - write(*,1120) -1120 format("") - -999 end program ft2d - -subroutine getbitmetric(ib,ps,ns,xmet) - real ps(0:ns-1) - xm1=0 - xm0=0 - do i=0,ns-1 - if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) xm1=ps(i) - if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) xm0=ps(i) - enddo - xmet=xm1-xm0 - return -end subroutine getbitmetric - -subroutine downsample2(ci,f0,co) - parameter(NI=144*160,NH=NI/2,NO=NI/16) ! downsample from 200 samples per symbol to 10 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - b=8.0 - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample2 - -subroutine ft2_downsample(iwave,f0,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 1200 Hz - - include 'ft2_params.f90' - parameter (NFFT2=NMAX/16) - integer*2 iwave(NMAX) - complex c(0:NMAX/16-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - BW=4.0*75 - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - ibw=nint(BW/df) - i0=nint(f0/df) - c1=0. - c1(0)=cx(i0) - do i=1,NFFT2/2 - arg=(i-1)*df/bw - win=exp(-arg*arg) - c1(i)=cx(i0+i)*win - c1(NFFT2-i)=cx(i0-i)*win - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/16-1) - return -end subroutine ft2_downsample - diff --git a/lib/fsk4hf/ft2sim.f90 b/lib/fsk4hf/ft2sim.f90 deleted file mode 100644 index ea0518a52..000000000 --- a/lib/fsk4hf/ft2sim.f90 +++ /dev/null @@ -1,154 +0,0 @@ -program ft2sim - -! Generate simulated signals for experimental "FT2" mode - - use wavhdr - use packjt77 - include 'ft2_params.f90' !Set various constants - parameter (NWAVE=NN*NSPS) - type(hdr) h !Header for .wav file - character arg*12,fname*17 - character msg37*37,msgsent37*37 - character c77*77 - complex c0(0:NMAX-1) - complex c(0:NMAX-1) - real wave(NMAX) - real dphi(0:NMAX-1) - real pulse(480) - integer itone(NN) - integer*1 msgbits(77) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: ft2sim "message" f0 DT fdop del width nfiles snr' - print*,'Examples: ft2sim "K1ABC W9XYZ EN37" 1500.0 0.0 0.1 1.0 0 10 -18' - print*,' ft2sim "WA9XYZ/R KA1ABC/R FN42" 1500.0 0.0 0.1 1.0 0 10 -18' - print*,' ft2sim "K1ABC RR73; W9XYZ -11" 300 0 0 0 25 1 -10' - go to 999 - endif - call getarg(1,msg37) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Frequency (only used for single-signal) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) width !Filter transition width (Hz) - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - nfiles=abs(nfiles) - twopi=8.0*atan(1.0) - fs=12000.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - hmod=0.800 !Modulation index (0.5 is MSK, 1.0 is FSK) - tt=NSPS*dt !Duration of symbols (s) - baud=1.0/tt !Keying rate (baud) - txt=NZ*dt !Transmission length (s) - - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS/12000.0 - - ! Source-encode, then get itone() - i3=-1 - n3=-1 - call pack77(msg37,i3,n3,c77) - read(c77,'(77i1)') msgbits - call genft2(msg37,0,msgsent37,itone,itype) - write(*,*) - write(*,'(a9,a37,3x,a7,i1,a1,i1)') 'Message: ',msgsent37,'i3.n3: ',i3,'.',n3 - write(*,1000) f0,xdt,txt,snrdb -1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1) - write(*,*) - if(i3.eq.1) then - write(*,*) ' mycall hiscall hisgrid' - write(*,'(28i1,1x,i1,1x,28i1,1x,i1,1x,i1,1x,15i1,1x,3i1)') msgbits(1:77) - else - write(*,'(a14)') 'Message bits: ' - write(*,'(77i1)') msgbits - endif - write(*,*) - write(*,'(a17)') 'Channel symbols: ' - write(*,'(79i1)') itone - write(*,*) - - call sgran() - -! The filtered frequency pulse - do i=1,480 - tt=(i-240.5)/160.0 - pulse(i)=gfsk_pulse(1.0,tt) - enddo - -! Define the instantaneous frequency waveform - dphi_peak=twopi*(hmod/2.0)/real(NSPS) - dphi=0.0 - do j=1,NN - ib=(j-1)*160 - ie=ib+480-1 - dphi(ib:ie)=dphi(ib:ie)+dphi_peak*pulse*(2*itone(j)-1) - enddo - - phi=0.0 - c0=0.0 - dphi=dphi+twopi*f0*dt - do j=0,NMAX-1 - c0(j)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dphi(j),twopi) - enddo - - c0(0:159)=c0(0:159)*(1.0-cos(twopi*(/(i,i=0,159)/)/320.0) )/2.0 - c0(145*160:145*160+159)=c0(145*160:145*160+159)*(1.0+cos(twopi*(/(i,i=0,159)/)/320.0 ))/2.0 - c0(146*160:)=0. - - k=nint((xdt+0.25)/dt) - c0=cshift(c0,-k) - ia=k - - do ifile=1,nfiles - c=c0 - if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c,NMAX,NWAVE,fs,delay,fspread) - c=sig*c - - ib=k - wave=real(c) - peak=maxval(abs(wave(ia:ib))) - nslots=1 - if(width.gt.0.0) call filt8(f0,nslots,width,wave) - - if(snrdb.lt.90) then - do i=1,NMAX !Add gaussian noise at specified SNR - xnoise=gran() - wave(i)=wave(i) + xnoise - enddo - endif - - gain=100.0 - if(snrdb.lt.90.0) then - wave=gain*wave - else - datpk=maxval(abs(wave)) - fac=32766.9/datpk - wave=fac*wave - endif - if(any(abs(wave).gt.32767.0)) print*,"Warning - data will be clipped." - iwave=nint(wave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i6.6,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a17) - enddo -999 end program ft2sim diff --git a/lib/fsk4hf/ft4d.f90 b/lib/fsk4hf/ft4d.f90 deleted file mode 100644 index d1bf262c1..000000000 --- a/lib/fsk4hf/ft4d.f90 +++ /dev/null @@ -1,329 +0,0 @@ -program ft4d - - use crc - use packjt77 - include 'ft4_params.f90' - character arg*8,message*37,c77*77,infile*80,fname*16,datetime*11 - character*37 decodes(100) - character*120 data_dir - character*90 dmsg - complex cd2(0:NMAX/16-1) !Complex waveform - complex cb(0:NMAX/16-1) - complex cd(0:76*20-1) !Complex waveform - complex csum,cterm - complex ctwk(80),ctwk2(80) - complex csymb(20) - complex cs(0:3,NN) - real s4(0:3,NN) - - real*8 fMHz - real ps(0:8191),psbest(0:8191) - real bmeta(152),bmetb(152),bmetc(152) - real s(NH1,NHSYM) - real a(5) - real llr(128),llr2(128),llra(128),llrb(128),llrc(128) - real s2(0:255) - real candidate(3,100) - real savg(NH1),sbase(NH1) - integer ihdr(11) - integer icos4(0:3) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 message77(77),apmask(128),cw(128) - integer*1 hbits(152),hbits1(152),hbits3(152) - integer*1 s12(12) - integer graymap(0:3) - integer ip(1) - logical unpk77_success - logical one(0:511,0:7) ! 256 4-symbol sequences, 8 bits - data s12/1,1,1,2,2,2,2,2,2,1,1,1/ - data icos4/0,1,3,2/ - data graymap/0,1,3,2/ - save one - - fs=12000.0/NDOWN !Sample rate - dt=1/fs !Sample interval after downsample (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - twopi=8.0*atan(1.0) - h=1.0 !h=0.8 seems to be optimum for AWGN sensitivity (not for fading) - - one=.false. - do i=0,255 - do j=0,7 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: ft4d [-a ] [-f fMHz] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - ncoh=1 - - do ifile=iarg,nargs - call getarg(ifile,infile) - j2=index(infile,'.wav') - open(10,file=infile,status='old',access='stream') - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - close(10) - candidate=0.0 - ncand=0 - - nfqso=1500 - nfa=500 - nfb=2700 - syncmin=1.0 - maxcand=100 -! call syncft4(iwave,nfa,nfb,syncmin,nfqso,maxcand,s,candidate,ncand,sbase) - - call getcandidates4(iwave,375.0,3000.0,0.2,2200.0,100,savg,candidate,ncand,sbase) - ndecodes=0 - do icand=1,ncand - f0=candidate(1,icand)-1.5*37.5 - xsnr=1.0 - if( f0.le.375.0 .or. f0.ge.(5000.0-375.0) ) cycle - call ft4_downsample(iwave,f0,cd2) ! downsample from 320 Sa/Symbol to 20 Sa/Symbol - sum2=sum(cd2*conjg(cd2))/(20.0*76) - if(sum2.gt.0.0) cd2=cd2/sqrt(sum2) - -! 750 samples/second here - ibest=-1 - smax=-99. - dfbest=-1. - do idf=-90,+90,5 - df=idf - a=0. - a(1)=df - ctwk=1. - call twkfreq1(ctwk,80,fs,a,ctwk2) - do istart=0,315 - call sync4d(cd2,istart,ctwk2,1,sync) - if(sync.gt.smax) then - smax=sync - ibest=istart - dfbest=df - endif - enddo - enddo - - f0=f0+dfbest -!f0=1443.75 - call ft4_downsample(iwave,f0,cb) ! downsample from 320s/Symbol to 20s/Symbol - sum2=sum(abs(cb)**2)/(20.0*76) - if(sum2.gt.0.0) cb=cb/sqrt(sum2) -!ibest=208 - cd=cb(ibest:ibest+76*20-1) - do k=1,NN - i1=(k-1)*20 - csymb=cd(i1:i1+19) - call four2a(csymb,20,1,-1,1) - cs(0:3,k)=csymb(1:4)/1e2 - s4(0:3,k)=abs(csymb(1:4)) - enddo - -! sync quality check - is1=0 - is2=0 - is3=0 - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+36)) - if(icos4(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+72)) - if(icos4(k-1).eq.(ip(1)-1)) is3=is3+1 - enddo -! hard sync sum - max is 12 - nsync=is1+is2+is3 - - do nseq=1,3 - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - nt=2**(2*nsym) - do ks=1,76,nsym - amax=-1.0 - do i=0,nt-1 - i1=i/64 - i2=iand(i,63)/16 - i3=iand(i,15)/4 - i4=iand(i,3) - if(nsym.eq.1) then - s2(i)=abs(cs(graymap(i4),ks)) - elseif(nsym.eq.2) then - s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) - elseif(nsym.eq.4) then - s2(i)=abs(cs(graymap(i1),ks ) + & - cs(graymap(i2),ks+1) + & - cs(graymap(i3),ks+2) + & - cs(graymap(i4),ks+3) & - ) - else - print*,"Error - nsym must be 1, 2, or 4." - endif - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib .gt.152) cycle - if(nsym.eq.1) then - bmeta(ipt+ib)=bm - elseif(nsym.eq.2) then - bmetb(ipt+ib)=bm - elseif(nsym.eq.4) then - bmetc(ipt+ib)=bm - endif - enddo - enddo - enddo - - call normalizebmet(bmeta,152) - call normalizebmet(bmetb,152) - call normalizebmet(bmetc,152) - - hbits=0 - where(bmeta.ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 73: 80).eq.(/0,0,0,1,1,0,1,1/)) - ns3=count(hbits(145:152).eq.(/0,0,0,1,1,0,1,1/)) - nsync_qual=ns1+ns2+ns3 - - sigma=0.7 - llra(1:64)=bmeta(9:72) - llra(65:128)=bmeta(81:144) - llra=2*llra/sigma**2 - llrb(1:64)=bmetb(9:72) - llrb(65:128)=bmetb(81:144) - llrb=2*llrb/sigma**2 - llrc(1:64)=bmetc(9:72) - llrc(65:128)=bmetc(81:144) - llrc=2*llrc/sigma**2 - - do isd=1,3 - if(isd.eq.1) llr=llra - if(isd.eq.2) llr=llrb - if(isd.eq.3) llr=llrc - apmask=0 - max_iterations=40 - do ibias=0,0 - llr2=llr - if(ibias.eq.1) llr2=llr+0.4 - if(ibias.eq.2) llr2=llr-0.4 - call bpdecode128_90(llr2,apmask,max_iterations,message77,cw,nharderror,niterations) - if(nharderror.ge.0) exit - enddo - if(sum(message77).eq.0) cycle - if( nharderror.ge.0 ) then - write(c77,'(77i1)') message77(1:77) - call unpack77(c77,1,message,unpk77_success) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(idupe.eq.1) cycle - ndecodes=ndecodes+1 - decodes(ndecodes)=message - nsnr=nint(xsnr) - write(*,1212) datetime(8:11),nsnr,ibest/750.0,f0,message,'*',nharderror,nsync_qual,isd,niterations -1212 format(a4,i4,2x,f5.3,f11.1,2x,a22,a1,i5,i5,i5,i5) - endif - enddo ! sequence estimation - enddo !candidate list - enddo !files - - write(*,1120) -1120 format("") - -999 end program ft4d - -subroutine getbitmetric(ib,ps,ns,xmet) - real ps(0:ns-1) - xm1=0 - xm0=0 - do i=0,ns-1 - if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) xm1=ps(i) - if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) xm0=ps(i) - enddo - xmet=xm1-xm0 - return -end subroutine getbitmetric - -subroutine downsample4(ci,f0,co) - parameter(NI=144*160,NH=NI/2,NO=NI/16) ! downsample from 200 samples per symbol to 10 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - b=8.0 - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample4 - -subroutine ft4_downsample(iwave,f0,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 1200 Hz - - include 'ft4_params.f90' - parameter (NFFT2=NMAX/16) - integer*2 iwave(NMAX) - complex c(0:NMAX/16-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - BW=6.0*75 - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - ibw=nint(BW/df) - i0=nint(f0/df) - c1=0. - c1(0)=cx(i0) - do i=1,NFFT2/2 - arg=(i-1)*df/bw - win=exp(-arg*arg) - c1(i)=cx(i0+i)*win - c1(NFFT2-i)=cx(i0-i)*win - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/16-1) - return -end subroutine ft4_downsample - diff --git a/lib/fsk4hf/ft4s280_params.f90 b/lib/fsk4hf/ft4s280_params.f90 deleted file mode 100644 index 29483e48a..000000000 --- a/lib/fsk4hf/ft4s280_params.f90 +++ /dev/null @@ -1,16 +0,0 @@ -! FT4S280 -! LDPC(280,101)/CRC24 code, six 4x4 Costas arrays for sync, ramp-up and ramp-down symbols - -parameter (KK=77) !Information bits (77 + CRC24) -parameter (ND=140) !Data symbols -parameter (NS=24) !Sync symbols -parameter (NN=NS+ND) !Sync and data symbols (164) -parameter (NN2=NS+ND+2) !Total channel symbols (166) -parameter (NSPS=8400) !Samples per symbol at 12000 S/s -parameter (NZ=NSPS*NN) !Sync and Data samples (1,377,600) -parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (1,394,400) -parameter (NMAX=408*3456) !Samples in iwave (1,410,048) -parameter (NFFT1=4*NSPS, NH1=NFFT1/2) !Length of FFTs for symbol spectra -parameter (NSTEP=NSPS) !Coarse time-sync step size -parameter (NHSYM=(NMAX-NFFT1)/NSTEP) !Number of symbol spectra (1/4-sym steps) -parameter (NDOWN=28) !Downsample factor diff --git a/lib/fsk4hf/ft4s_params.f90 b/lib/fsk4hf/ft4s_params.f90 deleted file mode 100644 index 510d7e505..000000000 --- a/lib/fsk4hf/ft4s_params.f90 +++ /dev/null @@ -1,16 +0,0 @@ -! FT4A -! LDPC(240,101)/CRC24 code, four 4x4 Costas arrays for sync, ramp-up and ramp-down symbols - -parameter (KK=77) !Information bits (77 + CRC24) -parameter (ND=120) !Data symbols -parameter (NS=24) !Sync symbols -parameter (NN=NS+ND) !Sync and data symbols (144) -parameter (NN2=NS+ND+2) !Total channel symbols (146) -parameter (NSPS=9600) !Samples per symbol at 12000 S/s -parameter (NZ=NSPS*NN) !Sync and Data samples (1,382,400) -parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (1,397,760) -parameter (NMAX=408*3456) !Samples in iwave (1,410,048) -parameter (NFFT1=4*NSPS, NH1=NFFT1/2) !Length of FFTs for symbol spectra -parameter (NSTEP=NSPS) !Coarse time-sync step size -parameter (NHSYM=(NMAX-NFFT1)/NSTEP) !Number of symbol spectra (1/4-sym steps) -parameter (NDOWN=32) !Downsample factor diff --git a/lib/fsk4hf/ft4sd.f90 b/lib/fsk4hf/ft4sd.f90 deleted file mode 100644 index b74f397d6..000000000 --- a/lib/fsk4hf/ft4sd.f90 +++ /dev/null @@ -1,473 +0,0 @@ -program ft4sd - -! Decode ft4slow data read from *.c2 or *.wav files. - - use packjt77 - include 'ft4s_params.f90' - parameter (NSPS2=NSPS/32) - character arg*8,cbits*50,infile*80,fname*16,datetime*11 - character ch1*1,ch4*4,cseq*31 - character*22 decodes(100) - character*37 msg - character*120 data_dir - character*77 c77 - complex c2(0:NMAX/32-1) !Complex waveform - complex cframe(0:144*NSPS2-1) !Complex waveform - complex cd(0:144*20-1) !Complex waveform - real*8 fMHz - real llr(240),llra(240),llrb(240),llrc(240),llrd(240) - real candidates(100,2) - real bitmetrics(288,4) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 apmask(240),cw(240) - integer*1 hbits(288) - integer*1 message101(101) - logical badsync,unpk77_success - - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - txt=NZ*dt !Transmission length (s) - hmod=1.0 - Keff=91 - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: ft4sd [-a ] [-f fMHz] [-h hmod] [-k Keff] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-h') then - call getarg(iarg+1,arg) - read(arg,*) hmod - iarg=iarg+2 - call getarg(iarg,arg) - endif - if(arg(1:2).eq.'-k') then - call getarg(iarg+1,arg) - read(arg,*) Keff - iarg=iarg+2 - endif - - ngood=0 - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c2') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c2 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call ft4s_downsample(iwave,c2) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=-100.0 - fb=100.0 - fs=12000.0/32.0 - npts=120*12000.0/32.0 - - call getcandidate_ft4s(c2,npts,hmod,fs,fa,fb,ncand,candidates) !First approx for freq - - del=1.5*hmod*fs/300.0 - ndecodes=0 - do icand=1,ncand - fc0=candidates(icand,1) - xsnr=candidates(icand,2) -!write(*,*) 'candidates ',icand,fc0,xsnr - do isync=0,1 - - if(isync.eq.0) then - fc1=fc0-del - is0=375 - ishw=350 - isst=30 - ifhw=10 - df=.1 - else if(isync.eq.1) then - fc1=fc2 - is0=isbest - ishw=100 - isst=10 - ifhw=10 - df=.02 - endif - smax=0.0 - do if=-ifhw,ifhw - fc=fc1+df*if - do istart=max(1,is0-ishw),is0+ishw,isst - call coherent_sync_ft4s(c2,istart,hmod,fc,1,sync) - if(sync.gt.smax) then - fc2=fc - isbest=istart - smax=sync - endif - enddo - enddo -! write(*,*) ifile,icand,isync,fc1+del,fc2+del,isbest,smax - enddo - -! if(smax .lt. 100.0 ) cycle -!isbest=375 -!fc2=-del - do ijitter=0,2 - if(ijitter.eq.0) ioffset=0 - if(ijitter.eq.1) ioffset=45 - if(ijitter.eq.2) ioffset=-45 - is0=isbest+ioffset - if(is0.lt.0) cycle - cframe=c2(is0:is0+144*300-1) - call downsample_ft4s(cframe,fc2+del,hmod,cd) - s2=sum(cd*conjg(cd))/(20*144) - cd=cd/sqrt(s2) - call get_ft4s_bitmetrics(cd,hmod,bitmetrics,badsync) - - hbits=0 - where(bitmetrics(:,1).ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 57: 64).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(113:120).eq.(/1,1,1,0,0,1,0,0/)) - ns4=count(hbits(169:176).eq.(/1,0,1,1,0,0,0,1/)) - ns5=count(hbits(225:232).eq.(/0,0,1,1,1,0,0,1/)) - ns6=count(hbits(281:288).eq.(/0,1,1,1,0,0,1,0/)) - nsync_qual=ns1+ns2+ns3+ns4+ns5+ns6 -! if(nsync_qual.lt. 20) cycle - - scalefac=2.83 - llra( 1: 48)=bitmetrics( 9: 56, 1) - llra( 49: 96)=bitmetrics( 65:112, 1) - llra( 97:144)=bitmetrics(121:168, 1) - llra(145:192)=bitmetrics(177:224, 1) - llra(193:240)=bitmetrics(233:280, 1) - llra=scalefac*llra - llrb( 1: 48)=bitmetrics( 9: 56, 2) - llrb( 49: 96)=bitmetrics( 65:112, 2) - llrb( 97:144)=bitmetrics(121:168, 2) - llrb(145:192)=bitmetrics(177:224, 2) - llrb(193:240)=bitmetrics(233:280, 2) - llrb=scalefac*llrb - llrc( 1: 48)=bitmetrics( 9: 56, 3) - llrc( 49: 96)=bitmetrics( 65:112, 3) - llrc( 97:144)=bitmetrics(121:168, 3) - llrc(145:192)=bitmetrics(177:224, 3) - llrc(193:240)=bitmetrics(233:280, 3) - llrc=scalefac*llrc - llrd( 1: 48)=bitmetrics( 9: 56, 4) - llrd( 49: 96)=bitmetrics( 65:112, 4) - llrd( 97:144)=bitmetrics(121:168, 4) - llrd(145:192)=bitmetrics(177:224, 4) - llrd(193:240)=bitmetrics(233:280, 4) - llrd=scalefac*llrd - apmask=0 - max_iterations=40 - - do itry=4,1,-1 - if(itry.eq.1) llr=llra - if(itry.eq.2) llr=llrb - if(itry.eq.3) llr=llrc - if(itry.eq.4) llr=llrd - nhardbp=0 - nhardosd=0 - dmin=0.0 - call bpdecode240_101(llr,apmask,max_iterations,message101,cw,nhardbp,niterations,nchecks) -! if(nhardbp.lt.0) call osd240_101(llr,Keff,apmask,5,message101,cw,nhardosd,dmin) - maxsuperits=2 - ndeep=3 ! use ndeep=3 with Keff=91 - if(Keff.eq.77) ndeep=4 - if(nhardbp.lt.0) then -! call osd240_101(llr,Keff,apmask,ndeep,message101,cw,nhardosd,dmin) - call decode240_101(llr,Keff,ndeep,apmask,maxsuperits,message101,cw,nhardosd,iter,ncheck,dmin,isuper) - endif - if(nhardbp.ge.0 .or. nhardosd.ge.0) then - write(c77,'(77i1)') message101(1:77) - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success .and. index(msg,'K9AN').gt.0) then - ngood=ngood+1 - write(*,1100) ifile-2,icand,xsnr,isbest/375.0-1.0,1500.0+fc2+del,msg(1:20),itry,nhardbp,nhardosd,dmin,ijitter -1100 format(i5,2x,i5,2x,f6.1,2x,f6.2,2x,f8.2,2x,a20,i4,i4,i4,f7.2,i6) - goto 2002 - else - cycle - endif - endif - enddo ! metrics - enddo ! istart jitter - enddo !candidate list -2002 continue - enddo !files - nfiles=nargs-iarg+1 - write(*,*) 'nfiles: ',nfiles,' ngood: ',ngood - write(*,1120) -1120 format("") - -999 end program ft4sd - -subroutine coherent_sync_ft4s(cd0,i0,hmod,f0,itwk,sync) - -! Compute sync power for a complex, downsampled FT4s signal. - - include 'ft4s_params.f90' - parameter(NP=NMAX/NDOWN,NSS=NSPS/NDOWN) - complex cd0(0:NP-1) - complex csynca(4*NSS),csyncb(4*NSS) - complex csyncc(4*NSS),csyncd(4*NSS) - complex csynce(4*NSS),csyncf(4*NSS) - complex csync2(4*NSS) - complex ctwk(4*NSS) - complex z1,z2,z3,z4,z5,z6 - logical first - integer icos4a(0:3),icos4b(0:3) - integer icos4c(0:3),icos4d(0:3) - integer icos4e(0:3),icos4f(0:3) - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data icos4e/0,2,3,1/ - data icos4f/1,2,0,3/ - data first/.true./ - save first,twopi,csynca,csyncb,csyncc,csyncd,csynce,csyncf,fac - - p(z1)=(real(z1*fac)**2 + aimag(z1*fac)**2)**0.5 !Statement function for power - - if( first ) then - twopi=8.0*atan(1.0) - k=1 - phia=0.0 - phib=0.0 - phic=0.0 - phid=0.0 - phie=0.0 - phif=0.0 - do i=0,3 - dphia=twopi*hmod*icos4a(i)/real(NSS) - dphib=twopi*hmod*icos4b(i)/real(NSS) - dphic=twopi*hmod*icos4c(i)/real(NSS) - dphid=twopi*hmod*icos4d(i)/real(NSS) - dphie=twopi*hmod*icos4e(i)/real(NSS) - dphif=twopi*hmod*icos4f(i)/real(NSS) - do j=1,NSS - csynca(k)=cmplx(cos(phia),sin(phia)) - csyncb(k)=cmplx(cos(phib),sin(phib)) - csyncc(k)=cmplx(cos(phic),sin(phic)) - csyncd(k)=cmplx(cos(phid),sin(phid)) - csynce(k)=cmplx(cos(phie),sin(phie)) - csyncf(k)=cmplx(cos(phif),sin(phif)) - phia=mod(phia+dphia,twopi) - phib=mod(phib+dphib,twopi) - phic=mod(phic+dphic,twopi) - phid=mod(phid+dphid,twopi) - phie=mod(phie+dphie,twopi) - phif=mod(phif+dphif,twopi) - k=k+1 - enddo - enddo - first=.false. - fac=1.0/(4.0*NSS) - endif - - i1=i0 !four Costas arrays - i2=i0+28*NSS - i3=i0+56*NSS - i4=i0+84*NSS - i5=i0+112*NSS - i6=i0+140*NSS - - z1=0. - z2=0. - z3=0. - z4=0. - z5=0. - z6=0. - - if(itwk.eq.1) then - dt=1/(12000.0/32.0) - dphi=twopi*f0*dt - phi=0.0 - do i=1,4*NSS - ctwk(i)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dphi,twopi) - enddo - endif - - if(itwk.eq.1) csync2=ctwk*csynca !Tweak the frequency - if(i1.ge.0 .and. i1+4*NSS-1.le.NP-1) then - z1=sum(cd0(i1:i1+4*NSS-1)*conjg(csync2)) - elseif( i1.lt.0 ) then - npts=(i1+4*NSS-1)/2 - if(npts.le.40) then - z1=0. - else - z1=sum(cd0(0:i1+4*NSS-1)*conjg(csync2(4*NSS-npts:))) - endif - endif - - if(itwk.eq.1) csync2=ctwk*csyncb !Tweak the frequency - if(i2.ge.0 .and. i2+4*NSS-1.le.NP-1) then - z2=sum(cd0(i2:i2+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csyncc !Tweak the frequency - if(i3.ge.0 .and. i3+4*NSS-1.le.NP-1) then - z3=sum(cd0(i3:i3+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csyncd !Tweak the frequency - if(i4.ge.0 .and. i4+4*NSS-1.le.NP-1) then - z4=sum(cd0(i4:i4+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csynce !Tweak the frequency - if(i5.ge.0 .and. i5+4*NSS-1.le.NP-1) then - z5=sum(cd0(i5:i5+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csyncf !Tweak the frequency - if(i6.ge.0 .and. i6+4*NSS-1.le.NP-1) then - z6=sum(cd0(i6:i6+4*NSS-1)*conjg(csync2)) - elseif( i6+4*NSS-1.gt.NP-1 ) then - npts=(NP-1-i6+1) - if(npts.le.40) then - z6=0. - else - z6=sum(cd0(i6:i6+npts-1)*conjg(csync2(1:npts))) - endif - endif - - sync = p(z1) + p(z2) + p(z3) + p(z4) + p(z5) + p(z6) - - return -end subroutine coherent_sync_ft4s - -subroutine downsample_ft4s(ci,f0,hmod,co) - parameter(NI=144*300,NH=NI/2,NO=NI/15) ! downsample from 315 samples per symbol to 20 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0/32.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - b=16.0*hmod - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample_ft4s - -subroutine getcandidate_ft4s(c,npts,hmod,fs,fa,fb,ncand,candidates) - parameter(NFFT1=120*12000/32,NH1=NFFT1/2,NFFT2=120*12000/320,NH2=NFFT2/2) - complex c(0:npts-1) !Complex waveform - complex cc(0:NFFT1-1) - complex csfil(0:NFFT2-1) - complex cwork(0:NFFT2-1) - real bigspec(0:NFFT2-1) - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - real ss(-NH1+1:NH1) !Smoothed coarse spectrum - real candidates(100,2) - integer indx(NFFT2-1) - logical first - data first/.true./ - save first,w,df,csfil - - if(first) then - df=10*fs/NFFT1 - csfil=cmplx(0.0,0.0) - do i=0,NFFT2-1 -! csfil(i)=exp(-((i-NH2)/32.0)**2) ! revisit this - csfil(i)=exp(-((i-NH2)/(hmod*28.0))**2) ! revisit this - enddo - csfil=cshift(csfil,NH2) - call four2a(csfil,NFFT2,1,-1,1) - first=.false. - endif - - cc=cmplx(0.0,0.0) - cc(0:npts-1)=c; - call four2a(cc,NFFT1,1,-1,1) - cc=abs(cc)**2 - call four2a(cc,NFFT1,1,-1,1) - cwork(0:NH2)=cc(0:NH2)*conjg(csfil(0:NH2)) - cwork(NH2+1:NFFT2-1)=cc(NFFT1-NH2+1:NFFT1-1)*conjg(csfil(NH2+1:NFFT2-1)) - - call four2a(cwork,NFFT2,1,+1,1) - bigspec=cshift(real(cwork),-NH2) - il=NH2+fa/df - ih=NH2+fb/df - nnl=ih-il+1 - call indexx(bigspec(il:il+nnl-1),nnl,indx) - xn=bigspec(il-1+indx(nint(0.3*nnl))) - bigspec=bigspec/xn - ncand=0 - do i=il,ih - if((bigspec(i).gt.bigspec(i-1)).and. & - (bigspec(i).gt.bigspec(i+1)).and. & - (bigspec(i).gt.1.15).and.ncand.lt.100) then - ncand=ncand+1 - candidates(ncand,1)=df*(i-NH2) - candidates(ncand,2)=10*log10(bigspec(i)-1)-26.5 - endif - enddo - return -end subroutine getcandidate_ft4s - -subroutine ft4s_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 375 Hz - - include 'ft4s_params.f90' - parameter (NFFT2=NMAX/32) - integer*2 iwave(NMAX) - complex c(0:NMAX/32-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/32-1) - return -end subroutine ft4s_downsample - diff --git a/lib/fsk4hf/ft4slowsim.f90 b/lib/fsk4hf/ft4slowsim.f90 deleted file mode 100644 index a5f0d80f3..000000000 --- a/lib/fsk4hf/ft4slowsim.f90 +++ /dev/null @@ -1,113 +0,0 @@ -program ft4slowsim - -! Generate simulated signals for experimental slow FT4 mode - - use wavhdr - use packjt77 - include 'ft4s_params.f90' !Set various constants - type(hdr) h !Header for .wav file - character arg*12,fname*17 - character msg37*37,msgsent37*37 - character c77*77 - complex c0(0:NMAX-1) - complex c(0:NMAX-1) - real wave(NMAX) - integer itone(NN) - integer*1 msgbits(101) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: ft4slowsim "message" f0 DT h fdop del nfiles snr' - print*,'Examples: ft4slowsim "K1JT K9AN EN50" 1500 0.0 1.0 0.1 1.0 10 -15' - go to 999 - endif - call getarg(1,msg37) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Frequency (only used for single-signal) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) hmod !Modulation index, h - call getarg(5,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(6,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - nfiles=abs(nfiles) - twopi=8.0*atan(1.0) - fs=12000.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of symbols (s) - baud=1.0/tt !Keying rate (baud) - txt=NZ2*dt !Transmission length (s) - - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - - call genft4slow(msg37,0,msgsent37,msgbits,itone) - write(*,*) - write(*,'(a9,a37,3x,a7,i1,a1,i1)') 'Message: ',msgsent37,'i3.n3: ',i3,'.',n3 - write(*,1000) f0,xdt,hmod,txt,snrdb -1000 format('f0:',f9.3,' DT:',f6.2,' hmod:',f6.3,' TxT:',f6.1,' SNR:',f6.1) - write(*,*) - if(i3.eq.1) then - write(*,*) ' mycall hiscall hisgrid' - write(*,'(28i1,1x,i1,1x,28i1,1x,i1,1x,i1,1x,15i1,1x,3i1)') msgbits(1:77) - else - write(*,'(a14)') 'Message bits: ' - write(*,'(50i1,1x,24i1)') msgbits - endif - write(*,*) - write(*,'(a17)') 'Channel symbols: ' - write(*,'(10i1)') itone - write(*,*) - - call sgran() - - fsample=12000.0 - icmplx=1 - call gen_wspr4wave(itone,NN,NSPS,fsample,hmod,f0,c0,wave,icmplx,NMAX) - k=nint((xdt+1.0)/dt)-NSPS - c0=cshift(c0,-k) - if(k.gt.0) c0(0:k-1)=0.0 - if(k.lt.0) c0(NMAX+k:NMAX-1)=0.0 - - do ifile=1,nfiles - c=c0 - if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c,NMAX,NZ,fs,delay,fspread) - c=sig*c - wave=real(c) - if(snrdb.lt.90) then - do i=1,NMAX !Add gaussian noise at specified SNR - xnoise=gran() - wave(i)=wave(i) + xnoise - enddo - endif - gain=100.0 - if(snrdb.lt.90.0) then - wave=gain*wave - else - datpk=maxval(abs(wave)) - fac=32766.9/datpk - wave=fac*wave - endif - if(any(abs(wave).gt.32767.0)) print*,"Warning - data will be clipped." - iwave=nint(wave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i6.6,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a17) - enddo - -999 end program ft4slowsim diff --git a/lib/fsk4hf/gen_wspr4wave.f90 b/lib/fsk4hf/gen_wspr4wave.f90 deleted file mode 100644 index 31b3f68ba..000000000 --- a/lib/fsk4hf/gen_wspr4wave.f90 +++ /dev/null @@ -1,68 +0,0 @@ -subroutine gen_wspr4wave(itone,nsym,nsps,fsample,hmod,f0,cwave,wave,icmplx,nwave) - - real wave(nwave) - complex cwave(nwave) - real, allocatable, save :: pulse(:) - real, allocatable :: dphi(:) - integer itone(nsym) - logical first - data first/.true./ - save pulse,first,twopi,dt,tsym - - if(first) then - allocate( pulse(3*nsps*fsample) ) - twopi=8.0*atan(1.0) - dt=1.0/fsample - tsym=nsps/fsample -! Compute the smoothed frequency-deviation pulse - do i=1,3*nsps - tt=(i-1.5*nsps)/real(nsps) - pulse(i)=gfsk_pulse(4.0,tt) - enddo - first=.false. - endif - -! Compute the smoothed frequency waveform. -! Length = (nsym+2)*nsps samples, zero-padded - allocate( dphi(0:(nsym+2)*nsps-1) ) - dphi_peak=twopi*hmod/real(nsps) - dphi=0.0 - do j=1,nsym - ib=(j-1)*nsps - ie=ib+3*nsps-1 - dphi(ib:ie) = dphi(ib:ie) + dphi_peak*pulse(1:3*nsps)*itone(j) - enddo - -! Calculate and insert the audio waveform - phi=0.0 - dphi = dphi + twopi*(f0-1.5*hmod/tsym)*dt !Shift frequency up by f0 - wave=0. - if(icmplx.eq.1) cwave=0. - k=0 - do j=0,(nsym+2)*nsps-1 - k=k+1 - if(icmplx.eq.0) then - wave(k)=sin(phi) - else - cwave(k)=cmplx(cos(phi),sin(phi)) - endif - phi=mod(phi+dphi(j),twopi) - enddo - -! Compute the ramp-up and ramp-down symbols - if(icmplx.eq.0) then - wave(1:nsps)=wave(1:nsps) * & - (1.0-cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 - k1=(nsym+1)*nsps+1 - wave(k1:k1+nsps-1)=wave(k1:k1+nsps-1) * & - (1.0+cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 - else - cwave(1:nsps)=cwave(1:nsps) * & - (1.0-cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 - k1=(nsym+1)*nsps+1 - cwave(k1:k1+nsps-1)=cwave(k1:k1+nsps-1) * & - (1.0+cos(twopi*(/(i,i=0,nsps-1)/)/(2.0*nsps)))/2.0 - endif - - return -end subroutine gen_wspr4wave diff --git a/lib/fsk4hf/genbpsk.f90 b/lib/fsk4hf/genbpsk.f90 deleted file mode 100644 index 6c283e72f..000000000 --- a/lib/fsk4hf/genbpsk.f90 +++ /dev/null @@ -1,44 +0,0 @@ -subroutine genbpsk(id,f00,ndiff,nref,c) - - parameter (ND=121) !Data symbols: LDPC (120,60), r=1/2 - parameter (NN=ND) !Total symbols (121) - parameter (NSPS=28800) !Samples per symbol at 12000 sps - parameter (NZ=NSPS*NN) !Samples in waveform (3456000) - - complex c(0:NZ-1) !Complex waveform - real*8 twopi,dt,fs,baud,f0,dphi,phi - integer id(NN) !Encoded NRZ data (values +/-1) - integer ie(NN) !Differentially encoded data - - f0=f00 - twopi=8.d0*atan(1.d0) - fs=12000.d0 - dt=1.0/fs - baud=1.d0/(NSPS*dt) - - if(ndiff.ne.0) then - ie(1)=1 !First bit is always 1 - do i=2,NN !Differentially encode - ie(i)=id(i)*ie(i-1) - enddo - endif - -! Generate the BPSK waveform - phi=0.d0 - k=-1 - do j=1,NN - dphi=twopi*f0*dt - x=id(j) - if(ndiff.ne.0) x=ie(j) !Differential - if(nref.ne.0) x=1.0 !Generate reference carrier - do i=1,NSPS - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - c(k)=x*cmplx(cos(xphi),sin(xphi)) - enddo - enddo - - return -end subroutine genbpsk diff --git a/lib/fsk4hf/genfsk4.f90 b/lib/fsk4hf/genfsk4.f90 deleted file mode 100644 index d8b0394b2..000000000 --- a/lib/fsk4hf/genfsk4.f90 +++ /dev/null @@ -1,36 +0,0 @@ -subroutine genfsk4(id,f00,nts,c) - - parameter (ND=60) !Data symbols: LDPC (120,60), r=1/2 - parameter (NN=ND) !Total symbols (60) - parameter (NSPS=57600) !Samples per symbol at 12000 sps - parameter (NZ=NSPS*NN) !Samples in waveform (3456000) - parameter (NFFT=NZ) !Full length FFT - - complex c(0:NFFT-1) !Complex waveform - real*8 twopi,dt,fs,baud,f0,dphi,phi - integer id(NN) !Encoded 2-bit data (values 0-3) - - f0=f00 - twopi=8.d0*atan(1.d0) - fs=12000.d0 - dt=1.0/fs - baud=1.d0/(NSPS*dt) - -! Generate the 4-FSK waveform - x=0. - c=0. - phi=0.d0 - k=-1 - do j=1,NN - dphi=twopi*(f0 + nts*id(j)*baud)*dt - do i=1,NSPS - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - c(k)=cmplx(cos(xphi),sin(xphi)) - enddo - enddo - - return -end subroutine genfsk4 diff --git a/lib/fsk4hf/genfsk4hf.f90 b/lib/fsk4hf/genfsk4hf.f90 deleted file mode 100644 index 924e97931..000000000 --- a/lib/fsk4hf/genfsk4hf.f90 +++ /dev/null @@ -1,51 +0,0 @@ -subroutine genfsk4hf(msgbits,f0,id,c) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=84) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=12) !Sync symbols (3 @ 4x4 Costas arrays) - parameter (NR=2) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (98) - parameter (NSPS=2688/84) !Samples per symbol (32) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3136) - - complex c(0:NZ-1) !Complex waveform - integer id0(NN) !2-bit data (values 0-3), all symbols - integer id(ND) !2-bit data (values 0-3), data only - integer*1 msgbits(KK),codeword(2*ND) - integer icos4(4) !4x4 Costas array - data icos4/0,1,3,2/ - - twopi=8.0*atan(1.0) - fs=12000.0/84.0 - dt=1.0/fs - baud=1.0/(NSPS*dt) - call encode168(msgbits,codeword) !Encode the test message - id0(1)=0 !Ramp-up - id0(2:5)=icos4 !First Costas array - id0(48:51)=icos4 !Second - id0(94:97)=icos4 !Third - id0(98)=0 !Ramp down - j=5 - do i=1,84 !Data symbols - id(i)=2*codeword(2*i-1) + codeword(2*i) - j=j+1 - if(i.eq.43) j=j+4 - id0(j)=id(i) - enddo - -! Generate the 4-FSK waveform, low tone at f=0 - c=0. - phi=0.d0 - k=-1 - do j=1,NN - dphi=twopi*(f0+id0(j)*baud)*dt - do i=1,NSPS - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - c(k)=cmplx(cos(phi),sin(phi)) - enddo - enddo - - return -end subroutine genfsk4hf diff --git a/lib/fsk4hf/genft2.f90 b/lib/fsk4hf/genft2.f90 deleted file mode 100644 index 2eb36bccc..000000000 --- a/lib/fsk4hf/genft2.f90 +++ /dev/null @@ -1,86 +0,0 @@ -subroutine genft2(msg0,ichk,msgsent,i4tone,itype) -! s8 + 48bits + s8 + 80 bits = 144 bits (72ms message duration) -! -! Encode an MSK144 message -! Input: -! - msg0 requested message to be transmitted -! - ichk if ichk=1, return only msgsent -! if ichk.ge.10000, set imsg=ichk-10000 for short msg -! - msgsent message as it will be decoded -! - i4tone array of audio tone values, 0 or 1 -! - itype message type -! 1 = 77 bit message -! 7 = 16 bit message " Rpt" - - use iso_c_binding, only: c_loc,c_size_t - use packjt77 - character*37 msg0 - character*37 message !Message to be generated - character*37 msgsent !Message as it will be received - character*77 c77 - integer*4 i4tone(144) - integer*1 codeword(128) - integer*1 msgbits(77) - integer*1 bitseq(144) !Tone #s, data and sync (values 0-1) - integer*1 s16(16) - real*8 xi(864),xq(864),pi,twopi - data s16/0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0/ - equivalence (ihash,i1hash) - logical unpk77_success - - nsym=128 - pi=4.0*atan(1.0) - twopi=8.*atan(1.0) - - message(1:37)=' ' - itype=1 - if(msg0(1:1).eq.'@') then !Generate a fixed tone - read(msg0(2:5),*,end=1,err=1) nfreq !at specified frequency - go to 2 -1 nfreq=1000 -2 i4tone(1)=nfreq - else - message=msg0 - - do i=1, 37 - if(ichar(message(i:i)).eq.0) then - message(i:37)=' ' - exit - endif - enddo - do i=1,37 !Strip leading blanks - if(message(1:1).ne.' ') exit - message=message(i+1:) - enddo - - if(message(1:1).eq.'<') then - i2=index(message,'>') - i1=0 - if(i2.gt.0) i1=index(message(1:i2),' ') - if(i1.gt.0) then - call genmsk40(message,msgsent,ichk,i4tone,itype) - if(itype.lt.0) go to 999 - i4tone(41)=-40 - go to 999 - endif - endif - - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent - - if(ichk.eq.1) go to 999 - read(c77,"(77i1)") msgbits - call encode_128_90(msgbits,codeword) - -!Create 144-bit channel vector: - bitseq=0 - bitseq(1:16)=s16 - bitseq(17:144)=codeword - - i4tone=bitseq - endif - -999 return -end subroutine genft2 diff --git a/lib/fsk4hf/genft280.f90 b/lib/fsk4hf/genft280.f90 deleted file mode 100644 index bc8de4b18..000000000 --- a/lib/fsk4hf/genft280.f90 +++ /dev/null @@ -1,95 +0,0 @@ -subroutine genft280(msg0,ichk,msgsent,msgbits,i4tone) - -! Encode an FT4 message -! Input: -! - msg0 requested message to be transmitted -! - ichk if ichk=1, return only msgsent -! - msgsent message as it will be decoded -! - i4tone array of audio tone values, {0,1,2,3} - -! Frame structure: -! s4s4 d70 s4s4 d70 s4s4 - -! Message duration: TxT = 144*9600/12000 = 115.2 s - - use packjt77 - include 'ft4s280_params.f90' - character*37 msg0 - character*37 message !Message to be generated - character*37 msgsent !Message as it will be received - character*77 c77 - character*24 c24 - integer*4 i4tone(NN),itmp(ND) - integer*1 codeword(2*ND) - integer*1 msgbits(101),rvec(77) - integer icos4a(4),icos4b(4),icos4c(4),icos4d(4),icos4e(4),icos4f(4) - integer ncrc24 - logical unpk77_success - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data icos4e/0,2,3,1/ - data icos4f/1,2,0,3/ - data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & - 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & - 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - message=msg0 - - do i=1, 37 - if(ichar(message(i:i)).eq.0) then - message(i:37)=' ' - exit - endif - enddo - do i=1,37 !Strip leading blanks - if(message(1:1).ne.' ') exit - message=message(i+1:) - enddo - - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent - msgbits=0 - read(c77,'(77i1)') msgbits(1:77) - call get_crc24(msgbits,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(78:101) - - if(ichk.eq.1) go to 999 - if(unpk77_success) go to 2 -1 msgbits=0 - itone=0 - msgsent='*** bad message *** ' - go to 999 - -entry get_ft4s280_tones_from_101bits(msgbits,i4tone) - -2 call encode280_101(msgbits,codeword) - -! Grayscale mapping: -! bits tone -! 00 0 -! 01 1 -! 11 2 -! 10 3 - - do i=1,ND - is=codeword(2*i)+2*codeword(2*i-1) - if(is.le.1) itmp(i)=is - if(is.eq.2) itmp(i)=3 - if(is.eq.3) itmp(i)=2 - enddo - - i4tone(1:4)=icos4a - i4tone(5:8)=icos4b - i4tone(9:78)=itmp(1:70) - i4tone(79:82)=icos4a - i4tone(83:86)=icos4b - i4tone(87:156)=itmp(71:140) - i4tone(157:160)=icos4a - i4tone(161:164)=icos4b - -999 return -end subroutine genft280 diff --git a/lib/fsk4hf/genft4slow.f90 b/lib/fsk4hf/genft4slow.f90 deleted file mode 100644 index cd58094a3..000000000 --- a/lib/fsk4hf/genft4slow.f90 +++ /dev/null @@ -1,98 +0,0 @@ -subroutine genft4slow(msg0,ichk,msgsent,msgbits,i4tone) - -! Encode an FT4 message -! Input: -! - msg0 requested message to be transmitted -! - ichk if ichk=1, return only msgsent -! - msgsent message as it will be decoded -! - i4tone array of audio tone values, {0,1,2,3} - -! Frame structure: -! s4 d24 s4 d24 s4 d24 s4 d24 s4 d24 s4 - -! Message duration: TxT = 144*9600/12000 = 115.2 s - - use packjt77 - include 'ft4s_params.f90' - character*37 msg0 - character*37 message !Message to be generated - character*37 msgsent !Message as it will be received - character*77 c77 - character*24 c24 - integer*4 i4tone(NN),itmp(ND) - integer*1 codeword(2*ND) - integer*1 msgbits(101),rvec(77) - integer icos4a(4),icos4b(4),icos4c(4),icos4d(4),icos4e(4),icos4f(4) - integer ncrc24 - logical unpk77_success - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data icos4e/0,2,3,1/ - data icos4f/1,2,0,3/ - data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & - 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & - 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - message=msg0 - - do i=1, 37 - if(ichar(message(i:i)).eq.0) then - message(i:37)=' ' - exit - endif - enddo - do i=1,37 !Strip leading blanks - if(message(1:1).ne.' ') exit - message=message(i+1:) - enddo - - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent - msgbits=0 - read(c77,'(77i1)') msgbits(1:77) - call get_crc24(msgbits,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(78:101) - - if(ichk.eq.1) go to 999 - if(unpk77_success) go to 2 -1 msgbits=0 - itone=0 - msgsent='*** bad message *** ' - go to 999 - -entry get_ft4slow_tones_from_101bits(msgbits,i4tone) - -2 call encode240_101(msgbits,codeword) - -! Grayscale mapping: -! bits tone -! 00 0 -! 01 1 -! 11 2 -! 10 3 - - do i=1,ND - is=codeword(2*i)+2*codeword(2*i-1) - if(is.le.1) itmp(i)=is - if(is.eq.2) itmp(i)=3 - if(is.eq.3) itmp(i)=2 - enddo - - i4tone(1:4)=icos4a - i4tone(5:28)=itmp(1:24) - i4tone(29:32)=icos4b - i4tone(33:56)=itmp(25:48) - i4tone(57:60)=icos4c - i4tone(61:84)=itmp(49:72) - i4tone(85:88)=icos4d - i4tone(89:112)=itmp(73:96) - i4tone(113:116)=icos4e - i4tone(117:140)=itmp(97:120) - i4tone(141:144)=icos4f - -999 return -end subroutine genft4slow diff --git a/lib/fsk4hf/genmskhf.f90 b/lib/fsk4hf/genmskhf.f90 deleted file mode 100644 index 7d4b0838c..000000000 --- a/lib/fsk4hf/genmskhf.f90 +++ /dev/null @@ -1,126 +0,0 @@ -subroutine genmskhf(msgbits,id,icw,cbb,csync) - -!Encode an MSK-HF message, produce baseband waveform and sync vector. - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) - parameter (NR=3) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (236) - parameter (NSPS=16) !Samples per MSK symbol (16) - parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - - complex cbb(0:NZ-1) - complex csync(0:NZ-1) - real x(0:NZ-1) - real y(0:NZ-1) - real pp(N2) - logical first - integer*1 msgbits(KK),codeword(ND) - integer icw(ND) - integer id(NS+ND) - integer isync(26) !Long sync vector - integer ib13(13) !Barker 13 code - data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ - data first/.true./ - save first,isync,twopi,pp - - if(first) then - n=z'2c1aeb1' - do i=1,26 - isync(i)=-1 - if(iand(n,1).eq.1) isync(i)=1 - n=n/2 - enddo - - twopi=8.0*atan(1.0) - do i=1,N2 !Half-sine shaped pulse - pp(i)=sin(0.5*(i-1)*twopi/N2) - enddo - first=.false. - endif - - call encode168(msgbits,codeword) !Encode the test message - icw=2*codeword - 1 - -! Message structure: R1 26*(S1+D1) S13 26*(D1+S1) R1 -! Generate QPSK without any offset; then shift the y array to get OQPSK. - -! Do the I channel first: results in array x - n=0 - k=0 - ia=0 - ib=NSPS-1 - x(ia:ib)=0. !Ramp up (half-symbol; shape TBD) - do j=1,26 !Insert group of 26*(S1+D1) - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*isync(j) - x(ia:ib)=isync(j)*pp !Insert Sync bit - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - x(ia:ib)=id(n)*pp !Insert data bit - enddo - - do j=1,13 !Insert Barker 13 code - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*ib13(j) - x(ia:ib)=ib13(j)*pp - enddo - - do j=1,26 !Insert group of 26*(S1+D1) - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - x(ia:ib)=id(n)*pp !Insert data bit - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*isync(j) - x(ia:ib)=isync(j)*pp !Insert Sync bit - enddo - ia=ib+1 - ib=ia+NSPS-1 - x(ia:ib)=0. !Ramp down (half-symbol; shape TBD) - -! Now do the Q channel: results in array y - ia=0 - ib=NSPS-1 - y(ia:ib)=0. !Ramp up (half-symbol; shape TBD) - do j=1,116 - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - y(ia:ib)=id(n)*pp - enddo - ia=ib+1 - ib=ia+NSPS-1 - y(ia:ib)=0. !Ramp down (half-symbol; shape TBD) - y=cshift(y,-NSPS) !Shift Q array to get OQPSK - cbb=cmplx(x,y) !Complex baseband waveform - - ib=NSPS-1 - ib2=NSPS-1+64*N2 - do j=1,26 !Zero all data symbols in x - ia=ib+1+N2 - ib=ia+N2-1 - x(ia:ib)=0. - ia2=ib2+1+N2 - ib2=ia2+N2-1 - x(ia2:ib2)=0. - enddo - csync=x - - return -end subroutine genmskhf diff --git a/lib/fsk4hf/genwspr4.f90 b/lib/fsk4hf/genwspr4.f90 deleted file mode 100644 index c2f5f42f2..000000000 --- a/lib/fsk4hf/genwspr4.f90 +++ /dev/null @@ -1,95 +0,0 @@ -subroutine genwspr4(msg0,ichk,msgsent,msgbits,i4tone) - -! Encode an FT4 message -! Input: -! - msg0 requested message to be transmitted -! - ichk if ichk=1, return only msgsent -! - msgsent message as it will be decoded -! - i4tone array of audio tone values, {0,1,2,3} - -! Frame structure: -! s16 + 87symbols + 2 ramp up/down = 105 total channel symbols -! r1 + s4 + d29 + s4 + d29 + s4 + d29 + s4 + r1 - -! Message duration: TxT = 105*13312/12000 = 116.48 s - -! use iso_c_binding, only: c_loc,c_size_t - - use packjt77 - include 'wspr4_params.f90' - character*37 msg0 - character*37 message !Message to be generated - character*37 msgsent !Message as it will be received - character*77 c77 - character*24 c24 - integer*4 i4tone(NN),itmp(ND) - integer*1 codeword(2*ND) - integer*1 msgbits(74),rvec(77) - integer icos4a(4),icos4b(4),icos4c(4),icos4d(4) - integer ncrc24 - logical unpk77_success - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, & - 1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, & - 0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/ - message=msg0 - - do i=1, 37 - if(ichar(message(i:i)).eq.0) then - message(i:37)=' ' - exit - endif - enddo - do i=1,37 !Strip leading blanks - if(message(1:1).ne.' ') exit - message=message(i+1:) - enddo - - i3=-1 - n3=-1 - call pack77(message,i3,n3,c77) - call unpack77(c77,0,msgsent,unpk77_success) !Unpack to get msgsent - msgbits=0 - read(c77,'(50i1)') msgbits(1:50) - call get_crc24(msgbits,74,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(51:74) - - if(ichk.eq.1) go to 999 - if(unpk77_success) go to 2 -1 msgbits=0 - itone=0 - msgsent='*** bad message *** ' - go to 999 - -entry get_wspr4_tones_from_74bits(msgbits,i4tone) - -2 call encode174_74(msgbits,codeword) - -! Grayscale mapping: -! bits tone -! 00 0 -! 01 1 -! 11 2 -! 10 3 - - do i=1,ND - is=codeword(2*i)+2*codeword(2*i-1) - if(is.le.1) itmp(i)=is - if(is.eq.2) itmp(i)=3 - if(is.eq.3) itmp(i)=2 - enddo - - i4tone(1:4)=icos4a - i4tone(5:33)=itmp(1:29) - i4tone(34:37)=icos4b - i4tone(38:66)=itmp(30:58) - i4tone(67:70)=icos4c - i4tone(71:99)=itmp(59:87) - i4tone(100:103)=icos4d - -999 return -end subroutine genwspr4 diff --git a/lib/fsk4hf/genwspr5.f90 b/lib/fsk4hf/genwspr5.f90 deleted file mode 100644 index e09bcd6f7..000000000 --- a/lib/fsk4hf/genwspr5.f90 +++ /dev/null @@ -1,107 +0,0 @@ -subroutine genwspr5(msg,msgsent,itone) - -! Encode a WSPR-LF message, producing array itone(). - - use crc - include 'wsprlf_params.f90' - - character*22 msg,msgsent - character*60 cbits - integer*1,target :: idat(9) - integer*1 msgbits(KK),codeword(ND) - logical first - integer icw(ND) - integer id(NS+ND) - integer jd(NS+ND) - integer isync(48) !Long sync vector - integer ib13(13) !Barker 13 code - integer itone(NN) - integer*8 n8 - data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ - data first/.true./ - save first,isync - - if(first) then - n8=z'cbf089223a51' - do i=1,48 - isync(i)=-1 - if(iand(n8,1).eq.1) isync(i)=1 - n8=n8/2 - enddo - first=.false. - endif - - idat=0 - call wqencode(msg,ntype0,idat) !Source encoding - id7=idat(7) - if(id7.lt.0) id7=id7+256 - id7=id7/64 - icrc=crc10(c_loc(idat),9) !Compute the 10-bit CRC - idat(8)=icrc/256 !Insert CRC into idat(8:9) - idat(9)=iand(icrc,255) - call wqdecode(idat,msgsent,itype) - - write(cbits,1004) idat(1:6),id7,icrc -1004 format(6b8.8,b2.2,b10.10) - read(cbits,1006) msgbits -1006 format(60i1) - -! call chkcrc10(msgbits,nbadcrc) -! print*,msgsent,itype,crc10_check(c_loc(idat),9),nbadcrc - - call encode300(msgbits,codeword) !Encode the test message - icw=2*codeword - 1 !NRZ codeword - -! Message structure: -! I channel: R1 48*(S1+D1) S13 48*(D1+S1) R1 -! Q channel: R1 D204 R1 -! Generate QPSK with no offset, then shift the y array to get OQPSK. - -! I channel: - n=0 - k=0 - do j=1,48 !Insert group of 48*(S1+D1) - n=n+1 - id(n)=2*isync(j) - k=k+1 - n=n+1 - id(n)=icw(k) - enddo - - do j=1,13 !Insert Barker 13 code - n=n+1 - id(n)=2*ib13(j) - enddo - - do j=1,48 !Insert group of 48*(S1+D1) - k=k+1 - n=n+1 - id(n)=icw(k) - n=n+1 - id(n)=2*isync(j) - enddo - -! Q channel - do j=1,204 - k=k+1 - n=n+1 - id(n)=icw(k) - enddo - -! Map I and Q to tones. - n=0 - jz=(NS+ND+1)/2 - do j=1,jz-1 - jd(2*j-1)=id(j)/abs(id(j)) - jd(2*j)=id(j+jz)/abs(id(j+jz)) - enddo - jd(NS+ND)=id(jz)/abs(id(jz)) - itone=0 - do j=1,jz-1 - itone(2*j+1)=(jd(2*j)*jd(2*j-1)+1)/2; - itone(2*j+2)=-(jd(2*j)*jd(2*j+1)-1)/2; - enddo - itone(NS+ND+2)=jd(NS+ND) !### Is this correct ??? ### - - return -end subroutine genwspr5 diff --git a/lib/fsk4hf/genwspr_fsk8.f90 b/lib/fsk4hf/genwspr_fsk8.f90 deleted file mode 100644 index 2ef6ace30..000000000 --- a/lib/fsk4hf/genwspr_fsk8.f90 +++ /dev/null @@ -1,45 +0,0 @@ -subroutine genwspr_fsk8(msg,msgsent,itone) - -! Encode a WSPR-LF 8-FSK message, producing array itone(). - - use crc - include 'wspr_fsk8_params.f90' - - character*22 msg,msgsent - character*60 cbits - integer*1,target :: idat(9) - integer*1 msgbits(KK),codeword(3*ND) - integer itone(NN) - integer icos7(0:6) - data icos7/2,5,6,0,4,1,3/ !Costas 7x7 tone pattern - - idat=0 - call wqencode(msg,ntype0,idat) !Source encoding - id7=idat(7) - if(id7.lt.0) id7=id7+256 - id7=id7/64 - icrc=crc10(c_loc(idat),9) !Compute the 10-bit CRC - idat(8)=icrc/256 !Insert CRC into idat(8:9) - idat(9)=iand(icrc,255) - call wqdecode(idat,msgsent,itype) - - write(cbits,1004) idat(1:6),id7,icrc -1004 format(6b8.8,b2.2,b10.10) - read(cbits,1006) msgbits -1006 format(60i1) - -! call chkcrc10(msgbits,nbadcrc) -! print*,msgsent,itype,crc10_check(c_loc(idat),9),nbadcrc - - call encode300(msgbits,codeword) !Encode the test message - -! Message structure: S7 D100 S7 - itone(1:7)=icos7 - itone(NN-6:NN)=icos7 - do j=1,ND - i=3*j -2 - itone(j+7)=codeword(i)*4 + codeword(i+1)*2 + codeword(i+2) - enddo - - return -end subroutine genwspr_fsk8 diff --git a/lib/fsk4hf/genwsprcpm.f90 b/lib/fsk4hf/genwsprcpm.f90 deleted file mode 100644 index 6e9eb9ab1..000000000 --- a/lib/fsk4hf/genwsprcpm.f90 +++ /dev/null @@ -1,76 +0,0 @@ -subroutine genwsprcpm(msg,msgsent,itone) - -! Encode a WSPRCPM message, producing array itone(). -! - use crc - include 'wsprcpm_params.f90' - - character*22 msg,msgsent - character*64 cbits - character*32 sbits - character c1*1,c4*4 - character*31 cseq - integer*1,target :: idat(9) - integer*1 msgbits(68),codeword(ND) - logical first - integer icw(ND) - integer id(NS+ND) - integer jd(NS+ND) -! integer ipreamble(16) !Freq estimation preamble - integer isyncword(16) - integer isync(200) !Long sync vector - integer itone(NN) - data cseq /'9D9F C48B 797A DD60 58CB 2EBC 6'/ -! data ipreamble/1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1/ - data isyncword/0,1,3,2,1,0,2,3,2,3,1,0,3,2,0,1/ - data first/.true./ - save first,isync,ipreamble,isyncword - - if(first) then - k=0 - do i=1,31 - c1=cseq(i:i) - if(c1.eq.' ') cycle - read(c1,'(z1)') n - write(c4,'(b4.4)') n - do j=1,4 - k=k+1 - isync(k)=0 - if(c4(j:j).eq.'1') isync(k)=1 - enddo - isync(101:200)=isync(1:100) - enddo - first=.false. - endif - - idat=0 - call wqencode(msg,ntype0,idat) !Source encoding - id7=idat(7) - if(id7.lt.0) id7=id7+256 - id7=id7/64 - write(*,*) 'idat ',idat - icrc=crc14(c_loc(idat),9) - write(*,*) 'icrc: ',icrc - write(*,'(a6,b16.16)') 'icrc: ',icrc - call wqdecode(idat,msgsent,itype) - print*,msgsent,itype - write(cbits,1004) idat(1:6),id7,iand(icrc,z'3FFF') -1004 format(6b8.8,b2.2,b14.14) - msgbits=0 - read(cbits,1006) msgbits(1:64) -1006 format(64i1) - - write(*,'(50i1,1x,14i1,1x,4i1)') msgbits - - call encode204(msgbits,codeword) !Encode the test message - -! Message structure: -! d100 p16 d100 - itone(1:100)=isync(1:100)+2*codeword(1:100) - itone(101:116)=isyncword - itone(117:216)=isync(101:200)+2*codeword(101:200) - itone=2*itone-3 - - - return -end subroutine genwsprcpm diff --git a/lib/fsk4hf/genwsprdpsk.f90 b/lib/fsk4hf/genwsprdpsk.f90 deleted file mode 100644 index 1b6c58b10..000000000 --- a/lib/fsk4hf/genwsprdpsk.f90 +++ /dev/null @@ -1,63 +0,0 @@ -subroutine genwsprdpsk(msg,msgsent,imsgde) - -! Encode a WSPRDPSK message, producing array txwave(). -! - use crc - include 'wsprdpsk_params.f90' - - character*22 msg,msgsent - character*64 cbits - character*32 sbits - integer iuniqueword0 - integer*1,target :: idat(9) - integer*1 msgbits(68),codeword(ND) - logical first - integer ipreamble(16) !Freq estimation preamble - integer isync(32) !Long sync vector - integer imsg(NN),imsgde(NN) - data ipreamble/1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1/ - data first/.true./ - data iuniqueword0/z'30C9E8AD'/ - save first,isync,ipreamble - - if(first) then - write(sbits,'(b32.32)') iuniqueword0 - read(sbits,'(32i1)') isync(1:32) - first=.false. - endif - - idat=0 - call wqencode(msg,ntype0,idat) !Source encoding - id7=idat(7) - if(id7.lt.0) id7=id7+256 - id7=id7/64 -write(*,*) 'idat ',idat - icrc=crc14(c_loc(idat),9) -write(*,*) 'icrc: ',icrc -write(*,'(a6,b16.16)') 'icrc: ',icrc - call wqdecode(idat,msgsent,itype) - print*,msgsent,itype - write(cbits,1004) idat(1:6),id7,iand(icrc,z'3FFF') -1004 format(6b8.8,b2.2,b14.14) - msgbits=0 - read(cbits,1006) msgbits(1:64) -1006 format(64i1) - -write(*,'(50i1,1x,14i1,1x,4i1)') msgbits - - call encode204(msgbits,codeword) !Encode the test message - - imsg(1)=1 !reference bit - imsg(2:101)=codeword(1:100) - imsg(102:132)=isync(1:31) !only use 31 of the sync bits - imsg(133:232)=codeword(101:200) -write(*,'(232i1)') imsg(1:232) - imsgde(1)=1 - do i=2,232 - imsgde(i)=mod(imsgde(i-1)+imsg(i),2) - enddo - -write(*,*) '-------------' -write(*,'(232i1)') imsgde(1:232) - return -end subroutine genwsprdpsk diff --git a/lib/fsk4hf/genwsprlf.f90 b/lib/fsk4hf/genwsprlf.f90 deleted file mode 100644 index 4c5b31cf9..000000000 --- a/lib/fsk4hf/genwsprlf.f90 +++ /dev/null @@ -1,137 +0,0 @@ -subroutine genwsprlf(msgbits,id,icw,cbb,csync,itone) - -!Encode a WSPR-LF message, produce baseband waveform and sync vector. - - include 'wsprlf_params.f90' - - complex cbb(0:NZ-1) - complex csync(0:NZ-1) - real x(0:NZ-1) - real y(0:NZ-1) - real pp(N2) - logical first - integer*1 msgbits(KK),codeword(ND) - integer icw(ND) - integer id(NS+ND) - integer jd(NS+ND) - integer isync(48) !Long sync vector - integer ib13(13) !Barker 13 code - integer itone(NN) - integer*8 n8 - data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ - data first/.true./ - save first,isync,twopi,pp - - if(first) then - n8=z'cbf089223a51' - do i=1,48 - isync(i)=-1 - if(iand(n8,1).eq.1) isync(i)=1 - n8=n8/2 - enddo - - twopi=8.0*atan(1.0) - do i=1,N2 !Half-sine shaped pulse - pp(i)=sin(0.5*(i-1)*twopi/N2) - enddo - first=.false. - endif - - call encode300(msgbits,codeword) !Encode the test message - icw=2*codeword - 1 - -! Message structure: R1 48*(S1+D1) S13 48*(D1+S1) R1 -! Generate QPSK without any offset; then shift the y array to get OQPSK. - -! Do the I channel first: results in array x - n=0 - k=0 - ia=0 - ib=NSPS-1 - x(ia:ib)=0. !Ramp up (half-symbol; shape TBD) - do j=1,48 !Insert group of 48*(S1+D1) - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*isync(j) - x(ia:ib)=isync(j)*pp !Insert Sync bit - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - x(ia:ib)=id(n)*pp !Insert data bit - enddo - - do j=1,13 !Insert Barker 13 code - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*ib13(j) - x(ia:ib)=ib13(j)*pp - enddo - - do j=1,48 !Insert group of 48*(S1+D1) - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - x(ia:ib)=id(n)*pp !Insert data bit - ia=ib+1 - ib=ia+N2-1 - n=n+1 - id(n)=2*isync(j) - x(ia:ib)=isync(j)*pp !Insert Sync bit - enddo - ia=ib+1 - ib=ia+NSPS-1 - x(ia:ib)=0. !Ramp down (half-symbol; shape TBD) - -! Now do the Q channel: results in array y - ia=0 - ib=NSPS-1 - y(ia:ib)=0. !Ramp up (half-symbol; shape TBD) - do j=1,204 - ia=ib+1 - ib=ia+N2-1 - k=k+1 - n=n+1 - id(n)=icw(k) - y(ia:ib)=id(n)*pp - enddo - ia=ib+1 - ib=ia+NSPS-1 - y(ia:ib)=0. !Ramp down (half-symbol; shape TBD) - y=cshift(y,-NSPS) !Shift Q array to get OQPSK - cbb=cmplx(x,y) !Complex baseband waveform - - ib=NSPS-1 - ib2=NSPS-1+64*N2 - do j=1,48 !Zero all data symbols in x - ia=ib+1+N2 - ib=ia+N2-1 - x(ia:ib)=0. - ia2=ib2+1+N2 - ib2=ia2+N2-1 - x(ia2:ib2)=0. - enddo - csync=x - -! Map I and Q to tones. - n=0 - jz=(NS+ND+1)/2 - do j=1,jz-1 - jd(2*j-1)=id(j)/abs(id(j)) - jd(2*j)=id(j+jz)/abs(id(j+jz)) - enddo - jd(NS+ND)=id(jz)/abs(id(jz)) - itone=0 - do j=1,jz-1 - itone(2*j-1)=(jd(2*j)*jd(2*j-1)+1)/2; - itone(2*j)=-(jd(2*j)*jd(2*j+1)-1)/2; - enddo - itone(NS+ND)=jd(NS+ND) !### Is this correct ??? ### - - return -end subroutine genwsprlf diff --git a/lib/fsk4hf/get_crc24.f90 b/lib/fsk4hf/get_crc24.f90 deleted file mode 100644 index cb7f3a05f..000000000 --- a/lib/fsk4hf/get_crc24.f90 +++ /dev/null @@ -1,25 +0,0 @@ -subroutine get_crc24(mc,len,ncrc) -! -! 1. To calculate 24-bit CRC, mc(1:len-24) is the message and mc(len-23:len) are zero. -! 2. To check a received CRC, mc(1:len) is the received message plus CRC. -! ncrc will be zero if the received message/CRC are consistent. -! - character c24*24 - integer*1 mc(len) - integer*1 r(25),p(25) - integer ncrc -! polynomial for 24-bit CRC 0x100065b - data p/1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1/ - -! divide by polynomial - r=mc(1:25) - do i=0,len-25 - r(25)=mc(i+25) - r=mod(r+r(1)*p,2) - r=cshift(r,1) - enddo - - write(c24,'(24b1)') r(1:24) - read(c24,'(b24.24)') ncrc - -end subroutine get_crc24 diff --git a/lib/fsk4hf/get_ft280_bitmetrics.f90 b/lib/fsk4hf/get_ft280_bitmetrics.f90 deleted file mode 100644 index 761577aa7..000000000 --- a/lib/fsk4hf/get_ft280_bitmetrics.f90 +++ /dev/null @@ -1,117 +0,0 @@ -subroutine get_ft280_bitmetrics(cd,hmod,bitmetrics,badsync) - - include 'ft4s280_params.f90' - parameter (NSS=20) - complex cd(0:NN*NSS-1) - complex cs(0:3,NN) - complex csymb(NSS) - complex c1(NSS,0:3) ! ideal waveforms, 20 samples per symbol, 4 tones - complex ccor(0:3,NN) ! correlations with each ideal waveform, for each symbol - complex cp(0:3) ! accumulated phase shift over symbol types 0:3 - complex csum,cterm - integer icos8(0:7) - integer graymap(0:3) - integer ip(1) - logical one(0:65535,0:15) ! 65536 8-symbol sequences, 16 bits - logical first - logical badsync - real bitmetrics(2*NN,4) - real s2(0:65535) - real s4(0:3,NN) - data icos8/0,1,3,2,1,0,2,3/ - data graymap/0,1,3,2/ - data first/.true./ - save first,one,c1,cp - - if(first) then - one=.false. - do i=0,65535 - do j=0,15 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo - twopi=8.0*atan(1.0) - dphi=twopi*hmod/NSS - do itone=0,3 - dp=(itone-1.5)*dphi - phi=0.0 - do j=1,NSS - c1(j,itone)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dp,twopi) - enddo - cp(itone)=cmplx(cos(phi),sin(phi)) - enddo - first=.false. - endif - - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - do itone=0,3 - cs(itone,k)=sum(csymb*conjg(c1(:,itone))) - enddo - s4(0:3,k)=abs(cs(0:3,k)) - enddo - -! Sync quality check - is1=0 - is2=0 - is3=0 - badsync=.false. - ibmax=0 - - do k=1,8 - ip=maxloc(s4(:,k)) - if(icos8(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+78)) - if(icos8(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+156)) - if(icos8(k-1).eq.(ip(1)-1)) is3=is3+1 - enddo - nsync=is1+is2+is3 !Number of correct hard sync symbols, 0-24 - - badsync=.false. -! if(nsync .lt. 8) then -! badsync=.true. -! return -! endif - - do nseq=4,1,-1 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - if(nseq.eq.4) nsym=8 - nt=4**nsym - do ks=1,NN-nsym+1,nsym - s2=0 - do i=0,nt-1 - csum=0 - cterm=1 - do j=0,nsym-1 - ntone=mod(i/4**(nsym-1-j),4) - csum=csum+cs(graymap(ntone),ks+j)*cterm - cterm=cterm*conjg(cp(graymap(ntone))) - enddo - s2(i)=abs(csum) - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - if(nsym.eq.8) ibmax=15 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - bitmetrics(ipt+ib,nseq)=bm - enddo - enddo - enddo - - call normalizebmet(bitmetrics(:,1),2*NN) - call normalizebmet(bitmetrics(:,2),2*NN) - call normalizebmet(bitmetrics(:,3),2*NN) - call normalizebmet(bitmetrics(:,4),2*NN) - return - -end subroutine get_ft280_bitmetrics diff --git a/lib/fsk4hf/get_ft4s_bitmetrics.f90 b/lib/fsk4hf/get_ft4s_bitmetrics.f90 deleted file mode 100644 index a2af01f1e..000000000 --- a/lib/fsk4hf/get_ft4s_bitmetrics.f90 +++ /dev/null @@ -1,133 +0,0 @@ -subroutine get_ft4s_bitmetrics(cd,hmod,bitmetrics,badsync) - - include 'ft4s_params.f90' - parameter (NSS=20) - complex cd(0:NN*NSS-1) - complex cs(0:3,NN) - complex csymb(NSS) - complex c1(NSS,0:3) ! ideal waveforms, 20 samples per symbol, 4 tones - complex ccor(0:3,NN) ! correlations with each ideal waveform, for each symbol - complex cp(0:3) ! accumulated phase shift over symbol types 0:3 - complex csum,cterm - integer icos4a(0:3),icos4b(0:3) - integer icos4c(0:3),icos4d(0:3) - integer icos4e(0:3),icos4f(0:3) - integer graymap(0:3) - integer ip(1) - logical one(0:65535,0:15) ! 65536 8-symbol sequences, 16 bits - logical first - logical badsync - real bitmetrics(2*NN,4) - real s2(0:65535) - real s4(0:3,NN) - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data icos4e/0,2,3,1/ - data icos4f/1,2,0,3/ - data graymap/0,1,3,2/ - data first/.true./ - save first,one,c1,cp - - if(first) then - one=.false. - do i=0,65535 - do j=0,15 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo - twopi=8.0*atan(1.0) - dphi=twopi*hmod/NSS - do itone=0,3 - dp=(itone-1.5)*dphi - phi=0.0 - do j=1,NSS - c1(j,itone)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dp,twopi) - enddo - cp(itone)=cmplx(cos(phi),sin(phi)) - enddo - first=.false. - endif - - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - do itone=0,3 - cs(itone,k)=sum(csymb*conjg(c1(:,itone))) - enddo - s4(0:3,k)=abs(cs(0:3,k)) - enddo - -! Sync quality check - is1=0 - is2=0 - is3=0 - is4=0 - is5=0 - is6=0 - badsync=.false. - ibmax=0 - - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+28)) - if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+56)) - if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 - ip=maxloc(s4(:,k+84)) - if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 - ip=maxloc(s4(:,k+112)) - if(icos4e(k-1).eq.(ip(1)-1)) is5=is5+1 - ip=maxloc(s4(:,k+140)) - if(icos4f(k-1).eq.(ip(1)-1)) is6=is6+1 - enddo - nsync=is1+is2+is3+is4+is5+is6 !Number of correct hard sync symbols, 0-24 - - badsync=.false. -! if(nsync .lt. 8) then -! badsync=.true. -! return -! endif - - do nseq=4,1,-1 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - if(nseq.eq.4) nsym=8 - nt=4**nsym - do ks=1,NN-nsym+1,nsym !87+16=103 symbols. - s2=0 - do i=0,nt-1 - csum=0 - cterm=1 - do j=0,nsym-1 - ntone=mod(i/4**(nsym-1-j),4) - csum=csum+cs(graymap(ntone),ks+j)*cterm - cterm=cterm*conjg(cp(graymap(ntone))) - enddo - s2(i)=abs(csum) - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - if(nsym.eq.8) ibmax=15 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - bitmetrics(ipt+ib,nseq)=bm - enddo - enddo - enddo - - call normalizebmet(bitmetrics(:,1),2*NN) - call normalizebmet(bitmetrics(:,2),2*NN) - call normalizebmet(bitmetrics(:,3),2*NN) - call normalizebmet(bitmetrics(:,4),2*NN) - return - -end subroutine get_ft4s_bitmetrics diff --git a/lib/fsk4hf/get_wspr4_bitmetrics.f90 b/lib/fsk4hf/get_wspr4_bitmetrics.f90 deleted file mode 100644 index d0d82af10..000000000 --- a/lib/fsk4hf/get_wspr4_bitmetrics.f90 +++ /dev/null @@ -1,118 +0,0 @@ -subroutine get_wspr4_bitmetrics(cd,bitmetrics,badsync) - - include 'wspr4_params.f90' - parameter (NSS=16) - complex cd(0:NN*NSS-1) - complex cs(0:3,NN) - complex csymb(NSS) - integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) - integer graymap(0:3) - integer ip(1) - logical one(0:255,0:7) ! 256 4-symbol sequences, 8 bits - logical first - logical badsync - real bitmetrics(2*NN,3) - real s2(0:255) - real s4(0:3,NN) - - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data graymap/0,1,3,2/ - data first/.true./ - save first,one - - if(first) then - one=.false. - do i=0,255 - do j=0,7 - if(iand(i,2**j).ne.0) one(i,j)=.true. - enddo - enddo - first=.false. - endif - - do k=1,NN - i1=(k-1)*NSS - csymb=cd(i1:i1+NSS-1) - call four2a(csymb,NSS,1,-1,1) - cs(0:3,k)=csymb(1:4) - s4(0:3,k)=abs(csymb(1:4)) - enddo - -! Sync quality check - is1=0 - is2=0 - is3=0 - is4=0 - badsync=.false. - ibmax=0 - - do k=1,4 - ip=maxloc(s4(:,k)) - if(icos4a(k-1).eq.(ip(1)-1)) is1=is1+1 - ip=maxloc(s4(:,k+33)) - if(icos4b(k-1).eq.(ip(1)-1)) is2=is2+1 - ip=maxloc(s4(:,k+66)) - if(icos4c(k-1).eq.(ip(1)-1)) is3=is3+1 - ip=maxloc(s4(:,k+99)) - if(icos4d(k-1).eq.(ip(1)-1)) is4=is4+1 - enddo - nsync=is1+is2+is3+is4 !Number of correct hard sync symbols, 0-16 - - badsync=.false. -! if(nsync .lt. 8) then -! badsync=.true. -! return -! endif - - do nseq=1,3 !Try coherent sequences of 1, 2, and 4 symbols - if(nseq.eq.1) nsym=1 - if(nseq.eq.2) nsym=2 - if(nseq.eq.3) nsym=4 - nt=2**(2*nsym) - do ks=1,NN-nsym+1,nsym !87+16=103 symbols. - amax=-1.0 - do i=0,nt-1 - i1=i/64 - i2=iand(i,63)/16 - i3=iand(i,15)/4 - i4=iand(i,3) - if(nsym.eq.1) then - s2(i)=abs(cs(graymap(i4),ks)) - elseif(nsym.eq.2) then - s2(i)=abs(cs(graymap(i3),ks)+cs(graymap(i4),ks+1)) - elseif(nsym.eq.4) then - s2(i)=abs(cs(graymap(i1),ks ) + & - cs(graymap(i2),ks+1) + & - cs(graymap(i3),ks+2) + & - cs(graymap(i4),ks+3) & - ) - else - print*,"Error - nsym must be 1, 2, or 4." - endif - enddo - ipt=1+(ks-1)*2 - if(nsym.eq.1) ibmax=1 - if(nsym.eq.2) ibmax=3 - if(nsym.eq.4) ibmax=7 - do ib=0,ibmax - bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & - maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) - if(ipt+ib.gt.2*NN) cycle - bitmetrics(ipt+ib,nseq)=bm - enddo - enddo - enddo - - bitmetrics(205:206,2)=bitmetrics(205:206,1) - bitmetrics(201:204,3)=bitmetrics(201:204,2) - bitmetrics(205:206,3)=bitmetrics(205:206,1) - - call normalizebmet(bitmetrics(:,1),2*NN) - call normalizebmet(bitmetrics(:,2),2*NN) - call normalizebmet(bitmetrics(:,3),2*NN) - return - -end subroutine get_wspr4_bitmetrics diff --git a/lib/fsk4hf/getcandidates2.f90 b/lib/fsk4hf/getcandidates2.f90 deleted file mode 100644 index 3aa841c83..000000000 --- a/lib/fsk4hf/getcandidates2.f90 +++ /dev/null @@ -1,63 +0,0 @@ -subroutine getcandidates2(id,fa,fb,syncmin,nfqso,maxcand,savg,candidate, & - ncand,sbase) - -! For now, hardwired to find the largest peak in the average spectrum - - include 'ft2_params.f90' - real s(NH1,NHSYM) - real savg(NH1),savsm(NH1) - real sbase(NH1) - real x(NFFT1) - complex cx(0:NH1) - real candidate(3,maxcand) - integer*2 id(NMAX) - integer*1 s8(8) - integer indx(NH1) - data s8/0,1,1,1,0,0,1,0/ - equivalence (x,cx) - -! Compute symbol spectra, stepping by NSTEP steps. - savg=0. - tstep=NSTEP/12000.0 - df=12000.0/NFFT1 !3.125 Hz - fac=1.0/300.0 - do j=1,NHSYM - ia=(j-1)*NSTEP + 1 - ib=ia+NSPS-1 - x(1:NSPS)=fac*id(ia:ib) - x(NSPS+1:)=0. - call four2a(x,NFFT1,1,-1,0) !r2c FFT - do i=1,NH1 - s(i,j)=real(cx(i))**2 + aimag(cx(i))**2 - enddo - savg=savg + s(1:NH1,j) !Average spectrum - enddo - savsm=0. - do i=2,NH1-1 - savsm(i)=sum(savg(i-1:i+1))/3. - enddo - - nfa=fa/df - nfb=fb/df - np=nfb-nfa+1 - indx=0 - call indexx(savsm(nfa:nfb),np,indx) - xn=savsm(nfa+indx(nint(0.3*np))) - savsm=savsm/xn - imax=-1 - xmax=-99. - do i=2,NH1-1 - if(savsm(i).gt.savsm(i-1).and. & - savsm(i).gt.savsm(i+1).and. & - savsm(i).gt.xmax) then - xmax=savsm(i) - imax=i - endif - enddo - f0=imax*df - if(xmax.gt.1.2) then - ncand=ncand+1 - candidate(1,ncand)=f0 - endif -return -end subroutine getcandidates2 diff --git a/lib/fsk4hf/getfc1.f90 b/lib/fsk4hf/getfc1.f90 deleted file mode 100644 index b82b0303b..000000000 --- a/lib/fsk4hf/getfc1.f90 +++ /dev/null @@ -1,58 +0,0 @@ -subroutine getfc1(c,fc1) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) - parameter (NR=3) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (236) - parameter (NSPS=16) !Samples per MSK symbol (16) - parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) - parameter (N13=13*N2) !Samples in central sync vector (416) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - - complex c(0:NZ-1) !Complex waveform - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - - nspec=NZ/NFFT1 - fs=12000.0/72.0 - df1=fs/NFFT1 - s=0. - do k=1,nspec - ia=(k-1)*N2 - ib=ia+N2-1 - c2(0:N2-1)=c(ia:ib) - c2(N2:)=0. - call four2a(c2,NFFT1,1,-1,1) - do i=0,NFFT1-1 - j=i - if(j.gt.NH1) j=j-NFFT1 - s(j)=s(j) + real(c2(i))**2 + aimag(c2(i))**2 - enddo - enddo -! call smo121(s,NFFT1) - smax=0. - ipk=0 - fc1=0. - ia=nint(40.0/df1) - do i=-ia,ia - f=i*df1 - if(s(i).gt.smax) then - smax=s(i) - ipk=i - fc1=f - endif -! write(51,3001) f,s(i),db(s(i)) -! 3001 format(f10.3,e12.3,f10.3) - enddo - -! The following is for testing SNR calibration: -! sp3n=(s(ipk-1)+s(ipk)+s(ipk+1)) !Sig + 3*noise -! base=(sum(s)-sp3n)/(NFFT1-3.0) !Noise per bin -! psig=sp3n-3*base !Sig only -! pnoise=(2500.0/df1)*base !Noise in 2500 Hz -! xsnrdb=db(psig/pnoise) - - return -end subroutine getfc1 diff --git a/lib/fsk4hf/getfc1w.f90 b/lib/fsk4hf/getfc1w.f90 deleted file mode 100644 index 532b9837d..000000000 --- a/lib/fsk4hf/getfc1w.f90 +++ /dev/null @@ -1,47 +0,0 @@ -subroutine getfc1w(c,fs,fa,fb,fc1,xsnr) - - include 'wsprlf_params.f90' - complex c(0:NZ-1) !Complex waveform - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - nspec=NZ/NFFT1 - df1=fs/NFFT1 - s=0. - do k=1,nspec - ia=(k-1)*N2 - ib=ia+N2-1 - c2(0:N2-1)=c(ia:ib) - c2(N2:)=0. - call four2a(c2,NFFT1,1,-1,1) - do i=0,NFFT1-1 - j=i - if(j.gt.NH1) j=j-NFFT1 - s(j)=s(j) + real(c2(i))**2 + aimag(c2(i))**2 - enddo - enddo -! call smo121(s,NFFT1) - smax=0. - ipk=0 - fc1=0. - ia=nint(fa/df1) - ib=nint(fb/df1) - do i=ia,ib - f=i*df1 - if(s(i).gt.smax) then - smax=s(i) - ipk=i - fc1=f - endif -! write(51,3001) f,s(i),db(s(i)) -! 3001 format(f10.3,e12.3,f10.3) - enddo - -! The following is for testing SNR calibration: - sp3n=(s(ipk-1)+s(ipk)+s(ipk+1)) !Sig + 3*noise - base=(sum(s)-sp3n)/(NFFT1-3.0) !Noise per bin - psig=sp3n-3*base !Sig only - pnoise=(2500.0/df1)*base !Noise in 2500 Hz - xsnr=db(psig/pnoise) - - return -end subroutine getfc1w diff --git a/lib/fsk4hf/getfc2.f90 b/lib/fsk4hf/getfc2.f90 deleted file mode 100644 index 9506168dd..000000000 --- a/lib/fsk4hf/getfc2.f90 +++ /dev/null @@ -1,74 +0,0 @@ -subroutine getfc2(c,csync,fc1,fc2,fc3) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) - parameter (NR=3) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (236) - parameter (NSPS=16) !Samples per MSK symbol (16) - parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) - parameter (N13=13*N2) !Samples in central sync vector (416) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - - complex c(0:NZ-1) !Complex waveform - complex cs(0:NZ-1) !For computing spectrum - complex csync(0:NZ-1) !Sync symbols only, from cbb - real a(5) - - fs=12000.0/72.0 - df=fs/NZ - baud=fs/NSPS - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 - -! Filter, square, then FFT to get refined carrier frequency fc2. - call four2a(cs,NZ,1,-1,1) !To freq domain - ia=nint(0.75*baud/df) - cs(ia:NZ-1-ia)=0. !Save only freqs around fc1 - call four2a(cs,NZ,1,1,1) !Back to time domain - cs=cs/NZ - cs=cs*cs !Square the data - call four2a(cs,NZ,1,-1,1) !Compute squared spectrum - -! Find two peaks separated by baud - pmax=0. - fc2=0. - ic=nint(baud/df) - ja=nint(0.5*baud/df) - do j=-ja,ja - f2=j*df - ia=nint((f2-0.5*baud)/df) - if(ia.lt.0) ia=ia+NZ - ib=nint((f2+0.5*baud)/df) - p=real(cs(ia))**2 + aimag(cs(ia))**2 + & - real(cs(ib))**2 + aimag(cs(ib))**2 - if(p.gt.pmax) then - pmax=p - fc2=0.5*f2 - endif -! write(52,1200) f2,p,db(p) -!1200 format(f10.3,2f15.3) - enddo - - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 - cs=cs*conjg(csync) - call four2a(cs,NZ,1,-1,1) !To freq domain - pmax=0. - do i=0,NZ-1 - f=i*df - if(i.gt.NZ/2) f=(i-NZ)*df - p=real(cs(i))**2 + aimag(cs(i))**2 -! write(51,3001) f,p,db(p) -!3001 format(f10.3,e12.3,f10.3) - if(p.gt.pmax) then - pmax=p - fc3=f - endif - enddo - - return -end subroutine getfc2 diff --git a/lib/fsk4hf/getfc2w.f90 b/lib/fsk4hf/getfc2w.f90 deleted file mode 100644 index 0d100ee56..000000000 --- a/lib/fsk4hf/getfc2w.f90 +++ /dev/null @@ -1,82 +0,0 @@ -subroutine getfc2w(c,csync,npeaks,fs,fc1,fpks) - - include 'wsprlf_params.f90' - - complex c(0:NZ-1) !Complex waveform - complex cs(0:NZ-1) !For computing spectrum - complex csync(0:NZ-1) !Sync symbols only, from cbb - real a(5) - real freqs(413),sp2(413),fpks(npeaks) - integer pkloc(1) - - df=fs/NZ - baud=fs/NSPS - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 - -! Filter, square, then FFT to get refined carrier frequency fc2. - call four2a(cs,NZ,1,-1,1) !To freq domain - - ia=nint(0.75*baud/df) - cs(ia:NZ-1-ia)=0. !Save only freqs around fc1 - call four2a(cs,NZ,1,1,1) !Back to time domain - cs=cs/NZ - cs=cs*cs !Square the data - call four2a(cs,NZ,1,-1,1) !Compute squared spectrum - -! Find two peaks separated by baud - pmax=0. - fc2=0. - ja=nint(0.3*baud/df) - k=1 - do j=-ja,ja - f2=j*df - ia=nint((f2-0.5*baud)/df) - if(ia.lt.0) ia=ia+NZ - ib=nint((f2+0.5*baud)/df) - p=real(cs(ia))**2 + aimag(cs(ia))**2 + & - real(cs(ib))**2 + aimag(cs(ib))**2 - if(p.gt.pmax) then - pmax=p - fc2=0.5*f2 - endif - freqs(k)=0.5*f2 - sp2(k)=p - k=k+1 -! write(52,1200) f2,p,db(p) -!1200 format(f10.3,2f15.3) - enddo - - do i=1,npeaks - pkloc=maxloc(sp2) - ipk=pkloc(1) - fpks(i)=freqs(ipk) - ipk0=max(1,ipk-1) - ipk1=min(413,ipk+1) -! ipk0=ipk -! ipk1=ipk - sp2(ipk0:ipk1)=0.0 -!write(*,*) i,fpks(i),fc2 - enddo - - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 - cs=cs*conjg(csync) - call four2a(cs,NZ,1,-1,1) !To freq domain - pmax=0. - do i=0,NZ-1 - f=i*df - if(i.gt.NZ/2) f=(i-NZ)*df - p=real(cs(i))**2 + aimag(cs(i))**2 -! write(51,3001) f,p,db(p) -!3001 format(f10.3,e12.3,f10.3) - if(p.gt.pmax) then - pmax=p - fc3=f - endif - enddo - - return -end subroutine getfc2w diff --git a/lib/fsk4hf/gran.c b/lib/fsk4hf/gran.c deleted file mode 100644 index 24b986503..000000000 --- a/lib/fsk4hf/gran.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -/* Generate gaussian random float with mean=0 and std_dev=1 */ -float gran_() -{ - float fac,rsq,v1,v2; - static float gset; - static int iset; - - if(iset){ - /* Already got one */ - iset = 0; - return gset; - } - /* Generate two evenly distributed numbers between -1 and +1 - * that are inside the unit circle - */ - do { - v1 = 2.0 * (float)rand() / RAND_MAX - 1; - v2 = 2.0 * (float)rand() / RAND_MAX - 1; - rsq = v1*v1 + v2*v2; - } while(rsq >= 1.0 || rsq == 0.0); - fac = sqrt(-2.0*log(rsq)/rsq); - gset = v1*fac; - iset++; - return v2*fac; -} diff --git a/lib/fsk4hf/ldpc_174_101_generator.f90 b/lib/fsk4hf/ldpc_174_101_generator.f90 deleted file mode 100644 index 26b300d7c..000000000 --- a/lib/fsk4hf/ldpc_174_101_generator.f90 +++ /dev/null @@ -1,76 +0,0 @@ -character *26 g(73) - -data g/ & - "63e951344af12c4cc41106e760", & - "68d44d92ecd93ad6d4692266c8", & - "4580fb1fac614cbfd928ede720", & - "14eeda1b8a01f66880f5012ad8", & - "35a9cfb6458a89bf8aafeaf488", & - "20c8bc97810aea0bea6224ddb8", & - "f577e866d9a5ed407f37bf4010", & - "100d26dff465508c671a3b2710", & - "4e860571d270084b99b18e74a0", & - "495bbc1ba799ac5f5c159ebeb8", & - "c71b622d5e7e351b46cf9f29a8", & - "2e01d802b77181d4789285fdb8", & - "41ee2ab37388eaee0ec6d54860", & - "839084a886a9e1f3c5f56453b0", & - "bbaef43ff6506531465a4a2690", & - "627436a8e4ff531d190f179a68", & - "d48abf3769173ad49de8bf9d98", & - "1a588539d6b05682445316b6e0", & - "59dfa468e4da46b03c5fe69b48", & - "0c94c6716f592a165d9ad056a8", & - "4cae5d652767e32d08b75bf370", & - "9d7bff3c3fea24c15d9a78e550", & - "400576f3f695101962ccbd7818", & - "8731ecdaa728862d0f29f334a8", & - "3b588539d6b0d682547316b6e0", & - "958ee990eb7b62502f49733388", & - "4c84c6716f582a165dbad0d6a8", & - "9294bdce4590c752416f516238", & - "72a2a0f864533375373ff521d8", & - "552a32c530cb00206e8ce56d90", & - "fbc29b77052ba34d9993873c98", & - "eeb3767ac69e86f08d793a44a0", & - "20f4128d200bdae9a24e79efd0", & - "26aaf29464a373e092e963fed0", & - "33cd65456ae8efe40bce1b3378", & - "900d66fff465708c671a3b2730", & - "91aa5e8f40af51c256da031b00", & - "ca41c5a3d010dfe60d87a3ab68", & - "9d68f4c75fceab703c9a74ea58", & - "2d2f3945b24e17547f27f78400", & - "07d78fdbc0f3c361297561f070", & - "ebbcb3f268a60852e7582376f0", & - "c263d7e939dbf3f7823941b9e0", & - "f2244da30cb449300f01de6348", & - "19043d66c33926a9849a3d3188", & - "dd7d8234a953bb695ed6c89240", & - "24f233d9168f595680fe99eec8", & - "177d16017d598f7e1ed3497ac8", & - "387ec44871f376c96bcd0aec38", & - "08f596acd411469152d30bf6d8", & - "27239f5ee0f8198c8b3b1819a0", & - "c69382b7dbe81f06983ed4f2f0", & - "d9d2c29710af363c5f455dbcf8", & - "6e4c7ae7ee52c11db7daf40b10", & - "9b2ef437f6506531445a4a6690", & - "86d5489e3df6deb548094a61c8", & - "7cf277ada2132560d6ba744830", & - "471b62ad5c7e351b44ef9f29a8", & - "bfbb8689f7ded0062e48a6e6b8", & - "380a6a5250f6562b21e157d250", & - "5f1928d58631d732dfa3395db0", & - "d2eef1368dbea33be523fa9ef0", & - "8a55e2c622d7240e23492d9190", & - "8fc03eac7c719359c4af4a4c48", & - "62af8467903663f97025de06c8", & - "1ecb7b94b903e532986f1c36e0", & - "d2918b3db705d74b2ba2ec1a20", & - "1571fd0dc3bd259d14eabd6838", & - "18be78df70f98cc281af2e3580", & - "e547da7243f7d5309626a4aec0", & - "1bac17b4f2bb086bf63d6f1930", & - "0864932f8d6ec6ef479d450db8", & - "10aa89da9daa4c1fb7a4288ab0"/ diff --git a/lib/fsk4hf/ldpc_174_101_parity.f90 b/lib/fsk4hf/ldpc_174_101_parity.f90 deleted file mode 100644 index 1c1cc321f..000000000 --- a/lib/fsk4hf/ldpc_174_101_parity.f90 +++ /dev/null @@ -1,258 +0,0 @@ -data Mn/ & - 2, 54, 72, & - 18, 60, 62, & - 37, 50, 70, & - 3, 30, 66, & - 4, 9, 14, & - 5, 19, 23, & - 6, 21, 47, & - 7, 31, 50, & - 8, 39, 70, & - 10, 33, 73, & - 11, 22, 49, & - 12, 60, 61, & - 16, 53, 55, & - 17, 63, 67, & - 24, 59, 64, & - 25, 27, 68, & - 26, 38, 46, & - 28, 57, 72, & - 29, 36, 43, & - 32, 48, 51, & - 34, 52, 69, & - 14, 35, 44, & - 40, 41, 42, & - 45, 56, 65, & - 31, 51, 54, & - 42, 58, 69, & - 1, 37, 72, & - 2, 27, 64, & - 3, 41, 70, & - 4, 10, 12, & - 5, 40, 59, & - 6, 19, 39, & - 7, 53, 68, & - 8, 35, 47, & - 9, 48, 66, & - 11, 18, 36, & - 13, 20, 29, & - 15, 28, 46, & - 16, 23, 54, & - 17, 52, 57, & - 21, 26, 62, & - 22, 63, 73, & - 24, 51, 65, & - 25, 30, 43, & - 32, 47, 61, & - 33, 56, 71, & - 15, 34, 45, & - 38, 43, 60, & - 44, 50, 67, & - 3, 49, 58, & - 22, 55, 72, & - 1, 13, 53, & - 2, 20, 69, & - 4, 46, 49, & - 5, 9, 45, & - 6, 11, 65, & - 7, 35, 57, & - 8, 11, 38, & - 10, 29, 32, & - 12, 16, 21, & - 14, 64, 71, & - 17, 41, 68, & - 1, 18, 66, & - 19, 58, 64, & - 23, 24, 48, & - 25, 31, 67, & - 26, 42, 44, & - 27, 40, 50, & - 28, 56, 62, & - 30, 37, 63, & - 33, 54, 70, & - 34, 36, 73, & - 39, 55, 61, & - 9, 52, 59, & - 50, 54, 60, & - 2, 4, 16, & - 3, 20, 31, & - 5, 55, 67, & - 6, 44, 48, & - 7, 28, 52, & - 8, 29, 30, & - 10, 24, 49, & - 12, 57, 66, & - 13, 42, 73, & - 14, 19, 21, & - 15, 27, 36, & - 17, 39, 43, & - 18, 51, 61, & - 22, 23, 60, & - 25, 46, 70, & - 26, 58, 59, & - 32, 63, 71, & - 5, 33, 65, & - 34, 41, 53, & - 35, 37, 41, & - 38, 68, 73, & - 30, 40, 69, & - 39, 45, 62, & - 47, 69, 72, & - 4, 37, 56, & - 1, 31, 48, & - 1, 21, 58, & - 2, 5, 62, & - 3, 27, 57, & - 4, 43, 51, & - 2, 35, 63, & - 6, 53, 59, & - 7, 29, 66, & - 8, 42, 72, & - 9, 31, 36, & - 10, 35, 55, & - 11, 13, 54, & - 12, 63, 65, & - 10, 11, 15, & - 14, 22, 69, & - 15, 16, 70, & - 9, 16, 24, & - 17, 47, 56, & - 18, 45, 50, & - 19, 30, 44, & - 20, 60, 71, & - 1, 44, 65, & - 22, 26, 68, & - 23, 28, 61, & - 24, 25, 39, & - 13, 46, 50, & - 26, 34, 67, & - 3, 6, 60, & - 14, 28, 40, & - 4, 7, 42, & - 19, 36, 57, & - 25, 32, 34, & - 32, 37, 38, & - 33, 41, 46, & - 17, 18, 23, & - 5, 43, 47, & - 30, 45, 72, & - 12, 37, 64, & - 27, 38, 56, & - 31, 61, 73, & - 40, 49, 52, & - 20, 41, 48, & - 21, 29, 52, & - 8, 68, 71, & - 15, 17, 59, & - 3, 13, 14, & - 2, 61, 66, & - 9, 38, 58, & - 48, 64, 73, & - 49, 53, 62, & - 10, 19, 26, & - 1, 41, 43, & - 52, 55, 71, & - 16, 20, 30, & - 4, 6, 34, & - 51, 69, 70, & - 7, 11, 64, & - 18, 25, 35, & - 54, 58, 67, & - 12, 39, 40, & - 33, 39, 66, & - 5, 37, 68, & - 8, 31, 59, & - 21, 45, 73, & - 27, 51, 55, & - 23, 42, 65, & - 22, 29, 56, & - 20, 28, 67, & - 32, 44, 49, & - 33, 53, 69, & - 13, 24, 47, & - 36, 46, 63, & - 1, 15, 71, & - 48, 57, 62/ - -data Nm/ & - 27, 52, 63, 101, 102, 122, 152, 173, & - 1, 28, 53, 76, 103, 106, 147, 0, & - 4, 29, 50, 77, 104, 128, 146, 0, & - 5, 30, 54, 76, 100, 105, 130, 155, & - 6, 31, 55, 78, 93, 103, 136, 162, & - 7, 32, 56, 79, 107, 128, 155, 0, & - 8, 33, 57, 80, 108, 130, 157, 0, & - 9, 34, 58, 81, 109, 144, 163, 0, & - 5, 35, 55, 74, 110, 117, 148, 0, & - 10, 30, 59, 82, 111, 114, 151, 0, & - 11, 36, 56, 58, 112, 114, 157, 0, & - 12, 30, 60, 83, 113, 138, 160, 0, & - 37, 52, 84, 112, 126, 146, 171, 0, & - 5, 22, 61, 85, 115, 129, 146, 0, & - 38, 47, 86, 114, 116, 145, 173, 0, & - 13, 39, 60, 76, 116, 117, 154, 0, & - 14, 40, 62, 87, 118, 135, 145, 0, & - 2, 36, 63, 88, 119, 135, 158, 0, & - 6, 32, 64, 85, 120, 131, 151, 0, & - 37, 53, 77, 121, 142, 154, 168, 0, & - 7, 41, 60, 85, 102, 143, 164, 0, & - 11, 42, 51, 89, 115, 123, 167, 0, & - 6, 39, 65, 89, 124, 135, 166, 0, & - 15, 43, 65, 82, 117, 125, 171, 0, & - 16, 44, 66, 90, 125, 132, 158, 0, & - 17, 41, 67, 91, 123, 127, 151, 0, & - 16, 28, 68, 86, 104, 139, 165, 0, & - 18, 38, 69, 80, 124, 129, 168, 0, & - 19, 37, 59, 81, 108, 143, 167, 0, & - 4, 44, 70, 81, 97, 120, 137, 154, & - 8, 25, 66, 77, 101, 110, 140, 163, & - 20, 45, 59, 92, 132, 133, 169, 0, & - 10, 46, 71, 93, 134, 161, 170, 0, & - 21, 47, 72, 94, 127, 132, 155, 0, & - 22, 34, 57, 95, 106, 111, 158, 0, & - 19, 36, 72, 86, 110, 131, 172, 0, & - 3, 27, 70, 95, 100, 133, 138, 162, & - 17, 48, 58, 96, 133, 139, 148, 0, & - 9, 32, 73, 87, 98, 125, 160, 161, & - 23, 31, 68, 97, 129, 141, 160, 0, & - 23, 29, 62, 94, 95, 134, 142, 152, & - 23, 26, 67, 84, 109, 130, 166, 0, & - 19, 44, 48, 87, 105, 136, 152, 0, & - 22, 49, 67, 79, 120, 122, 169, 0, & - 24, 47, 55, 98, 119, 137, 164, 0, & - 17, 38, 54, 90, 126, 134, 172, 0, & - 7, 34, 45, 99, 118, 136, 171, 0, & - 20, 35, 65, 79, 101, 142, 149, 174, & - 11, 50, 54, 82, 141, 150, 169, 0, & - 3, 8, 49, 68, 75, 119, 126, 0, & - 20, 25, 43, 88, 105, 156, 165, 0, & - 21, 40, 74, 80, 141, 143, 153, 0, & - 13, 33, 52, 94, 107, 150, 170, 0, & - 1, 25, 39, 71, 75, 112, 159, 0, & - 13, 51, 73, 78, 111, 153, 165, 0, & - 24, 46, 69, 100, 118, 139, 167, 0, & - 18, 40, 57, 83, 104, 131, 174, 0, & - 26, 50, 64, 91, 102, 148, 159, 0, & - 15, 31, 74, 91, 107, 145, 163, 0, & - 2, 12, 48, 75, 89, 121, 128, 0, & - 12, 45, 73, 88, 124, 140, 147, 0, & - 2, 41, 69, 98, 103, 150, 174, 0, & - 14, 42, 70, 92, 106, 113, 172, 0, & - 15, 28, 61, 64, 138, 149, 157, 0, & - 24, 43, 56, 93, 113, 122, 166, 0, & - 4, 35, 63, 83, 108, 147, 161, 0, & - 14, 49, 66, 78, 127, 159, 168, 0, & - 16, 33, 62, 96, 123, 144, 162, 0, & - 21, 26, 53, 97, 99, 115, 156, 170, & - 3, 9, 29, 71, 90, 116, 156, 0, & - 46, 61, 92, 121, 144, 153, 173, 0, & - 1, 18, 27, 51, 99, 109, 137, 0, & - 10, 42, 72, 84, 96, 140, 149, 164/ - -data nrw/ & -8,7,7,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, & -7,7,7,7,7,7,7,7,7,8,8,7,7,7,7,7,8,7,8,7, & -8,7,7,7,7,7,7,8,7,7,7,7,7,7,7,7,7,7,7,7, & -7,7,7,7,7,7,7,7,8,7,7,7,8/ - -ncw=3 diff --git a/lib/fsk4hf/ldpc_174_74_generator.f90 b/lib/fsk4hf/ldpc_174_74_generator.f90 deleted file mode 100644 index 116ccfddc..000000000 --- a/lib/fsk4hf/ldpc_174_74_generator.f90 +++ /dev/null @@ -1,105 +0,0 @@ -! generator matrix for regular column weight 3 (174,74) LDPC code. - -character*19 g(100) - -data g/ & - "b190e319bd45882ed74", & - "b159282d395467cabe4", & - "f502387ec63db738358", & - "a6c7911729277b2a178", & - "05d812d04122ff2842c", & - "eb040701b66b26d12ec", & - "c617358e34398e73c6c", & - "37b62b499bbb84aeb0c", & - "60257b5d4e41594a250", & - "e8ac26253c0268ba33c", & - "0f243baf67353230318", & - "521d5eb1268bed86854", & - "53bab7dbe89962bba00", & - "417abaf10e0912604b8", & - "c0d371dbb301f49aae8", & - "e7014cf533a2cb9fd24", & - "948175882e16ecd8cc8", & - "87db37137999fb15504", & - "2557139852451e678c8", & - "aaaf0b6b1f70db8e5ac", & - "f5be069b0a41fd5bb28", & - "e7789f2237b2175d494", & - "94554737d22b00d5980", & - "525e935db67c1af214c", & - "9c57c640427a2c2e33c", & - "9a82e00fb570e371cac", & - "39ebbdd43570f690818", & - "a037514614e0d5cc2a4", & - "ff19fc0eee4376f6de0", & - "f8853aad262b1a14cf0", & - "f5687424fe7c5156ee0", & - "fba0aa4876b79e45d78", & - "dfdfb60046769dec900", & - "600b4517a14560fad64", & - "39c618d3f629809c064", & - "5c821087e8c365869f8", & - "a4f26e15e3ef8264c04", & - "ac230e4147016f5bf98", & - "e11a6981f5257957d84", & - "b9dd003c09cf2abc5b0", & - "326ff2588a1bfa6a310", & - "a84e8e04722185f23ac", & - "8a66abe81aff313f9a8", & - "f6047ea2cad01957e08", & - "f14b63fdff262eb74bc", & - "7588be7336de21f7680", & - "312d0e1d5d1c3666fec", & - "5ab69333712cdbf9c38", & - "3c8e8c949be183939f4", & - "ed3b36d068e55ef76d8", & - "8193b051800415c06e0", & - "bc8e88949be18393bd4", & - "a7db37037999fb15404", & - "c5ec69ecc57ed7800b8", & - "475b645148268e10afc", & - "1fe90fea7ae941c04a8", & - "513b196d2a6e43c9504", & - "ffc27ceba420d04f468", & - "972c2cc31e578dba968", & - "7fc874b734a8188a2f8", & - "3d0327a801275734cc4", & - "b1e77d50857f56b6a40", & - "f25389644e47dae2384", & - "4e7e815e6b3c20507a0", & - "27d63d2e80a23f057cc", & - "381388a8a6fad77ec50", & - "b785abf747ea18bc350", & - "40a2a8214e2bed48090", & - "0e891f175b06fed80d4", & - "dbd155acd9fbec5b4a4", & - "9d3476e615c702f8e60", & - "050ea06fbd1f532d164", & - "d03767bca8394f31628", & - "455d568ff3047e9d5ac", & - "6b343bcf7378e1283f4", & - "a0d371dbb311f49aae8", & - "36ea237c911eb2ac27c", & - "54a636ec612a744f368", & - "5cabf5c9d5a0d2d9ba4", & - "00d632bffc3dac0d548", & - "d86bf5593c70dcb91fc", & - "bada10bb78be8c219c0", & - "b98028f926fed2beab0", & - "c0347b3cc45c2888094", & - "0662d6a3c2974e0a910", & - "8036b9e83c9fdc2cda8", & - "e5db38aad196024c21c", & - "746c8af5783b5daedcc", & - "1dc47211c27e39ec5dc", & - "6b98898e40559a2e128", & - "52d9077dbfa44c6d75c", & - "9ca1e6bd4515559a054", & - "7b2dd815e5991f88d14", & - "bfde5ebc6e09940460c", & - "487f5ffeaf139c209f4", & - "08d6b3c9686cc0f6ff4", & - "e198f5466141f53ab84", & - "0a7c7af0ac612d14f40", & - "a4192113ec53f4d165c", & - "1423ae72e003614be88"/ diff --git a/lib/fsk4hf/ldpc_174_74_parity.f90 b/lib/fsk4hf/ldpc_174_74_parity.f90 deleted file mode 100644 index 12187cc32..000000000 --- a/lib/fsk4hf/ldpc_174_74_parity.f90 +++ /dev/null @@ -1,288 +0,0 @@ -! parity check matrix for regular column weight 3 (174,74) LDPC code - -data Mn/ & - 28, 32, 98, & - 1, 94, 95, & - 70, 71, 94, & - 3, 9, 39, & - 4, 22, 84, & - 5, 25, 85, & - 6, 55, 100, & - 7, 41, 67, & - 8, 62, 77, & - 10, 37, 40, & - 11, 16, 36, & - 12, 29, 47, & - 14, 57, 91, & - 15, 49, 59, & - 17, 18, 52, & - 19, 48, 58, & - 20, 34, 72, & - 21, 38, 87, & - 23, 46, 79, & - 24, 43, 83, & - 26, 74, 78, & - 27, 51, 98, & - 30, 35, 42, & - 31, 63, 88, & - 25, 33, 82, & - 44, 53, 96, & - 50, 75, 90, & - 46, 54, 71, & - 56, 76, 81, & - 60, 65, 69, & - 61, 95, 97, & - 64, 89, 99, & - 66, 73, 76, & - 68, 80, 92, & - 74, 86, 87, & - 52, 55, 93, & - 1, 3, 21, & - 2, 57, 64, & - 4, 11, 82, & - 5, 60, 81, & - 6, 13, 66, & - 7, 43, 59, & - 8, 27, 85, & - 9, 34, 94, & - 10, 28, 88, & - 12, 19, 53, & - 14, 33, 65, & - 15, 75, 84, & - 16, 56, 68, & - 17, 44, 90, & - 18, 23, 73, & - 20, 26, 83, & - 22, 42, 91, & - 24, 70, 79, & - 29, 96, 97, & - 30, 48, 77, & - 31, 37, 67, & - 32, 35, 78, & - 36, 80, 89, & - 38, 62, 93, & - 39, 54, 72, & - 40, 58, 61, & - 41, 51, 86, & - 9, 45, 63, & - 46, 47, 92, & - 49, 50, 80, & - 69, 75, 98, & - 14, 71, 99, & - 21, 85, 100, & - 1, 6, 50, & - 2, 74, 98, & - 3, 73, 92, & - 4, 32, 79, & - 5, 63, 96, & - 1, 29, 79, & - 2, 6, 84, & - 3, 36, 78, & - 4, 59, 69, & - 5, 72, 80, & - 2, 41, 44, & - 7, 38, 90, & - 8, 58, 99, & - 9, 42, 49, & - 10, 46, 74, & - 11, 14, 73, & - 12, 85, 88, & - 13, 25, 93, & - 5, 11, 61, & - 15, 16, 94, & - 8, 15, 32, & - 17, 64, 76, & - 18, 60, 71, & - 19, 34, 57, & - 20, 77, 96, & - 21, 31, 82, & - 22, 23, 48, & - 16, 17, 22, & - 24, 35, 86, & - 13, 51, 64, & - 26, 33, 39, & - 4, 27, 47, & - 28, 54, 56, & - 1, 62, 76, & - 30, 53, 100, & - 21, 46, 57, & - 32, 55, 61, & - 33, 92, 95, & - 19, 67, 68, & - 14, 35, 75, & - 3, 84, 99, & - 37, 75, 92, & - 7, 30, 63, & - 23, 39, 50, & - 27, 40, 44, & - 41, 66, 91, & - 9, 10, 69, & - 12, 43, 52, & - 6, 20, 88, & - 43, 45, 89, & - 24, 31, 60, & - 47, 50, 70, & - 26, 38, 45, & - 25, 42, 98, & - 40, 79, 87, & - 51, 68, 83, & - 52, 97, 98, & - 48, 71, 78, & - 28, 29, 80, & - 53, 59, 73, & - 49, 54, 95, & - 34, 36, 90, & - 55, 82, 89, & - 4, 77, 90, & - 49, 58, 81, & - 18, 56, 77, & - 62, 63, 65, & - 60, 91, 100, & - 2, 11, 62, & - 15, 24, 93, & - 37, 66, 83, & - 65, 85, 86, & - 5, 10, 48, & - 1, 69, 89, & - 67, 81, 87, & - 13, 56, 75, & - 70, 72, 97, & - 8, 50, 57, & - 6, 19, 33, & - 7, 25, 99, & - 74, 94, 96, & - 14, 52, 87, & - 16, 30, 40, & - 20, 42, 79, & - 17, 21, 72, & - 9, 12, 41, & - 18, 61, 67, & - 3, 83, 97, & - 26, 80, 91, & - 23, 55, 65, & - 27, 31, 95, & - 28, 84, 86, & - 29, 34, 93, & - 46, 51, 63, & - 35, 39, 76, & - 13, 44, 78, & - 32, 37, 38, & - 22, 43, 92, & - 45, 53, 54, & - 58, 73, 74, & - 47, 64, 100, & - 59, 68, 85, & - 66, 82, 96, & - 36, 81, 88, & - 2, 45, 70/ - -data Nm/ & - 2, 37, 70, 75, 103, 143, & - 38, 71, 76, 80, 138, 174, & - 4, 37, 72, 77, 110, 157, & - 5, 39, 73, 78, 101, 133, & - 6, 40, 74, 79, 88, 142, & - 7, 41, 70, 76, 118, 148, & - 8, 42, 81, 112, 149, 0, & - 9, 43, 82, 90, 147, 0, & - 4, 44, 64, 83, 116, 155, & - 10, 45, 84, 116, 142, 0, & - 11, 39, 85, 88, 138, 0, & - 12, 46, 86, 117, 155, 0, & - 41, 87, 99, 145, 165, 0, & - 13, 47, 68, 85, 109, 151, & - 14, 48, 89, 90, 139, 0, & - 11, 49, 89, 97, 152, 0, & - 15, 50, 91, 97, 154, 0, & - 15, 51, 92, 135, 156, 0, & - 16, 46, 93, 108, 148, 0, & - 17, 52, 94, 118, 153, 0, & - 18, 37, 69, 95, 105, 154, & - 5, 53, 96, 97, 167, 0, & - 19, 51, 96, 113, 159, 0, & - 20, 54, 98, 120, 139, 0, & - 6, 25, 87, 123, 149, 0, & - 21, 52, 100, 122, 158, 0, & - 22, 43, 101, 114, 160, 0, & - 1, 45, 102, 128, 161, 0, & - 12, 55, 75, 128, 162, 0, & - 23, 56, 104, 112, 152, 0, & - 24, 57, 95, 120, 160, 0, & - 1, 58, 73, 90, 106, 166, & - 25, 47, 100, 107, 148, 0, & - 17, 44, 93, 131, 162, 0, & - 23, 58, 98, 109, 164, 0, & - 11, 59, 77, 131, 173, 0, & - 10, 57, 111, 140, 166, 0, & - 18, 60, 81, 122, 166, 0, & - 4, 61, 100, 113, 164, 0, & - 10, 62, 114, 124, 152, 0, & - 8, 63, 80, 115, 155, 0, & - 23, 53, 83, 123, 153, 0, & - 20, 42, 117, 119, 167, 0, & - 26, 50, 80, 114, 165, 0, & - 64, 119, 122, 168, 174, 0, & - 19, 28, 65, 84, 105, 163, & - 12, 65, 101, 121, 170, 0, & - 16, 56, 96, 127, 142, 0, & - 14, 66, 83, 130, 134, 0, & - 27, 66, 70, 113, 121, 147, & - 22, 63, 99, 125, 163, 0, & - 15, 36, 117, 126, 151, 0, & - 26, 46, 104, 129, 168, 0, & - 28, 61, 102, 130, 168, 0, & - 7, 36, 106, 132, 159, 0, & - 29, 49, 102, 135, 145, 0, & - 13, 38, 93, 105, 147, 0, & - 16, 62, 82, 134, 169, 0, & - 14, 42, 78, 129, 171, 0, & - 30, 40, 92, 120, 137, 0, & - 31, 62, 88, 106, 156, 0, & - 9, 60, 103, 136, 138, 0, & - 24, 64, 74, 112, 136, 163, & - 32, 38, 91, 99, 170, 0, & - 30, 47, 136, 141, 159, 0, & - 33, 41, 115, 140, 172, 0, & - 8, 57, 108, 144, 156, 0, & - 34, 49, 108, 125, 171, 0, & - 30, 67, 78, 116, 143, 0, & - 3, 54, 121, 146, 174, 0, & - 3, 28, 68, 92, 127, 0, & - 17, 61, 79, 146, 154, 0, & - 33, 51, 72, 85, 129, 169, & - 21, 35, 71, 84, 150, 169, & - 27, 48, 67, 109, 111, 145, & - 29, 33, 91, 103, 164, 0, & - 9, 56, 94, 133, 135, 0, & - 21, 58, 77, 127, 165, 0, & - 19, 54, 73, 75, 124, 153, & - 34, 59, 66, 79, 128, 158, & - 29, 40, 134, 144, 173, 0, & - 25, 39, 95, 132, 172, 0, & - 20, 52, 125, 140, 157, 0, & - 5, 48, 76, 110, 161, 0, & - 6, 43, 69, 86, 141, 171, & - 35, 63, 98, 141, 161, 0, & - 18, 35, 124, 144, 151, 0, & - 24, 45, 86, 118, 173, 0, & - 32, 59, 119, 132, 143, 0, & - 27, 50, 81, 131, 133, 0, & - 13, 53, 115, 137, 158, 0, & - 34, 65, 72, 107, 111, 167, & - 36, 60, 87, 139, 162, 0, & - 2, 3, 44, 89, 150, 0, & - 2, 31, 107, 130, 160, 0, & - 26, 55, 74, 94, 150, 172, & - 31, 55, 126, 146, 157, 0, & - 1, 22, 67, 71, 123, 126, & - 32, 68, 82, 110, 149, 0, & - 7, 69, 104, 137, 170, 0/ - -data nrw/ & - 6,6,6,6,6,6,5,5,6,5,5,5,5,6,5,5,5,5,5,5, & - 6,5,5,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5, & - 5,5,5,5,5,6,5,5,5,6,5,5,5,5,5,5,5,5,5,5, & - 5,5,6,5,5,5,5,5,5,5,5,5,6,6,6,5,5,5,6,6, & - 5,5,5,5,6,5,5,5,5,5,5,6,5,5,5,6,5,6,5,5/ - -ncw=3 diff --git a/lib/fsk4hf/ldpc_174_91_a_colorder.f90 b/lib/fsk4hf/ldpc_174_91_a_colorder.f90 deleted file mode 100644 index 65a2314fb..000000000 --- a/lib/fsk4hf/ldpc_174_91_a_colorder.f90 +++ /dev/null @@ -1,11 +0,0 @@ -data colorder/ & - 0, 1, 2, 3, 28, 4, 5, 6, 7, 8, 9, 10, 11, 34, 12, 32, 13, 14, 15, 16,& - 17, 18, 36, 29, 40, 19, 20, 38, 21, 41, 30, 42, 22, 44, 37, 47, 48, 23, 33, 43,& - 49, 45, 56, 39, 25, 26, 46, 50, 51, 52, 24, 57, 58, 61, 31, 54, 64, 35, 27, 62,& - 59, 53, 60, 63, 55, 70, 66, 67, 68, 65, 71, 74, 72, 73, 77, 75, 69, 76, 79, 82,& - 83, 78, 81, 80, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,& - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,& - 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,& - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,& - 160,161,162,163,164,165,166,167,168,169,170,171,172,173/ - diff --git a/lib/fsk4hf/ldpc_174_91_a_generator.f90 b/lib/fsk4hf/ldpc_174_91_a_generator.f90 deleted file mode 100644 index 889826abe..000000000 --- a/lib/fsk4hf/ldpc_174_91_a_generator.f90 +++ /dev/null @@ -1,87 +0,0 @@ -character*23 g(83) - -data g/ & - "2a6a9ab98f661b797baa21a", & - "5fda604488977fdc30ff630", & - "8a450007032409e8797b13a", & - "0f7923bfa5d559590ef6efe", & - "44dc14bc4461e645f847c78", & - "f8c66224febd3e60f5e3708", & - "6d60329e83fb0e1b1bdac2e", & - "66435a472a7837a0e5d4e12", & - "9d0feced8745a66e328c310", & - "1791b0e7c5eaa43710c4276", & - "e5cbd2d5b4d65d3a432d97e", & - "c2241f8795e0e5bc6bd9052", & - "222d861201a4697c2689576", & - "aa2ee5d6d462e206f59cbe8", & - "e486eb73894e6a0964d8c40", & - "4099d5b42d36301cff6dbd6", & - "40c50b9341f7b5ea08dabde", & - "c90359074895363d428f072", & - "ca819cb6569fbfe26b68ef8", & - "4d983341fb56b8e1dae3450", & - "2dce341bc8fd0e5de04fa52", & - "3e7b01b376e3e5f6080de0e", & - "6c8b0813ca2394c08564f94", & - "c322ca8ea866784adc9451a", & - "6378aa1a03fab3e163aa4b0", & - "3c92ea8df0003883a021d70", & - "c793729067176eca26b83c2", & - "d3fae76046a36dff711207a", & - "bc9bf3ef57137fda1c325da", & - "a4eabe2df65a083ea6387c8", & - "650e3da3a0c0349154131d8", & - "1fb4c59ffc11c648ad06760", & - "1471f9599543f13fd7eb6ae", & - "6111012405186e84cba67ce", & - "c4da3574edafefff976fc08", & - "953f854e40701063115c0f2", & - "1f7ae6982f9a5733c44fb70", & - "83e101fe5e80c1b8541728e", & - "50375654edd53054f81e228", & - "1bb03a21a6cde34dff7ec96", & - "b0b279a934342aa0e188b3a", & - "e1989846a20a09cd77b1f64", & - "4eb68e01cb07fdbc83edee2", & - "f33ac4ec36a7c8e6ea8364c", & - "99b03a21a6c5e34dfffec96", & - "e50e3de3a1c034915413158", & - "fda09f8b05b8fb80ac78600", & - "ca8709be6b193204dd25ab0", & - "35701ff0cc3a03f213a93d2", & - "c2bfdec67f7b5a4c5ee7544", & - "dc184fe7e93a65c1b4b7cd2", & - "8cf8aac820f107d6ec6b30a", & - "e74b3da5a3e43d593d680e2", & - "c1e51f79db6124243fceadc", & - "29237d5d05dc1a4cca2ddd0", & - "050e76be4749b3b279d6414", & - "dd163959ae739673cde18c6", & - "03e100fe5e81c1b85417a8e", & - "06b2b17f70e75fc365bed20", & - "6df9e72abecd3e03e4b77fa", & - "4fa5370361b4bf3cf6b1296", & - "eabbf88f0a88307629bfd1c", & - "190674f88cf69989c8b8a40", & - "37740c13cfad07f61dcac3a", & - "4e7923bfa5d579590ef4ede", & - "fe74d37b8e5a63a2905da28", & - "2101e7a95979b2c5c44257e", & - "841f3ec7a4585a159fb5796", & - "aa7ff31d4b7f859c21254c2", & - "6e69229ba0cdb7ddcd50930", & - "29cfc4288af223bea58b96e", & - "5d03eba9f51956176b87abe", & - "399cbc33a7498b31d9f79e4", & - "034967e48ab80135b1c7fca", & - "721ad006ac715928df9775e", & - "37210b395327446ac7108f8", & - "52acf6de27477ea937e5330", & - "1f3a8549435c198b68231c8", & - "ef6809edb4a3557cd173d0a", & - "09a31639fef9c7a8b6fcae2", & - "03bc87c137eeec711c68d36", & - "b09347742319f90131d3146", & - "a723c9cef1de8c97f34c94c"/ - diff --git a/lib/fsk4hf/ldpc_174_91_a_params.f90 b/lib/fsk4hf/ldpc_174_91_a_params.f90 deleted file mode 100644 index dd44be23e..000000000 --- a/lib/fsk4hf/ldpc_174_91_a_params.f90 +++ /dev/null @@ -1,100 +0,0 @@ -integer, parameter:: N=174, K=91, M=N-K -character*23 g(83) -integer colorder(N) - -data g/ & - "2a6a9ab98f661b797baa21a", & - "5fda604488977fdc30ff630", & - "8a450007032409e8797b13a", & - "0f7923bfa5d559590ef6efe", & - "44dc14bc4461e645f847c78", & - "f8c66224febd3e60f5e3708", & - "6d60329e83fb0e1b1bdac2e", & - "66435a472a7837a0e5d4e12", & - "9d0feced8745a66e328c310", & - "1791b0e7c5eaa43710c4276", & - "e5cbd2d5b4d65d3a432d97e", & - "c2241f8795e0e5bc6bd9052", & - "222d861201a4697c2689576", & - "aa2ee5d6d462e206f59cbe8", & - "e486eb73894e6a0964d8c40", & - "4099d5b42d36301cff6dbd6", & - "40c50b9341f7b5ea08dabde", & - "c90359074895363d428f072", & - "ca819cb6569fbfe26b68ef8", & - "4d983341fb56b8e1dae3450", & - "2dce341bc8fd0e5de04fa52", & - "3e7b01b376e3e5f6080de0e", & - "6c8b0813ca2394c08564f94", & - "c322ca8ea866784adc9451a", & - "6378aa1a03fab3e163aa4b0", & - "3c92ea8df0003883a021d70", & - "c793729067176eca26b83c2", & - "d3fae76046a36dff711207a", & - "bc9bf3ef57137fda1c325da", & - "a4eabe2df65a083ea6387c8", & - "650e3da3a0c0349154131d8", & - "1fb4c59ffc11c648ad06760", & - "1471f9599543f13fd7eb6ae", & - "6111012405186e84cba67ce", & - "c4da3574edafefff976fc08", & - "953f854e40701063115c0f2", & - "1f7ae6982f9a5733c44fb70", & - "83e101fe5e80c1b8541728e", & - "50375654edd53054f81e228", & - "1bb03a21a6cde34dff7ec96", & - "b0b279a934342aa0e188b3a", & - "e1989846a20a09cd77b1f64", & - "4eb68e01cb07fdbc83edee2", & - "f33ac4ec36a7c8e6ea8364c", & - "99b03a21a6c5e34dfffec96", & - "e50e3de3a1c034915413158", & - "fda09f8b05b8fb80ac78600", & - "ca8709be6b193204dd25ab0", & - "35701ff0cc3a03f213a93d2", & - "c2bfdec67f7b5a4c5ee7544", & - "dc184fe7e93a65c1b4b7cd2", & - "8cf8aac820f107d6ec6b30a", & - "e74b3da5a3e43d593d680e2", & - "c1e51f79db6124243fceadc", & - "29237d5d05dc1a4cca2ddd0", & - "050e76be4749b3b279d6414", & - "dd163959ae739673cde18c6", & - "03e100fe5e81c1b85417a8e", & - "06b2b17f70e75fc365bed20", & - "6df9e72abecd3e03e4b77fa", & - "4fa5370361b4bf3cf6b1296", & - "eabbf88f0a88307629bfd1c", & - "190674f88cf69989c8b8a40", & - "37740c13cfad07f61dcac3a", & - "4e7923bfa5d579590ef4ede", & - "fe74d37b8e5a63a2905da28", & - "2101e7a95979b2c5c44257e", & - "841f3ec7a4585a159fb5796", & - "aa7ff31d4b7f859c21254c2", & - "6e69229ba0cdb7ddcd50930", & - "29cfc4288af223bea58b96e", & - "5d03eba9f51956176b87abe", & - "399cbc33a7498b31d9f79e4", & - "034967e48ab80135b1c7fca", & - "721ad006ac715928df9775e", & - "37210b395327446ac7108f8", & - "52acf6de27477ea937e5330", & - "1f3a8549435c198b68231c8", & - "ef6809edb4a3557cd173d0a", & - "09a31639fef9c7a8b6fcae2", & - "03bc87c137eeec711c68d36", & - "b09347742319f90131d3146", & - "a723c9cef1de8c97f34c94c"/ - -data colorder/ & - 0, 1, 2, 3, 28, 4, 5, 6, 7, 8, 9, 10, 11, 34, 12, 32, 13, 14, 15, 16,& - 17, 18, 36, 29, 40, 19, 20, 38, 21, 41, 30, 42, 22, 44, 37, 47, 48, 23, 33, 43,& - 49, 45, 56, 39, 25, 26, 46, 50, 51, 52, 24, 57, 58, 61, 31, 54, 64, 35, 27, 62,& - 59, 53, 60, 63, 55, 70, 66, 67, 68, 65, 71, 74, 72, 73, 77, 75, 69, 76, 79, 82,& - 83, 78, 81, 80, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,& - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,& - 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,& - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,& - 160,161,162,163,164,165,166,167,168,169,170,171,172,173/ - diff --git a/lib/fsk4hf/ldpc_174_91_a_parity.f90 b/lib/fsk4hf/ldpc_174_91_a_parity.f90 deleted file mode 100644 index 44f36463f..000000000 --- a/lib/fsk4hf/ldpc_174_91_a_parity.f90 +++ /dev/null @@ -1,269 +0,0 @@ -data Mn/ & - 1, 24, 66, & - 2, 5, 70, & - 3, 31, 65, & - 4, 49, 58, & - 6, 60, 67, & - 7, 32, 75, & - 8, 48, 82, & - 9, 35, 41, & - 10, 39, 62, & - 11, 14, 61, & - 12, 71, 74, & - 13, 23, 78, & - 15, 16, 79, & - 17, 54, 63, & - 18, 50, 57, & - 19, 30, 47, & - 20, 64, 80, & - 21, 28, 69, & - 22, 25, 43, & - 26, 34, 72, & - 27, 36, 37, & - 29, 40, 44, & - 33, 52, 53, & - 38, 55, 83, & - 42, 51, 59, & - 45, 76, 81, & - 46, 68, 77, & - 56, 67, 73, & - 1, 4, 5, & - 2, 47, 51, & - 3, 46, 82, & - 6, 24, 76, & - 7, 9, 16, & - 8, 10, 78, & - 11, 35, 55, & - 12, 38, 64, & - 13, 42, 83, & - 14, 27, 54, & - 15, 21, 34, & - 17, 44, 53, & - 18, 25, 28, & - 19, 33, 57, & - 20, 22, 73, & - 23, 40, 81, & - 26, 49, 68, & - 29, 71, 75, & - 30, 65, 79, & - 31, 36, 60, & - 32, 43, 77, & - 37, 62, 70, & - 39, 69, 74, & - 41, 52, 66, & - 45, 50, 61, & - 48, 63, 80, & - 56, 59, 72, & - 58, 64, 65, & - 1, 13, 28, & - 2, 48, 75, & - 3, 53, 69, & - 4, 11, 44, & - 5, 73, 79, & - 6, 12, 17, & - 7, 57, 60, & - 8, 15, 61, & - 9, 39, 59, & - 10, 19, 49, & - 14, 43, 52, & - 16, 54, 68, & - 18, 41, 63, & - 20, 36, 45, & - 21, 67, 77, & - 10, 22, 55, & - 23, 65, 72, & - 24, 27, 82, & - 25, 26, 29, & - 30, 35, 37, & - 31, 51, 66, & - 17, 32, 78, & - 33, 42, 76, & - 34, 70, 83, & - 38, 46, 81, & - 40, 62, 80, & - 45, 47, 74, & - 50, 56, 71, & - 7, 37, 58, & - 1, 16, 71, & - 2, 6, 61, & - 3, 22, 50, & - 4, 59, 77, & - 5, 41, 81, & - 8, 58, 74, & - 9, 20, 26, & - 11, 21, 31, & - 12, 66, 79, & - 13, 14, 57, & - 15, 33, 40, & - 18, 44, 82, & - 19, 69, 83, & - 23, 49, 63, & - 24, 29, 39, & - 25, 47, 56, & - 27, 55, 72, & - 28, 64, 70, & - 30, 48, 77, & - 32, 34, 45, & - 35, 68, 80, & - 36, 38, 52, & - 42, 43, 62, & - 46, 60, 78, & - 51, 54, 67, & - 53, 73, 75, & - 14, 73, 76, & - 1, 22, 30, & - 2, 35, 43, & - 3, 47, 63, & - 4, 25, 76, & - 5, 33, 78, & - 6, 20, 83, & - 7, 12, 72, & - 8, 54, 70, & - 9, 61, 65, & - 10, 34, 51, & - 11, 46, 75, & - 13, 39, 68, & - 15, 17, 56, & - 16, 23, 36, & - 18, 32, 55, & - 19, 31, 81, & - 21, 37, 71, & - 24, 57, 64, & - 26, 38, 48, & - 27, 49, 50, & - 28, 52, 59, & - 29, 41, 58, & - 40, 60, 74, & - 42, 44, 79, & - 51, 53, 80, & - 62, 67, 82, & - 23, 66, 69, & - 1, 53, 61, & - 2, 18, 39, & - 3, 4, 12, & - 5, 26, 74, & - 6, 30, 52, & - 7, 82, 83, & - 8, 35, 73, & - 9, 19, 67, & - 10, 64, 75, & - 11, 20, 33, & - 13, 45, 48, & - 3, 14, 40, & - 15, 43, 49, & - 16, 55, 76, & - 17, 62, 65, & - 21, 47, 78, & - 22, 59, 81, & - 24, 34, 63, & - 25, 37, 66, & - 27, 79, 80, & - 28, 60, 79, & - 29, 31, 70, & - 32, 58, 69, & - 10, 36, 77, & - 38, 50, 51, & - 13, 41, 56, & - 42, 63, 71, & - 44, 47, 68, & - 1, 46, 72, & - 54, 57, 75, & - 2, 33, 58, & - 4, 17, 83, & - 5, 14, 55, & - 6, 23, 48, & - 7, 52, 56/ - -data Nm/ & - 1, 29, 57, 86, 113, 140, 168, & - 2, 30, 58, 87, 114, 141, 170, & - 3, 31, 59, 88, 115, 142, 151, & - 4, 29, 60, 89, 116, 142, 171, & - 2, 29, 61, 90, 117, 143, 172, & - 5, 32, 62, 87, 118, 144, 173, & - 6, 33, 63, 85, 119, 145, 174, & - 7, 34, 64, 91, 120, 146, 0, & - 8, 33, 65, 92, 121, 147, 0, & - 9, 34, 66, 72, 122, 148, 163, & - 10, 35, 60, 93, 123, 149, 0, & - 11, 36, 62, 94, 119, 142, 0, & - 12, 37, 57, 95, 124, 150, 165, & - 10, 38, 67, 95, 112, 151, 172, & - 13, 39, 64, 96, 125, 152, 0, & - 13, 33, 68, 86, 126, 153, 0, & - 14, 40, 62, 78, 125, 154, 171, & - 15, 41, 69, 97, 127, 141, 0, & - 16, 42, 66, 98, 128, 147, 0, & - 17, 43, 70, 92, 118, 149, 0, & - 18, 39, 71, 93, 129, 155, 0, & - 19, 43, 72, 88, 113, 156, 0, & - 12, 44, 73, 99, 126, 139, 173, & - 1, 32, 74, 100, 130, 157, 0, & - 19, 41, 75, 101, 116, 158, 0, & - 20, 45, 75, 92, 131, 143, 0, & - 21, 38, 74, 102, 132, 159, 0, & - 18, 41, 57, 103, 133, 160, 0, & - 22, 46, 75, 100, 134, 161, 0, & - 16, 47, 76, 104, 113, 144, 0, & - 3, 48, 77, 93, 128, 161, 0, & - 6, 49, 78, 105, 127, 162, 0, & - 23, 42, 79, 96, 117, 149, 170, & - 20, 39, 80, 105, 122, 157, 0, & - 8, 35, 76, 106, 114, 146, 0, & - 21, 48, 70, 107, 126, 163, 0, & - 21, 50, 76, 85, 129, 158, 0, & - 24, 36, 81, 107, 131, 164, 0, & - 9, 51, 65, 100, 124, 141, 0, & - 22, 44, 82, 96, 135, 151, 0, & - 8, 52, 69, 90, 134, 165, 0, & - 25, 37, 79, 108, 136, 166, 0, & - 19, 49, 67, 108, 114, 152, 0, & - 22, 40, 60, 97, 136, 167, 0, & - 26, 53, 70, 83, 105, 150, 0, & - 27, 31, 81, 109, 123, 168, 0, & - 16, 30, 83, 101, 115, 155, 167, & - 7, 54, 58, 104, 131, 150, 173, & - 4, 45, 66, 99, 132, 152, 0, & - 15, 53, 84, 88, 132, 164, 0, & - 25, 30, 77, 110, 122, 137, 164, & - 23, 52, 67, 107, 133, 144, 174, & - 23, 40, 59, 111, 137, 140, 0, & - 14, 38, 68, 110, 120, 169, 0, & - 24, 35, 72, 102, 127, 153, 172, & - 28, 55, 84, 101, 125, 165, 174, & - 15, 42, 63, 95, 130, 169, 0, & - 4, 56, 85, 91, 134, 162, 170, & - 25, 55, 65, 89, 133, 156, 0, & - 5, 48, 63, 109, 135, 160, 0, & - 10, 53, 64, 87, 121, 140, 0, & - 9, 50, 82, 108, 138, 154, 0, & - 14, 54, 69, 99, 115, 157, 166, & - 17, 36, 56, 103, 130, 148, 0, & - 3, 47, 56, 73, 121, 154, 0, & - 1, 52, 77, 94, 139, 158, 0, & - 5, 28, 71, 110, 138, 147, 0, & - 27, 45, 68, 106, 124, 167, 0, & - 18, 51, 59, 98, 139, 162, 0, & - 2, 50, 80, 103, 120, 161, 0, & - 11, 46, 84, 86, 129, 166, 0, & - 20, 55, 73, 102, 119, 168, 0, & - 28, 43, 61, 111, 112, 146, 0, & - 11, 51, 83, 91, 135, 143, 0, & - 6, 46, 58, 111, 123, 148, 169, & - 26, 32, 79, 112, 116, 153, 0, & - 27, 49, 71, 89, 104, 163, 0, & - 12, 34, 78, 109, 117, 155, 0, & - 13, 47, 61, 94, 136, 159, 160, & - 17, 54, 82, 106, 137, 159, 0, & - 26, 44, 81, 90, 128, 156, 0, & - 7, 31, 74, 97, 138, 145, 0, & - 24, 37, 80, 98, 118, 145, 171/ - -data nrw/ & - 7,7,7,7,7,7,7,6,6,7,6,6,7,7,6,6,7,6, & - 6,6,6,6,7,6,6,6,6,6,6,6,6,6,7,6,6,6, & - 6,6,6,6,6,6,6,6,6,6,7,7,6,6,7,7,6,6, & - 7,7,6,7,6,6,6,6,7,6,6,6,6,6,6,6,6,6, & - 6,6,7,6,6,6,7,6,6,6,7/ - -ncw=3 diff --git a/lib/fsk4hf/ldpc_204_68_params.f90 b/lib/fsk4hf/ldpc_204_68_params.f90 deleted file mode 100644 index 6e75ef114..000000000 --- a/lib/fsk4hf/ldpc_204_68_params.f90 +++ /dev/null @@ -1,154 +0,0 @@ -integer, parameter:: N=204, K=68, M=N-K -character*17 g(136) -integer colorder(N) -data g/ & !parity generator matrix for (204,68) code - "2de7435fd27c0031d", & - "f331b40671e20ea80", & - "48bd3f8cb9a24392f", & - "d4ed71c935162aa2a", & - "c437a3284ec58bce7", & - "35a806dd5be35627c", & - "396e797c33a4739a6", & - "768f331a59c15487b", & - "c214eac24ae5e1732", & - "0b5c53ff3a6da1192", & - "99624981d2703fb97", & - "e9f5447ef7f1ff6af", & - "bd8c730f0cfdf0727", & - "26f61e63e1e098f7f", & - "ef826566137b6526f", & - "af0e4fa251e9b4926", & - "75974a8b2a24292c5", & - "71caf0f2cd10f6d4f", & - "b1103f1f26e6898b7", & - "67ceb7d6f490da64f", & - "ee0e8fbefec23008a", & - "11cc2227e8bd676ca", & - "6e71626ba1e278046", & - "005d28da267e50e13", & - "a9ae4a130aaba8219", & - "d8ab72e0158d0da70", & - "56009d42b37bd66ff", & - "c39a75eca99b0e996", & - "6886de0bf7c0bf4bb", & - "1046cd8f64162f7b5", & - "da0f15843ac21e3a5", & - "e9bf9cd19f3db3913", & - "2fb9cb42d650f47a7", & - "a2b6c5a378fa75a65", & - "41a88f3cd60b79d6c", & - "fcf175794cc3ac96a", & - "8677a3447d40a9f71", & - "97a1f08c250b4bf12", & - "0168f090a1df6e8ea", & - "418a06bf372cc67d9", & - "0f17b880c1ff51239", & - "b2afd6d585deb961b", & - "60298ac5b58dbeee0", & - "8350c03c40119feff", & - "b29c964a8accf6af4", & - "9b46f036a5c178b5d", & - "917398bff051c300a", & - "5e52c03b2f8c5128c", & - "beae6c33c87ba38ab", & - "20843f7b056a02ebf", & - "66690d65acd9de598", & - "8f025841af5b54331", & - "b43cd869d3be2c3db", & - "c9c342fe63c18df50", & - "d331b40671e28ea80", & - "62406a0f4947e6ce9", & - "d67b1495883b22e1b", & - "734534c372408895b", & - "d88750e33d9677dcd", & - "6f96964da55138687", & - "80bee98bb75d50ef2", & - "c428ef3e3f06f4c56", & - "b1a1499b125883a35", & - "ac892d4b37fa9e395", & - "458dbda0f95ab11a5", & - "6f93c9e95b1094eed", & - "2e370d713914f848e", & - "758806dd5be35627c", & - "8c52e01caec798b49", & - "c286cc25bae3669cf", & - "87c56fb895c100884", & - "e89cb1376a18fd911", & - "156ffe5f30dc354e0", & - "f20d0b121d6a6b3ee", & - "7db08891b491a95d2", & - "191fac548d5077bdf", & - "023a37d7ea5660bbc", & - "6781668b363fee682", & - "bbfaf262cab7370da", & - "feea557965b7e474f", & - "c094eb223e1d305b8", & - "2be051abdd5beea35", & - "0790449880fda9d00", & - "f9029a39ec869e7b4", & - "5a29f48926ec9a552", & - "e0463306dc1470f87", & - "9251058334d790f86", & - "3019e1d4578e8a4dc", & - "887e46631502fa111", & - "c25fcd7a42465d326", & - "cf64bcc1056b555c4", & - "3e71c0fe5f0ad733b", & - "11055ec43b076e5b2", & - "3440f64dfa3c30a96", & - "2b73885b4d3299f60", & - "2e71627ba1e268046", & - "ad23743d5e6e5b80c", & - "c9757b05f29bfdc10", & - "f7112bea739247b51", & - "3664062387998b2b1", & - "90897a3b8785aefba", & - "29e126e3201fc1d46", & - "96c9001c84d5257fc", & - "067723447d40a9f71", & - "1a019cc68f7511402", & - "4bd48eb2330032763", & - "d139a5da936b37647", & - "765ab46a4dec5f04f", & - "706f475ad19b91955", & - "1755c988fa8a55e5c", & - "2fd9ed5777eb01d6a", & - "bec27d85b954d3fe8", & - "7135a3b92c45b3f8d", & - "353237872f002163a", & - "e31e4a97aef10c729", & - "da527d5e1cbc4edb6", & - "6e33cdede17c3207e", & - "ef2d2062e84dc401f", & - "8217c84c50c1bf833", & - "12ffbac7b2219c9e0", & - "3729178706f66881f", & - "2fdd748c382a608a1", & - "dd0a00076f9dcec73", & - "46b1d37bced447035", & - "7316f33a9c05ef178", & - "152c39a6de8954cc3", & - "16efffb7b62e12ba3", & - "9d9ec2bb467affd83", & - "467723445d40a9f61", & - "87994762b3bf50697", & - "b1bfa5b51526dde9b", & - "b0a6a19d709a96148", & - "990d567c0aba31a14", & - "171f190792461b1e0", & - "166011c27d2b6b8a4", & - "170c15831244ae73e"/ - -data colorder/ & - 0, 1, 2, 3, 4, 5, 47, 6, 7, 8, 9, 10, 11, 12, 58, 55, 13, & - 14, 15, 46, 17, 18, 60, 19, 20, 21, 22, 23, 24, 25, 57, 26, 27, 49, & - 28, 52, 65, 16, 50, 73, 59, 68, 63, 29, 30, 31, 32, 51, 62, 56, 66, & - 45, 33, 34, 53, 67, 35, 36, 37, 61, 69, 54, 38, 71, 82, 39, 77, 80, & - 83, 78, 84, 48, 41, 85, 40, 64, 75, 96, 74, 72, 76, 86, 87, 89, 90, & - 79, 70, 92, 99, 93,101, 95,100, 97, 94, 42, 98,103,105,102, 43,104, & - 88, 44,106, 81,107,110,108,111,112,109,113,114,117,118,116,121,115, & - 119,122,120,125,129,124,127,126,128, 91,123,133,131,130,134,135,137, & - 136,132,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, & - 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, & - 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, & - 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203/ diff --git a/lib/fsk4hf/ldpc_240_101_generator.f90 b/lib/fsk4hf/ldpc_240_101_generator.f90 deleted file mode 100644 index 782e0a211..000000000 --- a/lib/fsk4hf/ldpc_240_101_generator.f90 +++ /dev/null @@ -1,142 +0,0 @@ -character*26 g(139) - -data g/ & - "e28df133efbc554bcd30eb1828", & - "b1adf97787f81b4ac02e0caff8", & - "e70c43adce5036f847af367560", & - "c26663f7f7acafdf5abacb6f30", & - "eba93204ddfa3bcf994aea8998", & - "126b51e33c6a740afa0d5ce990", & - "b41a1569e6fede1f2f5395cb68", & - "1d3af0bb43fddbc670a291cc70", & - "e0aebd9921e2c9e1d453ffccb0", & - "897d1370f0df94b8b27a5e4fb8", & - "5e97539338003b13fa8198ad38", & - "7276b87da4a4d777e2752fdd48", & - "989888bd3a85835e2bc6a560f8", & - "7ec4f4a56199ab0a8d6e102478", & - "207007665090258782d1b38a98", & - "1ea1f61cd7f0b7eed7dd346ab8", & - "08f150b27c7f18a027783de0e8", & - "d42324a4e21b62d548d7865858", & - "2e029656269d4fe46e167d21d0", & - "7d84acb7737b0ca6b6f2ef5eb0", & - "6674ca04528ad4782bf5e15248", & - "118ce9825f563ae4963af7a0b0", & - "fb06248cc985e314b1b36ccd38", & - "1c478b7a5aec7e1cfc9c24eb70", & - "185a0f06a84f7f4f484c455020", & - "98b840a3a70688cd58588e3e30", & - "cfb7719de83a3baf582e5b2aa0", & - "9d8cc6b5a01fdbfa307a769048", & - "ed776a728ca162d6fcc8996760", & - "8d2b068128dfb2f8d22c79db50", & - "bd2ba50007789ffb7324aa9190", & - "fd95008fe88812025e78065610", & - "3027849be8e99f9ef68eac1020", & - "88574e1ea39d87414b15e803a8", & - "89365b330e76e6dde740dced08", & - "c83f37b913ed0f6b802aaf21d8", & - "bdca7c1959caa7488b7eb13030", & - "794e0b4888e1ef42992287dd98", & - "526ac87fbaa790c6cd58864e08", & - "940518ba1a51c1da55bc8b2d70", & - "59c5e51ebfbd02ab30ff822378", & - "c81fff87866e04f8f3948c7f10", & - "7913513f3e2a3c0f76b69f6d68", & - "e43cc04da189c44803c4f740a0", & - "fdca7c1959ca85488b7eb13030", & - "95b07fce9b7b1bf4f057ca61b8", & - "d7db48a86691a0c0c9305aac90", & - "0d50bf79a59464597c43ba8058", & - "4a9c34b23fd5eaff8c9dc215e0", & - "3d5305a6f0427938eeb9d1c118", & - "55d8b6b58039f7a3a2d592a900", & - "784f349ecb74c4abbdbb073b90", & - "5973bbb2205f9d6a5c9a55c238", & - "5d2ee61006fec94f69f6b0f460", & - "9e1f52ef1e6589990dd0ce0cc8", & - "85b7b48f4b45775c9f8a36cc90", & - "ae1d6a0171168f6d70804b79f8", & - "a467aa9aa6cdc7094677c730d8", & - "dcf2f56c9ae20fb57e89b916d0", & - "3ae98d26ae96ea714c1a5146d0", & - "103c89581446805b8c71b2e638", & - "6783f3dfec835dd4e92131cc20", & - "52f88428c50f12c55876f7d8a8", & - "51fcb0e56a22fa3b7140aeaa80", & - "07c54871155603e65325f66cd8", & - "a8dd4fac47a113ee5706eef180", & - "f6cdc6f4cc1fa7e4db15bf86f8", & - "2e1c6a0171168f6d70c04a79f8", & - "2a90ab82bef6424db981752dc8", & - "845a1db59c193249d937e889d0", & - "a929d379f1769cb4baa4e41e90", & - "0c2a5829548d82223d6f566d48", & - "420087bc5c4e2f5bc139ad0220", & - "6df8d880ae7209fe52c69ede00", & - "dfbdcef29a985fd40d052d1a88", & - "8567fc332342b1ed8408f5fa00", & - "c908feb4e1866a24ca0c702a08", & - "645f5ee59f9f64fd43a5f2ec30", & - "bee56991e877baf3e9cf11b770", & - "649ea2e4194ca51be28abf3430", & - "90e7394c551bd58d00686d5420", & - "4e3cf731f8f89e8414214afaf0", & - "dcbf16aa8180a7712571e94f98", & - "9b456c015999c52b7fbd1ab390", & - "397ab76924659c4b8b3be4ac58", & - "4f5038c4f9da4b02bdfa178278", & - "4892fada978c98dd4fd363c450", & - "6c8af64b426bc474431c110c98", & - "84a553be5ef0e57390a5af05b0", & - "bed4a9347c9a2064f6d63ac0f8", & - "d973bbb2605f9d6a5c9a57c238", & - "1e3bee9a99fe10d3864ee669d8", & - "a590771ff185d807cb32f46000", & - "9a498fc4b549d81c625f80fc90", & - "28b3e72878aadee7e0e2617950", & - "96ce025d621a91396aa8f3ec20", & - "4f5a77becf838a590d6d406ea8", & - "52d3856dfb9fe78012f10e25c0", & - "b45323c2b28b4752ca0675d2e0", & - "3bae5a8452a785beb35851ad18", & - "65098832d20d915e75bea336e8", & - "5eb6f3c331098e8c0fbfa3aee0", & - "ef19d974a25540c8998fbf1df0", & - "403ea58feff08cf92d5cacc780", & - "6ba93204ddfa7bcb994aea8998", & - "653909166aa7bead4bd9c90020", & - "089cb20e639bc5a44da66f17c0", & - "10f803949961359e994f5ade88", & - "15b7ec1e6106cd55ef7d996590", & - "c99e99de9d85d2b999a17a95d8", & - "ca3e161b97148bac6dd28a6178", & - "e1ab199c992cb4c22aee115358", & - "ea8a4d0e96d3d9f827899b6d88", & - "8af4992d60223f021569a8ab60", & - "5087771abceb87a6d872291fe8", & - "d045e0812e217bb7bbdac92f30", & - "ccccd78ae5fa6e191f21c06908", & - "54545f37df6fed4734ef6509b0", & - "b0780327d899cbc03d95a81a48", & - "a4229c31f2b85e44a322273d50", & - "d182ab001c2085ea7be26a20d0", & - "1a82c30b4fba7dfaafb8d287a8", & - "d974fba598e7fb0630c1587db0", & - "b5c078a8cbab3e73728659ea20", & - "626bbf9eed1a8715c3a7d38f60", & - "c1efe9aa67130865fda93d8be8", & - "d39796dbce155df6306e7b77c0", & - "c7e7c1f032d7209b4549e84aa8", & - "d5799b30a1605baf6b9cd04960", & - "0baf2d21051a926dfd87046d70", & - "da8bf7d1e305c499b573c02cc8", & - "0ccaa7fffb9ae3e42dd0688328", & - "b951b62e18f5290ac13c195130", & - "79b006f001961fb233be80d0e8", & - "56637b6dedfd6e050f06404a48", & - "e0c4bf71a15597523bbd57bde0", & - "1312231ffa04426a34a8fab038", & - "db5f6f0455d24b8358d1cbc3d8", & - "d559e31b34d21f48e1f501af30"/ diff --git a/lib/fsk4hf/ldpc_240_101_parity.f90 b/lib/fsk4hf/ldpc_240_101_parity.f90 deleted file mode 100644 index d3c1280c6..000000000 --- a/lib/fsk4hf/ldpc_240_101_parity.f90 +++ /dev/null @@ -1,393 +0,0 @@ -data Mn/ & - 57, 100, 134, & - 56, 99, 136, & - 1, 12, 15, & - 2, 23, 72, & - 3, 133, 137, & - 4, 93, 125, & - 5, 68, 139, & - 6, 38, 55, & - 7, 40, 78, & - 8, 30, 84, & - 9, 17, 122, & - 10, 34, 95, & - 11, 36, 138, & - 13, 90, 132, & - 14, 50, 117, & - 16, 57, 83, & - 18, 22, 121, & - 19, 60, 89, & - 20, 98, 107, & - 21, 37, 61, & - 24, 26, 75, & - 25, 88, 115, & - 27, 49, 127, & - 28, 74, 119, & - 29, 111, 114, & - 31, 91, 129, & - 32, 96, 104, & - 30, 33, 130, & - 35, 65, 135, & - 41, 42, 87, & - 44, 108, 131, & - 45, 94, 101, & - 45, 46, 97, & - 47, 102, 134, & - 48, 64, 104, & - 19, 51, 116, & - 20, 52, 67, & - 53, 104, 113, & - 12, 54, 103, & - 58, 66, 88, & - 62, 80, 124, & - 63, 70, 71, & - 73, 114, 123, & - 76, 85, 128, & - 77, 106, 109, & - 46, 79, 126, & - 61, 81, 110, & - 82, 92, 120, & - 86, 105, 112, & - 66, 100, 118, & - 23, 51, 136, & - 1, 40, 53, & - 2, 73, 81, & - 3, 63, 130, & - 4, 68, 136, & - 5, 60, 78, & - 6, 72, 131, & - 7, 115, 124, & - 8, 89, 120, & - 9, 15, 44, & - 10, 22, 93, & - 11, 49, 100, & - 13, 55, 80, & - 14, 76, 95, & - 16, 54, 111, & - 17, 41, 110, & - 18, 69, 139, & - 21, 24, 116, & - 25, 39, 71, & - 26, 69, 90, & - 27, 101, 133, & - 28, 64, 126, & - 29, 94, 103, & - 31, 56, 57, & - 32, 91, 102, & - 33, 35, 129, & - 34, 47, 128, & - 36, 86, 117, & - 37, 74, 75, & - 38, 79, 106, & - 42, 82, 123, & - 43, 77, 99, & - 48, 70, 92, & - 50, 109, 118, & - 52, 112, 119, & - 58, 62, 108, & - 59, 84, 134, & - 57, 65, 122, & - 67, 97, 113, & - 83, 127, 135, & - 85, 121, 125, & - 87, 132, 137, & - 96, 98, 105, & - 73, 107, 138, & - 1, 83, 89, & - 2, 41, 70, & - 3, 35, 131, & - 4, 111, 128, & - 5, 29, 99, & - 6, 25, 31, & - 7, 19, 96, & - 1, 39, 110, & - 2, 7, 117, & - 3, 49, 109, & - 4, 81, 96, & - 5, 100, 108, & - 6, 51, 124, & - 2, 20, 132, & - 8, 80, 137, & - 9, 56, 67, & - 10, 63, 102, & - 11, 16, 101, & - 12, 115, 122, & - 13, 32, 128, & - 14, 15, 130, & - 14, 70, 99, & - 11, 51, 69, & - 17, 89, 105, & - 18, 83, 99, & - 19, 44, 79, & - 20, 106, 133, & - 10, 21, 123, & - 22, 23, 61, & - 16, 22, 60, & - 24, 38, 114, & - 25, 37, 42, & - 26, 43, 52, & - 27, 68, 71, & - 28, 65, 139, & - 29, 62, 69, & - 30, 92, 126, & - 31, 78, 123, & - 13, 44, 78, & - 33, 40, 120, & - 7, 34, 119, & - 4, 35, 77, & - 12, 36, 52, & - 25, 98, 136, & - 5, 24, 133, & - 1, 80, 91, & - 33, 96, 97, & - 34, 41, 91, & - 32, 37, 117, & - 26, 72, 125, & - 19, 65, 75, & - 45, 131, 136, & - 46, 55, 70, & - 47, 48, 50, & - 6, 48, 94, & - 3, 74, 79, & - 39, 50, 126, & - 23, 118, 127, & - 21, 36, 113, & - 53, 77, 134, & - 30, 54, 55, & - 17, 46, 135, & - 9, 92, 102, & - 57, 85, 87, & - 58, 125, 138, & - 59, 76, 93, & - 60, 66, 107, & - 47, 132, 138, & - 29, 85, 131, & - 43, 73, 108, & - 64, 75, 129, & - 28, 38, 53, & - 61, 106, 122, & - 56, 71, 114, & - 27, 57, 120, & - 62, 67, 130, & - 54, 104, 118, & - 8, 68, 115, & - 72, 86, 111, & - 73, 74, 94, & - 49, 105, 113, & - 42, 86, 121, & - 40, 59, 109, & - 35, 88, 95, & - 31, 107, 112, & - 58, 64, 87, & - 68, 79, 104, & - 1, 5, 121, & - 15, 82, 93, & - 18, 88, 116, & - 82, 84, 119, & - 7, 71, 103, & - 4, 80, 94, & - 63, 81, 84, & - 66, 76, 137, & - 83, 124, 129, & - 90, 112, 116, & - 89, 111, 134, & - 6, 21, 120, & - 3, 16, 25, & - 12, 28, 131, & - 45, 95, 110, & - 17, 93, 124, & - 97, 121, 127, & - 98, 103, 135, & - 8, 99, 138, & - 41, 101, 139, & - 13, 24, 105, & - 14, 53, 107, & - 10, 64, 98, & - 11, 35, 78, & - 90, 100, 103, & - 9, 72, 101, & - 18, 74, 92, & - 15, 73, 87, & - 2, 88, 113, & - 20, 55, 85, & - 19, 67, 110, & - 26, 27, 95, & - 22, 50, 114, & - 29, 49, 81, & - 32, 52, 83, & - 30, 37, 77, & - 39, 128, 135, & - 23, 128, 130, & - 36, 76, 126, & - 33, 132, 139, & - 34, 89, 118, & - 38, 58, 127, & - 31, 54, 125, & - 40, 70, 75, & - 41, 109, 116, & - 43, 60, 63, & - 44, 84, 86, & - 42, 47, 62, & - 45, 82, 90, & - 43, 46, 91, & - 48, 112, 122, & - 51, 102, 133, & - 59, 61, 108, & - 65, 117, 137, & - 56, 66, 96, & - 59, 69, 104, & - 39, 69, 119, & - 97, 115, 123, & - 106, 111, 129/ - -data Nm/ & - 3, 52, 95, 102, 140, 182, & - 4, 53, 96, 103, 108, 210, & - 5, 54, 97, 104, 150, 194, & - 6, 55, 98, 105, 136, 187, & - 7, 56, 99, 106, 139, 182, & - 8, 57, 100, 107, 149, 193, & - 9, 58, 101, 103, 135, 186, & - 10, 59, 109, 172, 200, 0, & - 11, 60, 110, 157, 207, 0, & - 12, 61, 111, 122, 204, 0, & - 13, 62, 112, 117, 205, 0, & - 3, 39, 113, 137, 195, 0, & - 14, 63, 114, 133, 202, 0, & - 15, 64, 115, 116, 203, 0, & - 3, 60, 115, 183, 209, 0, & - 16, 65, 112, 124, 194, 0, & - 11, 66, 118, 156, 197, 0, & - 17, 67, 119, 184, 208, 0, & - 18, 36, 101, 120, 145, 212, & - 19, 37, 108, 121, 211, 0, & - 20, 68, 122, 153, 193, 0, & - 17, 61, 123, 124, 214, 0, & - 4, 51, 123, 152, 219, 0, & - 21, 68, 125, 139, 202, 0, & - 22, 69, 100, 126, 138, 194, & - 21, 70, 127, 144, 213, 0, & - 23, 71, 128, 169, 213, 0, & - 24, 72, 129, 166, 195, 0, & - 25, 73, 99, 130, 163, 215, & - 10, 28, 131, 155, 217, 0, & - 26, 74, 100, 132, 179, 224, & - 27, 75, 114, 143, 216, 0, & - 28, 76, 134, 141, 221, 0, & - 12, 77, 135, 142, 222, 0, & - 29, 76, 97, 136, 178, 205, & - 13, 78, 137, 153, 220, 0, & - 20, 79, 126, 143, 217, 0, & - 8, 80, 125, 166, 223, 0, & - 69, 102, 151, 218, 238, 0, & - 9, 52, 134, 177, 225, 0, & - 30, 66, 96, 142, 201, 226, & - 30, 81, 126, 176, 229, 0, & - 82, 127, 164, 227, 231, 0, & - 31, 60, 120, 133, 228, 0, & - 32, 33, 146, 196, 230, 0, & - 33, 46, 147, 156, 231, 0, & - 34, 77, 148, 162, 229, 0, & - 35, 83, 148, 149, 232, 0, & - 23, 62, 104, 175, 215, 0, & - 15, 84, 148, 151, 214, 0, & - 36, 51, 107, 117, 233, 0, & - 37, 85, 127, 137, 216, 0, & - 38, 52, 154, 166, 203, 0, & - 39, 65, 155, 171, 224, 0, & - 8, 63, 147, 155, 211, 0, & - 2, 74, 110, 168, 236, 0, & - 1, 16, 74, 88, 158, 169, & - 40, 86, 159, 180, 223, 0, & - 87, 160, 177, 234, 237, 0, & - 18, 56, 124, 161, 227, 0, & - 20, 47, 123, 167, 234, 0, & - 41, 86, 130, 170, 229, 0, & - 42, 54, 111, 188, 227, 0, & - 35, 72, 165, 180, 204, 0, & - 29, 88, 129, 145, 235, 0, & - 40, 50, 161, 189, 236, 0, & - 37, 89, 110, 170, 212, 0, & - 7, 55, 128, 172, 181, 0, & - 67, 70, 117, 130, 237, 238, & - 42, 83, 96, 116, 147, 225, & - 42, 69, 128, 168, 186, 0, & - 4, 57, 144, 173, 207, 0, & - 43, 53, 94, 164, 174, 209, & - 24, 79, 150, 174, 208, 0, & - 21, 79, 145, 165, 225, 0, & - 44, 64, 160, 189, 220, 0, & - 45, 82, 136, 154, 217, 0, & - 9, 56, 132, 133, 205, 0, & - 46, 80, 120, 150, 181, 0, & - 41, 63, 109, 140, 187, 0, & - 47, 53, 105, 188, 215, 0, & - 48, 81, 183, 185, 230, 0, & - 16, 90, 95, 119, 190, 216, & - 10, 87, 185, 188, 228, 0, & - 44, 91, 158, 163, 211, 0, & - 49, 78, 173, 176, 228, 0, & - 30, 92, 158, 180, 209, 0, & - 22, 40, 178, 184, 210, 0, & - 18, 59, 95, 118, 192, 222, & - 14, 70, 191, 206, 230, 0, & - 26, 75, 140, 142, 231, 0, & - 48, 83, 131, 157, 208, 0, & - 6, 61, 160, 183, 197, 0, & - 32, 73, 149, 174, 187, 0, & - 12, 64, 178, 196, 213, 0, & - 27, 93, 101, 105, 141, 236, & - 33, 89, 141, 198, 239, 0, & - 19, 93, 138, 199, 204, 0, & - 2, 82, 99, 116, 119, 200, & - 1, 50, 62, 106, 206, 0, & - 32, 71, 112, 201, 207, 0, & - 34, 75, 111, 157, 233, 0, & - 39, 73, 186, 199, 206, 0, & - 27, 35, 38, 171, 181, 237, & - 49, 93, 118, 175, 202, 0, & - 45, 80, 121, 167, 240, 0, & - 19, 94, 161, 179, 203, 0, & - 31, 86, 106, 164, 234, 0, & - 45, 84, 104, 177, 226, 0, & - 47, 66, 102, 196, 212, 0, & - 25, 65, 98, 173, 192, 240, & - 49, 85, 179, 191, 232, 0, & - 38, 89, 153, 175, 210, 0, & - 25, 43, 125, 168, 214, 0, & - 22, 58, 113, 172, 239, 0, & - 36, 68, 184, 191, 226, 0, & - 15, 78, 103, 143, 235, 0, & - 50, 84, 152, 171, 222, 0, & - 24, 85, 135, 185, 238, 0, & - 48, 59, 134, 169, 193, 0, & - 17, 91, 176, 182, 198, 0, & - 11, 88, 113, 167, 232, 0, & - 43, 81, 122, 132, 239, 0, & - 41, 58, 107, 190, 197, 0, & - 6, 91, 144, 159, 224, 0, & - 46, 72, 131, 151, 220, 0, & - 23, 90, 152, 198, 223, 0, & - 44, 77, 98, 114, 218, 219, & - 26, 76, 165, 190, 240, 0, & - 28, 54, 115, 170, 219, 0, & - 31, 57, 97, 146, 163, 195, & - 14, 92, 108, 162, 221, 0, & - 5, 71, 121, 139, 233, 0, & - 1, 34, 87, 154, 192, 0, & - 29, 90, 156, 199, 218, 0, & - 2, 51, 55, 138, 146, 0, & - 5, 92, 109, 189, 235, 0, & - 13, 94, 159, 162, 200, 0, & - 7, 67, 129, 201, 221, 0/ - -data nrw/ & -6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,6,5, & -5,5,5,5,6,5,5,5,6,5,6,5,5,5,6,5,5,5,5,5, & -6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5, & -5,5,5,5,5,5,5,5,6,6,5,5,6,5,5,5,5,5,5,5, & -5,5,6,5,5,5,5,5,6,5,5,5,5,5,5,6,5,5,6,5, & -5,5,5,6,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5, & -5,5,5,5,5,5,5,6,5,5,6,5,5,5,5,5,5,5,5/ - -ncw=3 diff --git a/lib/fsk4hf/ldpc_280_101_generator.f90 b/lib/fsk4hf/ldpc_280_101_generator.f90 deleted file mode 100644 index 521e80026..000000000 --- a/lib/fsk4hf/ldpc_280_101_generator.f90 +++ /dev/null @@ -1,182 +0,0 @@ -character*26 g(179) - -data g/ & - "c919bcbfe4091279702a761e98", & - "51b952dddd36200cf73cc1ed30", & - "15871d32e8e888439180cf6fd8", & - "581f858f6c89ee5ccb91664358", & - "3515e85cedf905eda366a8fc20", & - "e9fcaa6aaa9bab21bc91174e80", & - "0ac73221d424e8747628b13968", & - "4999f7116446f1a7a7a1453a30", & - "0e92773bff2a6d4f09caa48898", & - "7dfaec97c17679f6c3b6a425f0", & - "00707d76a2a7d90297ee39f660", & - "8048cc93fc4ad84ccfc021e6e0", & - "0c13df64062fed419c9bf43400", & - "5523d84459c826b7bc3335d508", & - "828ee2552144d041ed44ada8e0", & - "3f1b89fbd93f674df4813f0898", & - "4e13df64062fed419c9bf43400", & - "5d8645307d3d442991d6efafd0", & - "e5cd9b98d73aab17ce04c4df10", & - "06d26e11e2d02e9cb4f191c2b0", & - "5630cebc5b3a09f7d4fe58fab0", & - "bbfa9591589229738ecbc19288", & - "c98654d1f1f16d507e9bb77cf0", & - "c2af2107bb2bdff49d909dc730", & - "51da7da0c9b1bd18a15f580068", & - "5bdfd83e7ca3097146a5359428", & - "34fc4d397d97ca3ceb272f49a0", & - "6716a6d027ade94010e9aa90b0", & - "62ac7bb089d1a13f6e89f92348", & - "737c3ab63210e195e92e8ad478", & - "db2da5b8a21d22a7122ad80e60", & - "1226525dba4221d4768a495878", & - "a99deb4c9b7d316917b1ece958", & - "8123fb46556f22a0b57bdc7eb0", & - "cc6a80e87a7a9bf8addb17a6a8", & - "3d42bb6ca1c8d30e6cee77aa10", & - "ad15a0c2f36d4409a458cc83c0", & - "766a04039736bd8be23513ae58", & - "257a3da77558d7c707170c30c8", & - "8e54a55fd9f00eb669ab787678", & - "4ef1a73cc9da8670d83bebc588", & - "be8bb82558d44fea1ab27376a0", & - "ea9db4f88c60edf410cb0128d8", & - "a84e19a5261818262ee7247278", & - "51f99e4ea17cf84038d4e00bd0", & - "610560db4095fc44d2465308a0", & - "7688745b59c3d6baa6950c4f50", & - "4b8794914d365b6802bd62a9c8", & - "f62c211d05ed28802b9d278298", & - "b9cd45b2ffa8c0dd688f8d2bc0", & - "68555e81f4227a48e76878bc98", & - "7ab58f11d41a2d38b80d2a7558", & - "aba2d33e69077b6acad393af68", & - "81e5f58fa3ab563e73706201a8", & - "7586aea816750c41671eaa7db8", & - "af37b0a97ba5334a3dd01948e8", & - "4fdc03c263a0c42dcc265f7dc8", & - "b23f2d7f28748944cdfffd5af0", & - "5c1e6f37dfba8feacaafdb0f78", & - "3a85b051f4f1c930d921f60828", & - "72319352bd8022ce2cae2e7858", & - "78b79f633ac6879e3ac3a005a0", & - "9f0c470609669953b23328de60", & - "86d3745d50142c82a066ab9490", & - "743e7bf411490f36a9799e37e8", & - "9b8378677870933ef360d7e418", & - "5f7adbf515b663a1434b0d47d8", & - "13249a96b14c6cdcfae5009eb0", & - "da9570e0a52125d0dc4dec4430", & - "ada13ce2dbcb57e2f5b31172f0", & - "84f5485886d4157e9d37efb4d0", & - "23f58c3200bab4ae5dee54edd0", & - "d4377aadf8acb19d4369613ac8", & - "17cefcf65c87885fb6c4d537a0", & - "59d70b8536488298930aaea7f8", & - "49e8dbb08c2ecdaa84bb6a5378", & - "e1694479ecc1f87e503f959e50", & - "dbb3fc94f0f70d4bd4dcf302d8", & - "4ccb3a56f80c236424683b1588", & - "f4f123c72596a00397d56fcdf8", & - "13f9cf266a6957b87cd2b576f0", & - "0904d341bc0878460cd8361ac0", & - "69fd534caf2cccf9c90659a038", & - "757d3d95089a5bc20a7b77c618", & - "30df1d7b8124415c73190b08d8", & - "d39319584987dce0c44176d5d8", & - "1a81df299eb7434a5b6b9322a0", & - "fe4acfab1c22c7bea222f1a6b0", & - "2f2fde37fa8f87a318f7bcda10", & - "fae712210c23665aa7a3f10620", & - "977b8407c7fd22d7715077ee78", & - "2ab2b355b3477df0b738c49d48", & - "93a2468cfd11a522b310069d88", & - "0e5ae6e789ded3c0d436359318", & - "9ece0b13a3c06d560a15d3c448", & - "838e8bbf5e671503ea72ba3118", & - "7c827de9a87d740763c69c6778", & - "1fe395e4e2e6d1373602243488", & - "f2c4efee3d0ce2e22749be9e20", & - "46405cca0e40f36ab83de4a998", & - "8b6e931355a79630ef2dbdbdb8", & - "10df1d3b8124415c72190b08d8", & - "cdff258b07a4f7cfe5c2210ba8", & - "1515e85cedf904eda366a8fc20", & - "a38276f2d077abc1da5e177868", & - "67a7b5ab66f21f391d306c3330", & - "29492cc630f9bad1fdedf0c990", & - "490a6dd38170eab178f7cebf78", & - "ca9db4e88c60edf410cf0128d8", & - "e3f1c23fa8531fb1e4c7768d88", & - "39d7d8fbbb689b2a9bedfd4dd0", & - "d1b952dd5d36200cf734c1ed30", & - "0820a5ccb970d1ab109d84d700", & - "58bc3c509fcd7874e9b1533ba8", & - "08ed7724ac66b7974499b12f40", & - "4738529b2fd04afd89184b64b8", & - "7155b496e3b9f687135b4c55b8", & - "b5d1d3cf38b1765dd730d8b960", & - "296de2c373773a869b9cf804c8", & - "1cdf18b99bcc47ae72bf59df68", & - "ad0888db89dd794be0b2660e98", & - "1f2a8db9db19cd4d69a735d930", & - "44b720007480382206fdbfbb18", & - "c63817aad3801fb993ea9032c0", & - "d44707db5a0b489fd48748cca8", & - "49f98a67c6e128a5300f7ccc50", & - "04849fa9da91d4514355406388", & - "dfad3a11788cf6f6517f987de8", & - "47078a19e38a0763cabd7c8d70", & - "aafa7f864f0da5bc78f8e57ba8", & - "8acb5a34e18e111023b3e7b1f8", & - "5acc41263d6aa1767e5e6acdc8", & - "27623a9f6c1174e35394191820", & - "1f2bde9c006b3b687964b1c5e0", & - "b01c6e357bce202244b4a88d08", & - "61c85d74d7e97576507c9b0e88", & - "bcad5a44d75ae40bc43559d268", & - "10584eaf319552194418563de0", & - "b29b011d717d10a22de0983980", & - "2f9b42d7d2299449491c612b20", & - "389ba33f5fec3bfb3a0ef86b50", & - "3df89f78c19fb27ae7ff19d360", & - "65ff6ba4e107aa919a6afb4ff0", & - "39b607c3f09679a62e134cd390", & - "94ad06f7b7414727d92f998930", & - "169200459898ae0bc7f06714a0", & - "c7a5a945adebb554cb4d86a830", & - "f37c3ab63230e195e92e8ad478", & - "559a51262e91aa9ba0fa96af48", & - "fb2998ca916a557463d00fb160", & - "aa32462ada57a76ae132fc8de8", & - "e6df6b19f58bfee0b96b731b90", & - "e984335d40a54fe914a6249110", & - "ea73d8f3f14bd9fe2374e39120", & - "3adab8e51c36f53584e3669c88", & - "74ef69f64dc4fef86c3b1fe640", & - "d01c6bc112d7ae3e4ba4820a78", & - "62923979fd3c3d1153bcaaf338", & - "038f72995b5072df8fe5f4dfa0", & - "9f07e7cea2f1476fb035978790", & - "2a5aad6a75d5c86cab38fd0070", & - "a254a09cc3180854688d2aa9c8", & - "0495639712a04820f7038ae7c0", & - "d99fc716ca825ad45cca8f4518", & - "01b8d558073c0377ce67344a50", & - "2fbd0f86a17c3f93713fbd09a0", & - "c29dc84bec7b4cd00dd1c17380", & - "5e6238b823f530ae017a03f0e0", & - "51203d329c68b061977d78d4c0", & - "1186729e08cf1dfbec30237968", & - "40363018b431224a1f559d2908", & - "e334e78442b614a0c9a377e1b8", & - "ff2eda86339f589f96382f52e0", & - "58a30e07fc7a37a4f858623778", & - "f5067fe407a4c3b94ce7b63e48", & - "1d09ced788a3642bc0ec640ec8", & - "17734ca67d53cd9d8595970668", & - "47953c2105bd94bff079672740", & - "3444682d1dc0ab486036c1b0d0"/ diff --git a/lib/fsk4hf/ldpc_280_101_parity.f90 b/lib/fsk4hf/ldpc_280_101_parity.f90 deleted file mode 100644 index b1cabb7d1..000000000 --- a/lib/fsk4hf/ldpc_280_101_parity.f90 +++ /dev/null @@ -1,476 +0,0 @@ -data Mn/ & - 150, 151, 161, & - 6, 164, 172, & - 92, 128, 158, & - 2, 63, 135, & - 3, 14, 22, & - 4, 18, 29, & - 5, 17, 164, & - 7, 99, 179, & - 8, 88, 115, & - 9, 62, 110, & - 10, 107, 154, & - 11, 50, 140, & - 12, 28, 33, & - 13, 31, 170, & - 15, 69, 175, & - 16, 77, 178, & - 19, 70, 91, & - 20, 95, 177, & - 21, 96, 106, & - 23, 129, 168, & - 24, 49, 169, & - 25, 65, 102, & - 26, 82, 171, & - 27, 45, 137, & - 30, 89, 119, & - 32, 148, 158, & - 34, 94, 152, & - 35, 44, 92, & - 36, 39, 138, & - 37, 55, 58, & - 38, 121, 165, & - 40, 81, 162, & - 41, 139, 150, & - 42, 43, 83, & - 46, 80, 114, & - 47, 52, 54, & - 48, 166, 173, & - 38, 53, 87, & - 56, 64, 126, & - 57, 67, 127, & - 59, 156, 159, & - 60, 97, 133, & - 61, 118, 161, & - 66, 100, 123, & - 68, 124, 131, & - 71, 101, 155, & - 72, 74, 144, & - 73, 112, 141, & - 75, 136, 149, & - 59, 78, 117, & - 79, 130, 163, & - 84, 93, 113, & - 86, 108, 163, & - 103, 146, 157, & - 70, 104, 145, & - 105, 128, 142, & - 74, 109, 122, & - 54, 111, 153, & - 116, 154, 176, & - 120, 132, 167, & - 21, 125, 147, & - 134, 143, 166, & - 7, 81, 160, & - 32, 99, 174, & - 1, 93, 104, & - 2, 69, 98, & - 3, 33, 152, & - 4, 46, 159, & - 5, 126, 178, & - 6, 127, 147, & - 8, 101, 110, & - 9, 73, 158, & - 10, 120, 123, & - 11, 122, 125, & - 12, 58, 170, & - 13, 88, 105, & - 14, 133, 150, & - 15, 92, 100, & - 16, 90, 108, & - 17, 44, 106, & - 18, 35, 175, & - 19, 94, 179, & - 20, 97, 153, & - 22, 109, 130, & - 23, 63, 140, & - 24, 37, 146, & - 25, 141, 168, & - 26, 95, 115, & - 27, 107, 149, & - 28, 91, 168, & - 29, 134, 144, & - 30, 31, 169, & - 34, 40, 96, & - 36, 156, 172, & - 39, 61, 135, & - 41, 42, 121, & - 43, 57, 117, & - 45, 62, 72, & - 47, 137, 167, & - 48, 83, 116, & - 49, 65, 173, & - 1, 50, 141, & - 2, 8, 150, & - 3, 62, 140, & - 4, 104, 124, & - 5, 128, 139, & - 6, 64, 159, & - 7, 103, 176, & - 2, 11, 104, & - 9, 71, 85, & - 10, 80, 131, & - 11, 17, 130, & - 12, 148, 156, & - 13, 39, 164, & - 14, 15, 167, & - 14, 32, 89, & - 16, 114, 135, & - 8, 164, 169, & - 18, 107, 129, & - 19, 53, 102, & - 20, 134, 170, & - 21, 43, 145, & - 22, 24, 76, & - 23, 44, 146, & - 19, 22, 101, & - 25, 41, 48, & - 26, 46, 58, & - 27, 82, 87, & - 28, 78, 179, & - 29, 73, 81, & - 30, 116, 161, & - 31, 96, 157, & - 15, 58, 172, & - 10, 33, 160, & - 34, 110, 118, & - 33, 35, 113, & - 36, 166, 175, & - 32, 37, 152, & - 38, 57, 74, & - 13, 82, 176, & - 40, 42, 45, & - 25, 57, 177, & - 40, 120, 136, & - 21, 92, 121, & - 23, 34, 147, & - 12, 45, 54, & - 3, 46, 48, & - 47, 91, 169, & - 26, 61, 132, & - 49, 123, 147, & - 1, 79, 88, & - 51, 97, 101, & - 52, 155, 177, & - 24, 72, 105, & - 54, 84, 106, & - 55, 63, 126, & - 56, 72, 163, & - 38, 63, 170, & - 37, 71, 178, & - 20, 49, 59, & - 30, 60, 117, & - 61, 65, 137, & - 41, 98, 119, & - 47, 51, 62, & - 6, 76, 131, & - 55, 70, 81, & - 66, 111, 119, & - 60, 67, 94, & - 68, 112, 132, & - 9, 69, 157, & - 70, 75, 89, & - 69, 108, 153, & - 44, 53, 77, & - 29, 130, 149, & - 65, 103, 125, & - 74, 85, 156, & - 56, 67, 68, & - 77, 138, 144, & - 28, 95, 138, & - 79, 133, 142, & - 35, 50, 86, & - 73, 78, 137, & - 27, 126, 175, & - 83, 100, 143, & - 42, 142, 168, & - 40, 48, 158, & - 86, 95, 174, & - 39, 109, 129, & - 59, 88, 125, & - 6, 89, 155, & - 36, 90, 102, & - 75, 97, 141, & - 43, 146, 148, & - 93, 149, 168, & - 52, 83, 94, & - 80, 87, 106, & - 91, 96, 143, & - 3, 43, 126, & - 98, 154, 162, & - 99, 115, 173, & - 5, 84, 100, & - 64, 133, 154, & - 90, 117, 158, & - 7, 108, 151, & - 4, 128, 167, & - 105, 127, 136, & - 1, 83, 114, & - 107, 127, 134, & - 4, 108, 170, & - 92, 109, 171, & - 110, 113, 122, & - 111, 124, 166, & - 12, 112, 150, & - 2, 95, 105, & - 17, 114, 118, & - 99, 139, 144, & - 116, 165, 178, & - 5, 22, 73, & - 16, 115, 162, & - 13, 34, 41, & - 120, 122, 151, & - 121, 160, 172, & - 8, 37, 102, & - 123, 140, 165, & - 7, 53, 93, & - 9, 10, 130, & - 11, 30, 58, & - 31, 66, 179, & - 14, 31, 45, & - 15, 88, 129, & - 18, 101, 148, & - 16, 62, 127, & - 17, 20, 68, & - 19, 86, 98, & - 25, 106, 163, & - 135, 152, 163, & - 23, 124, 137, & - 21, 28, 71, & - 24, 26, 153, & - 29, 90, 123, & - 32, 113, 134, & - 35, 57, 169, & - 27, 50, 139, & - 33, 60, 65, & - 38, 61, 142, & - 145, 153, 154, & - 39, 67, 81, & - 36, 84, 133, & - 18, 161, 173, & - 93, 155, 171, & - 42, 99, 131, & - 49, 87, 162, & - 51, 56, 168, & - 47, 125, 144, & - 44, 143, 159, & - 46, 75, 138, & - 52, 78, 107, & - 54, 109, 174, & - 64, 110, 179, & - 159, 165, 174, & - 66, 135, 171, & - 63, 76, 117, & - 59, 111, 120, & - 72, 160, 166, & - 70, 118, 156, & - 55, 157, 173, & - 74, 100, 176, & - 77, 112, 145, & - 69, 141, 147, & - 94, 140, 151, & - 51, 82, 104, & - 85, 98, 167, & - 80, 119, 146, & - 97, 122, 172, & - 90, 96, 132, & - 79, 91, 178, & - 103, 136, 152, & - 1, 76, 85, & - 115, 121, 149, & - 116, 175, 177/ - -data Nm/ & - 65, 102, 151, 207, 278, 0, & - 4, 66, 103, 109, 214, 0, & - 5, 67, 104, 147, 198, 0, & - 6, 68, 105, 205, 209, 0, & - 7, 69, 106, 201, 218, 0, & - 2, 70, 107, 165, 190, 0, & - 8, 63, 108, 204, 225, 0, & - 9, 71, 103, 118, 223, 0, & - 10, 72, 110, 170, 226, 0, & - 11, 73, 111, 134, 226, 0, & - 12, 74, 109, 112, 227, 0, & - 13, 75, 113, 146, 213, 0, & - 14, 76, 114, 140, 220, 0, & - 5, 77, 115, 116, 229, 0, & - 15, 78, 115, 133, 230, 0, & - 16, 79, 117, 219, 232, 0, & - 7, 80, 112, 215, 233, 0, & - 6, 81, 119, 231, 249, 0, & - 17, 82, 120, 125, 234, 0, & - 18, 83, 121, 160, 233, 0, & - 19, 61, 122, 144, 238, 0, & - 5, 84, 123, 125, 218, 0, & - 20, 85, 124, 145, 237, 0, & - 21, 86, 123, 154, 239, 0, & - 22, 87, 126, 142, 235, 0, & - 23, 88, 127, 149, 239, 0, & - 24, 89, 128, 183, 243, 0, & - 13, 90, 129, 179, 238, 0, & - 6, 91, 130, 174, 240, 0, & - 25, 92, 131, 161, 227, 0, & - 14, 92, 132, 228, 229, 0, & - 26, 64, 116, 138, 241, 0, & - 13, 67, 134, 136, 244, 0, & - 27, 93, 135, 145, 220, 0, & - 28, 81, 136, 181, 242, 0, & - 29, 94, 137, 191, 248, 0, & - 30, 86, 138, 159, 223, 0, & - 31, 38, 139, 158, 245, 0, & - 29, 95, 114, 188, 247, 0, & - 32, 93, 141, 143, 186, 0, & - 33, 96, 126, 163, 220, 0, & - 34, 96, 141, 185, 251, 0, & - 34, 97, 122, 193, 198, 0, & - 28, 80, 124, 173, 255, 0, & - 24, 98, 141, 146, 229, 0, & - 35, 68, 127, 147, 256, 0, & - 36, 99, 148, 164, 254, 0, & - 37, 100, 126, 147, 186, 0, & - 21, 101, 150, 160, 252, 0, & - 12, 102, 181, 243, 0, 0, & - 152, 164, 253, 271, 0, 0, & - 36, 153, 195, 257, 0, 0, & - 38, 120, 173, 225, 0, 0, & - 36, 58, 146, 155, 258, 0, & - 30, 156, 166, 266, 0, 0, & - 39, 157, 177, 253, 0, 0, & - 40, 97, 139, 142, 242, 0, & - 30, 75, 127, 133, 227, 0, & - 41, 50, 160, 189, 263, 0, & - 42, 161, 168, 244, 0, 0, & - 43, 95, 149, 162, 245, 0, & - 10, 98, 104, 164, 232, 0, & - 4, 85, 156, 158, 262, 0, & - 39, 107, 202, 259, 0, 0, & - 22, 101, 162, 175, 244, 0, & - 44, 167, 228, 261, 0, 0, & - 40, 168, 177, 247, 0, 0, & - 45, 169, 177, 233, 0, 0, & - 15, 66, 170, 172, 269, 0, & - 17, 55, 166, 171, 265, 0, & - 46, 110, 159, 238, 0, 0, & - 47, 98, 154, 157, 264, 0, & - 48, 72, 130, 182, 218, 0, & - 47, 57, 139, 176, 267, 0, & - 49, 171, 192, 256, 0, 0, & - 123, 165, 262, 278, 0, 0, & - 16, 173, 178, 268, 0, 0, & - 50, 129, 182, 257, 0, 0, & - 51, 151, 180, 276, 0, 0, & - 35, 111, 196, 273, 0, 0, & - 32, 63, 130, 166, 247, 0, & - 23, 128, 140, 271, 0, 0, & - 34, 100, 184, 195, 207, 0, & - 52, 155, 201, 248, 0, 0, & - 110, 176, 272, 278, 0, 0, & - 53, 181, 187, 234, 0, 0, & - 38, 128, 196, 252, 0, 0, & - 9, 76, 151, 189, 230, 0, & - 25, 116, 171, 190, 0, 0, & - 79, 191, 203, 240, 275, 0, & - 17, 90, 148, 197, 276, 0, & - 3, 28, 78, 144, 210, 0, & - 52, 65, 194, 225, 250, 0, & - 27, 82, 168, 195, 270, 0, & - 18, 88, 179, 187, 214, 0, & - 19, 93, 132, 197, 275, 0, & - 42, 83, 152, 192, 274, 0, & - 66, 163, 199, 234, 272, 0, & - 8, 64, 200, 216, 251, 0, & - 44, 78, 184, 201, 267, 0, & - 46, 71, 125, 152, 231, 0, & - 22, 120, 191, 223, 0, 0, & - 54, 108, 175, 277, 0, 0, & - 55, 65, 105, 109, 271, 0, & - 56, 76, 154, 206, 214, 0, & - 19, 80, 155, 196, 235, 0, & - 11, 89, 119, 208, 257, 0, & - 53, 79, 172, 204, 209, 0, & - 57, 84, 188, 210, 258, 0, & - 10, 71, 135, 211, 259, 0, & - 58, 167, 212, 263, 0, 0, & - 48, 169, 213, 268, 0, 0, & - 52, 136, 211, 241, 0, 0, & - 35, 117, 207, 215, 0, 0, & - 9, 88, 200, 219, 279, 0, & - 59, 100, 131, 217, 280, 0, & - 50, 97, 161, 203, 262, 0, & - 43, 135, 215, 265, 0, 0, & - 25, 163, 167, 273, 0, 0, & - 60, 73, 143, 221, 263, 0, & - 31, 96, 144, 222, 279, 0, & - 57, 74, 211, 221, 274, 0, & - 44, 73, 150, 224, 240, 0, & - 45, 105, 212, 237, 0, 0, & - 61, 74, 175, 189, 254, 0, & - 39, 69, 156, 183, 198, 0, & - 40, 70, 206, 208, 232, 0, & - 3, 56, 106, 205, 0, 0, & - 20, 119, 188, 230, 0, 0, & - 51, 84, 112, 174, 226, 0, & - 45, 111, 165, 251, 0, 0, & - 60, 149, 169, 275, 0, 0, & - 42, 77, 180, 202, 248, 0, & - 62, 91, 121, 208, 241, 0, & - 4, 95, 117, 236, 261, 0, & - 49, 143, 206, 277, 0, 0, & - 24, 99, 162, 182, 237, 0, & - 29, 178, 179, 256, 0, 0, & - 33, 106, 216, 243, 0, 0, & - 12, 85, 104, 224, 270, 0, & - 48, 87, 102, 192, 269, 0, & - 56, 180, 185, 245, 0, 0, & - 62, 184, 197, 255, 0, 0, & - 47, 91, 178, 216, 254, 0, & - 55, 122, 246, 268, 0, 0, & - 54, 86, 124, 193, 273, 0, & - 61, 70, 145, 150, 269, 0, & - 26, 113, 193, 231, 0, 0, & - 49, 89, 174, 194, 279, 0, & - 1, 33, 77, 103, 213, 0, & - 1, 204, 221, 270, 0, 0, & - 27, 67, 138, 236, 277, 0, & - 58, 83, 172, 239, 246, 0, & - 11, 59, 199, 202, 246, 0, & - 46, 153, 190, 250, 0, 0, & - 41, 94, 113, 176, 265, 0, & - 54, 132, 170, 266, 0, 0, & - 3, 26, 72, 186, 203, 0, & - 41, 68, 107, 255, 260, 0, & - 63, 134, 222, 264, 0, 0, & - 1, 43, 131, 249, 0, 0, & - 32, 199, 219, 252, 0, 0, & - 51, 53, 157, 235, 236, 0, & - 2, 7, 114, 118, 0, 0, & - 31, 217, 224, 260, 0, 0, & - 37, 62, 137, 212, 264, 0, & - 60, 99, 115, 205, 272, 0, & - 20, 87, 90, 185, 194, 253, & - 21, 92, 118, 148, 242, 0, & - 14, 75, 121, 158, 209, 0, & - 23, 210, 250, 261, 0, 0, & - 2, 94, 133, 222, 274, 0, & - 37, 101, 200, 249, 266, 0, & - 64, 187, 258, 260, 0, 0, & - 15, 81, 137, 183, 280, 0, & - 59, 108, 140, 267, 0, 0, & - 18, 142, 153, 280, 0, 0, & - 16, 69, 159, 217, 276, 0, & - 8, 82, 129, 228, 259, 0/ - -data nrw/ & -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, & -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, & -5,5,5,5,5,5,5,5,5,4,4,4,4,5,4,4,5,5,5,4, & -5,5,5,4,5,4,4,4,5,5,4,5,5,5,4,4,4,4,4,4, & -5,4,5,4,4,4,4,5,4,5,5,5,5,5,5,5,5,5,5,5, & -5,4,4,5,5,5,5,5,5,5,4,4,4,4,5,5,5,4,4,5, & -5,5,5,4,5,5,5,4,4,5,4,4,5,5,5,4,5,4,4,5, & -5,4,4,5,4,5,5,4,5,5,4,5,5,5,4,5,4,5,5,4, & -4,4,5,4,4,5,5,6,5,5,4,5,5,4,5,4,4,5,5/ - -ncw=3 - diff --git a/lib/fsk4hf/ldpc_300_60_params.f90 b/lib/fsk4hf/ldpc_300_60_params.f90 deleted file mode 100644 index 53ee994ea..000000000 --- a/lib/fsk4hf/ldpc_300_60_params.f90 +++ /dev/null @@ -1,262 +0,0 @@ -integer, parameter:: N=300, K=60, M=N-K -character*15 g(M) -integer colorder(N) -data g/ & - "316fd3bb18bcefd", & - "a9c1c984f91244e", & - "9e04bd3d5d78d89", & - "f81617089621bd4", & - "12997ce2f44dbf4", & - "3ebddaf9b0fa1fc", & - "d0c114b0b0ef162", & - "f8c4f115f98bd92", & - "d0a79c0c5b8ca19", & - "477f6712f357b3b", & - "fa28b2444a7e66b", & - "bedcd4df8d95c64", & - "da30de73e57022c", & - "bc099bbb90fe09e", & - "cffc1e47e5708e8", & - "713d808563ca9a3", & - "70fcf1741d5d5d7", & - "32e80bc15112008", & - "804cef4df9b18ec", & - "3736881819d1033", & - "f4e37db7f9c5efe", & - "9e84b93d4d78d09", & - "2250c3518ec830a", & - "55a529a92e18021", & - "1cb80b14c9f6eae", & - "80c504b031ef926", & - "ece6636d0ac9c6d", & - "5d50a1690782cd0", & - "3d54a1fb30937a2", & - "ba8fe8006318041", & - "02917ce2fc45bf4", & - "abc1d984f95a44e", & - "fc05b4c4ab2d850", & - "467f7718f357b3b", & - "472cc094546c6b2", & - "fcdd94cf8c9cc64", & - "4dbc1647e970cc8", & - "6caa465c442aed1", & - "aead5af8b0da1be", & - "d8e1fa45a2e8431", & - "9d4dc4cc63abb7f", & - "9b2df6b48264637", & - "7335808563ca3a3", & - "36bf8d5cd93e6cc", & - "004ccf4db9b08ec", & - "90a71c8c598ca19", & - "f8c5d115f90bc92", & - "b95546c4e3f7934", & - "7d50a1690786cd0", & - "c90939921a0d7c6", & - "d0c504b030ef126", & - "ce3e6f9396fc542", & - "a0072a59f3707f5", & - "532d0a8fe3da1ea", & - "68b9e5cd7d142db", & - "fedc94df8c9dc64", & - "6da2465c448aed0", & - "3574aa19cb273c0", & - "1e54768c6bc6843", & - "691f65654498186", & - "fe2c92444a6ef6b", & - "9caad933e038cc4", & - "ad4e6f4defb28ec", & - "4f3d80947c6d2b2", & - "1caad933e0b8cc4", & - "b14fd3bf18bcafd", & - "ad091bbbb0f809e", & - "90b71c8c598da19", & - "f8c4d115f90bd92", & - "9d4dcccc63afb7f", & - "fa2c92444a6e76b", & - "1e14768c6bc6c43", & - "d1baf5aacb86087", & - "bdf762b92ee51c7", & - "caacec06ad8a90c", & - "804ccf4df9b08ec", & - "69e969f9da5cbd8", & - "814ccf4df9b086c", & - "cebe4f9796f4542", & - "491f65654499186", & - "8fbf5b9796f6d2a", & - "ce3e4f9396f4542", & - "47558560e7debc3", & - "94aadd33e038cc4", & - "a94eef4debb286e", & - "d8e5d115f91bcd2", & - "532d488fe3da0ab", & - "664e7bc4e23a80c", & - "94a2dd33a038cd4", & - "d8c5d115f91bc92", & - "0fef071eee60bd5", & - "9a89a09163c2b97", & - "0eaf071e6c60bd5", & - "bc0d1bbbb0fe0be", & - "f9babd3d12d0f31", & - "69a969f9da5c9d8", & - "6e4e7bc4e23a82c", & - "b0042659f3227f5", & - "2d51418f0f28347", & - "be0d5bbbb0da0be", & - "225003508ec8302", & - "8fbf4b9796f4d2a", & - "bead5af9b0da1be", & - "6ca2465c440aed1", & - "4fbc1e47ed708c8", & - "bd091bbbb0fc09e", & - "b0062259f3307f5", & - "a8072a59f3727f5", & - "a0062259f3707f5", & - "3c380b14c974eae", & - "30042659f3226f5", & - "48b9e4cd7d142db", & - "728bcd4b38308fb", & - "c0c504b031ef126", & - "314fd3bb18bcafd", & - "1c29148305faec1", & - "44c92a9c28ada63", & - "88e99b370aae32b", & - "695081690386ad8", & - "572d0a8de3da1ea", & - "467f6610f357b2b", & - "733d008563da1a3", & - "d1baf4aacb84087", & - "4315551d71c8ff0", & - "48bde4cd7d140db", & - "3ebd58f9b0da9fc", & - "51baf4aacb84083", & - "814e4f4de9b082c", & - "814ecf4de9b086c", & - "be0d1bbbb0fa0be", & - "4f7580947c792b3", & - "cdf2dce48c39c3b", & - "d8c5c115f91bc12", & - "a94e6f4debb28ee", & - "be2d5afbb0da1be", & - "cdd6dce48439c2b", & - "bebd5af9b0da1fe", & - "fa2892444a6e66b", & - "51bbf4aacb8c083", & - "baa73d81eebcd83", & - "79a2ce47f138cc9", & - "cc28cf198e6dbd4", & - "fcde94dfcc9cc64", & - "1016fcf59286717", & - "12917ce2fc4dbf4", & - "4fbc1647e9708c8", & - "3e382b1cc974fae", & - "d5bafdaad386087", & - "0fef473eee60bd5", & - "c0e504b031ee126", & - "8bbf5b9797f6d2a", & - "0eef071e6e60bd5", & - "1806fcf59386517", & - "fcdc94df8c9cc64", & - "141eca2bfa25656", & - "5fbc1767e9708e8", & - "5aa4c7803a6bdf1", & - "b14bd3b718bcafd", & - "3ebd5af9b0da1fc", & - "d0a7148c5b8ca09", & - "a94ecf4debb086e", & - "733d808563ca1a3", & - "fd9abd1d92d0f31", & - "bc091bbbb0fe09e", & - "d0c514b0b0ef122", & - "4f7d80947c7d2b3", & - "8b3f5b97b7f6d2a", & - "4fbc1767e9708c8", & - "cebf4f9796f4502", & - "9c76c880a864e67", & - "abc1c984f95244e", & - "795081690786ad8", & - "467f6710f357b3b", & - "1c380b14c9f4eae", & - "d5baf5aac386087", & - "bedc94df8c95c64", & - "553d0a8de2da1fa", & - "0315551d71d8ff0", & - "1c1eca2ffa25656", & - "d4bafdaad3c6087", & - "be2d5bfbb0da0be", & - "b0062659f3207f5", & - "5ffc1765e9708e8", & - "8d62e8bcd303e33", & - "cc08cf198e69bd4", & - "573d0a8de3da1fa", & - "cd56dce48639c2b", & - "472dc094546c2b2", & - "7950a16907868d8", & - "7283cf4b38308fb", & - "894ecf4de9b086e", & - "0f7580b47c792b3", & - "cfbf4b9796f4d0a", & - "3e380b14c974fae", & - "732d0085e3da1a3", & - "1816fcf59386717", & - "532d088fe3da1ab", & - "1c300b94c9fcaae", & - "d0a71c8c5b8ca19", & - "9e84bd3d5d78d09", & - "225083508ec830a", & - "f99abd1d12d0f31", & - "35f4aa19cb673c0", & - "cdd2dce48c39c2b", & - "0f7780b47c792bf", & - "0e33a5f114f5730", & - "bc05b4c4ab0d850", & - "1c300b14c9f4aae", & - "cfbc1e47ed708e8", & - "0f7180b47c392b3", & - "d8c7c115f91be12", & - "c09148adfa94e97", & - "9c66c880a844e67", & - "2226c13b73519f8", & - "cebf4b9796f4d02", & - "c0e706b031ee126", & - "6a6629715e53ce3", & - "73f9aa824e7d0b8", & - "473d80947c6c2b2", & - "1df140e0ddb5632", & - "473dc0945c6c2b2", & - "81b4d95f671971d", & - "663945ca758e2b6", & - "02ec3d98a2306fd", & - "5dadb0fa1275690", & - "4bb8aaa854948d0", & - "8359ba40886971c", & - "49cc3d2a2be2ee0", & - "bfdf13af137f318", & - "a1de773a2b1ff04", & - "8ff3945a2f465c7", & - "532d0087e3da1a3", & - "f3eaf7fa454d385", & - "a606aa5aeba07d9", & - "67f0627b0af8a53", & - "56698bed69d1c2c", & - "d5f420011fbf924", & - "2a8f86c810e2c62", & - "43cc1cf1208c206", & - "ee784c4900258de"/ - -data colorder/ & -0,1,2,3,4,5,6,7,8,9,10,11,123,12,13,14,15,16,17,18, & -19,20,21,22,23,24,25,138,26,145,27,28,29,30,31,32,33,34,35,36, & -37,154,38,39,40,41,42,43,44,144,46,47,48,49,50,51,52,53,143,54, & -125,56,57,58,124,59,120,140,157,160,55,60,61,62,156,162,141,64,65,153, & -181,183,66,170,67,68,69,130,70,164,71,72,73,74,75,63,76,77,135,78, & -79,80,176,169,82,83,84,167,180,85,136,158,129,166,175,142,134,146,121,165, & -88,89,192,90,45,91,92,93,182,189,94,95,96,173,81,97,98,178,122,126, & -132,99,100,152,186,193,101,102,151,103,104,172,159,168,150,190,147,148,201,107, & -205,177,108,198,197,174,127,109,185,110,202,87,199,171,179,187,139,137,106,131, & -206,194,112,149,155,113,128,184,196,86,114,203,212,195,208,105,188,161,163,191, & -200,209,214,204,115,218,133,111,207,117,213,216,211,217,116,215,219,220,210,221, & -118,222,223,225,224,228,226,229,231,227,233,119,234,235,232,230,237,239,236,238, & -240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259, & -260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279, & -280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299/ - diff --git a/lib/fsk4hf/ldpcsim120.f90 b/lib/fsk4hf/ldpcsim120.f90 deleted file mode 100644 index 0b7d92865..000000000 --- a/lib/fsk4hf/ldpcsim120.f90 +++ /dev/null @@ -1,238 +0,0 @@ -program ldpcsim120 -! End to end test of the (120,60)/crc10 encoder and decoder. -use crc -use packjt - -parameter(NRECENT=10) -character*12 recent_calls(NRECENT) -character*22 msg,msgsent,msgreceived -character*8 arg -integer*1, allocatable :: codeword(:), decoded(:), message(:) -integer*1, target:: i1Msg8BitBytes(9) -integer*1, target:: i1Dec8BitBytes(9) -integer*1 msgbits(60) -integer*1 apmask(120) -integer*1 cw(120) -integer*2 checksum -integer colorder(120) -integer nerrtot(120),nerrdec(120),nmpcbad(60) -logical checksumok,fsk,bpsk -real*8, allocatable :: rxdata(:) -real, allocatable :: llr(:) -real dllr(120),llrd(120) - -data colorder/ & - 0,1,2,21,3,4,5,6,7,8,20,10,9,11,12,23,13,28,14,31, & - 15,16,22,26,17,30,18,29,25,32,41,34,19,33,27,36,38,43,42,24, & - 37,39,45,40,35,44,47,46,50,51,53,48,52,56,54,57,55,49,58,61, & - 60,59,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, & - 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99, & - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119/ - -do i=1,NRECENT - recent_calls(i)=' ' -enddo -nerrtot=0 -nerrdec=0 -nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - -nargs=iargc() -if(nargs.ne.3) then - print*,'Usage: ldpcsim niter #trials s ' - print*,'eg: ldpcsim 10 1000 0.84' - print*,'If s is negative, then value is ignored and sigma is calculated from SNR.' - return -endif -call getarg(1,arg) -read(arg,*) max_iterations -call getarg(2,arg) -read(arg,*) ntrials -call getarg(3,arg) -read(arg,*) s - -fsk=.false. -bpsk=.true. - -! don't count crc bits as data bits -N=120 -K=60 -! scale Eb/No for a (120,50) code -rate=real(50)/real(N) - -write(*,*) "rate: ",rate -write(*,*) "niter= ",max_iterations," s= ",s - -allocate ( codeword(N), decoded(K), message(K) ) -allocate ( rxdata(N), llr(N) ) - -! The message should be packed into the first 7 bytes - i1Msg8BitBytes(1:6)=85 - i1Msg8BitBytes(7)=64 -! The CRC will be put into the last 2 bytes - i1Msg8BitBytes(8:9)=0 - checksum = crc10 (c_loc (i1Msg8BitBytes), 9) -! For reference, the next 3 lines show how to check the CRC - i1Msg8BitBytes(8)=checksum/256 - i1Msg8BitBytes(9)=iand (checksum,255) - checksumok = crc10_check(c_loc (i1Msg8BitBytes), 9) - if( checksumok ) write(*,*) 'Good checksum' -write(*,*) i1Msg8BitBytes(1:9) - - mbit=0 - do i=1, 7 - i1=i1Msg8BitBytes(i) - do ibit=1,8 - mbit=mbit+1 - msgbits(mbit)=iand(1,ishft(i1,ibit-8)) - enddo - enddo - i1=i1Msg8BitBytes(8) ! First 2 bits of crc10 are LSB of this byte - do ibit=1,2 - msgbits(50+ibit)=iand(1,ishft(i1,ibit-2)) - enddo - i1=i1Msg8BitBytes(9) ! Now shift in last 8 bits of the CRC - do ibit=1,8 - msgbits(52+ibit)=iand(1,ishft(i1,ibit-8)) - enddo - - write(*,*) 'message' - write(*,'(9(8i1,1x))') msgbits - - call encode120(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(15(8i1,1x))') codeword - -write(*,*) "Es/N0 SNR2500 ngood nundetected nbadcrc sigma" -do idb = -10, 24 - db=idb/2.0-1.0 -! sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No - sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nbadcrc=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - if( bpsk ) then - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - elseif( fsk ) then - if( codeword(i) .eq. 1 ) then - r1=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r2=(sigma*gran())**2 + (sigma*gran())**2 - elseif( codeword(i) .eq. 0 ) then - r2=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r1=(sigma*gran())**2 + (sigma*gran())**2 - endif - rxdata(i)=0.35*(sqrt(r1)-sqrt(r2)) -! rxdata(i)=0.35*(exp(r1)-exp(r2)) -! rxdata(i)=0.12*(log(r1)-log(r2)) - endif - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - -! Correct signal normalization is important for this decoder. -! rxav=sum(rxdata)/N -! rx2av=sum(rxdata*rxdata)/N -! rxsig=sqrt(rx2av-rxav*rxav) -! rxdata=rxdata/rxsig -! To match the metric to the channel, s should be set to the noise standard deviation. -! For now, set s to the value that optimizes decode probability near threshold. -! The s parameter can be tuned to trade a few tenth's dB of threshold for an order of -! magnitude in UER - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 - -! max_iterations is max number of belief propagation iterations - call bpdecode120(llr, apmask, max_iterations, decoded, niterations, cw) - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo -!write(*,*) nerr,niterations,n2err - damp=0.75 - ndither=0 - if( niterations .lt. 0 ) then - do i=1, ndither - do in=1,N - dllr(in)=damp*gran() - enddo - llrd=llr+dllr - call bpdecode120(llrd, apmask, max_iterations, decoded, niterations, cw) - if( niterations .ge. 0 ) exit - enddo - endif - -! If the decoder finds a valid codeword, niterations will be .ge. 0. - if( niterations .ge. 0 ) then -! Check the CRC - do ibyte=1,6 - itmp=0 - do ibit=1,8 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit)) - enddo - i1Dec8BitBytes(ibyte)=itmp - enddo - i1Dec8BitBytes(7)=decoded(49)*128+decoded(50)*64 -! Need to pack the received crc into bytes 8 and 9 for crc10_check - i1Dec8BitBytes(8)=decoded(51)*2+decoded(52) - i1Dec8BitBytes(9)=decoded(53)*128+decoded(54)*64+decoded(55)*32+decoded(56)*16 - i1Dec8BitBytes(9)=i1Dec8BitBytes(9)+decoded(57)*8+decoded(58)*4+decoded(59)*2+decoded(60)*1 - ncrcflag=0 - if( crc10_check( c_loc( i1Dec8BitBytes ), 9 ) ) ncrcflag=1 - - if( ncrcflag .ne. 1 ) then - nbadcrc=nbadcrc+1 - endif - nueflag=0 - - nerrmpc=0 - do i=1,K ! find number of errors in message+crc part of codeword - if( msgbits(i) .ne. decoded(i) ) then - nueflag=1 - nerrmpc=nerrmpc+1 - endif - enddo - nmpcbad(nerrmpc)=nmpcbad(nerrmpc)+1 ! This histogram should inform our selection of CRC poly - if( ncrcflag .eq. 1 .and. nueflag .eq. 0 ) then - ngood=ngood+1 - nerrdec(nerr)=nerrdec(nerr)+1 - else if( ncrcflag .eq. 1 .and. nueflag .eq. 1 ) then - nue=nue+1; - endif - endif - enddo - snr2500=db+10*log10(0.4166/2500.0) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr - -enddo - -open(unit=23,file='nerrhisto.dat',status='unknown') -do i=1,120 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) -enddo -close(23) -open(unit=25,file='nmpcbad.dat',status='unknown') -do i=1,60 - write(25,'(i4,2x,i10)') i,nmpcbad(i) -enddo -close(25) - - - -end program ldpcsim120 diff --git a/lib/fsk4hf/ldpcsim168.f90 b/lib/fsk4hf/ldpcsim168.f90 deleted file mode 100644 index 57dbbd558..000000000 --- a/lib/fsk4hf/ldpcsim168.f90 +++ /dev/null @@ -1,233 +0,0 @@ -program ldpcsim168 -! End to end test of the (168,84)/crc12 encoder and decoder. -use crc -use packjt - -parameter(NRECENT=10) -character*12 recent_calls(NRECENT) -character*22 msg,msgsent,msgreceived -character*8 arg -integer*1, allocatable :: codeword(:), decoded(:), message(:) -integer*1, target:: i1Msg8BitBytes(11) -integer*1 msgbits(84) -integer*1 apmask(168), cw(168) -integer*2 checksum -integer*4 i4Msg6BitWords(13) -integer colorder(168) -integer nerrtot(168),nerrdec(168),nmpcbad(84) -logical checksumok,fsk,bpsk -real*8, allocatable :: rxdata(:) -real, allocatable :: llr(:) - -data colorder/0,1,2,3,28,4,5,6,7,8,9,10,11,34,12,32,13,14,15,16,17, & - 18,36,29,42,31,20,21,41,40,30,38,22,19,47,37,46,35,44,33,49,24, & - 43,51,25,26,27,50,52,57,69,54,55,45,59,58,56,61,60,53,48,23,62, & - 63,64,67,66,65,68,39,70,71,72,74,73,75,76,77,80,81,78,82,79,83, & - 84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, & - 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, & - 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146, & - 147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167/ - -do i=1,NRECENT - recent_calls(i)=' ' -enddo -nerrtot=0 -nerrdec=0 -nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - -nargs=iargc() -if(nargs.ne.3) then - print*,'Usage: ldpcsim niter #trials s ' - print*,'eg: ldpcsim 10 1000 0.84' - print*,'If s is negative, then value is ignored and sigma is calculated from SNR.' - return -endif -call getarg(1,arg) -read(arg,*) max_iterations -call getarg(2,arg) -read(arg,*) ntrials -call getarg(3,arg) -read(arg,*) s - -fsk=.false. -bpsk=.true. - -! don't count crc bits as data bits -N=168 -K=84 -! scale Eb/No for a (168,72) code -rate=real(72)/real(N) - -write(*,*) "rate: ",rate -write(*,*) "niter= ",max_iterations," s= ",s - -allocate ( codeword(N), decoded(K), message(K) ) -allocate ( rxdata(N), llr(N) ) - -! msg="K1JT K9AN EN50" - msg="G4WJS K9AN EN50" - call packmsg(msg,i4Msg6BitWords,itype) !Pack into 12 6-bit bytes - call unpackmsg(i4Msg6BitWords,msgsent) !Unpack to get msgsent - write(*,*) "message sent ",msgsent - - i4=0 - ik=0 - im=0 - do i=1,12 - nn=i4Msg6BitWords(i) - do j=1, 6 - ik=ik+1 - i4=i4+i4+iand(1,ishft(nn,j-6)) - i4=iand(i4,255) - if(ik.eq.8) then - im=im+1 -! if(i4.gt.127) i4=i4-256 - i1Msg8BitBytes(im)=i4 - ik=0 - endif - enddo - enddo - - i1Msg8BitBytes(10:11)=0 - checksum = crc12 (c_loc (i1Msg8BitBytes), 11) -! For reference, the next 3 lines show how to check the CRC - i1Msg8BitBytes(10)=checksum/256 - i1Msg8BitBytes(11)=iand (checksum,255) - checksumok = crc12_check(c_loc (i1Msg8BitBytes), 11) - if( checksumok ) write(*,*) 'Good checksum' - - mbit=0 - do i=1, 9 - i1=i1Msg8BitBytes(i) - do ibit=1,8 - mbit=mbit+1 - msgbits(mbit)=iand(1,ishft(i1,ibit-8)) - enddo - enddo - i1=i1Msg8BitBytes(10) ! First 4 bits of crc12 are LSB of this byte - do ibit=1,4 - msgbits(72+ibit)=iand(1,ishft(i1,ibit-4)) - enddo - i1=i1Msg8BitBytes(11) ! Now shift in last 8 bits of the CRC - do ibit=1,8 - msgbits(76+ibit)=iand(1,ishft(i1,ibit-8)) - enddo - - write(*,*) 'message' - write(*,'(11(8i1,1x))') msgbits - - call encode168(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(21(8i1,1x))') codeword - -write(*,*) "Es/N0 SNR2500 ngood nundetected nbadcrc sigma" -do idb = 6,-6,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*(10**(db/10.0)) ) - ngood=0 - nue=0 - nbadcrc=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - if( bpsk ) then - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - elseif( fsk ) then - if( codeword(i) .eq. 1 ) then - r1=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r2=(sigma*gran())**2 + (sigma*gran())**2 - elseif( codeword(i) .eq. 0 ) then - r2=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r1=(sigma*gran())**2 + (sigma*gran())**2 - endif - rxdata(i)=0.35*(sqrt(r1)-sqrt(r2)) -! rxdata(i)=0.35*(exp(r1)-exp(r2)) -! rxdata(i)=0.12*(log(r1)-log(r2)) - endif - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - -! Correct signal normalization is important for this decoder. -! rxav=sum(rxdata)/N -! rx2av=sum(rxdata*rxdata)/N -! rxsig=sqrt(rx2av-rxav*rxav) -! rxdata=rxdata/rxsig -! To match the metric to the channel, s should be set to the noise standard deviation. -! For now, set s to the value that optimizes decode probability near threshold. -! The s parameter can be tuned to trade a few tenth's dB of threshold for an order of -! magnitude in UER - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - nap=0 ! number of AP bits - llr(colorder(168-84+1:168-84+nap)+1)=5*(2.0*msgbits(1:nap)-1.0) - apmask=0 - apmask(colorder(168-84+1:168-84+nap)+1)=1 - -! max_iterations is max number of belief propagation iterations - call bpdecode168(llr, apmask, max_iterations, decoded, niterations) -! if( niterations .eq. -1 ) then -! norder=3 -! call osd168(llr, norder, decoded, niterations, cw) -! endif -! If the decoder finds a valid codeword, niterations will be .ge. 0. - if( niterations .ge. 0 ) then - call extractmessage168(decoded,msgreceived,ncrcflag,recent_calls,nrecent) - if( ncrcflag .ne. 1 ) then - nbadcrc=nbadcrc+1 - endif - - nueflag=0 - nerrmpc=0 - do i=1,K ! find number of errors in message+crc part of codeword - if( msgbits(i) .ne. decoded(i) ) then - nueflag=1 - nerrmpc=nerrmpc+1 - endif - enddo - -write(37,*) niterations, ncrcflag, nueflag - nmpcbad(nerrmpc)=nmpcbad(nerrmpc)+1 - if( ncrcflag .eq. 1 ) then - if( nueflag .eq. 0 ) then - ngood=ngood+1 - nerrdec(nerr)=nerrdec(nerr)+1 - else if( nueflag .eq. 1 ) then - nue=nue+1; - endif - endif - endif - enddo - snr2500=db+10*log10(10.417/2500.0) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr - -enddo - -open(unit=23,file='nerrhisto.dat',status='unknown') -do i=1,168 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) -enddo -close(23) -open(unit=25,file='nmpcbad.dat',status='unknown') -do i=1,84 - write(25,'(i4,2x,i10)') i,nmpcbad(i) -enddo -close(25) - - - -end program ldpcsim168 diff --git a/lib/fsk4hf/ldpcsim174.f90 b/lib/fsk4hf/ldpcsim174.f90 deleted file mode 100644 index 900011684..000000000 --- a/lib/fsk4hf/ldpcsim174.f90 +++ /dev/null @@ -1,233 +0,0 @@ -program ldpcsim174 -! End to end test of the (174,75)/crc12 encoder and decoder. -use crc -use packjt - -character*22 msg,msgsent,msgreceived -character*8 arg -character*6 grid -integer*1, allocatable :: codeword(:), decoded(:), message(:) -integer*1, target:: i1Msg8BitBytes(11) -integer*1 msgbits(87) -integer*1 apmask(174), cw(174) -integer*2 checksum -integer*4 i4Msg6BitWords(13) -integer colorder(174) -integer nerrtot(174),nerrdec(174),nmpcbad(87) -logical checksumok,fsk,bpsk -real*8, allocatable :: rxdata(:) -real, allocatable :: llr(:) - -data colorder/ & - 0, 1, 2, 3, 30, 4, 5, 6, 7, 8, 9, 10, 11, 32, 12, 40, 13, 14, 15, 16,& - 17, 18, 37, 45, 29, 19, 20, 21, 41, 22, 42, 31, 33, 34, 44, 35, 47, 51, 50, 43,& - 36, 52, 63, 46, 25, 55, 27, 24, 23, 53, 39, 49, 59, 38, 48, 61, 60, 57, 28, 62,& - 56, 58, 65, 66, 26, 70, 64, 69, 68, 67, 74, 71, 54, 76, 72, 75, 78, 77, 80, 79,& - 73, 83, 84, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,& - 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,& - 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,& - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,& - 160,161,162,163,164,165,166,167,168,169,170,171,172,173/ - -nerrtot=0 -nerrdec=0 -nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - -nargs=iargc() -if(nargs.ne.4) then - print*,'Usage: ldpcsim niter ndepth #trials s ' - print*,'eg: ldpcsim 10 2 1000 0.84' - print*,'belief propagation iterations: niter, ordered-statistics depth: ndepth' - print*,'If s is negative, then value is ignored and sigma is calculated from SNR.' - return -endif -call getarg(1,arg) -read(arg,*) max_iterations -call getarg(2,arg) -read(arg,*) ndepth -call getarg(3,arg) -read(arg,*) ntrials -call getarg(4,arg) -read(arg,*) s - -fsk=.false. -bpsk=.true. - -! don't count crc bits as data bits -N=174 -K=87 -! scale Eb/No for a (174,87) code -rate=real(K)/real(N) - -write(*,*) "rate: ",rate -write(*,*) "niter= ",max_iterations," s= ",s - -allocate ( codeword(N), decoded(K), message(K) ) -allocate ( rxdata(N), llr(N) ) - - msg="K1JT K9AN EN50" -! msg="G4WJS K9AN EN50" - call packmsg(msg,i4Msg6BitWords,itype) !Pack into 12 6-bit bytes - call unpackmsg(i4Msg6BitWords,msgsent) !Unpack to get msgsent - write(*,*) "message sent ",msgsent - - i4=0 - ik=0 - im=0 - do i=1,12 - nn=i4Msg6BitWords(i) - do j=1, 6 - ik=ik+1 - i4=i4+i4+iand(1,ishft(nn,j-6)) - i4=iand(i4,255) - if(ik.eq.8) then - im=im+1 -! if(i4.gt.127) i4=i4-256 - i1Msg8BitBytes(im)=i4 - ik=0 - endif - enddo - enddo - - i1Msg8BitBytes(10:11)=0 - checksum = crc12 (c_loc (i1Msg8BitBytes), 11) -! For reference, the next 3 lines show how to check the CRC - i1Msg8BitBytes(10)=checksum/256 - i1Msg8BitBytes(11)=iand (checksum,255) - checksumok = crc12_check(c_loc (i1Msg8BitBytes), 11) - if( checksumok ) write(*,*) 'Good checksum' - -! K=87, For now: -! msgbits(1:72) JT message bits -! msgbits(73:75) 3 free message bits (set to 0) -! msgbits(76:87) CRC12 - mbit=0 - do i=1, 9 - i1=i1Msg8BitBytes(i) - do ibit=1,8 - mbit=mbit+1 - msgbits(mbit)=iand(1,ishft(i1,ibit-8)) - enddo - enddo - msgbits(73:75)=0 ! the three extra message bits go here - i1=i1Msg8BitBytes(10) ! First 4 bits of crc12 are LSB of this byte - do ibit=1,4 - msgbits(75+ibit)=iand(1,ishft(i1,ibit-4)) - enddo - i1=i1Msg8BitBytes(11) ! Now shift in last 8 bits of the CRC - do ibit=1,8 - msgbits(79+ibit)=iand(1,ishft(i1,ibit-8)) - enddo - - write(*,*) 'message' - write(*,'(11(8i1,1x))') msgbits - - call encode174(msgbits,codeword) - call init_random_seed() -! call sgran() - - write(*,*) 'codeword' - write(*,'(22(8i1,1x))') codeword - -write(*,*) "Eb/N0 SNR2500 ngood nundetected nbadcrc sigma" -do idb = 20,-10,-1 -!do idb = -3,-3,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) - ngood=0 - nue=0 - nbadcrc=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - if( bpsk ) then - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - elseif( fsk ) then - if( codeword(i) .eq. 1 ) then - r1=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r2=(sigma*gran())**2 + (sigma*gran())**2 - elseif( codeword(i) .eq. 0 ) then - r2=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r1=(sigma*gran())**2 + (sigma*gran())**2 - endif -! rxdata(i)=0.35*(sqrt(r1)-sqrt(r2)) -! rxdata(i)=0.35*(exp(r1)-exp(r2)) - rxdata(i)=0.12*(log(r1)-log(r2)) - endif - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig -! To match the metric to the channel, s should be set to the noise standard deviation. -! For now, set s to the value that optimizes decode probability near threshold. -! The s parameter can be tuned to trade a few tenth's dB of threshold for an order of -! magnitude in UER - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - nap=0 ! number of AP bits - llr(colorder(174-87+1:174-87+nap)+1)=5*(2.0*msgbits(1:nap)-1.0) - apmask=0 - apmask(colorder(174-87+1:174-87+nap)+1)=1 - -! max_iterations is max number of belief propagation iterations - call bpdecode174(llr, apmask, max_iterations, decoded, cw, nharderrors,niterations) - if( ndepth .ge. 0 .and. nharderrors .lt. 0 ) call osd174(llr, apmask, ndepth, decoded, cw, nharderrors, dmin) -! If the decoder finds a valid codeword, nharderrors will be .ge. 0. - if( nharderrors .ge. 0 ) then - call extractmessage174(decoded,msgreceived,ncrcflag) - if( ncrcflag .ne. 1 ) then - nbadcrc=nbadcrc+1 - endif - - nueflag=0 - nerrmpc=0 - do i=1,K ! find number of errors in message+crc part of codeword - if( msgbits(i) .ne. decoded(i) ) then - nueflag=1 - nerrmpc=nerrmpc+1 - endif - enddo - if(nerrmpc.ge.1) nmpcbad(nerrmpc)=nmpcbad(nerrmpc)+1 - if( ncrcflag .eq. 1 ) then - if( nueflag .eq. 0 ) then - ngood=ngood+1 - if(nerr.ge.1) nerrdec(nerr)=nerrdec(nerr)+1 - else if( nueflag .eq. 1 ) then - nue=nue+1; - endif - endif - endif - enddo - baud=12000/1920 - snr2500=db+10.0*log10((baud/2500.0)) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr - -enddo - -open(unit=23,file='nerrhisto.dat',status='unknown') -do i=1,174 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) -enddo -close(23) -open(unit=25,file='nmpcbad.dat',status='unknown') -do i=1,87 - write(25,'(i4,2x,i10)') i,nmpcbad(i) -enddo -close(25) - -end program ldpcsim174 diff --git a/lib/fsk4hf/ldpcsim174_101.f90 b/lib/fsk4hf/ldpcsim174_101.f90 deleted file mode 100644 index 7833b10cf..000000000 --- a/lib/fsk4hf/ldpcsim174_101.f90 +++ /dev/null @@ -1,144 +0,0 @@ -program ldpcsim174_101 - -! End-to-end test of the (174,101)/crc24 encoder and decoders. - - use packjt77 - - parameter(N=174, K=101, M=N-K) - character*8 arg - character*37 msg0,msg - character*77 c77 - character*24 c24 - integer*1 msgbits(101) - integer*1 apmask(174) - integer*1 cw(174) - integer*1 codeword(N),message(77),message101(101) - integer ncrc24 - real rxdata(N),llr(N) - real dllr(174),llrd(174) - logical first,unpk77_success - data first/.true./ - - nargs=iargc() - if(nargs.ne.5 .and. nargs.ne.6) then - print*,'Usage: ldpcsim niter ndeep #trials s K [msg]' - print*,'e.g. ldpcsim174_101 20 5 1000 0.85 91 "K9AN K1JT FN20"' - print*,'s : if negative, then value is ignored and sigma is calculated from SNR.' - print*,'niter: is the number of BP iterations.' - print*,'ndeep: -1 is BP only, ndeep>=0 is OSD order' - print*,'K :is the number of message+CRC bits and must be in the range [77,101]' - print*,'WSPR-format message is optional' - return - endif - call getarg(1,arg) - read(arg,*) max_iterations - call getarg(2,arg) - read(arg,*) ndeep - call getarg(3,arg) - read(arg,*) ntrials - call getarg(4,arg) - read(arg,*) s - call getarg(5,arg) - read(arg,*) Keff - msg0='K9AN K1JT FN20 ' - if(nargs.eq.6) call getarg(6,msg0) - call pack77(msg0,i3,n3,c77) - - rate=real(Keff)/real(N) - - write(*,*) "code rate: ",rate - write(*,*) "niter : ",max_iterations - write(*,*) "ndeep : ",ndeep - write(*,*) "s : ",s - write(*,*) "K : ",Keff - - msgbits=0 - read(c77,'(77i1)') msgbits(1:77) - write(*,*) 'message' - write(*,'(77i1)') msgbits(1:77) - - call get_crc24(msgbits,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(78:101) -write(*,'(24i1)') msgbits(78:101) - write(*,*) 'message with crc24' - write(*,'(101i1)') msgbits(1:101) - call encode174_101(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(77i1,1x,24i1,1x,73i1)') codeword - - write(*,*) "Eb/N0 Es/N0 ngood nundetected sigma symbol error rate" - do idb = 8,-3,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode174_101(llr,apmask,max_iterations,message101,cw,nharderror,niterations,nchecks) - dmin=0.0 - if( (nharderror .lt. 0) .and. (ndeep .ge. 0) ) then -! call osd174_101(llr, Keff, apmask, ndeep, message101, cw, nharderror, dmin) - maxsuper=2 - call decode174_101(llr, Keff, ndeep, apmask, maxsuper, message101, cw, nharderror, iterations, ncheck, dmin, isuper) - endif - - if(nharderror.ge.0) then - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo - if(n2err.eq.0) then - ngood=ngood+1 - else - nue=nue+1 - endif - endif - enddo -! snr2500=db+10*log10(200.0/116.0/2500.0) - esn0=db+10*log10(rate) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,esn0,ngood,nue,ss,pberr - - if(first) then - write(c77,'(77i1)') message101(1:77) -write(*,'(101i1)') message101 - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success) then - write(*,1100) msg(1:37) -1100 format('Decoded message: ',a37) - else - print*,'Error unpacking message' - endif - first=.false. - endif - enddo - -end program ldpcsim174_101 diff --git a/lib/fsk4hf/ldpcsim174_74.f90 b/lib/fsk4hf/ldpcsim174_74.f90 deleted file mode 100644 index f432a2e7e..000000000 --- a/lib/fsk4hf/ldpcsim174_74.f90 +++ /dev/null @@ -1,159 +0,0 @@ -program ldpcsim174_74 - -! End-to-end test of the (174,74)/crc24 encoder and decoders. - - use packjt77 - - parameter(N=174, K=74, M=N-K) - character*8 arg - character*37 msg0,msg - character*77 c77 - character*50 cmsg - character*24 c24 - integer*1 msgbits(74) - integer*1 apmask(174) - integer*1 cw(174) - integer*1 codeword(N),message74(74) - integer ncrc24 - integer nerrtot(174),nerrdec(174),nmpcbad(74) - real rxdata(N),llr(N) - real dllr(174),llrd(174) - logical first,unpk77_success - data first/.true./ - - nerrtot=0 - nerrdec=0 - nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - - nargs=iargc() - if(nargs.ne.5 .and. nargs.ne.6) then - print*,'Usage: ldpcsim niter ndeep #trials s K [msg]' - print*,'e.g. ldpcsim174_74 20 5 1000 0.85 64 "K9AN EN50 37"' - print*,'s : if negative, then value is ignored and sigma is calculated from SNR.' - print*,'niter: is the number of BP iterations.' - print*,'ndeep: -1 is BP only, ndeep>=0 is OSD order' - print*,'K :is the number of message+CRC bits and must be in the range [50,74]' - print*,'WSPR-format message is optional' - return - endif - call getarg(1,arg) - read(arg,*) max_iterations - call getarg(2,arg) - read(arg,*) ndeep - call getarg(3,arg) - read(arg,*) ntrials - call getarg(4,arg) - read(arg,*) s - call getarg(5,arg) - read(arg,*) Keff - msg0='K9AN EN50 37 ' - if(nargs.eq.6) call getarg(6,msg0) - call pack77(msg0,i3,n3,c77) - cmsg=c77(1:50) - - rate=real(Keff)/real(N) - - write(*,*) "code rate: ",rate - write(*,*) "niter : ",max_iterations - write(*,*) "ndeep : ",ndeep - write(*,*) "s : ",s - write(*,*) "K : ",Keff - - msgbits=0 - read(cmsg,'(50i1)') msgbits(1:50) - write(*,*) 'message' - write(*,'(74i1)') msgbits - - call get_crc24(msgbits,74,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(51:74) - call encode174_74(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(50i1,1x,24i1,1x,100i1)') codeword - - write(*,*) "Eb/N0 Es/N0 ngood nundetected sigma symbol error rate" - do idb = 8,-3,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode174_74(llr,apmask,max_iterations,message74,cw,nharderror,niterations,nchecks) - dmin=0.0 - if( (nharderror .lt. 0) .and. (ndeep .ge. 0) ) then -! call osd174_74(llr, Keff, apmask, ndeep, message74, cw, nharderror, dmin) -call decode174_74(llr,Keff,ndeep,apmask,max_iterations,message74,cw,nharderror,niterations,ncheck,dmin,isuper) - endif - - if(nharderror.ge.0) then - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo - if(n2err.eq.0) then - ngood=ngood+1 - else - nue=nue+1 - endif - endif - enddo -! snr2500=db+10*log10(200.0/116.0/2500.0) - esn0=db+10*log10(rate) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,esn0,ngood,nue,ss,pberr - - if(first) then - write(c77,'(74i1)') message74 - c77(51:77)='000000000000000000000110000' - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success) then - write(*,1100) msg(1:14) -1100 format('Decoded message: ',a14) - else - print*,'Error unpacking message' - endif - first=.false. - endif - enddo - - open(unit=23,file='nerrhisto.dat',status='unknown') - do i=1,120 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) - enddo - close(23) - open(unit=25,file='nmpcbad.dat',status='unknown') - do i=1,68 - write(25,'(i4,2x,i10)') i,nmpcbad(i) - enddo - close(25) - -end program ldpcsim174_74 diff --git a/lib/fsk4hf/ldpcsim204.f90 b/lib/fsk4hf/ldpcsim204.f90 deleted file mode 100644 index 6d6c1e6b9..000000000 --- a/lib/fsk4hf/ldpcsim204.f90 +++ /dev/null @@ -1,205 +0,0 @@ -program ldpcsim204 - -! End-to-end test of the (300,60)/crc10 encoder and decoders. - -use crc -use packjt - -parameter(NRECENT=10) -character*12 recent_calls(NRECENT) -character*8 arg -character*68 cmsg -character*14 c14 -integer*1, allocatable :: codeword(:), decoded(:), message(:) -integer*1, target:: i1Msg8BitBytes(9) -integer*1, target:: i1Dec8BitBytes(9) -integer*1 msgbits(68) -integer*1 apmask(204) -integer*1 cw(204) -integer*2 ncrc14,nrcrc14 -integer colorder(204) -integer nerrtot(204),nerrdec(204),nmpcbad(68) -logical checksumok,fsk,bpsk -real*8, allocatable :: rxdata(:) -real, allocatable :: llr(:) -real dllr(204),llrd(204) - -data colorder/ & - 0, 1, 2, 3, 4, 5, 47, 6, 7, 8, 9, 10, 11, 12, 58, 55, 13, & - 14, 15, 46, 17, 18, 60, 19, 20, 21, 22, 23, 24, 25, 57, 26, 27, 49, & - 28, 52, 65, 16, 50, 73, 59, 68, 63, 29, 30, 31, 32, 51, 62, 56, 66, & - 45, 33, 34, 53, 67, 35, 36, 37, 61, 69, 54, 38, 71, 82, 39, 77, 80, & - 83, 78, 84, 48, 41, 85, 40, 64, 75, 96, 74, 72, 76, 86, 87, 89, 90, & - 79, 70, 92, 99, 93,101, 95,100, 97, 94, 42, 98,103,105,102, 43,104, & - 88, 44,106, 81,107,110,108,111,112,109,113,114,117,118,116,121,115, & - 119,122,120,125,129,124,127,126,128, 91,123,133,131,130,134,135,137, & - 136,132,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152, & - 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169, & - 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186, & - 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203/ - -data cmsg/'11111111000000001111111100000000111111110000000011000000000000000000'/ - -do i=1,NRECENT - recent_calls(i)=' ' -enddo -nerrtot=0 -nerrdec=0 -nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - -nargs=iargc() -if(nargs.ne.4) then - print*,'Usage: ldpcsim niter ndeep #trials s ' - print*,'eg: ldpcsim 100 4 1000 0.84' - print*,'If s is negative, then value is ignored and sigma is calculated from SNR.' - return -endif -call getarg(1,arg) -read(arg,*) max_iterations -call getarg(2,arg) -read(arg,*) ndeep -call getarg(3,arg) -read(arg,*) ntrials -call getarg(4,arg) -read(arg,*) s - -fsk=.false. -bpsk=.true. - -N=204 -K=68 -rate=real(K)/real(N) - - -write(*,*) "rate: ",rate -write(*,*) "niter= ",max_iterations," s= ",s - -allocate ( codeword(N), decoded(K), message(K) ) -allocate ( rxdata(N), llr(N) ) - - read(cmsg,'(68i1)') msgbits - call get_crc14(msgbits,ncrcsf) - write(c14,'(b14.14)') ncrcsf - read(c14,'(14i1)') msgbits(55:68) - - write(*,*) 'message' - write(*,'(9(8i1,1x))') msgbits - - call encode204(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(204i1)') codeword - -write(*,*) "Eb/N0 SNR2500 ngood nundetected nbadcrc sigma" -do idb = 10,-10,-1 -!do idb = 2, 2, -1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nbadcrc=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - if( bpsk ) then - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - elseif( fsk ) then - if( codeword(i) .eq. 1 ) then - r1=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r2=(sigma*gran())**2 + (sigma*gran())**2 - elseif( codeword(i) .eq. 0 ) then - r2=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r1=(sigma*gran())**2 + (sigma*gran())**2 - endif - rxdata(i)=0.35*(sqrt(r1)-sqrt(r2)) -! rxdata(i)=0.35*(exp(r1)-exp(r2)) -! rxdata(i)=0.12*(log(r1)-log(r2)) - endif - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig -! To match the metric to the channel, s should be set to the noise standard deviation. -! For now, set s to the value that optimizes decode probability near threshold. -! The s parameter can be tuned to trade a few tenth's dB of threshold for an order of -! magnitude in UER - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode204(llr,apmask,max_iterations,decoded,cw,nharderror,niterations) - if(nharderror.lt.0) niterations=-1 - if( (nharderror .lt. 0) .and. (ndeep .ge. 0) ) then - call osd204(llr, apmask, ndeep, decoded, cw, nhardmin, dmin) - niterations=nhardmin - endif - - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo - -! If the decoder finds a valid codeword, niterations will be .ge. 0. - if( niterations .ge. 0 ) then - call get_crc14(decoded,ncheck) - ncrcflag=0 - if(ncheck.eq.0) ncrcflag=1 - if( ncrcflag .ne. 1 ) then - nbadcrc=nbadcrc+1 - endif - - nueflag=0 - nerrmpc=0 - do i=1,K ! find number of errors in message+crc part of codeword - if( msgbits(i) .ne. decoded(i) ) then - if(ncrcflag.eq.1) nueflag=1 - nerrmpc=nerrmpc+1 - endif - enddo - - if(nerrmpc.ge.1) nmpcbad(nerrmpc)=nmpcbad(nerrmpc)+1 ! This histogram should inform our selection of CRC poly - if( ncrcflag .eq. 1 .and. nueflag .eq. 0 ) then - ngood=ngood+1 - if(nerr.ge.1) nerrdec(nerr)=nerrdec(nerr)+1 - else if( ncrcflag .eq. 1 .and. nueflag .eq. 1 ) then - nue=nue+1; - endif - endif - enddo - snr2500=db+10*log10(200.0/116.0/2500.0) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr - -enddo - -open(unit=23,file='nerrhisto.dat',status='unknown') -do i=1,120 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) -enddo -close(23) -open(unit=25,file='nmpcbad.dat',status='unknown') -do i=1,68 - write(25,'(i4,2x,i10)') i,nmpcbad(i) -enddo -close(25) - - - -end program ldpcsim204 diff --git a/lib/fsk4hf/ldpcsim240_101.f90 b/lib/fsk4hf/ldpcsim240_101.f90 deleted file mode 100644 index d87241fa4..000000000 --- a/lib/fsk4hf/ldpcsim240_101.f90 +++ /dev/null @@ -1,144 +0,0 @@ -program ldpcsim240_101 - -! End-to-end test of the (240,101)/crc24 encoder and decoders. - - use packjt77 - - parameter(N=240, K=101, M=N-K) - character*8 arg - character*37 msg0,msg - character*77 c77 - character*24 c24 - integer*1 msgbits(101) - integer*1 apmask(240) - integer*1 cw(240) - integer*1 codeword(N),message101(101) - integer ncrc24 - real rxdata(N),llr(N) - real llrd(240) - logical first,unpk77_success - data first/.true./ - - nargs=iargc() - if(nargs.ne.5 .and. nargs.ne.6) then - print*,'Usage: ldpcsim niter ndeep #trials s K [msg]' - print*,'e.g. ldpcsim240_101 20 5 1000 0.85 91 "K9AN K1JT FN20"' - print*,'s : if negative, then value is ignored and sigma is calculated from SNR.' - print*,'niter: is the number of BP iterations.' - print*,'ndeep: -1 is BP only, ndeep>=0 is OSD order' - print*,'K :is the number of message+CRC bits and must be in the range [77,101]' - print*,'WSPR-format message is optional' - return - endif - call getarg(1,arg) - read(arg,*) max_iterations - call getarg(2,arg) - read(arg,*) ndeep - call getarg(3,arg) - read(arg,*) ntrials - call getarg(4,arg) - read(arg,*) s - call getarg(5,arg) - read(arg,*) Keff - msg0='K9AN K1JT FN20 ' - if(nargs.eq.6) call getarg(6,msg0) - call pack77(msg0,i3,n3,c77) - - rate=real(Keff)/real(N) - - write(*,*) "code rate: ",rate - write(*,*) "niter : ",max_iterations - write(*,*) "ndeep : ",ndeep - write(*,*) "s : ",s - write(*,*) "K : ",Keff - - msgbits=0 - read(c77,'(77i1)') msgbits(1:77) - write(*,*) 'message' - write(*,'(77i1)') msgbits(1:77) - - call get_crc24(msgbits,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(78:101) -write(*,'(24i1)') msgbits(78:101) - write(*,*) 'message with crc24' - write(*,'(101i1)') msgbits(1:101) - call encode240_101(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(77i1,1x,24i1,1x,73i1)') codeword - - write(*,*) "Eb/N0 Es/N0 ngood nundetected sigma symbol error rate" - do idb = 8,-3,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode240_101(llr,apmask,max_iterations,message101,cw,nharderror,niterations,nchecks) - dmin=0.0 - if( (nharderror .lt. 0) .and. (ndeep .ge. 0) ) then -! call osd240_101(llr, Keff, apmask, ndeep, message101, cw, nharderror, dmin) - maxsuper=2 - call decode240_101(llr, Keff, ndeep, apmask, maxsuper, message101, cw, nharderror, iterations, ncheck, dmin, isuper) - endif - - if(nharderror.ge.0) then - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo - if(n2err.eq.0) then - ngood=ngood+1 - else - nue=nue+1 - endif - endif - enddo -! snr2500=db+10*log10(200.0/116.0/2500.0) - esn0=db+10*log10(rate) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,esn0,ngood,nue,ss,pberr - - if(first) then - write(c77,'(77i1)') message101(1:77) -write(*,'(101i1)') message101 - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success) then - write(*,1100) msg(1:37) -1100 format('Decoded message: ',a37) - else - print*,'Error unpacking message' - endif - first=.false. - endif - enddo - -end program ldpcsim240_101 diff --git a/lib/fsk4hf/ldpcsim280_101.f90 b/lib/fsk4hf/ldpcsim280_101.f90 deleted file mode 100644 index 060e32c80..000000000 --- a/lib/fsk4hf/ldpcsim280_101.f90 +++ /dev/null @@ -1,144 +0,0 @@ -program ldpcsim280_101 - -! End-to-end test of the (280,101)/crc24 encoder and decoders. - - use packjt77 - - parameter(N=280, K=101, M=N-K) - character*8 arg - character*37 msg0,msg - character*77 c77 - character*24 c24 - integer*1 msgbits(101) - integer*1 apmask(280) - integer*1 cw(280) - integer*1 codeword(N),message101(101) - integer ncrc24 - real rxdata(N),llr(N) - real llrd(280) - logical first,unpk77_success - data first/.true./ - - nargs=iargc() - if(nargs.ne.5 .and. nargs.ne.6) then - print*,'Usage: ldpcsim niter ndeep #trials s K [msg]' - print*,'e.g. ldpcsim280_101 20 5 1000 0.85 91 "K9AN K1JT FN20"' - print*,'s : if negative, then value is ignored and sigma is calculated from SNR.' - print*,'niter: is the number of BP iterations.' - print*,'ndeep: -1 is BP only, ndeep>=0 is OSD order' - print*,'K :is the number of message+CRC bits and must be in the range [77,101]' - print*,'WSPR-format message is optional' - return - endif - call getarg(1,arg) - read(arg,*) max_iterations - call getarg(2,arg) - read(arg,*) ndeep - call getarg(3,arg) - read(arg,*) ntrials - call getarg(4,arg) - read(arg,*) s - call getarg(5,arg) - read(arg,*) Keff - msg0='K9AN K1JT FN20 ' - if(nargs.eq.6) call getarg(6,msg0) - call pack77(msg0,i3,n3,c77) - - rate=real(Keff)/real(N) - - write(*,*) "code rate: ",rate - write(*,*) "niter : ",max_iterations - write(*,*) "ndeep : ",ndeep - write(*,*) "s : ",s - write(*,*) "K : ",Keff - - msgbits=0 - read(c77,'(77i1)') msgbits(1:77) - write(*,*) 'message' - write(*,'(77i1)') msgbits(1:77) - - call get_crc24(msgbits,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') msgbits(78:101) -write(*,'(24i1)') msgbits(78:101) - write(*,*) 'message with crc24' - write(*,'(101i1)') msgbits(1:101) - call encode280_101(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(77i1,1x,24i1,1x,73i1)') codeword - - write(*,*) "Eb/N0 Es/N0 ngood nundetected sigma symbol error rate" - do idb = 8,-3,-1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - nberr=nberr+nerr - - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode280_101(llr,apmask,max_iterations,message101,cw,nharderror,niterations,nchecks) - dmin=0.0 - if( (nharderror .lt. 0) .and. (ndeep .ge. 0) ) then -! call osd280_101(llr, Keff, apmask, ndeep, message101, cw, nharderror, dmin) - maxsuper=2 - call decode280_101(llr, Keff, ndeep, apmask, maxsuper, message101, cw, nharderror, iterations, ncheck, dmin, isuper) - endif - - if(nharderror.ge.0) then - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo - if(n2err.eq.0) then - ngood=ngood+1 - else - nue=nue+1 - endif - endif - enddo -! snr2500=db+10*log10(200.0/116.0/2500.0) - esn0=db+10*log10(rate) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,esn0,ngood,nue,ss,pberr - - if(first) then - write(c77,'(77i1)') message101(1:77) -write(*,'(101i1)') message101 - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success) then - write(*,1100) msg(1:37) -1100 format('Decoded message: ',a37) - else - print*,'Error unpacking message' - endif - first=.false. - endif - enddo - -end program ldpcsim280_101 diff --git a/lib/fsk4hf/ldpcsim300.f90 b/lib/fsk4hf/ldpcsim300.f90 deleted file mode 100644 index a2c31e6b0..000000000 --- a/lib/fsk4hf/ldpcsim300.f90 +++ /dev/null @@ -1,254 +0,0 @@ -program ldpcsim300 - -! End-to-end test of the (300,60)/crc10 encoder and decoders. - -use crc -use packjt - -parameter(NRECENT=10) -character*12 recent_calls(NRECENT) -character*8 arg -integer*1, allocatable :: codeword(:), decoded(:), message(:) -integer*1, target:: i1Msg8BitBytes(9) -integer*1, target:: i1Dec8BitBytes(9) -integer*1 msgbits(60) -integer*1 apmask(300) -integer*1 cw(300) -integer*2 checksum -integer colorder(300) -integer nerrtot(300),nerrdec(300),nmpcbad(60) -logical checksumok,fsk,bpsk -real*8, allocatable :: rxdata(:) -real, allocatable :: llr(:) -real dllr(300),llrd(300) - -data colorder/ & -0,1,2,3,4,5,6,7,8,9,10,11,123,12,13,14,15,16,17,18, & -19,20,21,22,23,24,25,138,26,145,27,28,29,30,31,32,33,34,35,36, & -37,154,38,39,40,41,42,43,44,144,46,47,48,49,50,51,52,53,143,54, & -125,56,57,58,124,59,120,140,157,160,55,60,61,62,156,162,141,64,65,153, & -181,183,66,170,67,68,69,130,70,164,71,72,73,74,75,63,76,77,135,78, & -79,80,176,169,82,83,84,167,180,85,136,158,129,166,175,142,134,146,121,165, & -88,89,192,90,45,91,92,93,182,189,94,95,96,173,81,97,98,178,122,126, & -132,99,100,152,186,193,101,102,151,103,104,172,159,168,150,190,147,148,201,107, & -205,177,108,198,197,174,127,109,185,110,202,87,199,171,179,187,139,137,106,131, & -206,194,112,149,155,113,128,184,196,86,114,203,212,195,208,105,188,161,163,191, & -200,209,214,204,115,218,133,111,207,117,213,216,211,217,116,215,219,220,210,221, & -118,222,223,225,224,228,226,229,231,227,233,119,234,235,232,230,237,239,236,238, & -240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259, & -260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279, & -280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299/ - -do i=1,NRECENT - recent_calls(i)=' ' -enddo -nerrtot=0 -nerrdec=0 -nmpcbad=0 ! Used to collect the number of errors in the message+crc part of the codeword - -nargs=iargc() -if(nargs.ne.4) then - print*,'Usage: ldpcsim niter ndeep #trials s ' - print*,'eg: ldpcsim 100 4 1000 0.84' - print*,'If s is negative, then value is ignored and sigma is calculated from SNR.' - return -endif -call getarg(1,arg) -read(arg,*) max_iterations -call getarg(2,arg) -read(arg,*) ndeep -call getarg(3,arg) -read(arg,*) ntrials -call getarg(4,arg) -read(arg,*) s - -fsk=.false. -bpsk=.true. - -! don't count crc bits as data bits -N=300 -K=60 -! scale Eb/No for a (300,50) code -rate=real(50)/real(N) - -write(*,*) "rate: ",rate -write(*,*) "niter= ",max_iterations," s= ",s - -allocate ( codeword(N), decoded(K), message(K) ) -allocate ( rxdata(N), llr(N) ) - -! The message should be packed into the first 7 bytes - i1Msg8BitBytes(1:6)=85 - i1Msg8BitBytes(7)=64 -! The CRC will be put into the last 2 bytes - i1Msg8BitBytes(8:9)=0 - checksum = crc10 (c_loc (i1Msg8BitBytes), 9) -! For reference, the next 3 lines show how to check the CRC - i1Msg8BitBytes(8)=checksum/256 - i1Msg8BitBytes(9)=iand (checksum,255) - checksumok = crc10_check(c_loc (i1Msg8BitBytes), 9) - if( checksumok ) write(*,*) 'Good checksum' -write(*,*) i1Msg8BitBytes(1:9) - - mbit=0 - do i=1, 7 - i1=i1Msg8BitBytes(i) - do ibit=1,8 - mbit=mbit+1 - msgbits(mbit)=iand(1,ishft(i1,ibit-8)) - enddo - enddo - i1=i1Msg8BitBytes(8) ! First 2 bits of crc10 are LSB of this byte - do ibit=1,2 - msgbits(50+ibit)=iand(1,ishft(i1,ibit-2)) - enddo - i1=i1Msg8BitBytes(9) ! Now shift in last 8 bits of the CRC - do ibit=1,8 - msgbits(52+ibit)=iand(1,ishft(i1,ibit-8)) - enddo - - write(*,*) 'message' - write(*,'(9(8i1,1x))') msgbits - - call encode300(msgbits,codeword) - call init_random_seed() - call sgran() - - write(*,*) 'codeword' - write(*,'(38(8i1,1x))') codeword - -write(*,*) "Eb/N0 SNR2500 ngood nundetected nbadcrc sigma" -do idb = 20,-16,-1 -!do idb = -16, -16, -1 - db=idb/2.0-1.0 - sigma=1/sqrt( 2*rate*(10**(db/10.0)) ) ! to make db represent Eb/No -! sigma=1/sqrt( 2*(10**(db/10.0)) ) ! db represents Es/No - ngood=0 - nue=0 - nbadcrc=0 - nberr=0 - do itrial=1, ntrials -! Create a realization of a noisy received word - do i=1,N - if( bpsk ) then - rxdata(i) = 2.0*codeword(i)-1.0 + sigma*gran() - elseif( fsk ) then - if( codeword(i) .eq. 1 ) then - r1=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r2=(sigma*gran())**2 + (sigma*gran())**2 - elseif( codeword(i) .eq. 0 ) then - r2=(1.0 + sigma*gran())**2 + (sigma*gran())**2 - r1=(sigma*gran())**2 + (sigma*gran())**2 - endif - rxdata(i)=0.35*(sqrt(r1)-sqrt(r2)) -! rxdata(i)=0.35*(exp(r1)-exp(r2)) -! rxdata(i)=0.12*(log(r1)-log(r2)) - endif - enddo - nerr=0 - do i=1,N - if( rxdata(i)*(2*codeword(i)-1.0) .lt. 0 ) nerr=nerr+1 - enddo - if(nerr.ge.1) nerrtot(nerr)=nerrtot(nerr)+1 - nberr=nberr+nerr - -! Correct signal normalization is important for this decoder. - rxav=sum(rxdata)/N - rx2av=sum(rxdata*rxdata)/N - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig -! To match the metric to the channel, s should be set to the noise standard deviation. -! For now, set s to the value that optimizes decode probability near threshold. -! The s parameter can be tuned to trade a few tenth's dB of threshold for an order of -! magnitude in UER - if( s .lt. 0 ) then - ss=sigma - else - ss=s - endif - - llr=2.0*rxdata/(ss*ss) - apmask=0 -! max_iterations is max number of belief propagation iterations - call bpdecode300(llr, apmask, max_iterations, decoded, niterations, cw) - if( (niterations .lt. 0) .and. (ndeep .ge. 0) ) then - call osd300(llr, apmask, ndeep, decoded, cw, nhardmin, dmin) - niterations=nhardmin - endif - n2err=0 - do i=1,N - if( cw(i)*(2*codeword(i)-1.0) .lt. 0 ) n2err=n2err+1 - enddo -!write(*,*) nerr,niterations,n2err - damp=0.75 - ndither=0 - if( niterations .lt. 0 ) then - do i=1, ndither - do in=1,N - dllr(in)=damp*gran() - enddo - llrd=llr+dllr - call bpdecode300(llrd, apmask, max_iterations, decoded, niterations, cw) - if( niterations .ge. 0 ) exit - enddo - endif - -! If the decoder finds a valid codeword, niterations will be .ge. 0. - if( niterations .ge. 0 ) then -! Check the CRC - do ibyte=1,6 - itmp=0 - do ibit=1,8 - itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit)) - enddo - i1Dec8BitBytes(ibyte)=itmp - enddo - i1Dec8BitBytes(7)=decoded(49)*128+decoded(50)*64 -! Need to pack the received crc into bytes 8 and 9 for crc10_check - i1Dec8BitBytes(8)=decoded(51)*2+decoded(52) - i1Dec8BitBytes(9)=decoded(53)*128+decoded(54)*64+decoded(55)*32+decoded(56)*16 - i1Dec8BitBytes(9)=i1Dec8BitBytes(9)+decoded(57)*8+decoded(58)*4+decoded(59)*2+decoded(60)*1 - ncrcflag=0 - if( crc10_check( c_loc( i1Dec8BitBytes ), 9 ) ) ncrcflag=1 - - if( ncrcflag .ne. 1 ) then - nbadcrc=nbadcrc+1 - endif - nueflag=0 - - nerrmpc=0 - do i=1,K ! find number of errors in message+crc part of codeword - if( msgbits(i) .ne. decoded(i) ) then - nueflag=1 - nerrmpc=nerrmpc+1 - endif - enddo - if(nerrmpc.ge.1) nmpcbad(nerrmpc)=nmpcbad(nerrmpc)+1 ! This histogram should inform our selection of CRC poly - if( ncrcflag .eq. 1 .and. nueflag .eq. 0 ) then - ngood=ngood+1 - if(nerr.ge.1) nerrdec(nerr)=nerrdec(nerr)+1 - else if( ncrcflag .eq. 1 .and. nueflag .eq. 1 ) then - nue=nue+1; - endif - endif - enddo - snr2500=db+10*log10(1.389/2500.0) - pberr=real(nberr)/(real(ntrials*N)) - write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr - -enddo - -open(unit=23,file='nerrhisto.dat',status='unknown') -do i=1,120 - write(23,'(i4,2x,i10,i10,f10.2)') i,nerrdec(i),nerrtot(i),real(nerrdec(i))/real(nerrtot(i)+1e-10) -enddo -close(23) -open(unit=25,file='nmpcbad.dat',status='unknown') -do i=1,60 - write(25,'(i4,2x,i10)') i,nmpcbad(i) -enddo -close(25) - - - -end program ldpcsim300 diff --git a/lib/fsk4hf/msksoftsym.f90 b/lib/fsk4hf/msksoftsym.f90 deleted file mode 100644 index 016b23e1e..000000000 --- a/lib/fsk4hf/msksoftsym.f90 +++ /dev/null @@ -1,81 +0,0 @@ -subroutine msksoftsym(zz,aa,bb,id,nterms,ierror,rxdata,nhard0,nhardsync0) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=168) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=65) !Sync symbols (2 x 26 + Barker 13) - parameter (NR=3) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (236) - parameter (NSPS=16) !Samples per MSK symbol (16) - parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) - parameter (N13=13*N2) !Samples in central sync vector (416) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z,z0 - real rxdata(ND) !Soft symbols - real aa(20),bb(20) !Fitted polyco's - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - integer ierror(NS+ND) - - n=0 - ierror=0 - do j=1,117 - xx=j*2.0/117.0 - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=real(z) - if(abs(id(j)).eq.2) then - if(real(z)*id(j).lt.0) then !Sync bit - nhardsync0=nhardsync0+1 - ierror(j)=2 - endif - else - n=n+1 !Data bit - rxdata(n)=p - ierr=0 - if(id(j)*p.lt.0) then - ierr=1 - ierror(j)=1 - endif - nhard0=nhard0+ierr - endif - enddo - - do j=118,233 - xx=(j-116.5)*2.0/117.0 - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=aimag(z) - n=n+1 - rxdata(n)=p - ierr=0 - if(id(j)*p.lt.0) then - ierr=1 - ierror(j)=1 - endif - nhard0=nhard0+ierr - enddo - - return -end subroutine msksoftsym diff --git a/lib/fsk4hf/msksoftsymw.f90 b/lib/fsk4hf/msksoftsymw.f90 deleted file mode 100644 index c7402ec47..000000000 --- a/lib/fsk4hf/msksoftsymw.f90 +++ /dev/null @@ -1,78 +0,0 @@ -subroutine msksoftsymw(zz,aa,bb,id,nterms,ierror,rxdata,nhard0,nhardsync0) - - include 'wsprlf_params.f90' - - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z,z0 - real rxdata(ND) !Soft symbols - real aa(20),bb(20) !Fitted polyco's - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - integer ierror(NS+ND) - - n=0 - ierror=0 - ierr=0 - jz=(NS+ND+1)/2 - do j=1,jz - xx=j*2.0/jz - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=real(z) - if(abs(id(j)).eq.2) then - if(real(z)*id(j).lt.0) then !Sync bit - nhardsync0=nhardsync0+1 - ierror(j)=2 - endif - else - n=n+1 !Data bit - rxdata(n)=p - ierr=0 - if(id(j)*p.lt.0) then - ierr=1 - ierror(j)=1 - endif - nhard0=nhard0+ierr - endif -! write(41,3301) j,id(j),ierror(j),ierr,n,p,p*id(j) -!3301 format(5i6,2f10.3) - enddo - - do j=jz+1,NS+ND - xx=(j-jz+0.5)*2.0/jz - 1.0 - yii=1. - yqq=0. - if(nterms.gt.0) then - yii=aa(1) - yqq=bb(1) - do i=2,nterms - yii=yii + aa(i)*xx**(i-1) - yqq=yqq + bb(i)*xx**(i-1) - enddo - endif - z0=cmplx(yii,yqq) - z=zz(j)*conjg(z0) - p=aimag(z) - n=n+1 - if(n.gt.ND) exit - rxdata(n)=p - ierr=0 - if(id(j)*p.lt.0) then - ierr=1 - ierror(j)=1 - endif - nhard0=nhard0+ierr -! write(41,3301) j,id(j),ierror(j),ierr,n,p,p*id(j) - enddo - - return -end subroutine msksoftsymw diff --git a/lib/fsk4hf/osd174_101.f90 b/lib/fsk4hf/osd174_101.f90 deleted file mode 100644 index e705ffe03..000000000 --- a/lib/fsk4hf/osd174_101.f90 +++ /dev/null @@ -1,403 +0,0 @@ -subroutine osd174_101(llr,k,apmask,ndeep,message101,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (174,101) code. -! Message payload is 77 bits. Any or all of a 24-bit CRC can be -! used for detecting incorrect codewords. The remaining CRC bits are -! cascaded with the LDPC code for the purpose of improving the -! distance spectrum of the code. -! -! If p1 (0.le.p1.le.24) is the number of CRC24 bits that are -! to be used for bad codeword detection, then the argument k should -! be set to 77+p1. -! -! Valid values for k are in the range [77,101]. -! - character*24 c24 - integer, parameter:: N=174 - integer*1 apmask(N),apmaskr(N) - integer*1, allocatable, save :: gen(:,:) - integer*1, allocatable :: genmrb(:,:),g2(:,:) - integer*1, allocatable :: temp(:),m0(:),me(:),mi(:),misub(:),e2sub(:),e2(:),ui(:) - integer*1, allocatable :: r2pat(:) - integer indices(N),nxor(N) - integer*1 cw(N),ce(N),c0(N),hdec(N) - integer*1, allocatable :: decoded(:) - integer*1 message101(101) - integer indx(N) - real llr(N),rx(N),absrx(N) - - logical first,reset - data first/.true./ - save first - - allocate( genmrb(k,N), g2(N,k) ) - allocate( temp(k), m0(k), me(k), mi(k), misub(k), e2sub(N-k), e2(N-k), ui(N-k) ) - allocate( r2pat(N-k), decoded(k) ) - - if( first ) then ! fill the generator matrix -! -! Create generator matrix for partial CRC cascaded with LDPC code. -! -! Let p2=101-k and p1+p2=24. -! -! The last p2 bits of the CRC24 are cascaded with the LDPC code. -! -! The first p1=k-77 CRC24 bits will be used for error detection. -! - allocate( gen(k,N) ) - gen=0 - do i=1,k - message101=0 - message101(i)=1 - if(i.le.77) then - call get_crc24(message101,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') message101(78:101) - message101(78:k)=0 - endif - call encode174_101(message101,cw) - gen(i,:)=cw - enddo - - first=.false. - endif - - rx=llr - apmaskr=apmask - -! Hard decisions on the received word. - hdec=0 - where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. - absrx=abs(rx) - call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. - do i=1,N - genmrb(1:k,i)=gen(1:k,indx(N+1-i)) - indices(i)=indx(N+1-i) - enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:k in order of decreasing reliability (more or less). - do id=1,k ! diagonal element indices - do icol=id,k+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:k)=genmrb(1:k,id) - genmrb(1:k,id)=genmrb(1:k,icol) - genmrb(1:k,icol)=temp(1:k) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,k - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo - enddo - - g2=transpose(genmrb) - -! The hard decisions for the k MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - - hdec=hdec(indices) ! hard decisions from received symbols - m0=hdec(1:k) ! zero'th order message - absrx=absrx(indices) - rx=rx(indices) - apmaskr=apmaskr(indices) - - call mrbencode101(m0,c0,g2,N,k) - nxor=ieor(c0,hdec) - nhardmin=sum(nxor) - dmin=sum(nxor*absrx) - - cw=c0 - ntotal=0 - nrejected=0 - npre1=0 - npre2=0 - - if(ndeep.eq.0) goto 998 ! norder=0 - if(ndeep.gt.6) ndeep=6 - if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 - elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.6) then - nord=4 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - endif - - do iorder=1,nord - misub(1:k-iorder)=0 - misub(k-iorder+1:k)=1 - iflag=k-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - d1=0. - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:k),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - e2=e2sub - nd1kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:k),hdec(1:k))*absrx(1:k)) - else - e2=ieor(e2sub,g2(k+1:N,n1)) - nd1kpt=sum(e2(1:nt))+2 - endif - if(nd1kpt .le. ntheta) then - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(k+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(k+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1kptbest=nd1kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat101(misub,k,iorder,iflag) - enddo - enddo - - if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=k,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(k+1:k+ntau,i1),g2(k+1:k+ntau,i2)) - call boxit101(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:k-nord)=0 - misub(k-nord+1:k)=1 - iflag=k-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit101(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:k),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat101(misub,k,nord,iflag) - enddo - endif - -998 continue -! Re-order the codeword to [message bits][parity bits] format. - cw(indices)=cw - hdec(indices)=hdec - message101=cw(1:101) - call get_crc24(message101,101,nbadcrc) - if(nbadcrc.ne.0) nhardmin=-nhardmin - - return -end subroutine osd174_101 - -subroutine mrbencode101(me,codeword,g2,N,K) - integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo - return -end subroutine mrbencode101 - -subroutine nextpat101(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat101 - -subroutine boxit101(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(5000,2),fp(0:525000),np(5000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit101 - -subroutine fetchit101(reset,e2,ntau,i1,i2) - integer indexes(5000,2),fp(0:525000),np(5000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit101 - diff --git a/lib/fsk4hf/osd174_74.f90 b/lib/fsk4hf/osd174_74.f90 deleted file mode 100644 index e954f4eff..000000000 --- a/lib/fsk4hf/osd174_74.f90 +++ /dev/null @@ -1,405 +0,0 @@ -subroutine osd174_74(llr,k,apmask,ndeep,message74,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (174,74) code. -! Message payload is 50 bits. Any or all of a 24-bit CRC can be -! used for detecting incorrect codewords. The remaining CRC bits are -! cascaded with the LDPC code for the purpose of improving the -! distance spectrum of the code. -! -! If p1 (0.le.p1.le.24) is the number of CRC24 bits that are -! to be used for bad codeword detection, then the argument k should -! be set to 50+p1. -! -! Valid values for k are in the range [50,74]. -! - character*24 c24 - integer, parameter:: N=174 - integer*1 apmask(N),apmaskr(N) - integer*1, allocatable, save :: gen(:,:) - integer*1, allocatable :: genmrb(:,:),g2(:,:) - integer*1, allocatable :: temp(:),m0(:),me(:),mi(:),misub(:),e2sub(:),e2(:),ui(:) - integer*1, allocatable :: r2pat(:) - integer indices(N),nxor(N) - integer*1 cw(N),ce(N),c0(N),hdec(N) - integer*1, allocatable :: decoded(:) - integer*1 message74(74) - integer indx(N) - real llr(N),rx(N),absrx(N) - -!include "ldpc_174_74_generator.f90" - - logical first,reset - data first/.true./ - save first - - allocate( genmrb(k,N), g2(N,k) ) - allocate( temp(k), m0(k), me(k), mi(k), misub(k), e2sub(N-k), e2(N-k), ui(N-k) ) - allocate( r2pat(N-k), decoded(k) ) - - if( first ) then ! fill the generator matrix -! -! Create generator matrix for partial CRC cascaded with LDPC code. -! -! Let p2=74-k and p1+p2=24. -! -! The last p2 bits of the CRC24 are cascaded with the LDPC code. -! -! The first p1=k-50 CRC24 bits will be used for error detection. -! - allocate( gen(k,N) ) - gen=0 - do i=1,k - message74=0 - message74(i)=1 - if(i.le.50) then - call get_crc24(message74,74,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') message74(51:74) - message74(51:k)=0 - endif - call encode174_74(message74,cw) - gen(i,:)=cw - enddo - - first=.false. - endif - - rx=llr - apmaskr=apmask - -! Hard decisions on the received word. - hdec=0 - where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. - absrx=abs(rx) - call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. - do i=1,N - genmrb(1:k,i)=gen(1:k,indx(N+1-i)) - indices(i)=indx(N+1-i) - enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:k in order of decreasing reliability (more or less). - do id=1,k ! diagonal element indices - do icol=id,k+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:k)=genmrb(1:k,id) - genmrb(1:k,id)=genmrb(1:k,icol) - genmrb(1:k,icol)=temp(1:k) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,k - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo - enddo - - g2=transpose(genmrb) - -! The hard decisions for the k MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - - hdec=hdec(indices) ! hard decisions from received symbols - m0=hdec(1:k) ! zero'th order message - absrx=absrx(indices) - rx=rx(indices) - apmaskr=apmaskr(indices) - - call mrbencode74(m0,c0,g2,N,k) - nxor=ieor(c0,hdec) - nhardmin=sum(nxor) - dmin=sum(nxor*absrx) - - cw=c0 - ntotal=0 - nrejected=0 - npre1=0 - npre2=0 - - if(ndeep.eq.0) goto 998 ! norder=0 - if(ndeep.gt.6) ndeep=6 - if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 - elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.6) then - nord=4 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - endif - - do iorder=1,nord - misub(1:k-iorder)=0 - misub(k-iorder+1:k)=1 - iflag=k-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - d1=0. - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:k),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode74(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - e2=e2sub - nd1kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:k),hdec(1:k))*absrx(1:k)) - else - e2=ieor(e2sub,g2(k+1:N,n1)) - nd1kpt=sum(e2(1:nt))+2 - endif - if(nd1kpt .le. ntheta) then - call mrbencode74(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(k+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(k+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1kptbest=nd1kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat74(misub,k,iorder,iflag) - enddo - enddo - - if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=k,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(k+1:k+ntau,i1),g2(k+1:k+ntau,i2)) - call boxit74(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:k-nord)=0 - misub(k-nord+1:k)=1 - iflag=k-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode74(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit74(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:k),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode74(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat74(misub,k,nord,iflag) - enddo - endif - -998 continue -! Re-order the codeword to [message bits][parity bits] format. - cw(indices)=cw - hdec(indices)=hdec - message74=cw(1:74) - call get_crc24(message74,74,nbadcrc) - if(nbadcrc.ne.0) nhardmin=-nhardmin - - return -end subroutine osd174_74 - -subroutine mrbencode74(me,codeword,g2,N,K) - integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo - return -end subroutine mrbencode74 - -subroutine nextpat74(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat74 - -subroutine boxit74(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(5000,2),fp(0:525000),np(5000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit74 - -subroutine fetchit74(reset,e2,ntau,i1,i2) - integer indexes(5000,2),fp(0:525000),np(5000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit74 - diff --git a/lib/fsk4hf/osd204.f90 b/lib/fsk4hf/osd204.f90 deleted file mode 100644 index 51a80c947..000000000 --- a/lib/fsk4hf/osd204.f90 +++ /dev/null @@ -1,372 +0,0 @@ -subroutine osd204(llr,apmask,ndeep,decoded,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (204,68) code. -! -include "ldpc_204_68_params.f90" - -integer*1 apmask(N),apmaskr(N) -integer*1 gen(K,N) -integer*1 genmrb(K,N),g2(N,K) -integer*1 temp(K),m0(K),me(K),mi(K),misub(K),e2sub(N-K),e2(N-K),ui(N-K) -integer*1 r2pat(N-K) -integer indices(N),nxor(N) -integer*1 cw(N),ce(N),c0(N),hdec(N) -integer*1 decoded(K) -integer indx(N) -real llr(N),rx(N),absrx(N) -logical first,reset -data first/.true./ -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1,17 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - irow=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(irow,i)=1 - enddo - enddo - enddo - do irow=1,K - gen(irow,M+irow)=1 - enddo -first=.false. -endif - -! Re-order received vector to place systematic msg bits at the end. -rx=llr(colorder+1) -apmaskr=apmask(colorder+1) - -! Hard decisions on the received word. -hdec=0 -where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. -absrx=abs(rx) -call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. -do i=1,N - genmrb(1:K,i)=gen(1:K,indx(N+1-i)) - indices(i)=indx(N+1-i) -enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:K in order of decreasing reliability (more or less). -do id=1,K ! diagonal element indices - do icol=id,K+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:K)=genmrb(1:K,id) - genmrb(1:K,id)=genmrb(1:K,icol) - genmrb(1:K,icol)=temp(1:K) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,K - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo -enddo - -g2=transpose(genmrb) - -! The hard decisions for the K MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - -hdec=hdec(indices) ! hard decisions from received symbols -m0=hdec(1:K) ! zero'th order message -absrx=absrx(indices) -rx=rx(indices) -apmaskr=apmaskr(indices) - -call mrbencode(m0,c0,g2,N,K) -nxor=ieor(c0,hdec) -nhardmin=sum(nxor) -dmin=sum(nxor*absrx) - -cw=c0 -ntotal=0 -nrejected=0 - -if(ndeep.eq.0) goto 998 ! norder=0 -if(ndeep.gt.6) ndeep=6 -if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 -elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 -elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 -elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - ntau=19 -elseif(ndeep.eq.5) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 -elseif(ndeep.eq.6) then - nord=3 - npre1=1 - npre2=1 - nt=60 - ntheta=22 - ntau=16 -endif - -do iorder=1,nord - misub(1:K-iorder)=0 - misub(K-iorder+1:K)=1 - iflag=K-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:K),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - e2=e2sub - nd1Kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:K),hdec(1:K))*absrx(1:K)) - else - e2=ieor(e2sub,g2(K+1:N,n1)) - nd1Kpt=sum(e2(1:nt))+2 - endif - if(nd1Kpt .le. ntheta) then - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(K+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(K+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1Kptbest=nd1Kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat(misub,k,iorder,iflag) - enddo -enddo - -if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=K,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(K+1:K+ntau,i1),g2(K+1:K+ntau,i2)) - call boxit(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:K-nord)=0 - misub(K-nord+1:K)=1 - iflag=K-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:K),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat(misub,K,nord,iflag) - enddo -endif - -998 continue -! Re-order the codeword to place message bits at the end. -cw(indices)=cw -hdec(indices)=hdec -decoded=cw(M+1:N) -cw(colorder+1)=cw ! put the codeword back into received-word order -return -end subroutine osd204 - -subroutine mrbencode(me,codeword,g2,N,K) -integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo -return -end subroutine mrbencode - -subroutine nextpat(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat - -subroutine boxit(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(4000,2),fp(0:525000),np(4000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit - -subroutine fetchit(reset,e2,ntau,i1,i2) - integer indexes(4000,2),fp(0:525000),np(4000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit - diff --git a/lib/fsk4hf/osd240_101.f90 b/lib/fsk4hf/osd240_101.f90 deleted file mode 100644 index 3e2506805..000000000 --- a/lib/fsk4hf/osd240_101.f90 +++ /dev/null @@ -1,403 +0,0 @@ -subroutine osd240_101(llr,k,apmask,ndeep,message101,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (240,101) code. -! Message payload is 77 bits. Any or all of a 24-bit CRC can be -! used for detecting incorrect codewords. The remaining CRC bits are -! cascaded with the LDPC code for the purpose of improving the -! distance spectrum of the code. -! -! If p1 (0.le.p1.le.24) is the number of CRC24 bits that are -! to be used for bad codeword detection, then the argument k should -! be set to 77+p1. -! -! Valid values for k are in the range [77,101]. -! - character*24 c24 - integer, parameter:: N=240 - integer*1 apmask(N),apmaskr(N) - integer*1, allocatable, save :: gen(:,:) - integer*1, allocatable :: genmrb(:,:),g2(:,:) - integer*1, allocatable :: temp(:),m0(:),me(:),mi(:),misub(:),e2sub(:),e2(:),ui(:) - integer*1, allocatable :: r2pat(:) - integer indices(N),nxor(N) - integer*1 cw(N),ce(N),c0(N),hdec(N) - integer*1, allocatable :: decoded(:) - integer*1 message101(101) - integer indx(N) - real llr(N),rx(N),absrx(N) - - logical first,reset - data first/.true./ - save first - - allocate( genmrb(k,N), g2(N,k) ) - allocate( temp(k), m0(k), me(k), mi(k), misub(k), e2sub(N-k), e2(N-k), ui(N-k) ) - allocate( r2pat(N-k), decoded(k) ) - - if( first ) then ! fill the generator matrix -! -! Create generator matrix for partial CRC cascaded with LDPC code. -! -! Let p2=101-k and p1+p2=24. -! -! The last p2 bits of the CRC24 are cascaded with the LDPC code. -! -! The first p1=k-77 CRC24 bits will be used for error detection. -! - allocate( gen(k,N) ) - gen=0 - do i=1,k - message101=0 - message101(i)=1 - if(i.le.77) then - call get_crc24(message101,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') message101(78:101) - message101(78:k)=0 - endif - call encode240_101(message101,cw) - gen(i,:)=cw - enddo - - first=.false. - endif - - rx=llr - apmaskr=apmask - -! Hard decisions on the received word. - hdec=0 - where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. - absrx=abs(rx) - call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. - do i=1,N - genmrb(1:k,i)=gen(1:k,indx(N+1-i)) - indices(i)=indx(N+1-i) - enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:k in order of decreasing reliability (more or less). - do id=1,k ! diagonal element indices - do icol=id,k+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:k)=genmrb(1:k,id) - genmrb(1:k,id)=genmrb(1:k,icol) - genmrb(1:k,icol)=temp(1:k) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,k - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo - enddo - - g2=transpose(genmrb) - -! The hard decisions for the k MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - - hdec=hdec(indices) ! hard decisions from received symbols - m0=hdec(1:k) ! zero'th order message - absrx=absrx(indices) - rx=rx(indices) - apmaskr=apmaskr(indices) - - call mrbencode101(m0,c0,g2,N,k) - nxor=ieor(c0,hdec) - nhardmin=sum(nxor) - dmin=sum(nxor*absrx) - - cw=c0 - ntotal=0 - nrejected=0 - npre1=0 - npre2=0 - - if(ndeep.eq.0) goto 998 ! norder=0 - if(ndeep.gt.6) ndeep=6 - if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 - elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - elseif(ndeep.eq.6) then - nord=4 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=19 - endif - - do iorder=1,nord - misub(1:k-iorder)=0 - misub(k-iorder+1:k)=1 - iflag=k-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - d1=0. - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:k),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - e2=e2sub - nd1kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:k),hdec(1:k))*absrx(1:k)) - else - e2=ieor(e2sub,g2(k+1:N,n1)) - nd1kpt=sum(e2(1:nt))+2 - endif - if(nd1kpt .le. ntheta) then - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(k+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(k+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1kptbest=nd1kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat101(misub,k,iorder,iflag) - enddo - enddo - - if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=k,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(k+1:k+ntau,i1),g2(k+1:k+ntau,i2)) - call boxit101(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:k-nord)=0 - misub(k-nord+1:k)=1 - iflag=k-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit101(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:k),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat101(misub,k,nord,iflag) - enddo - endif - -998 continue -! Re-order the codeword to [message bits][parity bits] format. - cw(indices)=cw - hdec(indices)=hdec - message101=cw(1:101) - call get_crc24(message101,101,nbadcrc) - if(nbadcrc.ne.0) nhardmin=-nhardmin - - return -end subroutine osd240_101 - -subroutine mrbencode101(me,codeword,g2,N,K) - integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo - return -end subroutine mrbencode101 - -subroutine nextpat101(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat101 - -subroutine boxit101(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(5000,2),fp(0:525000),np(5000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit101 - -subroutine fetchit101(reset,e2,ntau,i1,i2) - integer indexes(5000,2),fp(0:525000),np(5000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit101 - diff --git a/lib/fsk4hf/osd280_101.f90 b/lib/fsk4hf/osd280_101.f90 deleted file mode 100644 index acea3f664..000000000 --- a/lib/fsk4hf/osd280_101.f90 +++ /dev/null @@ -1,403 +0,0 @@ -subroutine osd280_101(llr,k,apmask,ndeep,message101,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (280,101) code. -! Message payload is 77 bits. Any or all of a 24-bit CRC can be -! used for detecting incorrect codewords. The remaining CRC bits are -! cascaded with the LDPC code for the purpose of improving the -! distance spectrum of the code. -! -! If p1 (0.le.p1.le.24) is the number of CRC24 bits that are -! to be used for bad codeword detection, then the argument k should -! be set to 77+p1. -! -! Valid values for k are in the range [77,101]. -! - character*24 c24 - integer, parameter:: N=280 - integer*1 apmask(N),apmaskr(N) - integer*1, allocatable, save :: gen(:,:) - integer*1, allocatable :: genmrb(:,:),g2(:,:) - integer*1, allocatable :: temp(:),m0(:),me(:),mi(:),misub(:),e2sub(:),e2(:),ui(:) - integer*1, allocatable :: r2pat(:) - integer indices(N),nxor(N) - integer*1 cw(N),ce(N),c0(N),hdec(N) - integer*1, allocatable :: decoded(:) - integer*1 message101(101) - integer indx(N) - real llr(N),rx(N),absrx(N) - - logical first,reset - data first/.true./ - save first - - allocate( genmrb(k,N), g2(N,k) ) - allocate( temp(k), m0(k), me(k), mi(k), misub(k), e2sub(N-k), e2(N-k), ui(N-k) ) - allocate( r2pat(N-k), decoded(k) ) - - if( first ) then ! fill the generator matrix -! -! Create generator matrix for partial CRC cascaded with LDPC code. -! -! Let p2=101-k and p1+p2=24. -! -! The last p2 bits of the CRC24 are cascaded with the LDPC code. -! -! The first p1=k-77 CRC24 bits will be used for error detection. -! - allocate( gen(k,N) ) - gen=0 - do i=1,k - message101=0 - message101(i)=1 - if(i.le.77) then - call get_crc24(message101,101,ncrc24) - write(c24,'(b24.24)') ncrc24 - read(c24,'(24i1)') message101(78:101) - message101(78:k)=0 - endif - call encode280_101(message101,cw) - gen(i,:)=cw - enddo - - first=.false. - endif - - rx=llr - apmaskr=apmask - -! Hard decisions on the received word. - hdec=0 - where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. - absrx=abs(rx) - call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. - do i=1,N - genmrb(1:k,i)=gen(1:k,indx(N+1-i)) - indices(i)=indx(N+1-i) - enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:k in order of decreasing reliability (more or less). - do id=1,k ! diagonal element indices - do icol=id,k+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:k)=genmrb(1:k,id) - genmrb(1:k,id)=genmrb(1:k,icol) - genmrb(1:k,icol)=temp(1:k) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,k - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo - enddo - - g2=transpose(genmrb) - -! The hard decisions for the k MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - - hdec=hdec(indices) ! hard decisions from received symbols - m0=hdec(1:k) ! zero'th order message - absrx=absrx(indices) - rx=rx(indices) - apmaskr=apmaskr(indices) - - call mrbencode101(m0,c0,g2,N,k) - nxor=ieor(c0,hdec) - nhardmin=sum(nxor) - dmin=sum(nxor*absrx) - - cw=c0 - ntotal=0 - nrejected=0 - npre1=0 - npre2=0 - - if(ndeep.eq.0) goto 998 ! norder=0 - if(ndeep.gt.6) ndeep=6 - if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=40 - ntheta=12 - elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=14 - elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=17 - elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=40 - ntheta=12 - ntau=15 - elseif(ndeep.eq.6) then - nord=4 - npre1=1 - npre2=1 - nt=95 - ntheta=12 - ntau=15 - endif - - do iorder=1,nord - misub(1:k-iorder)=0 - misub(k-iorder+1:k)=1 - iflag=k-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - d1=0. - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:k),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - e2=e2sub - nd1kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:k),hdec(1:k))*absrx(1:k)) - else - e2=ieor(e2sub,g2(k+1:N,n1)) - nd1kpt=sum(e2(1:nt))+2 - endif - if(nd1kpt .le. ntheta) then - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(k+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(k+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1kptbest=nd1kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat101(misub,k,iorder,iflag) - enddo - enddo - - if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=k,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(k+1:k+ntau,i1),g2(k+1:k+ntau,i2)) - call boxit101(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:k-nord)=0 - misub(k-nord+1:k)=1 - iflag=k-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode101(me,ce,g2,N,k) - e2sub=ieor(ce(k+1:N),hdec(k+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit101(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:k),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode101(me,ce,g2,N,k) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat101(misub,k,nord,iflag) - enddo - endif - -998 continue -! Re-order the codeword to [message bits][parity bits] format. - cw(indices)=cw - hdec(indices)=hdec - message101=cw(1:101) - call get_crc24(message101,101,nbadcrc) - if(nbadcrc.ne.0) nhardmin=-nhardmin - - return -end subroutine osd280_101 - -subroutine mrbencode101(me,codeword,g2,N,K) - integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo - return -end subroutine mrbencode101 - -subroutine nextpat101(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat101 - -subroutine boxit101(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(5000,2),fp(0:525000),np(5000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit101 - -subroutine fetchit101(reset,e2,ntau,i1,i2) - integer indexes(5000,2),fp(0:525000),np(5000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit101 - diff --git a/lib/fsk4hf/osd300.f90 b/lib/fsk4hf/osd300.f90 deleted file mode 100644 index 565f4ce53..000000000 --- a/lib/fsk4hf/osd300.f90 +++ /dev/null @@ -1,365 +0,0 @@ -subroutine osd300(llr,apmask,ndeep,decoded,cw,nhardmin,dmin) -! -! An ordered-statistics decoder for the (300,60) code. -! -include "ldpc_300_60_params.f90" - -integer*1 apmask(N),apmaskr(N) -integer*1 gen(K,N) -integer*1 genmrb(K,N),g2(N,K) -integer*1 temp(K),m0(K),me(K),mi(K),misub(K),e2sub(N-K),e2(N-K),ui(N-K) -integer*1 r2pat(N-K) -integer indices(N),nxor(N) -integer*1 cw(N),ce(N),c0(N),hdec(N) -integer*1 decoded(K) -integer indx(N) -real llr(N),rx(N),absrx(N) -logical first,reset -data first/.true./ -save first,gen - -if( first ) then ! fill the generator matrix - gen=0 - do i=1,M - do j=1, 15 - read(g(i)(j:j),"(Z1)") istr - do jj=1, 4 - irow=(j-1)*4+jj - if( btest(istr,4-jj) ) gen(irow,i)=1 - enddo - enddo - enddo - do irow=1,K - gen(irow,M+irow)=1 - enddo -first=.false. -endif - -! Re-order received vector to place systematic msg bits at the end. -rx=llr(colorder+1) -apmaskr=apmask(colorder+1) - -! Hard decisions on the received word. -hdec=0 -where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. -absrx=abs(rx) -call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. -do i=1,N - genmrb(1:K,i)=gen(1:K,indx(N+1-i)) - indices(i)=indx(N+1-i) -enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:K in order of decreasing reliability (more or less). -do id=1,K ! diagonal element indices - do icol=id,K+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:K)=genmrb(1:K,id) - genmrb(1:K,id)=genmrb(1:K,icol) - genmrb(1:K,icol)=temp(1:K) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,K - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo -enddo - -g2=transpose(genmrb) - -! The hard decisions for the K MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - -hdec=hdec(indices) ! hard decisions from received symbols -m0=hdec(1:K) ! zero'th order message -absrx=absrx(indices) -rx=rx(indices) -apmaskr=apmaskr(indices) - -call mrbencode(m0,c0,g2,N,K) -nxor=ieor(c0,hdec) -nhardmin=sum(nxor) -dmin=sum(nxor*absrx) - -cw=c0 -ntotal=0 -nrejected=0 - -if(ndeep.eq.0) goto 998 ! norder=0 -if(ndeep.gt.5) ndeep=5 -if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=120 - ntheta=12 -elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=120 - ntheta=12 -elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=120 - ntheta=12 - ntau=15 -elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=0 - nt=120 - ntheta=12 - ntau=15 -elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=80 - ntheta=40 - ntau=16 -endif - -do iorder=1,nord - misub(1:K-iorder)=0 - misub(K-iorder+1:K)=1 - iflag=K-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:K),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - e2=e2sub - nd1Kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:K),hdec(1:K))*absrx(1:K)) - else - e2=ieor(e2sub,g2(K+1:N,n1)) - nd1Kpt=sum(e2(1:nt))+2 - endif - if(nd1Kpt .le. ntheta) then - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(K+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(K+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1Kptbest=nd1Kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat(misub,k,iorder,iflag) - enddo -enddo - -if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=K,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(K+1:K+ntau,i1),g2(K+1:K+ntau,i2)) - call boxit(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:K-nord)=0 - misub(K-nord+1:K)=1 - iflag=K-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:K),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat(misub,K,nord,iflag) - enddo -endif - -998 continue -! Re-order the codeword to place message bits at the end. -cw(indices)=cw -hdec(indices)=hdec -decoded=cw(M+1:N) -cw(colorder+1)=cw ! put the codeword back into received-word order -return -end subroutine osd300 - -subroutine mrbencode(me,codeword,g2,N,K) -integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo -return -end subroutine mrbencode - -subroutine nextpat(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat - -subroutine boxit(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(4000,2),fp(0:525000),np(4000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit - -subroutine fetchit(reset,e2,ntau,i1,i2) - integer indexes(4000,2),fp(0:525000),np(4000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit - diff --git a/lib/fsk4hf/osdtbcc.f90 b/lib/fsk4hf/osdtbcc.f90 deleted file mode 100644 index 462fcc792..000000000 --- a/lib/fsk4hf/osdtbcc.f90 +++ /dev/null @@ -1,372 +0,0 @@ -subroutine osdtbcc(llr,apmask,ndeep,decoded,cw,nhardmin,dmin) -! -use iso_c_binding -parameter (N=280, K=70, L=16) - -integer*1 p1(L),p2(L),p3(L),p4(L) -integer*1 gg(100) - -integer*1 apmask(N),apmaskr(N) -integer*1 gen(K,N) -integer*1 genmrb(K,N),g2(N,K) -integer*1 temp(K),m0(K),me(K),mi(K),misub(K),e2sub(N-K),e2(N-K),ui(N-K) -integer*1 r2pat(N-K) -integer indices(N),nxor(N) -integer*1 cw(N),ce(N),c0(N),hdec(N) -integer*1 decoded(K) -integer indx(N) -real llr(N),rx(N),absrx(N) -logical first,reset -data first/.true./ -!data p1/1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,1,1,1,0,1/ -!data p2/1,0,1,0,1,0,1,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,1,1,1/ -!data p3/1,1,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,1,0,1,1/ -!data p4/1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1/ -data p1/1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1/ -data p2/1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,1/ -data p3/1,1,0,0,1,0,1,1,0,1,1,1,0,0,1,1/ -data p4/1,1,1,0,1,1,0,1,1,1,1,0,0,1,0,1/ - -save first,gen - -if( first ) then ! fill the generator matrix - gg=0 - gg(1:L)=p1 - gg(L+1:2*L)=p2 - gg(2*L+1:3*L)=p3 - gg(3*L+1:4*L)=p4 - gen=0 - gen(1,1:4*L)=gg(1:4*L) - do i=2,K - gen(i,:)=cshift(gen(i-1,:),-4) - enddo - first=.false. -endif - -! Re-order received vector to place systematic msg bits at the end. -rx=llr -apmaskr=apmask - -! Hard decisions on the received word. -hdec=0 -where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. -absrx=abs(rx) -call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. -do i=1,N - genmrb(1:K,i)=gen(1:K,indx(N+1-i)) - indices(i)=indx(N+1-i) -enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:K in order of decreasing reliability (more or less). -do id=1,K ! diagonal element indices - do icol=id,K+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:K)=genmrb(1:K,id) - genmrb(1:K,id)=genmrb(1:K,icol) - genmrb(1:K,icol)=temp(1:K) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,K - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo -enddo - -g2=transpose(genmrb) - -! The hard decisions for the K MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - -hdec=hdec(indices) ! hard decisions from received symbols -m0=hdec(1:K) ! zero'th order message -absrx=absrx(indices) -rx=rx(indices) -apmaskr=apmaskr(indices) - -call mrbencode(m0,c0,g2,N,K) -nxor=ieor(c0,hdec) -nhardmin=sum(nxor) -dmin=sum(nxor*absrx) - -cw=c0 -ntotal=0 -nrejected=0 - -if(ndeep.eq.0) goto 998 ! norder=0 -if(ndeep.gt.5) ndeep=5 -if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=120 - ntheta=12 -elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=120 - ntheta=12 -elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=120 - ntheta=12 - ntau=15 -elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=0 - nt=120 - ntheta=12 - ntau=15 -elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=80 - ntheta=22 - ntau=16 -endif - -do iorder=1,nord - misub(1:K-iorder)=0 - misub(K-iorder+1:K)=1 - iflag=K-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:K),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - e2=e2sub - nd1Kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:K),hdec(1:K))*absrx(1:K)) - else - e2=ieor(e2sub,g2(K+1:N,n1)) - nd1Kpt=sum(e2(1:nt))+2 - endif - if(nd1Kpt .le. ntheta) then - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(K+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(K+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1Kptbest=nd1Kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat(misub,k,iorder,iflag) - enddo -enddo - -if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=K,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(K+1:K+ntau,i1),g2(K+1:K+ntau,i2)) - call boxit(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:K-nord)=0 - misub(K-nord+1:K)=1 - iflag=K-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:K),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat(misub,K,nord,iflag) - enddo -endif - -998 continue -! Re-order the codeword to place message bits at the end. -cw(indices)=cw -hdec(indices)=hdec -decoded=0 -return -end subroutine osdtbcc - -subroutine mrbencode(me,codeword,g2,N,K) -integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo -return -end subroutine mrbencode - -subroutine nextpat(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat - -subroutine boxit(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(4000,2),fp(0:525000),np(4000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit - -subroutine fetchit(reset,e2,ntau,i1,i2) - integer indexes(4000,2),fp(0:525000),np(4000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit - diff --git a/lib/fsk4hf/osdwspr.f90 b/lib/fsk4hf/osdwspr.f90 deleted file mode 100644 index 26069eb14..000000000 --- a/lib/fsk4hf/osdwspr.f90 +++ /dev/null @@ -1,373 +0,0 @@ -subroutine osdwspr(ss,apmask,ndeep,cw,nhardmin,dmin) -! -use iso_c_binding -parameter (N=162, K=50, L=32) - -!integer*1 p1(L),p2(L),p3(L),p4(L) -integer*1 gg(64) - -real ss(N) -integer*1 apmask(N),apmaskr(N) -integer*1 gen(K,N) -integer*1 genmrb(K,N),g2(N,K) -integer*1 temp(K),m0(K),me(K),mi(K),misub(K),e2sub(N-K),e2(N-K),ui(N-K) -integer*1 r2pat(N-K) -integer indices(N),nxor(N) -integer*1 cw(N),ce(N),c0(N),hdec(N) -integer indx(N),ndeep,nhardmin -real rx(N),absrx(N),dmin -logical first,reset -data first/.true./ -!data p1/1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,1,1,1,0,1/ -!data p2/1,0,1,0,1,0,1,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,1,1,1/ -!data p3/1,1,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,1,1,1,0,1,1/ -!data p4/1,1,1,0,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1/ -!data p1/1,0,1,0,1,1,0,0,1,1,0,1,1,1,1,1/ -!data p2/1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,1/ -!data p3/1,1,0,0,1,0,1,1,0,1,1,1,0,0,1,1/ -!data p4/1,1,1,0,1,1,0,1,1,1,1,0,0,1,0,1/ -data gg/1,1,0,1,0,1,0,0,1,0,0,0,1,1,0,0,1,0,1,0,0,1,0,1,1,1,0,1,1,0,0,0, & - 0,1,0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,0,0,1,0,1,1,1,1,1,1/ - -save first,gen - -if( first ) then ! fill the generator matrix -! gg=0 -! gg(1:L)=p1 -! gg(L+1:2*L)=p2 -! gg(2*L+1:3*L)=p3 -! gg(3*L+1:4*L)=p4 - gen=0 - gen(1,1:2*L)=gg(1:2*L) - do i=2,K - gen(i,:)=cshift(gen(i-1,:),-2) - enddo - first=.false. -endif - -! Re-order received vector to place systematic msg bits at the end. -rx=ss/127.0 -apmaskr=apmask - -! Hard decisions on the received word. -hdec=0 -where(rx .ge. 0) hdec=1 - -! Use magnitude of received symbols as a measure of reliability. -absrx=abs(rx) -call indexx(absrx,N,indx) - -! Re-order the columns of the generator matrix in order of decreasing reliability. -do i=1,N - genmrb(1:K,i)=gen(1:K,indx(N+1-i)) - indices(i)=indx(N+1-i) -enddo - -! Do gaussian elimination to create a generator matrix with the most reliable -! received bits in positions 1:K in order of decreasing reliability (more or less). -do id=1,K ! diagonal element indices - do icol=id,K+20 ! The 20 is ad hoc - beware - iflag=0 - if( genmrb(id,icol) .eq. 1 ) then - iflag=1 - if( icol .ne. id ) then ! reorder column - temp(1:K)=genmrb(1:K,id) - genmrb(1:K,id)=genmrb(1:K,icol) - genmrb(1:K,icol)=temp(1:K) - itmp=indices(id) - indices(id)=indices(icol) - indices(icol)=itmp - endif - do ii=1,K - if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then - genmrb(ii,1:N)=ieor(genmrb(ii,1:N),genmrb(id,1:N)) - endif - enddo - exit - endif - enddo -enddo - -g2=transpose(genmrb) - -! The hard decisions for the K MRB bits define the order 0 message, m0. -! Encode m0 using the modified generator matrix to find the "order 0" codeword. -! Flip various combinations of bits in m0 and re-encode to generate a list of -! codewords. Return the member of the list that has the smallest Euclidean -! distance to the received word. - -hdec=hdec(indices) ! hard decisions from received symbols -m0=hdec(1:K) ! zero'th order message -absrx=absrx(indices) -rx=rx(indices) -apmaskr=apmaskr(indices) - -call mrbencode(m0,c0,g2,N,K) - -nxor=ieor(c0,hdec) -nhardmin=sum(nxor) -dmin=sum(nxor*absrx) -cw=c0 -ntotal=0 -nrejected=0 - -if(ndeep.eq.0) goto 998 ! norder=0 -if(ndeep.gt.5) ndeep=5 -if( ndeep.eq. 1) then - nord=1 - npre1=0 - npre2=0 - nt=60 - ntheta=12 -elseif(ndeep.eq.2) then - nord=1 - npre1=1 - npre2=0 - nt=60 - ntheta=12 -elseif(ndeep.eq.3) then - nord=1 - npre1=1 - npre2=1 - nt=60 - ntheta=22 - ntau=16 -elseif(ndeep.eq.4) then - nord=2 - npre1=1 - npre2=0 - nt=60 - ntheta=22 - ntau=16 -elseif(ndeep.eq.5) then - nord=3 - npre1=1 - npre2=1 - nt=60 - ntheta=22 - ntau=16 -endif - -do iorder=1,nord - misub(1:K-iorder)=0 - misub(K-iorder+1:K)=1 - iflag=K-iorder+1 - do while(iflag .ge.0) - if(iorder.eq.nord .and. npre1.eq.0) then - iend=iflag - else - iend=1 - endif - do n1=iflag,iend,-1 - mi=misub - mi(n1)=1 - if(any(iand(apmaskr(1:K),mi).eq.1)) cycle - ntotal=ntotal+1 - me=ieor(m0,mi) - if(n1.eq.iflag) then - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - e2=e2sub - nd1Kpt=sum(e2sub(1:nt))+1 - d1=sum(ieor(me(1:K),hdec(1:K))*absrx(1:K)) - else - e2=ieor(e2sub,g2(K+1:N,n1)) - nd1Kpt=sum(e2(1:nt))+2 - endif - if(nd1Kpt .le. ntheta) then - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - if(n1.eq.iflag) then - dd=d1+sum(e2sub*absrx(K+1:N)) - else - dd=d1+ieor(ce(n1),hdec(n1))*absrx(n1)+sum(e2*absrx(K+1:N)) - endif - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - nd1Kptbest=nd1Kpt - endif - else - nrejected=nrejected+1 - endif - enddo -! Get the next test error pattern, iflag will go negative -! when the last pattern with weight iorder has been generated. - call nextpat(misub,k,iorder,iflag) - enddo -enddo - -if(npre2.eq.1) then - reset=.true. - ntotal=0 - do i1=K,1,-1 - do i2=i1-1,1,-1 - ntotal=ntotal+1 - mi(1:ntau)=ieor(g2(K+1:K+ntau,i1),g2(K+1:K+ntau,i2)) - call boxit(reset,mi(1:ntau),ntau,ntotal,i1,i2) - enddo - enddo - - ncount2=0 - ntotal2=0 - reset=.true. -! Now run through again and do the second pre-processing rule - misub(1:K-nord)=0 - misub(K-nord+1:K)=1 - iflag=K-nord+1 - do while(iflag .ge.0) - me=ieor(m0,misub) - call mrbencode(me,ce,g2,N,K) - e2sub=ieor(ce(K+1:N),hdec(K+1:N)) - do i2=0,ntau - ntotal2=ntotal2+1 - ui=0 - if(i2.gt.0) ui(i2)=1 - r2pat=ieor(e2sub,ui) -778 continue - call fetchit(reset,r2pat(1:ntau),ntau,in1,in2) - if(in1.gt.0.and.in2.gt.0) then - ncount2=ncount2+1 - mi=misub - mi(in1)=1 - mi(in2)=1 - if(sum(mi).lt.nord+npre1+npre2.or.any(iand(apmaskr(1:K),mi).eq.1)) cycle - me=ieor(m0,mi) - call mrbencode(me,ce,g2,N,K) - nxor=ieor(ce,hdec) - dd=sum(nxor*absrx) - if( dd .lt. dmin ) then - dmin=dd - cw=ce - nhardmin=sum(nxor) - endif - goto 778 - endif - enddo - call nextpat(misub,K,nord,iflag) - enddo -endif - -998 continue -! Re-order the codeword to as-received order. -cw(indices)=cw -hdec(indices)=hdec -return -end subroutine osdwspr - -subroutine mrbencode(me,codeword,g2,N,K) -integer*1 me(K),codeword(N),g2(N,K) -! fast encoding for low-weight test patterns - codeword=0 - do i=1,K - if( me(i) .eq. 1 ) then - codeword=ieor(codeword,g2(1:N,i)) - endif - enddo -return -end subroutine mrbencode - -subroutine nextpat(mi,k,iorder,iflag) - integer*1 mi(k),ms(k) -! generate the next test error pattern - ind=-1 - do i=1,k-1 - if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i - enddo - if( ind .lt. 0 ) then ! no more patterns of this order - iflag=ind - return - endif - ms=0 - ms(1:ind-1)=mi(1:ind-1) - ms(ind)=1 - ms(ind+1)=0 - if( ind+1 .lt. k ) then - nz=iorder-sum(ms) - ms(k-nz+1:k)=1 - endif - mi=ms - do i=1,k ! iflag will point to the lowest-index 1 in mi - if(mi(i).eq.1) then - iflag=i - exit - endif - enddo - return -end subroutine nextpat - -subroutine boxit(reset,e2,ntau,npindex,i1,i2) - integer*1 e2(1:ntau) - integer indexes(4000,2),fp(0:525000),np(4000) - logical reset - common/boxes/indexes,fp,np - - if(reset) then - patterns=-1 - fp=-1 - np=-1 - sc=-1 - indexes=-1 - reset=.false. - endif - - indexes(npindex,1)=i1 - indexes(npindex,2)=i2 - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - - ip=fp(ipat) ! see what's currently stored in fp(ipat) - if(ip.eq.-1) then - fp(ipat)=npindex - else - do while (np(ip).ne.-1) - ip=np(ip) - enddo - np(ip)=npindex - endif - return -end subroutine boxit - -subroutine fetchit(reset,e2,ntau,i1,i2) - integer indexes(4000,2),fp(0:525000),np(4000) - integer lastpat - integer*1 e2(ntau) - logical reset - common/boxes/indexes,fp,np - save lastpat,inext - - if(reset) then - lastpat=-1 - reset=.false. - endif - - ipat=0 - do i=1,ntau - if(e2(i).eq.1) then - ipat=ipat+ishft(1,ntau-i) - endif - enddo - index=fp(ipat) - - if(lastpat.ne.ipat .and. index.gt.0) then ! return first set of indices - i1=indexes(index,1) - i2=indexes(index,2) - inext=np(index) - elseif(lastpat.eq.ipat .and. inext.gt.0) then - i1=indexes(inext,1) - i2=indexes(inext,2) - inext=np(inext) - else - i1=-1 - i2=-1 - inext=-1 - endif - lastpat=ipat - return -end subroutine fetchit - diff --git a/lib/fsk4hf/polyfit4.f90 b/lib/fsk4hf/polyfit4.f90 deleted file mode 100644 index 892cd2cd6..000000000 --- a/lib/fsk4hf/polyfit4.f90 +++ /dev/null @@ -1,109 +0,0 @@ -subroutine polyfit4(x,y,sigmay,npts,nterms,mode,a,chisqr) - - parameter (MAXN=20) - implicit real*8 (a-h,o-z) - real x(npts), y(npts), sigmay(npts), a(nterms),chisqr - real*8 sumx(2*MAXN-1), sumy(MAXN), array(MAXN,MAXN) - -! Accumulate weighted sums - nmax = 2*nterms-1 - sumx=0. - sumy=0. - chisq=0. - do i=1,npts - xi=x(i) - yi=y(i) - if(mode.lt.0) then - weight=1./abs(yi) - else if(mode.eq.0) then - weight=1 - else - weight=1./sigmay(i)**2 - end if - xterm=weight - do n=1,nmax - sumx(n)=sumx(n)+xterm - xterm=xterm*xi - enddo - yterm=weight*yi - do n=1,nterms - sumy(n)=sumy(n)+yterm - yterm=yterm*xi - enddo - chisq=chisq+weight*yi**2 - enddo - -! Construct matrices and calculate coefficients - do j=1,nterms - do k=1,nterms - n=j+k-1 - array(j,k)=sumx(n) - enddo - enddo - - delta=determ4(array,nterms) - if(delta.eq.0) then - chisqr=0. - a=0. - else - do l=1,nterms - do j=1,nterms - do k=1,nterms - n=j+k-1 - array(j,k)=sumx(n) - enddo - array(j,l)=sumy(j) - enddo - a(l)=determ4(array,nterms)/delta - enddo - -! Calculate chi square - - do j=1,nterms - chisq=chisq-2*a(j)*sumy(j) - do k=1,nterms - n=j+k-1 - chisq=chisq+a(j)*a(k)*sumx(n) - enddo - enddo - free=npts-nterms - chisqr=chisq/free - end if - - return -end subroutine polyfit4 - -real*8 function determ4(array,norder) - - parameter (MAXN=20) - implicit real*8 (a-h,o-z) - real*8 array(MAXN,MAXN) - - determ4=1. - do k=1,norder - if (array(k,k).ne.0) go to 41 - do j=k,norder - if(array(k,j).ne.0) go to 31 - enddo - determ4=0. - go to 60 - -31 do i=k,norder - s8=array(i,j) - array(i,j)=array(i,k) - array(i,k)=s8 - enddo - determ4=-1.*determ4 -41 determ4=determ4*array(k,k) - if(k.lt.norder) then - k1=k+1 - do i=k1,norder - do j=k1,norder - array(i,j)=array(i,j)-array(i,k)*array(k,j)/array(k,k) - enddo - enddo - end if - enddo - -60 return -end function determ4 diff --git a/lib/fsk4hf/spb.m b/lib/fsk4hf/spb.m deleted file mode 100644 index 9bb164506..000000000 --- a/lib/fsk4hf/spb.m +++ /dev/null @@ -1,89 +0,0 @@ -clear all; -global N -global R -global A - -#------------------------------------------------------------------------------- -function retval = f1(theta) - global N; - global R; - retval=0.0; - gterm = gammaln(N/2) - gammaln((N+1)/2) - log(2*sqrt(pi)); - rhs = -N*R*log(2); - lhs=gterm + (N-1)*log(sin(theta)) + log(1-(tan(theta).^2)/N) - log(cos(theta)); - retval = rhs-real(lhs); -endfunction -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -function retval = d(N,i,x) - t1=(x.^2)/2; - t2=gammaln(N/2); - t3=-gammaln(i/2+1); - t4=-gammaln(N-i); - t5=(N-1-i)*log(sqrt(2)*x); - t6=-log(2)/2; - t7arg=1+(-1)^i * gammainc((x.^2)/2.0,(i+1)/2); - t7=log(t7arg); - retval=t1+t2+t3+t4+t5+t6+t7; -endfunction -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -function retval = maxstar(x1,x2) - retval = max(x1,x2)+log(1+exp(-abs(x1-x2))); -endfunction -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -function retval = spb_integrand(x) - global N; - global A; - - t1=log(N-1); - t2=-N*(A^2)/2; - t3=-0.5*log(2*pi); - t4=(N-2)*log(sin(x)); - - arg=sqrt(N)*A*cos(x); - t5=maxstar(d(N,0,arg),d(N,1,arg)); - for i=2:N-1 - t5=maxstar(t5,d(N,i,arg)); - endfor - - retval=exp(t1+t2+t3+t4+t5); -endfunction -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -function retval = qfunc(x) - retval = 0.5 * erfc(x/sqrt(2)); -endfunction -#------------------------------------------------------------------------------- - -#------------------------------------------------------------------------------- -# Calculate sphere packing lower bound on the probability of word error -# given block length (N), code rate (R), and Eb/No. -# -# Ref: -# "Log-Domain Calculation of the 1959 Sphere-Packing Bound with Application to -# M-ary PSK Block Coded Modulation," Igal Sason and Gil Weichman, -# doi: 10.1109/EEEI.2006.321097 -#------------------------------------------------------------------------------- -N=128 -K=90 -R=K/N - -delta=0.01; -[ths,fval,info,output]=fzero(@f1,[delta,pi/2-delta], optimset ("jacobian", "off")); - -for ebnodb=-3:0.5:4 - ebno=10^(ebnodb/10.0); - esno=ebno*R; - A=sqrt(2*esno); - term1=quadcc(@spb_integrand,ths,pi/2); - term2=qfunc(sqrt(N)*A); - pe=term1+term2; - ps=1-pe; - printf("%f %f\n",ebnodb,ps); -endfor diff --git a/lib/fsk4hf/spb_128_90.dat b/lib/fsk4hf/spb_128_90.dat deleted file mode 100644 index 9e32e28e9..000000000 --- a/lib/fsk4hf/spb_128_90.dat +++ /dev/null @@ -1,19 +0,0 @@ -N = 128 -K = 90 -R = 0.70312 --3.000000 0.000341 --2.500000 0.001513 --2.000000 0.006049 --1.500000 0.021280 --1.000000 0.064283 --0.500000 0.162755 -0.000000 0.338430 -0.500000 0.571867 -1.000000 0.791634 -1.500000 0.930284 -2.000000 0.985385 -2.500000 0.998258 -3.000000 0.999893 -3.500000 0.999997 -4.000000 1.000000 - diff --git a/lib/fsk4hf/spec4.f90 b/lib/fsk4hf/spec4.f90 deleted file mode 100644 index e05889507..000000000 --- a/lib/fsk4hf/spec4.f90 +++ /dev/null @@ -1,35 +0,0 @@ -subroutine spec4(c,s,savg) - - parameter (KK=84) !Information bits (72 + CRC12) - parameter (ND=84) !Data symbols: LDPC (168,84), r=1/2 - parameter (NS=12) !Sync symbols (3 @ 4x4 Costas arrays) - parameter (NR=2) !Ramp up/down - parameter (NN=NR+NS+ND) !Total symbols (98) - parameter (NSPS=2688/84) !Samples per symbol (32) - parameter (NZ=NSPS*NN) !Samples in baseband waveform (3760) - parameter (NFFT=2*NSPS,NH=NSPS) - - complex c(0:NZ-1) - complex c1(0:NFFT-1) - real s(0:NH,NN) - real savg(0:NH) - - fs=12000.0/84.0 - df=fs/NFFT - savg=0. - do j=1,NN - ia=(j-1)*NSPS - ib=ia + NSPS-1 - c1(0:NSPS-1)=c(ia:ib) - c1(NSPS:)=0. - call four2a(c1,NFFT,1,-1,1) - do k=1,NSPS - s(k,j)=real(c1(k))**2 + aimag(c1(k))**2 - enddo - savg=savg+s(0:NH,j) - enddo - s=s/NZ - savg=savg/(NN*NZ) - - return -end subroutine spec4 diff --git a/lib/fsk4hf/spec8.f90 b/lib/fsk4hf/spec8.f90 deleted file mode 100644 index 43fbc7ee2..000000000 --- a/lib/fsk4hf/spec8.f90 +++ /dev/null @@ -1,31 +0,0 @@ -subroutine spec8(c,s,savg) - - include 'wspr_fsk8_params.f90' - complex c(0:NMAXD-1) - complex c1(0:NSPS-1) - real s(0:NH2,NN) - real savg(0:NH2) - - fs=12000.0/NDOWN - df=fs/NSPS - savg=0. - do j=1,NN - ia=(j-1)*NSPS - ib=ia + NSPS-1 - c1(0:NSPS-1)=c(ia:ib) - c1(NSPS:)=0. - call four2a(c1,NSPS,1,-1,1) - do i=0,NH2 - s(i,j)=real(c1(i))**2 + aimag(c1(i))**2 - enddo - savg=savg+s(0:NH2,j) - enddo - s=s/NZ - savg=savg/(NN*NZ) -! do i=0,NH2 -! write(31,3101) i*df,savg(i) -!3101 format(f10.3,f12.3) -! enddo - - return -end subroutine spec8 diff --git a/lib/fsk4hf/tccsim.f90 b/lib/fsk4hf/tccsim.f90 deleted file mode 100644 index 644b87a39..000000000 --- a/lib/fsk4hf/tccsim.f90 +++ /dev/null @@ -1,194 +0,0 @@ -! -! Simulator for terminated convolutional codes (so, far, only rate 1/2) -! BPSK on AWGN Channel -! -! Hybrid decoder - Fano Sequential Decoder and Ordered Statistics Decoder (OSD)a -! -program tccsim - - parameter (N=162,K=50) - integer*1 gen(K,N) - integer*1 gg(64) - integer*1 mbits(50),mbits2(50) - integer*4 mettab(-128:127,0:1) - - parameter (NSYM=162) - parameter (MAXSYM=162) - character*12 arg - character*22 msg,msg2 - integer*1 data0(13) - integer*1 data1(13) - integer*1 dat(206) - integer*1 softsym(162) - integer*1 apmask(162),cw0(162),cw(162) - real*4 xx0(0:255) - real ss(162) - - character*64 g ! Interleaved polynomial coefficients - data g/'1101010010001100101001011101100001000000100111100010010010111111'/ - - data xx0/ & !Metric table - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, & - 0.988, 1.000, 0.991, 0.993, 1.000, 0.995, 1.000, 0.991, & - 1.000, 0.991, 0.992, 0.991, 0.990, 0.990, 0.992, 0.996, & - 0.990, 0.994, 0.993, 0.991, 0.992, 0.989, 0.991, 0.987, & - 0.985, 0.989, 0.984, 0.983, 0.979, 0.977, 0.971, 0.975, & - 0.974, 0.970, 0.970, 0.970, 0.967, 0.962, 0.960, 0.957, & - 0.956, 0.953, 0.942, 0.946, 0.937, 0.933, 0.929, 0.920, & - 0.917, 0.911, 0.903, 0.895, 0.884, 0.877, 0.869, 0.858, & - 0.846, 0.834, 0.821, 0.806, 0.790, 0.775, 0.755, 0.737, & - 0.713, 0.691, 0.667, 0.640, 0.612, 0.581, 0.548, 0.510, & - 0.472, 0.425, 0.378, 0.328, 0.274, 0.212, 0.146, 0.075, & - 0.000,-0.079,-0.163,-0.249,-0.338,-0.425,-0.514,-0.606, & - -0.706,-0.796,-0.895,-0.987,-1.084,-1.181,-1.280,-1.376, & - -1.473,-1.587,-1.678,-1.790,-1.882,-1.992,-2.096,-2.201, & - -2.301,-2.411,-2.531,-2.608,-2.690,-2.829,-2.939,-3.058, & - -3.164,-3.212,-3.377,-3.463,-3.550,-3.768,-3.677,-3.975, & - -4.062,-4.098,-4.186,-4.261,-4.472,-4.621,-4.623,-4.608, & - -4.822,-4.870,-4.652,-4.954,-5.108,-5.377,-5.544,-5.995, & - -5.632,-5.826,-6.304,-6.002,-6.559,-6.369,-6.658,-7.016, & - -6.184,-7.332,-6.534,-6.152,-6.113,-6.288,-6.426,-6.313, & - -9.966,-6.371,-9.966,-7.055,-9.966,-6.629,-6.313,-9.966, & - -5.858,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966, & - -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966, & - -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966, & - -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966, & - -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966, & - -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966/ - - bias=0.42 - scale=120 -! ndelta=nint(3.4*scale) - ndelta=100 - ib=150 - slope=2 - do i=0,255 - mettab(i-128,0)=nint(scale*(xx0(i)-bias)) - if(i.gt.ib) mettab(i-128,0)=mettab(ib-128,0)-slope*(i-ib) - if(i.ge.1) mettab(128-i,1)=mettab(i-128,0) - enddo - mettab(-128,1)=mettab(-127,1) - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.3) then - print*,'Usage: tccsim "message" ntrials ndepth' - go to 999 - endif - call getarg(1,msg) !Get message from command line - write(*,1000) msg -1000 format('Message: ',a22) - call getarg(2,arg) - read(arg,*) ntrials - call getarg(3,arg) - read(arg,*) ndepth - - nbits=50+31 !User bits=99, constraint length=32 - nbytes=(nbits+7)/8 - limit=20000 - - data0=0 - call wqencode(msg,ntype0,data0) !Source encoding -write(*,*) 'data0 ',data0 -! Demonstrates how to create the generator matrix from a string that contains the interleaved -! polynomial coefficients - gen=0 - do j=1,64 - read(g(j:j),"(i1)") gg(j) ! read polynomial coeffs from string - enddo - do i=1,K - gen(i,2*(i-1)+1:2*(i-1)+64)=gg ! fill the generator matrix with cyclic shifts of gg - enddo - -! get message bits from data0 - nbits=0 - do i=1,7 - do ib=7,0,-1 - nbits=nbits+1 - if(nbits .le. 50) then - mbits(nbits)=0 - if(btest(data0(i),ib)) mbits(nbits)=1 - endif - enddo - enddo - - write(*,*) 'Source encoded message bits: ' - write(*,'(6(8i1,1x),2i1)') mbits - -! Encode message bits using the generator matrix, generating a 162-bit codeword. - cw0=0 - do i=1,50 - if(mbits(i).eq.1) cw0=mod(cw0+gen(i,:),2) - enddo - - write(*,*) 'Codeword from generator matrix: ' - write(*,'(162i1)') cw0 - -! call encode232(data0,nbytes,dat) !Convolutional encoding -! write(*,*) 'Codeword from encode232: ' -! write(*,'(162i2)') dat - -! call inter_mept(dat,1) !Interleaving - -! Here, we have channel symbols. - -! call inter_mept(dat,-1) !Remove interleaving - - call init_random_seed() - call sgran() - - do isnr=10,-20,-1 - sigma=1/sqrt(2*(10**((isnr/2.0)/10.0))) - ngood=0 - nbad=0 - do i=1,ntrials - do j=1,162 - ss(j)=-(2*cw0(j)-1)+sigma*gran() !Simulate soft symbols - enddo - - rms=sqrt(sum(ss**2)) - ss=100*ss/rms - where(ss>127.0) ss=127.0 - where(ss<-127.0) ss=-127.0 - softsym=ss - -! Call the sequential (Fano algorithm) decoder - nbits=50+31 -! call fano232(softsym,nbits,mettab,ndelta,limit,data1,ncycles,metric,nerr) -nerr=1 - iflag=0 - nhardmin=0 - dmin=0.0 - -! If Fano fails, call OSD - if(nerr.ne.0 .and. ndepth.ge.0) then - apmask=0 - cw=0 - call osdwspr(softsym,apmask,ndepth,cw,nhardmin,dmin) -! OSD produces a codeword, but code is not systematic -! Use Fano with hard decisions to retrieve the message from the codeword -! cw=-(2*cw-1)*64 -! nbits=50+31 -!dat=0 -!dat(1:162)=cw -! call fano232(dat,nbits,mettab,ndelta,limit,data1,ncycles,metric,nerr) -! iflag=1 - endif -! call wqdecode(data1,msg2,ntype1) -! write(*,*) msg2,iflag,nhardmin,dmin - if(any(cw.ne.cw0)) nbad=nbad+1 - if(all(cw.eq.cw0)) ngood=ngood+1 - enddo - - write(*,'(f4.1,i8,i8)') isnr/2.0,ngood,nbad - enddo - -999 end program tccsim - -#include '../wsprcode/wspr_old_subs.f90' - diff --git a/lib/fsk4hf/tweak1.f90 b/lib/fsk4hf/tweak1.f90 deleted file mode 100644 index c62c40872..000000000 --- a/lib/fsk4hf/tweak1.f90 +++ /dev/null @@ -1,23 +0,0 @@ -subroutine tweak1(ca,jz,f0,cb) - -! Shift frequency of analytic signal ca, with output to cb - - complex ca(jz),cb(jz) - real*8 twopi - complex*16 w,wstep - complex w4 - data twopi/0.d0/ - save twopi - - if(twopi.eq.0.d0) twopi=8.d0*atan(1.d0) - w=1.d0 - dphi=twopi*f0/12000.d0 - wstep=cmplx(cos(dphi),sin(dphi)) - do i=1,jz - w=w*wstep - w4=w - cb(i)=w4*ca(i) - enddo - - return -end subroutine tweak1 diff --git a/lib/fsk4hf/wavhdr.f90 b/lib/fsk4hf/wavhdr.f90 deleted file mode 100644 index b54fba787..000000000 --- a/lib/fsk4hf/wavhdr.f90 +++ /dev/null @@ -1,110 +0,0 @@ -module wavhdr - type hdr - character*4 ariff - integer*4 lenfile - character*4 awave - character*4 afmt - integer*4 lenfmt - integer*2 nfmt2 - integer*2 nchan2 - integer*4 nsamrate - integer*4 nbytesec - integer*2 nbytesam2 - integer*2 nbitsam2 - character*4 adata - integer*4 ndata - end type hdr - - contains - - function default_header(nsamrate,npts) - type(hdr) default_header,h - h%ariff='RIFF' - h%awave='WAVE' - h%afmt='fmt ' - h%lenfmt=16 - h%nfmt2=1 - h%nchan2=1 - h%nsamrate=nsamrate - h%nbitsam2=16 - h%nbytesam2=h%nbitsam2 * h%nchan2 / 8 - h%adata='data' - h%nbytesec=h%nsamrate * h%nbitsam2 * h%nchan2 / 8 - h%ndata=2*npts - h%lenfile=h%ndata + 44 - 8 - default_header=h - end function default_header - - subroutine set_wsjtx_wav_params(fMHz,mode,nsubmode,ntrperiod,id2) - - parameter (NBANDS=23,NMODES=11) - character*8 mode,modes(NMODES) - integer*2 id2(4) - integer iperiod(7) - real fband(NBANDS) - data fband/0.137,0.474,1.8,3.5,5.1,7.0,10.14,14.0,18.1,21.0,24.9, & - 28.0,50.0,144.0,222.0,432.0,902.0,1296.0,2304.0,3400.0, & - 5760.0,10368.0,24048.0/ - data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & - 'JT9+JT65','JTMS','JTMSK','WSPR'/ - data iperiod/5,10,15,30,60,120,900/ - - dmin=1.e30 - iband=0 - do i=1,NBANDS - if(abs(fMHz-fband(i)).lt.dmin) then - dmin=abs(fMHz-fband(i)) - iband=i - endif - enddo - - imode=0 - do i=1,NMODES - if(mode.eq.modes(i)) imode=i - enddo - - ip=0 - do i=1,7 - if(ntrperiod.eq.iperiod(i)) ip=i - enddo - - id2(1)=iband - id2(2)=imode - id2(3)=nsubmode - id2(4)=ip - - return - end subroutine set_wsjtx_wav_params - - subroutine get_wsjtx_wav_params(id2,band,mode,nsubmode,ntrperiod,ok) - - parameter (NBANDS=23,NMODES=11) - character*8 mode,modes(NMODES) - character*6 band,bands(NBANDS) - integer*2 id2(4) - integer iperiod(7) - logical ok - data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & - 'JT9+JT65','JTMS','JTMSK','WSPR'/ - data iperiod/5,10,15,30,60,120,900/ - data bands/'2190m','630m','160m','80m','60m','40m','30m','20m', & - '17m','15m','12m','10m','6m','2m','1.25m','70cm','33cm', & - '23cm','13cm','9cm','6cm','3cm','1.25cm'/ - - ok=.true. - if(id2(1).lt.1 .or. id2(1).gt.NBANDS) ok=.false. - if(id2(2).lt.1 .or. id2(2).gt.NMODES) ok=.false. - if(id2(3).lt.1 .or. id2(3).gt.8) ok=.false. - if(id2(4).lt.1 .or. id2(4).gt.7) ok=.false. - - if(ok) then - band=bands(id2(1)) - mode=modes(id2(2)) - nsubmode=id2(3) - ntrperiod=iperiod(id2(4)) - endif - - return - end subroutine get_wsjtx_wav_params - -end module wavhdr diff --git a/lib/fsk4hf/wspr4_params.f90 b/lib/fsk4hf/wspr4_params.f90 deleted file mode 100644 index d4e575382..000000000 --- a/lib/fsk4hf/wspr4_params.f90 +++ /dev/null @@ -1,16 +0,0 @@ -! WSPR4 -! LDPC(174,74)/CRC24 code, four 4x4 Costas arrays for sync, ramp-up and ramp-down symbols - -parameter (KK=50) !Information bits (50 + CRC24) -parameter (ND=87) !Data symbols -parameter (NS=16) !Sync symbols -parameter (NN=NS+ND) !Sync and data symbols (103) -parameter (NN2=NS+ND+2) !Total channel symbols (105) -parameter (NSPS=13312) !Samples per symbol at 12000 S/s -parameter (NZ=NSPS*NN) !Sync and Data samples (1,397,136) -parameter (NZ2=NSPS*NN2) !Total samples in shaped waveform (1,397,760) -parameter (NMAX=408*3456) !Samples in iwave (1,410,048) -parameter (NFFT1=4*NSPS, NH1=NFFT1/2) !Length of FFTs for symbol spectra -parameter (NSTEP=NSPS) !Coarse time-sync step size -parameter (NHSYM=(NMAX-NFFT1)/NSTEP) !Number of symbol spectra (1/4-sym steps) -parameter (NDOWN=32) !Downsample factor diff --git a/lib/fsk4hf/wspr4d.f90 b/lib/fsk4hf/wspr4d.f90 deleted file mode 100644 index 0e29833b5..000000000 --- a/lib/fsk4hf/wspr4d.f90 +++ /dev/null @@ -1,424 +0,0 @@ -program wspr4d - -! Decode WSPR4 data read from *.c2 or *.wav files. - - use packjt77 - include 'wspr4_params.f90' - parameter (NSPS2=NSPS/32) - character arg*8,cbits*50,infile*80,fname*16,datetime*11 - character ch1*1,ch4*4,cseq*31 - character*22 decodes(100) - character*37 msg - character*120 data_dir - character*77 c77 - complex c2(0:NMAX/32-1) !Complex waveform - complex cframe(0:103*NSPS2-1) !Complex waveform - complex cd(0:103*16-1) !Complex waveform - real*8 fMHz - real llr(174),llra(174),llrb(174),llrc(174) - real candidates(100,2) - real bitmetrics(206,3) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 apmask(174),cw(174) - integer*1 hbits(206) - integer*1 message74(74) - integer*1 message101(101) - logical badsync,unpk77_success - - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - txt=NZ*dt !Transmission length (s) - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: wspr4d [-a ] [-f fMHz] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') - - ngood=0 - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c2') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c2 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call wspr4_downsample(iwave,c2) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=-100.0 - fb=100.0 - fs=12000.0/32.0 - npts=120*12000.0/32.0 - - call getcandidate4(c2,npts,fs,fa,fb,ncand,candidates) !First approx for freq - - ndecodes=0 - do icand=1,ncand - fc0=candidates(icand,1) - xsnr=candidates(icand,2) - - do isync=0,1 - - del=1.5*fs/416.0 - if(isync.eq.0) then - fc1=fc0-del - is0=375 - ishw=300 - dis=50 - ifhw=10 - df=.1 - else if(isync.eq.1) then - fc1=fc2 - is0=isbest - ishw=100 - dis=10 - ifhw=10 - df=.02 - endif - smax=0.0 - do if=-ifhw,ifhw - fc=fc1+df*if - do istart=max(1,is0-ishw),is0+ishw,dis - call coherent_sync(c2,istart,fc,1,sync) - if(sync.gt.smax) then - fc2=fc - isbest=istart - smax=sync - endif - enddo - enddo -! write(*,*) ifile,icand,isync,fc1+del,fc2+del,isbest,smax - enddo - -! if(smax .lt. 100.0 ) cycle -!isbest=375 -!fc2=-del - idecoded=0 - do ijitter=0,2 - if(idecoded.eq.1) exit - if(ijitter.eq.0) ioffset=0 - if(ijitter.eq.1) ioffset=50 - if(ijitter.eq.2) ioffset=-50 - is0=isbest+ioffset - if(is0.lt.0) cycle - cframe=c2(is0:is0+103*416-1) - call downsample4(cframe,fc2,cd) - s2=sum(cd*conjg(cd))/(16*103) - cd=cd/sqrt(s2) - call get_wspr4_bitmetrics(cd,bitmetrics,badsync) - - hbits=0 - where(bitmetrics(:,1).ge.0) hbits=1 - ns1=count(hbits( 1: 8).eq.(/0,0,0,1,1,0,1,1/)) - ns2=count(hbits( 67: 74).eq.(/0,1,0,0,1,1,1,0/)) - ns3=count(hbits(133:140).eq.(/1,1,1,0,0,1,0,0/)) - ns4=count(hbits(199:206).eq.(/1,0,1,1,0,0,0,1/)) - nsync_qual=ns1+ns2+ns3+ns4 -! if(nsync_qual.lt. 20) cycle - - scalefac=2.83 - llra( 1: 58)=bitmetrics( 9: 66, 1) - llra( 59:116)=bitmetrics( 75:132, 1) - llra(117:174)=bitmetrics(141:198, 1) - llra=scalefac*llra - llrb( 1: 58)=bitmetrics( 9: 66, 2) - llrb( 59:116)=bitmetrics( 75:132, 2) - llrb(117:174)=bitmetrics(141:198, 2) - llrb=scalefac*llrb - llrc( 1: 58)=bitmetrics( 9: 66, 3) - llrc( 59:116)=bitmetrics( 75:132, 3) - llrc(117:174)=bitmetrics(141:198, 3) - llrc=scalefac*llrc - apmask=0 - max_iterations=40 - - do itry=3,1,-1 - if(itry.eq.1) llr=llra - if(itry.eq.2) llr=llrb - if(itry.eq.3) llr=llrc - nhardbp=0 - nhardosd=0 - dmin=0.0 - call bpdecode174_74(llr,apmask,max_iterations,message74,cw,nhardbp,niterations,nchecks) - Keff=64 -! if(nhardbp.lt.0) call osd174_74(llr,Keff,apmask,5,message74,cw,nhardosd,dmin) - maxsuperits=2 - ndeep=4 - if(nhardbp.lt.0) then - call decode174_74(llr,Keff,ndeep,apmask,maxsuperits,message74,cw,nhardosd,iter,ncheck,dmin,isuper) - endif - if(nhardbp.ge.0 .or. nhardosd.ge.0) then - write(c77,'(50i1)') message74(1:50) - c77(51:77)='000000000000000000000110000' - call unpack77(c77,0,msg,unpk77_success) - if(unpk77_success .and. index(msg,'K9AN').gt.0) then - idecoded=1 - ngood=ngood+1 - write(*,1100) ifile,xsnr,isbest/375.0-1.0,1500.0+fc2+del,msg(1:14),itry,nhardbp,nhardosd,dmin,ijitter -1100 format(i5,2x,f6.1,2x,f6.2,2x,f8.2,2x,a14,i4,i4,i4,f7.2,i6) - exit - else - cycle - endif - endif - enddo ! metrics - enddo ! istart jitter - enddo !candidate list - enddo !files - nfiles=nargs-iarg+1 - write(*,*) 'nfiles: ',nfiles,' ngood: ',ngood - write(*,1120) -1120 format("") - -999 end program wspr4d - -subroutine coherent_sync(cd0,i0,f0,itwk,sync) - -! Compute sync power for a complex, downsampled FT4 signal. - - include 'wspr4_params.f90' - parameter(NP=NMAX/NDOWN,NSS=NSPS/NDOWN) - complex cd0(0:NP-1) - complex csynca(4*NSS),csyncb(4*NSS),csyncc(4*NSS),csyncd(4*NSS) - complex csync2(4*NSS) - complex ctwk(4*NSS) - complex ctmp(4*NSS) - complex z1,z2,z3,z4 - logical first - integer icos4a(0:3),icos4b(0:3),icos4c(0:3),icos4d(0:3) - data icos4a/0,1,3,2/ - data icos4b/1,0,2,3/ - data icos4c/2,3,1,0/ - data icos4d/3,2,0,1/ - data first/.true./ - save first,twopi,csynca,csyncb,csyncc,csyncd,fac - - p(z1)=(real(z1*fac)**2 + aimag(z1*fac)**2)**0.5 !Statement function for power - - if( first ) then - twopi=8.0*atan(1.0) - k=1 - phia=0.0 - phib=0.0 - phic=0.0 - phid=0.0 - do i=0,3 - dphia=twopi*icos4a(i)/real(NSS) - dphib=twopi*icos4b(i)/real(NSS) - dphic=twopi*icos4c(i)/real(NSS) - dphid=twopi*icos4d(i)/real(NSS) - do j=1,NSS - csynca(k)=cmplx(cos(phia),sin(phia)) - csyncb(k)=cmplx(cos(phib),sin(phib)) - csyncc(k)=cmplx(cos(phic),sin(phic)) - csyncd(k)=cmplx(cos(phid),sin(phid)) - phia=mod(phia+dphia,twopi) - phib=mod(phib+dphib,twopi) - phic=mod(phic+dphic,twopi) - phid=mod(phid+dphid,twopi) - k=k+1 - enddo - enddo - first=.false. - fac=1.0/(4.0*NSS) - endif - - i1=i0 !four Costas arrays - i2=i0+33*NSS - i3=i0+66*NSS - i4=i0+99*NSS - - z1=0. - z2=0. - z3=0. - z4=0. - - if(itwk.eq.1) then - dt=1/(12000.0/32.0) - dphi=twopi*f0*dt - phi=0.0 - do i=1,4*NSS - ctwk(i)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dphi,twopi) - enddo - endif - - if(itwk.eq.1) csync2=ctwk*csynca !Tweak the frequency - z1=0. - if(i1.ge.0 .and. i1+4*NSS-1.le.NP-1) then - z1=sum(cd0(i1:i1+4*NSS-1)*conjg(csync2)) - elseif( i1.lt.0 ) then - npts=(i1+4*NSS-1)/2 - if(npts.le.32) then - z1=0. - else - z1=sum(cd0(0:i1+4*NSS-1)*conjg(csync2(4*NSS-npts:))) - endif - endif - - if(itwk.eq.1) csync2=ctwk*csyncb !Tweak the frequency - if(i2.ge.0 .and. i2+4*NSS-1.le.NP-1) then - z2=sum(cd0(i2:i2+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csyncc !Tweak the frequency - if(i3.ge.0 .and. i3+4*NSS-1.le.NP-1) then - z3=sum(cd0(i3:i3+4*NSS-1)*conjg(csync2)) - endif - - if(itwk.eq.1) csync2=ctwk*csyncd !Tweak the frequency - z4=0. - if(i4.ge.0 .and. i4+4*NSS-1.le.NP-1) then - z4=sum(cd0(i4:i4+4*NSS-1)*conjg(csync2)) - elseif( i4+4*NSS-1.gt.NP-1 ) then - npts=(NP-1-i4+1) - if(npts.le.32) then - z4=0. - else - z4=sum(cd0(i4:i4+npts-1)*conjg(csync2(1:npts))) - endif - endif - - sync = p(z1) + p(z2) + p(z3) + p(z4) - - return -end subroutine coherent_sync - -subroutine downsample4(ci,f0,co) - parameter(NI=103*416,NH=NI/2,NO=NI/26) ! downsample from 416 samples per symbol to 16 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0/32.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - b=16.0 - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample4 - -subroutine getcandidate4(c,npts,fs,fa,fb,ncand,candidates) - parameter(NFFT1=120*12000/32,NH1=NFFT1/2,NFFT2=120*12000/320,NH2=NFFT2/2) - complex c(0:npts-1) !Complex waveform - complex cc(0:NFFT1-1) - complex csfil(0:NFFT2-1) - complex cwork(0:NFFT2-1) - real bigspec(0:NFFT2-1) - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - real ss(-NH1+1:NH1) !Smoothed coarse spectrum - real candidates(100,2) - integer indx(NFFT2-1) - logical first - data first/.true./ - save first,w,df,csfil - - if(first) then - df=10*fs/NFFT1 - csfil=cmplx(0.0,0.0) - do i=0,NFFT2-1 - csfil(i)=exp(-((i-NH2)/32.0)**2) ! revisit this - enddo - csfil=cshift(csfil,NH2) - call four2a(csfil,NFFT2,1,-1,1) - first=.false. - endif - - cc=cmplx(0.0,0.0) - cc(0:npts-1)=c; - call four2a(cc,NFFT1,1,-1,1) - cc=abs(cc)**2 - call four2a(cc,NFFT1,1,-1,1) - cwork(0:NH2)=cc(0:NH2)*conjg(csfil(0:NH2)) - cwork(NH2+1:NFFT2-1)=cc(NFFT1-NH2+1:NFFT1-1)*conjg(csfil(NH2+1:NFFT2-1)) - - call four2a(cwork,NFFT2,1,+1,1) - bigspec=cshift(real(cwork),-NH2) - il=NH2+fa/df - ih=NH2+fb/df - nnl=ih-il+1 - call indexx(bigspec(il:il+nnl-1),nnl,indx) - xn=bigspec(il-1+indx(nint(0.3*nnl))) - bigspec=bigspec/xn - ncand=0 - do i=il,ih - if((bigspec(i).gt.bigspec(i-1)).and. & - (bigspec(i).gt.bigspec(i+1)).and. & - (bigspec(i).gt.1.15).and.ncand.lt.100) then - ncand=ncand+1 - candidates(ncand,1)=df*(i-NH2) - candidates(ncand,2)=10*log10(bigspec(i)-1)-28.5 - endif - enddo - return -end subroutine getcandidate4 - -subroutine wspr4_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 375 Hz - - include 'wspr4_params.f90' - parameter (NFFT2=NMAX/32) - integer*2 iwave(NMAX) - complex c(0:NMAX/32-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/32-1) - return -end subroutine wspr4_downsample - diff --git a/lib/fsk4hf/wspr4sim.f90 b/lib/fsk4hf/wspr4sim.f90 deleted file mode 100644 index eaca79c5a..000000000 --- a/lib/fsk4hf/wspr4sim.f90 +++ /dev/null @@ -1,114 +0,0 @@ -program wspr4sim - -! Generate simulated signals for experimental "wspr4" mode - - use wavhdr - use packjt77 - include 'wspr4_params.f90' !Set various constants - type(hdr) h !Header for .wav file - character arg*12,fname*17 - character msg37*37,msgsent37*37 - character c77*77 - complex c0(0:NMAX-1) - complex c(0:NMAX-1) - real wave(NMAX) - integer itone(NN) - integer*1 msgbits(74) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.7) then - print*,'Usage: wspr4sim "message" f0 DT fdop del nfiles snr' - print*,'Examples: wspr4sim "K9AN EN50 37" 1500 0.0 0.1 1.0 10 -15' - go to 999 - endif - call getarg(1,msg37) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Frequency (only used for single-signal) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nfiles !Number of files - call getarg(7,arg) - read(arg,*) snrdb !SNR_2500 - - nfiles=abs(nfiles) - twopi=8.0*atan(1.0) - fs=12000.0 !Sample rate (Hz) - dt=1.0/fs !Sample interval (s) - hmod=1.0 !Modulation index (0.5 is MSK, 1.0 is FSK) - tt=NSPS*dt !Duration of symbols (s) - baud=1.0/tt !Keying rate (baud) - txt=NZ2*dt !Transmission length (s) - - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - - call genwspr4(msg37,0,msgsent37,msgbits,itone) - write(*,*) - write(*,'(a9,a37,3x,a7,i1,a1,i1)') 'Message: ',msgsent37,'i3.n3: ',i3,'.',n3 - write(*,1000) f0,xdt,txt,snrdb -1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1) - write(*,*) - if(i3.eq.1) then - write(*,*) ' mycall hiscall hisgrid' - write(*,'(28i1,1x,i1,1x,28i1,1x,i1,1x,i1,1x,15i1,1x,3i1)') msgbits(1:77) - else - write(*,'(a14)') 'Message bits: ' - write(*,'(50i1,1x,24i1)') msgbits - endif - write(*,*) - write(*,'(a17)') 'Channel symbols: ' - write(*,'(10i1)') itone - write(*,*) - - call sgran() - - fsample=12000.0 - icmplx=1 - call gen_wspr4wave(itone,NN,NSPS,fsample,hmod,f0,c0,wave,icmplx,NMAX) - k=nint((xdt+1.0)/dt)-NSPS - c0=cshift(c0,-k) - if(k.gt.0) c0(0:k-1)=0.0 - if(k.lt.0) c0(NMAX+k:NMAX-1)=0.0 - - do ifile=1,nfiles - c=c0 - if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c,NMAX,NZ,fs,delay,fspread) - c=sig*c - wave=real(c) - peak=maxval(abs(wave)) - nslots=1 - if(snrdb.lt.90) then - do i=1,NMAX !Add gaussian noise at specified SNR - xnoise=gran() - wave(i)=wave(i) + xnoise - enddo - endif - gain=100.0 - if(snrdb.lt.90.0) then - wave=gain*wave - else - datpk=maxval(abs(wave)) - fac=32766.9/datpk - wave=fac*wave - endif - if(any(abs(wave).gt.32767.0)) print*,"Warning - data will be clipped." - iwave=nint(wave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i6.6,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a17) - enddo - -999 end program wspr4sim diff --git a/lib/fsk4hf/wspr5_downsample.f90 b/lib/fsk4hf/wspr5_downsample.f90 deleted file mode 100644 index 6fdb9021d..000000000 --- a/lib/fsk4hf/wspr5_downsample.f90 +++ /dev/null @@ -1,29 +0,0 @@ -subroutine wspr5_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 400 Hz - - include 'wsprlf_params.f90' - parameter (NMAX=300*12000,NFFT2=NMAX/30) - integer*2 iwave(NMAX) - complex c(0:NZ-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NZ-1) - - return -end subroutine wspr5_downsample diff --git a/lib/fsk4hf/wspr5_wav.f90 b/lib/fsk4hf/wspr5_wav.f90 deleted file mode 100644 index 0b09ccde2..000000000 --- a/lib/fsk4hf/wspr5_wav.f90 +++ /dev/null @@ -1,48 +0,0 @@ -subroutine wspr5_wav(baud,xdt,f0,itone,snrdb,iwave) - -! Generate iwave() from itone(). - - include 'wsprlf_params.f90' - parameter (NMAX=300*12000) - integer itone(NN) - integer*2 iwave(NMAX) - real*8 twopi,dt,dphi0,dphi1,dphi,phi - real dat(NMAX) - - twopi=8.d0*atan(1.d0) - dt=1.d0/12000.d0 - - dat=0. - if(snrdb.lt.90) then - do i=1,NMAX - dat(i)=gran() !Generate gaussian noise - enddo - bandwidth_ratio=2500.0/6000.0 - sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) - else - sig=1.0 - endif - - dphi0=twopi*(f0-0.25d0*baud)*dt - dphi1=twopi*(f0+0.25d0*baud)*dt - phi=0.d0 - k=nint(xdt/dt) - do j=1,NN - dphi=dphi0 - if(itone(j).eq.1) dphi=dphi1 - if(k.eq.0) phi=-dphi - do i=1,NSPS0 - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - if(k.gt.0 .and. k.le.NMAX) dat(k)=dat(k) + sig*sin(xphi) - enddo - enddo - fac=32767.0 - rms=100.0 - if(snrdb.ge.90.0) iwave=nint(fac*dat) - if(snrdb.lt.90.0) iwave=nint(rms*dat) - - return -end subroutine wspr5_wav diff --git a/lib/fsk4hf/wspr5d.f90 b/lib/fsk4hf/wspr5d.f90 deleted file mode 100644 index 8a3c800b8..000000000 --- a/lib/fsk4hf/wspr5d.f90 +++ /dev/null @@ -1,220 +0,0 @@ -program wspr5d - -! Decode WSPR-LF data read from *.c5 or *.wav files. - -! WSPR-LF is a potential WSPR-like mode intended for use at LF and MF. -! It uses an LDPC (300,60) code, OQPSK modulation, and 5 minute T/R sequences. - -! Reception and Demodulation algorithm: -! 1. Compute coarse spectrum; find fc1 = approx carrier freq -! 2. Mix from fc1 to 0; LPF at +/- 0.75*R -! 3. Square, FFT; find peaks near -R/2 and +R/2 to get fc2 -! 4. Mix from fc2 to 0 -! 5. Fit cb13 (central part of csync) to c -> lag, phase -! 6. Fit complex ploynomial for channel equalization -! 7. Get soft bits from equalized data - -! Still to do: find and decode more than one signal in the specified passband. - - include 'wsprlf_params.f90' - parameter (NMAX=300*12000) - character arg*8,message*22,cbits*50,infile*80,fname*16,datetime*11 - character*120 data_dir - complex csync(0:NZ-1) !Sync symbols only, from cbb - complex c(0:NZ-1) !Complex waveform - complex c1(0:NZ-1) !Complex waveform - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z - real*8 fMHz - real rxdata(ND),llr(ND) !Soft symbols - real pp(2*NSPS) !Shaped pulse for OQPSK - real a(5) !For twkfreq1 - real aa(20),bb(20) !Fitted polyco's - real fpks(20) - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - integer ierror(NS+ND) - integer isync(48) !Long sync vector - integer ib13(13) !Barker 13 code - integer ihdr(11) - integer*8 n8 - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 idat(7) - integer*1 decoded(KK),apmask(ND),cw(ND) - data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ - - nargs=iargc() - if(nargs.lt.2) then - print*,'Usage: wspr5d [-a ] [-f fMHz] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') -! maxn=4 !Default value - maxn=2 - twopi=8.0*atan(1.0) - fs=NSPS*12000.0/NSPS0 !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - ts=2*NSPS*dt !Duration of OQPSK symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - - do i=1,N2 !Half-sine pulse shape - pp(i)=sin(0.5*(i-1)*twopi/(2*NSPS)) - enddo - n8=z'cbf089223a51' - do i=1,48 - isync(i)=-1 - if(iand(n8,1).eq.1) isync(i)=1 - n8=n8/2 - enddo - -! Define array id() for sync symbols - id=0 - do j=1,48 !First group of 48 - id(2*j-1)=2*isync(j) - enddo - do j=1,13 !Barker 13 code - id(j+96)=2*ib13(j) - enddo - do j=1,48 !Second group of 48 - id(2*j+109)=2*isync(j) - enddo - - csync=0. - do j=1,205 - if(abs(id(j)).eq.2) then - ia=nint((j-0.5)*N2) - ib=ia+N2-1 - csync(ia:ib)=pp*id(j)/abs(id(j)) - endif - enddo - -write(*,*) 'iarg, nargs ',iarg,nargs - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c5') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call wspr5_downsample(iwave,c) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - fa=100.0 - fb=150.0 - call getfc1w(c,fs,fa,fb,fc1,xsnr) !First approx for freq - npeaks=20 - call getfc2w(c,csync,npeaks,fs,fc1,fpks) !Refined freq - - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,c) !Mix c down by fc1+fc2 -! Find time offset xdt - amax=0. - jpk=0 - iaa=0 - ibb=NZ-1 - jmax=1260 - do j=-jmax,jmax,NSPS/8 - ia=j - ib=NZ-1+j - if(ia.lt.0) then - ia=0 - iaa=-j - else - iaa=0 - endif - if(ib.gt.NZ-1) then - ib=NZ-1 - ibb=NZ-1-j - endif - z=sum(c(ia:ib)*conjg(csync(iaa:ibb))) - if(abs(z).gt.amax) then - amax=abs(z) - jpk=j - endif - enddo - xdt=jpk/fs -xdt=1.0 -jpk=fs*xdt - do i=0,NZ-1 - j=i+jpk - if(j.ge.0 .and. j.lt.NZ) c1(i)=c(j) - enddo - - nterms=maxn - do itry=1,npeaks - nhard0=0 - nhardsync0=0 - ifer=1 - a(1)=-fpks(itry) - a(2:5)=0. - call twkfreq1(c1,NZ,fs,a,c) !Mix c1 into c - call cpolyfitw(c,pp,id,maxn,aa,bb,zz,nhs) - call msksoftsymw(zz,aa,bb,id,nterms,ierror,rxdata,nhard0,nhardsync0) - if(nhardsync0.gt.35) cycle - rxav=sum(rxdata)/ND - rx2av=sum(rxdata*rxdata)/ND - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - ss=0.84 - llr=2.0*rxdata/(ss*ss) - apmask=0 - max_iterations=40 - ifer=0 - call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) - nhardmin=0 - if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin) - nbadcrc=0 - call chkcrc10(decoded,nbadcrc) - if(nbadcrc.ne.0) ifer=1 - if(ifer.eq.0) exit - enddo !Freq dither loop - message=' ' - if(ifer.eq.0) then - write(cbits,1100) decoded(1:50) -1100 format(50i1) - read(cbits,1102) idat -1102 format(6b8,b2) - idat(7)=ishft(idat(7),6) - call wqdecode(idat,message,itype) - nsnr=nint(xsnr) -! freq=fMHz + 1.d-6*(fc1+fc2) -! freq=fMHz + 1.d-6*(fc1+fpks(itry)) - freq=fc1+fpks(itry) - nfdot=0 - write(13,1110) datetime,0,nsnr,xdt,freq,message,nfdot -1110 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message,itry,nhardmin -!1112 format(a4,i4,f5.1,f11.6,i3,2x,a22,i4) -1112 format(a4,i4,f8.3,f8.3,i3,2x,a22,i4,i4) - endif - enddo ! ifile loop - write(*,1120) -1120 format("") - -999 end program wspr5d diff --git a/lib/fsk4hf/wspr5d_exp.f90 b/lib/fsk4hf/wspr5d_exp.f90 deleted file mode 100644 index b4f75c545..000000000 --- a/lib/fsk4hf/wspr5d_exp.f90 +++ /dev/null @@ -1,570 +0,0 @@ -program wspr5d - -! Decode WSPR-LF data read from *.c5 or *.wav files. - -! WSPR-LF is a potential WSPR-like mode intended for use at LF and MF. -! It uses an LDPC (300,60) code, OQPSK modulation, and 5 minute T/R sequences. -! -! Still to do: find and decode more than one signal in the specified passband. - -! include 'wsprlf_params.f90' - - parameter (NDOWN=30) - parameter (KK=60) - parameter (ND=300) - parameter (NS=109) - parameter (NR=3) - parameter (NN=NR+NS+ND) - parameter (NSPS0=8640) - parameter (NSPS=16) - parameter (N2=2*NSPS) - parameter (NZ=NSPS*NN) - parameter (NZ400=288*NN) - parameter (NMAX=300*12000) - - character arg*8,message*22,cbits*50,infile*80,fname*16,datetime*11 - character*120 data_dir - complex csync(0:NZ-1) !Sync symbols only, from cbb - complex c400(0:NZ400-1) !Complex waveform - complex c(0:NZ-1) !Complex waveform - complex cd(0:NZ-1) !Complex waveform - complex ca(0:NZ-1) !Complex waveform - complex zz,zzsum - complex cc(110) !Complex correlation coefficients - complex*8 cfac - real*8 fMHz - real rxdata(ND),llr(ND) !Soft symbols - real pp(32) !Shaped pulse for OQPSK - real sbits(412),softbits(9) - real fpks(20) - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - integer isync(48) !Long sync vector - integer ib13(13) !Barker 13 code - integer ihdr(11) - integer*8 n8 - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 idat(7) - integer*1 decoded(KK),apmask(ND),cw(ND) - integer*1 hbits(412),bits(13) - logical reset - data ib13/1,1,1,1,1,-1,-1,1,1,-1,1,-1,1/ - - nargs=iargc() - if(nargs.lt.2) then - print*,'Usage: wspr5d [-a ] [-f fMHz] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') - maxn=8 !Default value - twopi=8.0*atan(1.0) - fs=NSPS*12000.0/NSPS0 !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - ts=2*NSPS*dt !Duration of OQPSK symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - - do i=1,32 !Half-sine pulse shape - pp(i)=sin(0.5*(i-1)*twopi/(32)) - enddo - n8=z'cbf089223a51' - do i=1,48 - isync(i)=-1 - if(iand(n8,1).eq.1) isync(i)=1 - n8=n8/2 - enddo - -! Define array id() for sync symbols - id=0 - do j=1,48 !First group of 48 - id(2*j-1)=2*isync(j) - enddo - do j=1,13 !Barker 13 code - id(j+96)=2*ib13(j) - enddo - do j=1,48 !Second group of 48 - id(2*j+109)=2*isync(j) - enddo - - csync=0. - do j=1,205 - if(abs(id(j)).eq.2) then - ia=nint((j-0.5)*N2) - ib=ia+N2-1 - csync(ia:ib)=pp*id(j)/abs(id(j)) - endif - enddo - - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c5') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c400 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call wspr5_downsample(iwave,c400) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=100.0 - fb=150.0 - fs400=400.0 - call getfc1(c400,fs400,fa,fb,fc1,xsnr) !First approx for freq - npeaks=5 - call getfc2(c400,npeaks,fs400,fc1,fpks) !Refined freq -! do idf=1,npeaks ! consider the top npeak peaks - do idf=1,1 ! for genie-aided sync - fc1=125.0 ! genie provided - fc2=0.0 ! from the genie -! fc2=fpks(idf) - call downsample(c400,fc1+fc2,cd) - s2=sum(cd*conjg(cd))/(16*412) - cd=cd/sqrt(s2) - do is=0,0 ! dt search range is zeroed for genie-aided sync - idt=is/2 - if( mod(is,2).eq. 1 ) idt=-(is+1)/2 - xdt=real(22+idt)/22.222 - 1.0 - ca=cshift(cd,22+idt) - zzsum=0.0 - do iseq=1,4,3 - if(iseq.eq.4) then - k=1-2*3 - nseq=9 - istep=3*4 - else - k=1-2*iseq - nseq=iseq*3 - istep=iseq*4 - endif -icc=1 - do i=1,408,istep - j=(i+1)*16 - if(iseq.eq.4) then -! phase=-1.18596900 -! For now, average complex corr. coeffs over the entire frame to -! estimate phase - phase=atan2(imag(zzsum),real(zzsum)) - k=k+3*2 - call mskcohdet(nseq,ca(j),pp,id(k),softbits,phase) - else - k=k+iseq*2 - call mskseqdet(nseq,ca(j),pp,id(k),softbits,1,zz) - cc(icc)=zz -write(32,*) icc,real(cc(icc)),imag(cc(icc)) - icc=icc+1 - zzsum=zzsum+zz - endif - sbits(i+1)=softbits(1) - sbits(i+2)=softbits(2) - if( id(k+1) .ne. 0 ) sbits(i+2)=id(k+1)*25 - sbits(i+3)=softbits(3) - if( iseq .ge. 2 ) then - sbits(i+5)=softbits(4) - sbits(i+6)=softbits(5) - if( id(k+3) .ne. 0 ) sbits(i+6)=id(k+3)*25 - sbits(i+7)=softbits(6) - if( iseq .ge. 3 ) then - sbits(i+9)=softbits(7) - sbits(i+10)=softbits(8) - if( id(k+5) .ne. 0 ) sbits(i+10)=id(k+5)*25 - sbits(i+11)=softbits(9) - endif - endif - enddo - -cm=0.0 -do idel=-200,200 - df=idel*0.001 -! dpha=twopi*df*12.0*(16/22.0) - dpha=twopi*df*4.0*(16/22.0) - phase=0.0 - zzsum=0.0 - do i=1,102 - cfac=cmplx(cos(phase),sin(phase)) - zzsum=zzsum+cc(i)*cfac - phase=mod(phase+dpha,twopi) - enddo - if(abs(zzsum).gt.cm) then - cm=abs(zzsum) - dfbest=df - endif -! write(*,*) df,abs(zzsum) -enddo -write(*,*) 'dfbest ',dfbest -write(*,*) 'final estimated frequency is: ',fc1+fc2+dfbest - j=1 - do i=1,205 - if( abs(id(i)) .ne. 2 ) then - rxdata(j)=sbits(2*i-1) - j=j+1 - endif - enddo - do i=1,204 - rxdata(j)=sbits(2*i) - j=j+1 - enddo - rxav=sum(rxdata)/ND - rx2av=sum(rxdata*rxdata)/ND - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - sigma=1.20 - llr=2*rxdata/(sigma*sigma) - apmask=0 - max_iterations=40 - - ifer=0 - call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) -! niterations will be equal to the Hamming distance between hard received word and the codeword - nhardmin=0 - if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin) - if(nhardmin.gt.0) niterations=nhardmin - nbadcrc=0 - call chkcrc10(decoded,nbadcrc) - if(nbadcrc.ne.0) ifer=1 - - if( ifer.eq.0 ) then - write(cbits,1200) decoded(1:50) -1200 format(50i1) - read(cbits,1202) idat -1202 format(6b8,b2) - idat(7)=ishft(idat(7),6) - call wqdecode(idat,message,itype) - nsnr=nint(xsnr) -! freq=fMHz + 1.d-6*(fc1+fc2) - freq=fc1+fc2 - nfdot=0 - write(13,1210) datetime,0,nsnr,xdt,freq,message,nfdot -1210 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,is,iseq,niterations -!1212 format(a4,i4,f5.1,f11.6,i3,2x,a22,a1,i3,i3,i3,i4) -1212 format(a4,i4,f8.3,f8.3,i3,2x,a22,a1,i3,i3,i3,i3,i4) - goto 888 - endif - enddo !iseq - enddo - enddo -888 continue - enddo - - write(*,1120) -1120 format("") - -999 end program wspr5d - -subroutine getmetric(ib,ps,xmet) - real ps(0:511) - xm1=0 - xm0=0 - do i=0,511 - if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) xm1=ps(i) - if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) xm0=ps(i) - enddo - xmet=xm1-xm0 - return -end subroutine getmetric - -subroutine mskseqdet(ns,cdat,pp,bsync,softbits,ncoh,zz) -! -! Detect sequences of 3, 6, or 9 bits (ns). -! Sync bits are assumed to be known. -! -complex cdat(16*12),cbest(16*12),cideal(16*12) -complex cdf(16*12),cfac,zz -real cm(0:511),cmbest(0:511) -real pp(32),softbits(9) -integer bit(13),bestbits(13),sgn(13) -integer bsync(7) - -twopi=8.0*atan(1.0) -dt=30.0*18.0/12000.0 -cmax=0; -fbest=0.0; -np=2**ns-1 -idfmax=40 -if( ncoh .eq. 1 ) idfmax=0 -do idf=0,idfmax - if( mod(idf,2).eq.0 ) deltaf=idf/2*0.02 - if( mod(idf,2).eq.1 ) deltaf=-(idf+1)/2*0.02 - dphi=twopi*deltaf*dt - cfac=cmplx(cos(dphi),sin(dphi)) - cdf=1.0 - do i=2,16*(ns-1) - cdf(i)=cdf(i-1)*cfac - enddo - - cm=0 - ibflag=0 - do i=0,np - bit(1)=(bsync(1)+2)/4 - bit(2)=iand(i/(2**(ns-1)),1) - bit(3)=iand(i/(2**(ns-2)),1) - if( bsync(2).ne.0 ) then ! force the barker bits - bit(3)=(bsync(2)+2)/4 - endif - bit(4)=iand(i/(2**(ns-3)),1) - bit(5)=(bsync(3)+2)/4 - - if( ns .ge. 6 ) then - bit(6)=iand(i/(2**(ns-4)),1) - bit(7)=iand(i/(2**(ns-5)),1) - if( bsync(4).ne.0 ) then ! force the barker bits - bit(7)=(bsync(4)+2)/4 - endif - bit(8)=iand(i/(2**(ns-6)),1) - bit(9)=(bsync(5)+2)/4 - if( ns .eq. 9 ) then - bit(10)=iand(i/4,1) - bit(11)=iand(i/2,1) - if( bsync(6).ne.0 ) then ! force the barker bits - bit(11)=(bsync(6)+2)/4 - endif - bit(12)=iand(i/1,1) - bit(13)=(bsync(7)+2)/4 - endif - endif - - sgn=2*bit-1 - cideal(1:16) =cmplx(sgn(1)*pp(17:32),sgn(2)*pp(1:16)) - cideal(17:32) =cmplx(sgn(3)*pp(1:16),sgn(2)*pp(17:32)) - cideal(33:48) =cmplx(sgn(3)*pp(17:32),sgn(4)*pp(1:16)) - cideal(49:64) =cmplx(sgn(5)*pp(1:16),sgn(4)*pp(17:32)) - if( ns .ge. 6 ) then - cideal(65:80) =cmplx(sgn(5)*pp(17:32),sgn(6)*pp(1:16)) - cideal(81:96) =cmplx(sgn(7)*pp(1:16),sgn(6)*pp(17:32)) - cideal(97:112) =cmplx(sgn(7)*pp(17:32),sgn(8)*pp(1:16)) - cideal(113:128)=cmplx(sgn(9)*pp(1:16),sgn(8)*pp(17:32)) - if( ns .eq. 9 ) then - cideal(129:144) =cmplx(sgn(9)*pp(17:32),sgn(10)*pp(1:16)) - cideal(145:160) =cmplx(sgn(11)*pp(1:16),sgn(10)*pp(17:32)) - cideal(161:176) =cmplx(sgn(11)*pp(17:32),sgn(12)*pp(1:16)) - cideal(177:192)=cmplx(sgn(13)*pp(1:16),sgn(12)*pp(17:32)) - endif - endif - cideal=cideal*cdf - cm(i)=abs(sum(cdat(1:64*ns/3)*conjg(cideal(1:64*ns/3))))/1.e3 - if( cm(i) .gt. cmax ) then - ibflag=1 - cmax=cm(i) - bestbits=bit - cbest=cideal - fbest=deltaf - zz=sum(cdat(1:64*ns/3)*conjg(cbest(1:64*ns/3)))/1.e3 - endif - enddo - if( ibflag .eq. 1 ) then ! new best found - cmbest=cm - endif -enddo -softbits=0.0 -call getmetric(1,cmbest,softbits(ns)) -call getmetric(2,cmbest,softbits(ns-1)) -call getmetric(4,cmbest,softbits(ns-2)) -if( ns .ge. 6 ) then - call getmetric(8,cmbest,softbits(ns-3)) - call getmetric(16,cmbest,softbits(ns-4)) - call getmetric(32,cmbest,softbits(ns-5)) - if( ns .eq. 9 ) then - call getmetric(64,cmbest,softbits(3)) - call getmetric(128,cmbest,softbits(2)) - call getmetric(256,cmbest,softbits(1)) - endif -endif -end subroutine mskseqdet - -subroutine mskcohdet(ns,cdat,pp,bsync,softbits,phase) -! -! Coherent demodulate blocks of 9 bits (ns). -! - complex cdat(16*12),crot(16*12) - real pp(32),softbits(9) - - np=2**ns-1 - - softbits=0.0 - crot=cdat*cmplx(cos(phase),-sin(phase)) - softbits(1)=sum(imag(crot(1:32)*pp)) - softbits(2)=sum(real(crot(17:48)*pp)) - softbits(3)=sum(imag(crot(33:64)*pp)) - softbits(4)=sum(imag(crot(65:96)*pp)) - softbits(5)=sum(real(crot(81:112)*pp)) - softbits(6)=sum(imag(crot(97:128)*pp)) - softbits(7)=sum(imag(crot(129:160)*pp)) - softbits(8)=sum(real(crot(145:176)*pp)) - softbits(9)=sum(imag(crot(161:192)*pp)) - softbits=softbits/64. -end subroutine mskcohdet - -subroutine downsample(ci,f0,co) - parameter(NI=412*288,NO=NI/18) - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - - df=400.0/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - co=0.0 - co(0)=ct(i0) -! b=3.0 !optimized for sequence detection - b=6.0 - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i0+i)*filt - co(NO-i)=ct(i0-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample - -subroutine getfc1(c,fs,fa,fb,fc1,xsnr) - -! include 'wsprlf_params.f90' - parameter (NZ=288*412) - parameter (NSPS=288) - parameter (N2=2*NSPS) - parameter (NFFT1=16*NSPS) - parameter (NH1=NFFT1/2) - - complex c(0:NZ-1) !Complex waveform - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - nspec=NZ/N2 - df1=fs/NFFT1 - s=0. - do k=1,nspec - ia=(k-1)*N2 - ib=ia+N2-1 - c2(0:N2-1)=c(ia:ib) - c2(N2:)=0. - call four2a(c2,NFFT1,1,-1,1) - do i=0,NFFT1-1 - j=i - if(j.gt.NH1) j=j-NFFT1 - s(j)=s(j) + real(c2(i))**2 + aimag(c2(i))**2 - enddo - enddo -! call smo121(s,NFFT1) - smax=0. - ipk=0 - fc1=0. - ia=nint(fa/df1) - ib=nint(fb/df1) - do i=ia,ib - f=i*df1 - if(s(i).gt.smax) then - smax=s(i) - ipk=i - fc1=f - endif -! write(51,3001) f,s(i),db(s(i)) -! 3001 format(f10.3,e12.3,f10.3) - enddo - -! The following is for testing SNR calibration: - sp3n=(s(ipk-1)+s(ipk)+s(ipk+1)) !Sig + 3*noise - base=(sum(s)-sp3n)/(NFFT1-3.0) !Noise per bin - psig=sp3n-3*base !Sig only - pnoise=(2500.0/df1)*base !Noise in 2500 Hz - xsnr=db(psig/pnoise) - xsnr=xsnr+5.0 - return -end subroutine getfc1 - -subroutine getfc2(c,npeaks,fs,fc1,fpks) - -! include 'wsprlf_params.f90' - parameter (NZ=288*412) - parameter (NSPS=288) - parameter (N2=2*NSPS) - parameter (NFFT1=16*NSPS) - parameter (NH1=NFFT1/2) - - complex c(0:NZ-1) !Complex waveform - complex cs(0:NZ-1) !For computing spectrum - real a(5) - real freqs(413),sp2(413),fpks(npeaks) - integer pkloc(1) - - df=fs/NZ - baud=fs/NSPS - a(1)=-fc1 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,cs) !Mix down by fc1 - -! Filter, square, then FFT to get refined carrier frequency fc2. - call four2a(cs,NZ,1,-1,1) !To freq domain - - ia=nint(0.75*baud/df) - cs(ia:NZ-1-ia)=0. !Save only freqs around fc1 -! do i=1,NZ/2 -! filt=1/(1+((i*df)**2/(0.50*baud)**2)**8) -! cs(i)=cs(i)*filt -! cs(NZ+1-i)=cs(NZ+1-i)*filt -! enddo - call four2a(cs,NZ,1,1,1) !Back to time domain - cs=cs/NZ - cs=cs*cs !Square the data - call four2a(cs,NZ,1,-1,1) !Compute squared spectrum -! Find two peaks separated by baud - pmax=0. - fc2=0. -! ja=nint(0.3*baud/df) - ja=nint(0.5*baud/df) - k=1 - sp2=0.0 - do j=-ja,ja - f2=j*df - ia=nint((f2-0.5*baud)/df) - if(ia.lt.0) ia=ia+NZ - ib=nint((f2+0.5*baud)/df) - p=real(cs(ia))**2 + aimag(cs(ia))**2 + & - real(cs(ib))**2 + aimag(cs(ib))**2 - if(p.gt.pmax) then - pmax=p - fc2=0.5*f2 - endif - freqs(k)=0.5*f2 - sp2(k)=p - k=k+1 -! write(52,1200) f2,p,db(p) -!1200 format(f10.3,2f15.3) - enddo - - do i=1,npeaks - pkloc=maxloc(sp2) - ipk=pkloc(1) - fpks(i)=freqs(ipk) - ipk0=max(1,ipk-2) - ipk1=min(413,ipk+2) -! ipk0=ipk -! ipk1=ipk - sp2(ipk0:ipk1)=0.0 - enddo - return -end subroutine getfc2 diff --git a/lib/fsk4hf/wspr5sim.f90 b/lib/fsk4hf/wspr5sim.f90 deleted file mode 100644 index 5c2147b96..000000000 --- a/lib/fsk4hf/wspr5sim.f90 +++ /dev/null @@ -1,111 +0,0 @@ -program wspr5sim - -! Generate simulated data for a 5-minute "WSPR-LF" mode. Output is saved -! to a *.c5 or *.wav file. - - use wavhdr - include 'wsprlf_params.f90' !Set various constants - parameter (NMAX=300*12000) - type(hdr) h !Header for .wav file - character arg*12,fname*16 - character msg*22,msgsent*22 - complex c0(0:NZ-1) - complex c(0:NZ-1) - real*8 fMHz - integer itone(NN) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: wspr5sim "message" f0 DT fsp del nwav nfiles snr' - print*,'Example: wspr5sim "K1ABC FN42 30" 50 0.0 0.1 1.0 1 10 -33' - go to 999 - endif - call getarg(1,msg) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Freq relative to WSPR-band center (Hz) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nwav !1 for *.wav file, 0 for *.c5 file - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - twopi=8.0*atan(1.0) - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - ts=2*NSPS*dt !Duration of OQPSK symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS0/12000.0 - - call genwspr5(msg,msgsent,itone) !Encode the message, get itone - write(*,1000) f0,xdt,txt,snrdb,fspread,delay,nfiles,msgsent -1000 format('f0:',f9.3,' DT:',f6.2,' txt:',f6.1,' SNR:',f6.1, & - ' fspread:',f6.1,' delay:',f6.1,' nfiles:',i3,2x,a22) - - dphi0=twopi*(f0-0.25*baud)*dt - dphi1=twopi*(f0+0.25*baud)*dt - phi=0.0 - c0=0. - k=-1 + nint(xdt/dt) - do j=1,NN !Generate OQPSK waveform from itone - dphi=dphi0 - if(itone(j).eq.1) dphi=dphi1 - if(k.eq.0) phi=-dphi - do i=1,NSPS - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - if(k.ge.0 .and. k.lt.NZ) c0(k)=cmplx(cos(xphi),sin(xphi)) - enddo - enddo - - call sgran() - do ifile=1,nfiles - c=c0 - if(nwav.eq.0) then - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - call watterson(c,NZ,fs,delay,fspread) - endif - c=c*sig - if(snrdb.lt.90) then - do i=0,NZ-1 !Add gaussian noise at specified SNR - xnoise=gran() - ynoise=gran() - c(i)=c(i) + cmplx(xnoise,ynoise) - enddo - endif - write(fname,1100) ifile -1100 format('000000_',i4.4,'.c5') - open(10,file=fname,status='unknown',access='stream') - fMHz=10.1387d0 - nmin=5 - write(10) fname,nmin,fMHz,c !Save to *.c5 file - close(10) - else - call wspr5_wav(baud,xdt,f0,itone,snrdb,iwave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i4.4,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - endif - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a16) - enddo - -999 end program wspr5sim diff --git a/lib/fsk4hf/wspr_fsk8_downsample.f90 b/lib/fsk4hf/wspr_fsk8_downsample.f90 deleted file mode 100644 index 9750e0cbc..000000000 --- a/lib/fsk4hf/wspr_fsk8_downsample.f90 +++ /dev/null @@ -1,27 +0,0 @@ -subroutine wspr_fsk8_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 12000/24=500 Hz - - include 'wspr_fsk8_params.f90' - integer*2 iwave(NMAX) - complex c(0:NMAXD-1) - complex c1(0:NMAXD-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NMAXD/2 - c1(i)=cx(i0+i) - c1(NMAXD-i)=cx(i0-i) - enddo - c=c1/NMAXD - call four2a(c,NMAXD,1,1,1) !c2c FFT back to time domain - - return -end subroutine wspr_fsk8_downsample diff --git a/lib/fsk4hf/wspr_fsk8_params.f90 b/lib/fsk4hf/wspr_fsk8_params.f90 deleted file mode 100644 index c080f0296..000000000 --- a/lib/fsk4hf/wspr_fsk8_params.f90 +++ /dev/null @@ -1,14 +0,0 @@ -! LDPC (300,60) code -parameter (NDOWN=24) !Downsample factor -parameter (KK=60) !Information bits (50 + CRC10) -parameter (ND=100) !Data symbols -parameter (NS=14) !Sync symbols (2 @ Costas 7x7) -parameter (NN=NS+ND) !Total symbols (114) -parameter (NSPS0=24576) !Samples per symbol at 12000 S/s -parameter (NSPS=NSPS0/NDOWN) !Sam/sym, downsampled (1024) -parameter (N7=7*NSPS) !Samples in Costas 7x7 array (7168) -parameter (NZ=NSPS*NN) !Samples in downsampled waveform (116,736) -parameter (NMAX=240*12000) !Samples in iwave() -parameter (NMAXD=NMAX/24) !Samples in c(), after downsampling -parameter (NFFT1=4*NSPS,NH1=NFFT1/2) -parameter (NH2=NSPS/2) diff --git a/lib/fsk4hf/wspr_fsk8_sim.f90 b/lib/fsk4hf/wspr_fsk8_sim.f90 deleted file mode 100644 index 40d808a0b..000000000 --- a/lib/fsk4hf/wspr_fsk8_sim.f90 +++ /dev/null @@ -1,107 +0,0 @@ -program wspr_fsk8_sim - -! Generate simulated data for a 4-minute "WSPR-LF" mode using 8-FSK. -! Output is saved to a *.wav file. - - use wavhdr - include 'wspr_fsk8_params.f90' !Set various constants - type(hdr) h !Header for .wav file - character arg*12,fname*16 - character msg*22,msgsent*22 - complex c0(0:NZ-1) - complex c(0:NZ-1) - real*8 fMHz - integer itone(NN) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: wspr5sim "message" f0 DT fsp del nwav nfiles snr' - print*,'Example: wspr5sim "K1ABC FN42 30" 50 0.0 0.1 1.0 1 10 -33' - go to 999 - endif - call getarg(1,msg) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Freq relative to WSPR-band center (Hz) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nwav !1 for *.wav file, 0 for *.c4 file - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - twopi=8.0*atan(1.0) - fs=12000.0/NDOWN !Sample rate after downsampling - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of symbols (s) - baud=1.0/tt !Keying rate - bw=8*baud - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS0/12000.0 - - call genwspr_fsk8(msg,msgsent,itone) !Encode the message, get itone - write(*,1000) f0,xdt,txt,snrdb,bw,msgsent -1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, & - ' BW:',f4.1,2x,a22) - - - phi=0.0 - c0=0. - k=-1 + nint(xdt/dt) - do j=1,NN !Generate OQPSK waveform from itone - dphi=twopi*(f0+itone(j)*baud)*dt - if(k.eq.0) phi=-dphi - do i=1,NSPS - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - if(k.ge.0 .and. k.lt.NZ) c0(k)=cmplx(cos(xphi),sin(xphi)) - enddo - enddo - - call sgran() - do ifile=1,nfiles - if(nwav.eq.0) then - c=c0 - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - call watterson(c,NZ,fs,delay,fspread) - endif - c=c*sig - if( snrdb.lt.90) then - do i=0,NZ-1 - xnoise=gran() - ynoise=gran() - c(i)=c(i)+cmplx(xnoise,ynoise) - enddo - endif - write(fname,1100) ifile -1100 format('000000_',i4.4,'.c4') - open(10,file=fname,status='unknown',access='stream') - fMHz=1.866d0 - nmin=4 - write(10) fname,nmin,fMHz,c - else - call wspr_fsk8_wav(baud,xdt,f0,itone,snrdb,iwave) - h=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i4.4,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) h,iwave !Save to *.wav file - close(10) - endif - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a16) - enddo - -999 end program wspr_fsk8_sim diff --git a/lib/fsk4hf/wspr_fsk8_wav.f90 b/lib/fsk4hf/wspr_fsk8_wav.f90 deleted file mode 100644 index 3b0a0ff38..000000000 --- a/lib/fsk4hf/wspr_fsk8_wav.f90 +++ /dev/null @@ -1,44 +0,0 @@ -subroutine wspr_fsk8_wav(baud,xdt,f0,itone,snrdb,iwave) - -! Generate iwave() from itone(). - - include 'wspr_fsk8_params.f90' - integer itone(NN) - integer*2 iwave(NMAX) - real*8 twopi,dt,dphi,phi - real dat(NMAX) - - twopi=8.d0*atan(1.d0) - dt=1.d0/12000.d0 - - dat=0. - if(snrdb.lt.90) then - do i=1,NMAX - dat(i)=gran() !Generate gaussian noise, rms = 1.0 - enddo - bandwidth_ratio=2500.0/6000.0 - sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) - else - sig=1.0 - endif - - phi=0.d0 - k=nint((xdt+1.0)/dt) - do j=1,NN - dphi=twopi*(f0+ itone(j)*baud)*dt - if(k.eq.0) phi=-dphi - do i=1,NSPS0 - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - if(k.gt.0 .and. k.le.NMAX) dat(k)=dat(k) + sig*sin(xphi) - enddo - enddo - fac=32767.0 - rms=100.0 - if(snrdb.ge.90.0) iwave=nint(fac*dat) - if(snrdb.lt.90.0) iwave=nint(rms*dat) - - return -end subroutine wspr_fsk8_wav diff --git a/lib/fsk4hf/wspr_fsk8d.f90 b/lib/fsk4hf/wspr_fsk8d.f90 deleted file mode 100644 index 1f69c4402..000000000 --- a/lib/fsk4hf/wspr_fsk8d.f90 +++ /dev/null @@ -1,197 +0,0 @@ -program wspr_fsk8d - -! WSPR-LF is a potential WSPR-like mode intended for use at LF and MF. -! This version uses 4-minute T/R sequences, an LDPC (300,60) code, -! 8-FSK modulation, and noncoherent demodulation. This decoder reads -! data from *.wav files. - -! Reception and Demodulation algorithm: -! 1. Compute coarse spectrum; find fc1 = approx carrier freq -! 2. Mix from fc1 to 0; LPF at +/- 0.75*R -! 3. Find two 7x7 Costas arrays to get xdt and fc2 -! 4. Mix from fc2 to 0, compute aligned symbol spectra -! 5. Get soft bits from symbol spectra - -! Still to do: find and decode more than one signal in the specified passband. - - include 'wspr_fsk8_params.f90' - character arg*8,message*22,cbits*50,infile*80,fname*16,datetime*11 - character*120 data_dir - complex csync(0:N7-1) !Sync symbols for Costas 7x7 array - complex c1(0:2*N7-1) - complex c2(0:2*N7-1) - complex c(0:NMAXD-1) !Complex waveform - real*8 fMHz - real rxdata(3*ND),llr(3*ND) !Soft symbols - real a(5) !For twkfreq1 - real s(0:NH2,NN) - real savg(0:NH2) - real ss(0:N7) - real ss0(0:N7) - real ps(0:7) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1 idat(7) - integer*1 decoded(KK),apmask(3*ND),cw(3*ND) - integer icos7(0:6) - data icos7/2,5,6,0,4,1,3/ !Costas 7x7 tone pattern - - nargs=iargc() - if(nargs.lt.7) then - print*,'Usage: wspr_fsk8d -d db -f fMHz -a data_dir file1 [file2 ...]' - go to 999 - endif - call getarg(1,arg) - if(arg(1:3).ne.'-d ') go to 999 - call getarg(2,arg) - read(arg,*) degrade - rxbw=3000. - - call getarg(3,arg) - if(arg(1:3).ne.'-f ') go to 999 - call getarg(4,arg) - read(arg,*) fMHz - - call getarg(5,arg) - if(arg(1:3).ne.'-a ') go to 999 - call getarg(6,data_dir) - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') - - twopi=8.0*atan(1.0) - fs=NSPS*12000.0/NSPS0 !Sample rate after downsampling (Hz) - dt=1.0/fs !Sample interval (s) - ts=NSPS*dt !Symbol duration (s) - baud=1.0/ts !Keying rate (Hz) - txt=NZ*dt !Transmission length (s) - - phi=0. - k=-1 - do j=0,6 - dphi=twopi*baud*icos7(j)*dt - do i=1,NSPS - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - k=k+1 - csync(k)=cmplx(cos(phi),sin(phi)) - enddo - enddo - - do ifile=7,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c4') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c(0:NZ-1) - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - if(degrade.gt.0.0) call degrade_snr(iwave,NMAX,degrade,rxbw) - call wspr_fsk8_downsample(iwave,c) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - pmax=0. - df1=fs/(2*N7) - ia=nint(100.0/df1) - ib=nint(150.0/df1) - ipk=0 - jpk=0 -! Get xdt and f0 from the sync arrays - do j0=0,1000,50 - j0b=j0+107*NSPS - c1(0:N7-1)=c(j0:j0+N7-1)*conjg(csync) - c1(N7:)=0. - c2(0:N7-1)=c(j0b:j0b+N7-1)*conjg(csync) - c2(N7:)=0. - call four2a(c1,2*N7,1,-1,1) - call four2a(c2,2*N7,1,-1,1) - do i=0,N7 - p=1.e-9*(real(c1(i))**2 + aimag(c1(i))**2 + & - real(c2(i))**2 + aimag(c2(i))**2) - ss(i)=p - enddo - do i=ia,ib - p=ss(i) - if(p.gt.pmax) then - pmax=p - ipk=i - jpk=j0 - endif - enddo - if(jpk.eq.j0) ss0=ss - enddo - f0=ipk*df1 - xdt=jpk*dt - 1.0 - - sp3n=(ss0(ipk-1)+ss0(ipk)+ss0(ipk+1)) !Sig + 3*noise - call pctile(ss0,N7,45,base) - psig=sp3n-3*base !Sig only - pnoise=(2500.0/df1)*base !Noise in 2500 Hz - xsnr=db(psig/pnoise) !SNR from sync tones - - if(jpk.ge.0) c(0:NMAXD-1-jpk)=c(jpk:NMAXD-1) - - a(1)=-f0 - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,c) !Mix from f0 down to 0 - call spec8(c,s,savg) !Get symbol spectra - - do j=1,ND - k=j+7 - ps=s(0:7,k) - ps=sqrt(ps) !### ??? ### -! ps=log(ps) - r1=max(ps(1),ps(3),ps(5),ps(7))-max(ps(0),ps(2),ps(4),ps(6)) - r2=max(ps(2),ps(3),ps(6),ps(7))-max(ps(0),ps(1),ps(4),ps(5)) - r4=max(ps(4),ps(5),ps(6),ps(7))-max(ps(0),ps(1),ps(2),ps(3)) - rxdata(3*j-2)=r4 - rxdata(3*j-1)=r2 - rxdata(3*j)=r1 - enddo - - rxav=sum(rxdata)/ND - rx2av=sum(rxdata*rxdata)/ND - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - s0=1.1 - llr=2.0*rxdata/(s0*s0) - apmask=0 - max_iterations=40 - ifer=0 - call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) - if(niterations.lt.0) call osd300(llr,apmask,5,decoded,cw,nhardmin,dmin) - if(nhardmin.ge.0) niterations=nhardmin - nbadcrc=0 - if(niterations.ge.0) call chkcrc10(decoded,nbadcrc) - if(niterations.lt.0 .or. nbadcrc.ne.0) ifer=1 - nsnr=nint(xsnr) -! freq=fMHz + 1.d-6*f0 - freq=1.d-6*(f0+1500) - nfdot=0 - message=' ' - if(ifer.eq.0) then - write(cbits,1100) decoded(1:50) -1100 format(50i1) - read(cbits,1102) idat -1102 format(6b8,b2) - idat(7)=ishft(idat(7),6) - call wqdecode(idat,message,itype) - write(*,1112) datetime(8:11),nsnr,xdt,freq,nfdot,message -1112 format(a4,i4,f5.1,f11.6,i3,2x,a22) - endif - write(13,1110) datetime,0,nsnr,xdt,freq,message,nfdot -1110 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - enddo ! ifile loop - write(*,1120) -1120 format("") - -999 end program wspr_fsk8d - diff --git a/lib/fsk4hf/wspr_params.f90 b/lib/fsk4hf/wspr_params.f90 deleted file mode 100644 index 18feaea2f..000000000 --- a/lib/fsk4hf/wspr_params.f90 +++ /dev/null @@ -1,23 +0,0 @@ - parameter (NN=162) - parameter (NSPS0=8192) !Samples per symbol at 12000 S/s - parameter (NDOWN=32) - parameter (NSPS=NSPS0/NDOWN) - parameter (NZ=NSPS*NN) !Samples in waveform at 12000 S/s - parameter (NZ0=NSPS0*NN) !Samples in waveform at 375 S/s - parameter (NMAX=120*12000) !Samples in waveform at 375 S/s - -! Define the sync vector: - integer*1 sync(162) - data sync/ & - 1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0, & - 0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1, & - 0,0,0,0,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,1, & - 1,0,1,0,0,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1, & - 0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,0,0,0,1,0, & - 0,0,0,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0,1,1, & - 0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,1, & - 0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,0, & - 0,0/ - - - diff --git a/lib/fsk4hf/wspr_wav.f90 b/lib/fsk4hf/wspr_wav.f90 deleted file mode 100644 index 188242bbc..000000000 --- a/lib/fsk4hf/wspr_wav.f90 +++ /dev/null @@ -1,49 +0,0 @@ -subroutine wspr_wav(baud,xdt,h,f0,itone,snrdb,iwave) - -! Generate iwave() from itone(). - - include 'wspr_params.f90' - integer itone(NN) - integer*2 iwave(NMAX) - real*8 twopi,dt,dphi0,dphi1,dphi,phi - real dat(NMAX) - - twopi=8.d0*atan(1.d0) - dt=1.d0/12000.d0 - baud=375.0/256.0 - - dat=0. - if(snrdb.lt.90) then - do i=1,NMAX - dat(i)=gran() !Generate gaussian noise - enddo - bandwidth_ratio=2500.0/6000.0 - sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) - else - sig=1.0 - endif - - phi=0.d0 - k=nint(xdt/dt) - do j=1,NN - dphi=twopi*(f0+h*(itone(j)-1.5)*baud)*dt - do i=1,NSPS0 - k=k+1 - phi=mod(phi+dphi,twopi) - if(k.gt.0 .and. k.le.NMAX) dat(k)=dat(k) + sig*sin(phi) - enddo - enddo - - rms=100.0 - if(snrdb.lt.90.0) then - dat=rms*dat; - if(maxval(abs(dat)).gt.32767.0) print*,"Warning - data will be clipped." - else - datpk=maxval(abs(dat)) - fac=32767.9/datpk - dat=fac*dat - endif - iwave=nint(dat) - - return -end subroutine wspr_wav diff --git a/lib/fsk4hf/wsprcpm_params.f90 b/lib/fsk4hf/wsprcpm_params.f90 deleted file mode 100644 index b09ed86e7..000000000 --- a/lib/fsk4hf/wsprcpm_params.f90 +++ /dev/null @@ -1,14 +0,0 @@ -parameter (KK=64) !Information bits (50 + CRC14) ? -parameter (ND=200) !Data symbols: LDPC (204,68), r=1/3, don't send last 4 bits -parameter (NS=16) !Sync symbols (16) -parameter (NN=NS+ND) !Total symbols (216) - -parameter (NSPS0=6400) !Samples per symbol at 12000 S/s - -parameter (NDOWN=32) !Downsample to 200 sa/symbol (375 Hz) for candidate selection -parameter (NSPS=NSPS0/NDOWN) !Samples per symbol -parameter (NZ=NSPS*NN) !Samples in baseband waveform - -parameter (NZ0=NSPS0*NN) !Samples in waveform at 12000 S/s -parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - diff --git a/lib/fsk4hf/wsprcpm_wav.f90 b/lib/fsk4hf/wsprcpm_wav.f90 deleted file mode 100644 index 28665245c..000000000 --- a/lib/fsk4hf/wsprcpm_wav.f90 +++ /dev/null @@ -1,44 +0,0 @@ -subroutine wsprcpm_wav(baud,xdt,h,f0,itone,snrdb,iwave) - -! Generate iwave() from itone(). - - include 'wsprcpm_params.f90' - parameter (NMAX=120*12000) - integer itone(NN) - integer*2 iwave(NMAX) - real*8 twopi,dt,dphi0,dphi1,dphi,phi - real dat(NMAX) - - twopi=8.d0*atan(1.d0) - dt=1.d0/12000.d0 - - dat=0. - if(snrdb.lt.90) then - do i=1,NMAX - dat(i)=gran() !Generate gaussian noise - enddo - bandwidth_ratio=2500.0/6000.0 - sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) - else - sig=1.0 - endif - - phi=0.d0 - k=nint(xdt/dt) - do j=1,NN - dphi=twopi*(f0+itone(j)*(h/2.0d0)*baud)*dt - do i=1,NSPS0 - k=k+1 - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - if(k.gt.0 .and. k.le.NMAX) dat(k)=dat(k) + sig*sin(xphi) - enddo - enddo - fac=32767.0 - rms=100.0 - if(snrdb.ge.90.0) iwave=nint(fac*dat) - if(snrdb.lt.90.0) iwave=nint(rms*dat) - - return -end subroutine wsprcpm_wav diff --git a/lib/fsk4hf/wsprcpmd.f90 b/lib/fsk4hf/wsprcpmd.f90 deleted file mode 100644 index 455b53f41..000000000 --- a/lib/fsk4hf/wsprcpmd.f90 +++ /dev/null @@ -1,586 +0,0 @@ -program wsprcpmd - -! Decode WSPRCPM data read from *.c2 or *.wav files. - -! WSPRCPM is a WSPR-like mode based on full-response CPM. -! -! Currently configured to use (204,68) r=1/3 LDPC code, regular column weight 3. -! 50 data bits + 14 bit CRC + 4 "0" bits. The 4 "0" bits are unused bits that -! are not transmitted. At the decoder, these bits are treated as "AP" bits. -! This shortens the code to (200,64) r=0.32, slightly decreasing the code rate. -! -! Frame format is: -! d100 p32 d100 (232) channel symbols -! - use crc - include 'wsprcpm_params.f90' - parameter(NMAX=120*12000) - character arg*8,message*22,cbits*50,infile*80,fname*16,datetime*11 - character ch1*1,ch4*4,cseq*31 - character*22 decodes(100) - character*120 data_dir - character*32 uwbits - character*68 dmsg - complex c2(0:120*12000/32-1) !Complex waveform - complex cframe(0:216*200-1) !Complex waveform - complex cd(0:216*10-1) !Complex waveform - complex c1(0:9,0:1),c0(0:9,0:1) - complex ccor(0:1,216) - complex cp(0:1,0:1) - complex csum,cterm - real*8 fMHz - real rxdata(ND),llr(204) !Soft symbols - real sbits(216),sbits1(216),sbits3(216) - real ps(0:8191),psbest(0:8191) - real candidates(100,2) - integer iuniqueword0 - integer isync(200) !Unique word - integer isync2(216) -! integer ipreamble(16) !Preamble vector - integer isyncword(16) - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1,target :: idat(9) - integer*1 decoded(68),apmask(204),cw(204) - integer*1 hbits(216),hbits1(216),hbits3(216) -! data ipreamble/1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1/ - data isyncword/0,1,3,2,1,0,2,3,2,3,1,0,3,2,0,1/ - data cseq /'9D9F C48B 797A DD60 58CB 2EBC 6'/ - data iuniqueword0/z'30C9E8AD'/ - - k=0 - do i=1,31 - ch1=cseq(i:i) - if(ch1.eq.' ') cycle - read(ch1,'(z1)') n - write(ch4,'(b4.4)') n - do j=1,4 - k=k+1 - isync(k)=0 - if(ch4(j:j).eq.'1') isync(k)=1 - enddo - enddo - isync(101:200)=isync(1:100) - - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - h=0.50 !h=0.8 seems to be optimum for AWGN sensitivity (not for fading) - twopi=8.0*atan(1.0) - pi=4.0*atan(1.0) - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: wsprcpmd [-a ] [-f fMHz] [-c ncoh] [-h h] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - ncoh=1 - if(arg(1:2).eq.'-h') then - call getarg(iarg+1,arg) - read(arg,*) h - iarg=iarg+2 - endif - - isync2(1:100)=isync(1:100) - isync2(101:116)=(/0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1/) - isync2(117:216)=isync(101:200) - -! data MSB -! data sync tone -! 0 0 0 -! 0 1 1 -! 1 0 2 -! 1 1 3 - - dphi=twopi*baud*(h/2.0)*dt*20 ! dt*10 is samp interval after downsample - do j=0,1 - if(j.eq.0) then - dphi0=-3*dphi - dphi1=+1*dphi - else - dphi0=-1*dphi - dphi1=+3*dphi - endif - phi0=0.0 - phi1=0.0 - do i=0,9 - c1(i,j)=cmplx(cos(phi1),sin(phi1)) - c0(i,j)=cmplx(cos(phi0),sin(phi0)) - phi1=mod(phi1+dphi1,twopi) - phi0=mod(phi0+dphi0,twopi) - enddo - cp(1,j)=cmplx(cos(phi1),sin(phi1)) - cp(0,j)=cmplx(cos(phi0),sin(phi0)) - enddo - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') - - xs1=0.0 - xs2=0.0 - fr1=0.0 - fr2=0.0 - nav=0 - ngood=0 - - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c2') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c2 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call wsprcpm_downsample(iwave,c2) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=-100.0 - fb=100.0 - fs=12000.0/32.0 - npts=120*12000.0/32.0 - nsync=16 - call getcandidate2(c2,npts,fs,fa,fb,ncand,candidates) !First approx for freq - ndecodes=0 - do icand=1,ncand - fc0=candidates(icand,1) - xsnr=candidates(icand,2) - xmax=-1e32 - do i=-7,7 - ft=fc0+i*0.2 - call noncoherent_frame_sync(c2,h,ft,isync2,is,xf1) - if(xf1.gt.xmax) then - xmax=xf1 - fc1=ft - is0=is - endif - enddo - fcest=fc1 - imode=0 ! refine freq - call coherent_sync(c2,h,isyncword,nsync,NSPS,is0,fcest,imode,xp0) - imode=1 ! refine istart - istart=is0 - call coherent_sync(c2,h,isyncword,nsync,NSPS,istart,fcest,imode,xp1) - write(*,'(i5,i5,i5,6(f11.5,2x))') ifile-2,is0,istart,fc0,fc1,fcest,xf1,xp0,xp1 - -!genie sync -!istart=375 -!fcest=0.0 - do ijitter=0,4 - io=-10*(ijitter/2+1) - if(mod(ijitter,2).eq.0) io=10*(ijitter/2) - ib=max(0,istart+io) - cframe=c2(ib:ib+216*200-1) - call downsample2(cframe,fcest,h,cd) - - s2=sum(cd*conjg(cd))/(10*216) - cd=cd/sqrt(s2) - - do nseq=1,5 - if( nseq.eq.1 ) then ! noncoherent single-symbol detection - sbits1=0.0 - do ibit=1,216 - j=isync2(ibit) - ib=(ibit-1)*10 - ccor(1,ibit)=sum(cd(ib:ib+9)*conjg(c1(0:9,j))) - ccor(0,ibit)=sum(cd(ib:ib+9)*conjg(c0(0:9,j))) - sbits1(ibit)=abs(ccor(1,ibit))-abs(ccor(0,ibit)) - hbits1(ibit)=0 - if(sbits1(ibit).gt.0) hbits1(ibit)=1 - enddo - sbits=sbits1 - hbits=hbits1 - sbits3=sbits1 - hbits3=hbits1 - elseif( nseq.ge.2 ) then - ps=0 - if( nseq.eq. 2 ) nbit=3 - if( nseq.eq. 3 ) nbit=5 - if( nseq.eq. 4 ) nbit=7 - if( nseq.eq. 5 ) nbit=9 - if( nseq.eq. 6 ) nbit=11 - if( nseq.eq. 7 ) nbit=13 - numseq=2**(nbit) - do ibit=nbit/2+1,216-nbit/2 - ps=0.0 - pmax=0.0 - do iseq=0,numseq-1 - csum=0.0 - cterm=1.0 - k=1 - do i=nbit-1,0,-1 - j=isync2(ibit-(nbit/2+1)+k) - ibb=iand(iseq/(2**i),1) - csum=csum+ccor(ibb,ibit-(nbit/2+1)+k)*cterm - cterm=cterm*conjg(cp(ibb,j)) - k=k+1 - enddo - ps(iseq)=abs(csum) - if( ps(iseq) .gt. pmax ) then - pmax=ps(iseq) - ibflag=1 - endif - enddo - if( ibflag .eq. 1 ) then - psbest=ps - ibflag=0 - endif - call getmetric2(2**(nbit/2),psbest,numseq,sbits3(ibit)) - hbits3(ibit)=0 - if(sbits3(ibit).gt.0) hbits3(ibit)=1 - enddo - sbits=sbits3 - hbits=hbits3 - endif - - rxdata(1:100)=sbits(1:100) - rxdata(101:200)=sbits(117:216); - rxav=sum(rxdata(1:200))/200.0 - rx2av=sum(rxdata(1:200)*rxdata(1:200))/200.0 - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - sigma=0.90 - llr(201:204)=-5.0 - llr(1:200)=2*rxdata/(sigma*sigma) - apmask=0 - apmask(201:204)=1 - max_iterations=40 - ifer=0 - call bpdecode204(llr,apmask,max_iterations,decoded,cw,nharderror,niterations) - nhardmin=-1 - if(nharderror.lt.0) call osd204(llr,apmask,4,decoded,cw,nhardmin,dmin) - if(sum(decoded).eq.0) cycle - if(nhardmin.ge.0 .or. nharderror.ge.0) then - idat=0 - write(dmsg,'(68i1)') decoded - read(dmsg(1:50),'(6b8.8,b2.2)') idat(1:7) - idat(7)=idat(7)*64 - read(dmsg(51:64),'(b14.14)') ndec_crc - ncalc_crc=iand(crc14(c_loc(idat),9),z'FFFF') - nbadcrc=1 - if(ncalc_crc .eq. ndec_crc) nbadcrc=0 - else - cycle - endif - if( nbadcrc.eq.0 ) then - write(cbits,1200) decoded(1:50) -1200 format(50i1) - read(cbits,1202) idat -1202 format(8b8,b4) - idat(7)=ishft(idat(7),6) - call wqdecode(idat,message,itype) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(idupe.eq.1) goto 888 - ndecodes=ndecodes+1 - decodes(ndecodes)=message - nsnr=nint(xsnr) - freq=fMHz + 1.d-6*(fc1+fbest) - nfdot=0 - write(13,1210) datetime,0,nsnr,xdt,freq,message,nfdot -1210 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',nseq,ijitter,nharderror,nhardmin -1212 format(a4,i4,f5.1,f11.6,i3,2x,a22,a1,i5,i5,i5,i5) - goto 888 - endif - enddo ! nseq - enddo !jitter -888 continue - enddo !candidate list - enddo !files - - write(*,1120) -1120 format("") - -999 end program wsprcpmd - - -subroutine coherent_sync(c2,h,isyncword,nsync,nsps,istart,fc,imode,xmax) -! imode=0: refine fc using given istart -! imode=1: refine istart using given fc - complex c2(0:120*12000/32-1) - complex csync(0:16*200-1) - complex ctmp1(0:4*16*200-1) - complex ctwkp(0:16*200-1) - complex ccohp(0:15) - integer isyncword(nsync) - logical first/.true./ - save dt,first,twopi,csync - - if(first) then - baud=12000.0/6400.0 - dt=32.0/12000.0 - twopi=8.0*atan(1.0) - k=0 - phi=0.0 - dphi=twopi*baud*0.5*h*dt - do i=1,16 - dp=dphi*2*(isyncword(i)-1.5) - do j=1,200 - csync(k)=cmplx(cos(phi),sin(phi)) - phi=mod(phi+dp,twopi) - k=k+1 - enddo - enddo - first=.false. - endif - dphi=twopi*fc*dt - ctwkp=cmplx(0.0,0.0) - phi=0 - do i=0,nsync*nsps-1 - ctwkp(i)=csync(i)*cmplx(cos(phi),sin(phi)) - phi=mod(phi+dphi,twopi) - enddo - ipstart=istart+100*200 - ctmp1=0.0 - xmax=0.0 - if(imode.eq.1) then !refine DT with given fc - do iii=-50,50,5 - ctmp1(0:16*200-1)=c2(ipstart+iii:ipstart+iii+16*200-1)*conjg(ctwkp) - xnorm=sqrt(sum(abs(ctmp1(0:16*200-1))**2))*sqrt(16.0*200.0) - xc=abs(sum(ctmp1))/xnorm - if(xc.gt.xmax) then - iiibest=iii - xmax=xc - endif - enddo - istart=istart+iiibest - return - endif -! else refine fc with given DT - ctmp1(0:16*200-1)=c2(ipstart:ipstart+16*200-1)*conjg(ctwkp) - xnorm=sqrt(sum(abs(ctmp1(0:16*200-1))**2))*sqrt(16.0*200.0) - ctmp1=ctmp1/xnorm - call four2a(ctmp1,4*16*200,1,-1,1) !c2c FFT to freq domain - xmax=0.0 - ctmp1=cshift(ctmp1,-200) - dfp=1/(4*6400.0/12000.0*16) -! do i=150,250 - do i=190,210 - xa=abs(ctmp1(i)) -!write(51,*) (i-200)*dfp,xa - if(xa.gt.xmax) then - ishift=i - xmax=xa - endif - enddo - delta=(ishift-200)*dfp - xm1=abs(ctmp1(ishift-1)) - x0=abs(ctmp1(ishift)) - xp1=abs(ctmp1(ishift+1)) - xint=(log(xm1)-log(xp1))/(log(xm1)+log(xp1)-2*log(x0)) - delta2=delta+xint*dfp/2.0 - fc=fc+delta2 - return -end subroutine coherent_sync - -subroutine noncoherent_frame_sync(c2,h,fc,isync2,istart,ssmax) - complex c2(0:120*12000/32-1) - complex ct0(0:199),ct1(0:199),ct2(0:199),ct3(0:199) - integer isync2(216) - - twopi=8.0*atan(1.0) - dt=32.0/12000.0 - baud=12000.0/6400.0 - imax=370 ! defines dt search range (375 samples/s) - ssmax=-1e32 - izero=375 - do it = -imax,imax,5 -! noncoherent wspr-type dt estimation - dp0=twopi*(fc-1.5*h*baud)*dt - dp1=twopi*(fc-0.5*h*baud)*dt - dp2=twopi*(fc+0.5*h*baud)*dt - dp3=twopi*(fc+1.5*h*baud)*dt - th0=0.0 - th1=0.0 - th2=0.0 - th3=0.0 - do i=0,199 - ct0(i)=cmplx(cos(th0),sin(th0)) - ct1(i)=cmplx(cos(th1),sin(th1)) - ct2(i)=cmplx(cos(th2),sin(th2)) - ct3(i)=cmplx(cos(th3),sin(th3)) - th0=mod(th0+dp0,twopi) - th1=mod(th1+dp1,twopi) - th2=mod(th2+dp2,twopi) - th3=mod(th3+dp3,twopi) - enddo - xs=0.0 - xn=0.0 - do is=1,216 - i0=izero+it+(is-1)*200 - p0=abs(sum(c2(i0:i0+199)*conjg(ct0))) - p1=abs(sum(c2(i0:i0+199)*conjg(ct1))) - p2=abs(sum(c2(i0:i0+199)*conjg(ct2))) - p3=abs(sum(c2(i0:i0+199)*conjg(ct3))) - p0=p0**2 - p1=p1**2 - p2=p2**2 - p3=p3**2 - if(isync2(is).eq.0) then -! xs=xs+(p0+p2)/2.0 - xs=xs+max(p0,p2) - xn=xn+(p1+p3)/2.0 - elseif(isync2(is).eq.1) then -! xs=xs+(p1+p3)/2.0 - xs=xs+max(p1,p3) - xn=xn+(p0+p2)/2.0 - endif - enddo - sy=xs/xn -!write(41,*) it,sy - if(sy.gt.ssmax) then - ioffset=it - ssmax=sy - endif - enddo - istart=izero+ioffset - return -end subroutine noncoherent_frame_sync - -subroutine getmetric2(ib,ps,ns,xmet) - real ps(0:ns-1) - xm1=0 - xm0=0 - do i=0,ns-1 - if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) xm1=ps(i) - if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) xm0=ps(i) - enddo - xmet=xm1-xm0 - return -end subroutine getmetric2 - -subroutine downsample2(ci,f0,h,co) - parameter(NI=216*200,NH=NI/2,NO=NI/20) ! downsample from 200 samples per symbol to 10 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - fs=12000.0/32.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - b=max(1.0,h)*8.0 - do i=1,NO/2 - arg=(i*df/b)**2 - filt=exp(-arg) - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine downsample2 - -subroutine getcandidate2(c,npts,fs,fa,fb,ncand,candidates) - parameter(NDAT=200,NFFT1=120*12000/32,NH1=NFFT1/2,NFFT2=120*12000/320,NH2=NFFT2/2) - complex c(0:npts-1) !Complex waveform - complex cc(0:NFFT1-1) - complex csfil(0:NFFT2-1) - complex cwork(0:NFFT2-1) - real bigspec(0:NFFT2-1) - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - real ss(-NH1+1:NH1) !Smoothed coarse spectrum - real candidates(100,2) - integer indx(NFFT2-1) - logical first - data first/.true./ - save first,w,df,csfil - - if(first) then - df=10*fs/NFFT1 - csfil=cmplx(0.0,0.0) - do i=0,NFFT2-1 - csfil(i)=exp(-((i-NH2)/32.0)**2) ! revisit this - enddo - csfil=cshift(csfil,NH2) - call four2a(csfil,NFFT2,1,-1,1) - first=.false. - endif - - cc=cmplx(0.0,0.0) - cc(0:npts-1)=c; - call four2a(cc,NFFT1,1,-1,1) - cc=abs(cc)**2 - call four2a(cc,NFFT1,1,-1,1) - cwork(0:NH2)=cc(0:NH2)*conjg(csfil(0:NH2)) - cwork(NH2+1:NFFT2-1)=cc(NFFT1-NH2+1:NFFT1-1)*conjg(csfil(NH2+1:NFFT2-1)) - - call four2a(cwork,NFFT2,1,+1,1) - bigspec=cshift(real(cwork),-NH2) - il=NH2+fa/df - ih=NH2+fb/df - nnl=ih-il+1 - call indexx(bigspec(il:il+nnl-1),nnl,indx) - xn=bigspec(il-1+indx(nint(0.3*nnl))) - bigspec=bigspec/xn - ncand=0 - do i=il,ih - if((bigspec(i).gt.bigspec(i-1)).and. & - (bigspec(i).gt.bigspec(i+1)).and. & - (bigspec(i).gt.1.12).and.ncand.lt.100) then - ncand=ncand+1 - candidates(ncand,1)=df*(i-NH2) - candidates(ncand,2)=10*log10(bigspec(i)-1)-26.0 - endif - enddo - return -end subroutine getcandidate2 - -subroutine wsprcpm_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 400 Hz - - include 'wsprcpm_params.f90' - parameter (NMAX=120*12000,NFFT2=NMAX/32) - integer*2 iwave(NMAX) - complex c(0:NMAX/32-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/32-1) - return -end subroutine wsprcpm_downsample - diff --git a/lib/fsk4hf/wsprcpmsim.f90 b/lib/fsk4hf/wsprcpmsim.f90 deleted file mode 100644 index 42f40ed30..000000000 --- a/lib/fsk4hf/wsprcpmsim.f90 +++ /dev/null @@ -1,107 +0,0 @@ -program wsprcpmsim - -! Generate simulated data for a 2-minute "WSPR-LF" mode. Output is saved -! to a *.c2 or *.wav file. - - use wavhdr - include 'wsprcpm_params.f90' !Set various constants - parameter (NMAX=120*12000) - type(hdr) hwav !Header for .wav file - character arg*12,fname*16 - character msg*22,msgsent*22 - complex c0(0:NMAX/NDOWN-1) - complex c(0:NMAX/NDOWN-1) - real*8 fMHz - integer itone(NN) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.9) then - print*,'Usage: wsprcpmsim "message" f0 DT fsp del nwav nfiles snr h' - print*,'Example: wsprcpmsim "K1ABC FN42 30" 50 1.0 0.1 1.0 1 10 -32 1.0' - go to 999 - endif - call getarg(1,msg) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Freq relative to WSPR-band center (Hz) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nwav !1 for *.wav file, 0 for *.c2 file - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - call getarg(9,arg) - read(arg,*) h !h - - twopi=8.0*atan(1.0) - fs=12000.0/NDOWN ! - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS0/12000.0 - - call genwsprcpm(msg,msgsent,itone) !Encode the message, get itone - write(*,1000) f0,xdt,txt,snrdb,fspread,delay,nfiles,msgsent -1000 format('f0:',f9.3,' DT:',f6.2,' txt:',f6.1,' SNR:',f6.1, & - ' fspread:',f6.1,' delay:',f6.1,' nfiles:',i3,2x,a22) - - c0=0. - k=-1 + nint(xdt/dt) - do j=1,NN -write(*,*) j,itone(j) - dp=twopi*(f0+itone(j)*(h/2.0)*baud)*dt - do i=1,NSPS - k=k+1 - phi=mod(phi+dp,twopi) - if(k.ge.0 .and. k.lt.NMAX/NDOWN) c0(k)=cmplx(cos(phi),sin(phi)) - enddo - enddo - call sgran() - do ifile=1,nfiles - c=c0 - if(nwav.eq.0) then - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - ntot=NMAX/NDOWN - nsig=NN*NSPS - call watterson(c,ntot,nsig,fs,delay,fspread) - endif - c=c*sig - if(snrdb.lt.90) then - do i=0,NMAX/NDOWN-1 !Add gaussian noise at specified SNR - xnoise=gran() - ynoise=gran() - c(i)=c(i) + cmplx(xnoise,ynoise) - enddo - endif - write(fname,1100) ifile -1100 format('000000_',i4.4,'.c2') - open(10,file=fname,status='unknown',access='stream') - fMHz=10.1387d0 - nmin=2 - write(10) fname,nmin,fMHz,c !Save to *.c2 file - close(10) - else - call wsprcpm_wav(baud,xdt,h,f0,itone,snrdb,iwave) - hwav=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i4.4,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) hwav,iwave !Save to *.wav file - close(10) - endif - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a16) - enddo - -999 end program wsprcpmsim diff --git a/lib/fsk4hf/wsprdpsk_params.f90 b/lib/fsk4hf/wsprdpsk_params.f90 deleted file mode 100644 index 8c473cf20..000000000 --- a/lib/fsk4hf/wsprdpsk_params.f90 +++ /dev/null @@ -1,14 +0,0 @@ -parameter (KK=64) !Information bits (50 + CRC14) ? -parameter (ND=200) !Data symbols: LDPC (204,68), r=1/3, don't send last 4 bits -parameter (NS=32) !Sync symbols (32) -parameter (NN=NS+ND) !Total symbols (232) - -parameter (NSPS0=6000) !Samples per symbol at 12000 S/s - -parameter (NDOWN=30) !Downsample to 200 sa/symbol (400 Hz) for candidate selection -parameter (NSPS=NSPS0/NDOWN) !Samples per symbol (200) -parameter (NZ=NSPS*NN) !Samples in baseband waveform - -parameter (NZ0=NSPS0*NN) !Samples in waveform at 12000 S/s -parameter (NFFT1=4*NSPS,NH1=NFFT1/2) - diff --git a/lib/fsk4hf/wsprdpskd.f90 b/lib/fsk4hf/wsprdpskd.f90 deleted file mode 100644 index 223e2e4fc..000000000 --- a/lib/fsk4hf/wsprdpskd.f90 +++ /dev/null @@ -1,439 +0,0 @@ -program wsprdpskd - -! Decode WSPRDPSK data read from *.c2 or *.wav files. - -! Currently configured to use (204,68) r=1/3 LDPC code, regular column weight 3. -! 50 data bits + 14 bit CRC + 4 "0" bits. The 4 "0" bits are unused bits that -! are not transmitted. At the decoder, these bits are treated as "AP" bits. -! This shortens the code to (200,64) r=0.32, slightly decreasing the code rate. -! Frame format is: -! d100 p32 d100 (232) channel symbols -! - use crc - include 'wsprdpsk_params.f90' - parameter(NMAX=120*12000) - character arg*8,message*22,cbits*50,infile*80,fname*16,datetime*11 - character*22 decodes(100) - character*120 data_dir - character*32 uwbits - character*68 dmsg - complex c2(0:120*12000/30-1) !Complex waveform - complex cframe(0:232*200-1) !Complex waveform - complex cd(0:240*10-1) !Complex waveform - complex cs(0:240) - complex c1(0:9,0:1),c0(0:9,0:1) - complex ccor(0:1,232) - complex csum,cterm - real*8 fMHz - real rxdata(ND),llr(204) !Soft symbols - real sbits(232),sbits1(232),sbits3(232) - real ps(0:8191),psbest(0:8191) - real candidates(100,2) - integer iuniqueword0 - integer isync(200) !Unique word - integer isync2(232) - integer ipreamble(16) !Preamble vector - integer ihdr(11) - integer*2 iwave(NMAX) !Generated full-length waveform - integer*1,target :: idat(9) - integer*1 decoded(68),apmask(204),cw(204) - integer*1 hbits(232),hbits1(232),hbits3(232) - integer*1 b(14),bbest(14) - data ipreamble/1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1/ - data iuniqueword0/z'30C9E8AD'/ - - write(uwbits,'(b32.32)') iuniqueword0 - read(uwbits,'(32i1)') isync(1:32) - read(uwbits,'(32i1)') isync(33:64) - read(uwbits,'(32i1)') isync(65:96) - read(uwbits,'(32i1)') isync(97:128) - read(uwbits,'(32i1)') isync(129:160) - read(uwbits,'(32i1)') isync(161:192) - read(uwbits,'(8i1)') isync(193:200) - - fs=12000.0/NDOWN !Sample rate - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - h=1.00 !h=0.8 seems to be optimum for AWGN sensitivity (not for fading) - twopi=8.0*atan(1.0) - - isync2(1:100)=isync(1:100) - isync2(101:104)=0 ! This is *not* backwards. - isync2(105:112)=1 - isync2(113:116)=0 - isync2(117:216)=isync(101:200) - - dphi=twopi*baud*(h/2.0)*dt*20 ! dt*20 is samp interval after downsample - do j=0,1 - if(j.eq.0) then - dphi0=-3*dphi - dphi1=+1*dphi - else - dphi0=-1*dphi - dphi1=+3*dphi - endif - phi0=0.0 - phi1=0.0 - do i=0,9 - c1(i,j)=cmplx(cos(phi1),sin(phi1)) - c0(i,j)=cmplx(cos(phi0),sin(phi0)) - phi1=mod(phi1+dphi1,twopi) - phi0=mod(phi0+dphi0,twopi) - enddo - enddo - - nargs=iargc() - if(nargs.lt.1) then - print*,'Usage: wsprdpskd [-a ] [-f fMHz] [-c ncoh] file1 [file2 ...]' - go to 999 - endif - iarg=1 - data_dir="." - call getarg(iarg,arg) - if(arg(1:2).eq.'-a') then - call getarg(iarg+1,data_dir) - iarg=iarg+2 - endif - call getarg(iarg,arg) - if(arg(1:2).eq.'-f') then - call getarg(iarg+1,arg) - read(arg,*) fMHz - iarg=iarg+2 - endif - ncoh=1 - npdi=16 - if(arg(1:2).eq.'-c') then - call getarg(iarg+1,arg) - read(arg,*) ncoh - iarg=iarg+2 - npdi=16/ncoh - endif -! write(*,*) 'ncoh: ',ncoh,' npdi: ',npdi - - open(13,file=trim(data_dir)//'/ALL_WSPR.TXT',status='unknown', & - position='append') - - xs1=0.0 - xs2=0.0 - fr1=0.0 - fr2=0.0 - nav=0 - ngood=0 - - do ifile=iarg,nargs - call getarg(ifile,infile) - open(10,file=infile,status='old',access='stream') - j1=index(infile,'.c2') - j2=index(infile,'.wav') - if(j1.gt.0) then - read(10,end=999) fname,ntrmin,fMHz,c2 - read(fname(8:11),*) nutc - write(datetime,'(i11)') nutc - else if(j2.gt.0) then - read(10,end=999) ihdr,iwave - read(infile(j2-4:j2-1),*) nutc - datetime=infile(j2-11:j2-1) - call wsprdpsk_downsample(iwave,c2) - else - print*,'Wrong file format?' - go to 999 - endif - close(10) - - fa=-10.0 - fb=10.0 - fs=12000.0/30.0 - npts=120*12000.0/30.0 -! call getcandidate2(c2,npts,fs,fa,fb,ncand,candidates) !First approx for freq - ncand=1 - candidates(1,1)=0.0 - candidates(1,2)=-28 - ndecodes=0 - do icand=1,ncand - fc0=candidates(icand,1) - xsnr=candidates(icand,2) - call dsdpsk(c2,fc0,cd) - i0=40 - do i=0,231 - cs(i)=cd(i0+10*i)/5e4 - enddo -! 2-bit differential detection - do i=1,231 -! do i=1,232 - sbits(i)=-real(cs(i)*conjg(cs(i-1))) !2 symbol dpsk -! sbits(i)=real(cs(i-1)) !for coherent dpsk -! sbits(i)=real(cs(i)) !for coherent bpsk - enddo -! do i=1,231 -! sbits3(i)=-sbits(i+1)*sbits(i) ! for coherent dpsk -! enddo - -! detect a differentially encoded block of symbols using the -! Divsalar and Simon approach, except that we estimate only -! the central symbol of the block and then step the block forward -! by one symbol. -! - sbits3=sbits -!goto 100 - nbit=13 ! number of decoded bits to be derived from nbit+1 symbols - numseq=2**nbit - il=(nbit+1)/2 - ih=231-nbit/2 - do isym=il,ih - rmax=-1e32 - b=0 - do iseq=0,numseq-1 - do i=1,nbit - b(i)=merge(1,0,iand(iseq,2**(nbit-i))>0) - enddo - b(1:nbit)=2*b(1:nbit)-1 - i1=isym-(nbit+1)/2 - csum=cs(i1) - do i=1,nbit - bb=1 - do m=1,i - bb=bb*b(m) - enddo - csum=csum+bb*cs(i1+i) - enddo -! ps(iseq)=abs(csum)**2 - ps(iseq)=abs(csum) - if(ps(iseq).gt.rmax) then - bbest=b - rmax=ps(iseq) - endif - enddo - if(isym.eq.il) then - do i=1,isym-1 - call getmetric(2**(nbit-i),ps,numseq,xmet) - sbits3(i)=-xmet - enddo - endif - call getmetric(2**((nbit-1)/2),ps,numseq,xmet) - sbits3(isym)=-xmet - if(isym.eq.ih) then - do i=ih+1,231 - call getmetric(2**(231-i),ps,numseq,xmet) - sbits3(i)=-xmet - enddo - endif - enddo -100 continue - rxdata(1:100)=sbits3(1:100) - rxdata(101:200)=sbits3(132:231); - rxav=sum(rxdata(1:200))/200.0 - rx2av=sum(rxdata(1:200)*rxdata(1:200))/200.0 - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - sigma=0.90 - llr(201:204)=-5.0 - llr(1:200)=2*rxdata/(sigma*sigma) - apmask=0 - apmask(201:204)=1 - max_iterations=40 - ifer=0 - call bpdecode204(llr,apmask,max_iterations,decoded,cw,nharderror,niterations) - nhardmin=-1 - if(nharderror.lt.0) call osd204(llr,apmask,5,decoded,cw,nhardmin,dmin) - if(sum(decoded).eq.0) cycle - if(nhardmin.ge.0 .or. nharderror.ge.0) then - idat=0 - write(dmsg,'(68i1)') decoded - read(dmsg(1:50),'(6b8.8,b2.2)') idat(1:7) - idat(7)=idat(7)*64 - read(dmsg(51:64),'(b14.14)') ndec_crc - ncalc_crc=iand(crc14(c_loc(idat),9),z'FFFF') - nbadcrc=1 - if(ncalc_crc .eq. ndec_crc) nbadcrc=0 - else - cycle - endif - if( nbadcrc.eq.0 ) then - write(cbits,1200) decoded(1:50) -1200 format(50i1) - read(cbits,1202) idat -1202 format(8b8,b4) - idat(7)=ishft(idat(7),6) - call wqdecode(idat,message,itype) - idupe=0 - do i=1,ndecodes - if(decodes(i).eq.message) idupe=1 - enddo - if(idupe.eq.1) goto 888 - ndecodes=ndecodes+1 - decodes(ndecodes)=message - nsnr=nint(xsnr) - freq=fMHz + 1.d-6*(fc1+fbest) - nfdot=0 - write(13,1210) datetime,0,nsnr,xdt,freq,message,nfdot -1210 format(a11,2i4,f6.2,f12.7,2x,a22,i3) - write(*,1212) datetime(8:11),nsnr,xdt,freq,nfdot,message,'*',idf,nseq,ijitter,nharderror,nhardmin -1212 format(a4,i4,f5.1,f11.6,i3,2x,a22,a1,i5,i5,i5,i5,i5) - goto 888 - endif -888 continue - enddo !candidate list - enddo !files - - write(*,1120) -1120 format("") - -999 end program wsprdpskd - -subroutine getmetric(ib,ps,ns,xmet) - real ps(0:ns-1) - xm1=-1e32 - xm0=-1e32 - do i=0,ns-1 - if( iand(i/ib,1) .eq. 1 .and. ps(i) .gt. xm1 ) then - xm1=ps(i) - endif - if( iand(i/ib,1) .eq. 0 .and. ps(i) .gt. xm0 ) then - xm0=ps(i) - endif - enddo - xmet=xm1-xm0 - return -end subroutine getmetric - -subroutine getmetric3(ib,ps,ns,xmet) - real ps(0:ns-1) - xm1=0 - xm0=0 - do i=0,ns-1 - if( iand(i/ib,1) .eq. 1 ) then - xm1=xm1+ps(i) - endif - if( iand(i/ib,1) .eq. 0 ) then - xm0=xm0+ps(i) - endif - enddo - xmet=xm1-xm0 - return -end subroutine getmetric3 - -subroutine dsdpsk(ci,f0,co) - parameter(NI=240*200,NH=NI/2,NO=NI/20) ! downsample from 200 samples per symbol to 10 - complex ci(0:NI-1),ct(0:NI-1) - complex co(0:NO-1) - - pi=4.0*atan(1.0) - fs=12000.0/30.0 - df=fs/NI - ct=ci - call four2a(ct,NI,1,-1,1) !c2c FFT to freq domain - i0=nint(f0/df) - ct=cshift(ct,i0) - co=0.0 - co(0)=ct(0) - - dt=20/fs - beta=1.0 - tt=10*dt - baud=1/tt - bw=(1+beta)*baud/2.0 - bf=(1-beta)*baud/2.0 - iw=bw/df - if=bf/df - co=0.0 - co(0)=ct(0) - do i=1,iw - filt=((1.0+cos(pi*(i-if)/(iw-if)))/2.0)**0.5 - co(i)=ct(i)*filt - co(NO-i)=ct(NI-i)*filt - enddo - co=co/NO - call four2a(co,NO,1,1,1) !c2c FFT back to time domain - return -end subroutine dsdpsk - -subroutine getcandidate2(c,npts,fs,fa,fb,ncand,candidates) - parameter(NDAT=200,NFFT1=120*12000/30,NH1=NFFT1/2,NFFT2=120*12000/300,NH2=NFFT2/2) - complex c(0:npts-1) !Complex waveform - complex cc(0:NFFT1-1) - complex csfil(0:NFFT2-1) - complex cwork(0:NFFT2-1) - real bigspec(0:NFFT2-1) - complex c2(0:NFFT1-1) !Short spectra - real s(-NH1+1:NH1) !Coarse spectrum - real ss(-NH1+1:NH1) !Smoothed coarse spectrum - real candidates(100,2) - integer indx(NFFT2-1) - logical first - data first/.true./ - save first,w,df,csfil - - if(first) then - df=10*fs/NFFT1 - csfil=cmplx(0.0,0.0) - do i=0,NFFT2-1 - csfil(i)=exp(-((i-NH2)/20.0)**2) - enddo - csfil=cshift(csfil,NH2) - call four2a(csfil,NFFT2,1,-1,1) - first=.false. - endif - - cc=cmplx(0.0,0.0) - cc(0:npts-1)=c; - call four2a(cc,NFFT1,1,-1,1) - cc=abs(cc)**2 - call four2a(cc,NFFT1,1,-1,1) - cwork(0:NH2)=cc(0:NH2)*conjg(csfil(0:NH2)) - cwork(NH2+1:NFFT2-1)=cc(NFFT1-NH2+1:NFFT1-1)*conjg(csfil(NH2+1:NFFT2-1)) - - call four2a(cwork,NFFT2,1,+1,1) - bigspec=cshift(real(cwork),-NH2) - il=NH2+fa/df - ih=NH2+fb/df - nnl=ih-il+1 - call indexx(bigspec(il:il+nnl-1),nnl,indx) - xn=bigspec(il-1+indx(nint(0.3*nnl))) - bigspec=bigspec/xn - ncand=0 - do i=il,ih - if((bigspec(i).gt.bigspec(i-1)).and. & - (bigspec(i).gt.bigspec(i+1)).and. & - (bigspec(i).gt.1.15).and.ncand.lt.100) then - ncand=ncand+1 - candidates(ncand,1)=df*(i-NH2) - candidates(ncand,2)=10*log10(bigspec(i))-30.0 - endif - enddo -! do i=1,ncand -! write(*,*) i,candidates(i,1),candidates(i,2) -! enddo - return -end subroutine getcandidate2 - -subroutine wsprdpsk_downsample(iwave,c) - -! Input: i*2 data in iwave() at sample rate 12000 Hz -! Output: Complex data in c(), sampled at 400 Hz - - include 'wsprdpsk_params.f90' - parameter (NMAX=120*12000,NFFT2=NMAX/30) - integer*2 iwave(NMAX) - complex c(0:NMAX/30-1) - complex c1(0:NFFT2-1) - complex cx(0:NMAX/2) - real x(NMAX) - equivalence (x,cx) - - df=12000.0/NMAX - x=iwave - call four2a(x,NMAX,1,-1,0) !r2c FFT to freq domain - i0=nint(1500.0/df) - c1(0)=cx(i0) - do i=1,NFFT2/2 - c1(i)=cx(i0+i) - c1(NFFT2-i)=cx(i0-i) - enddo - c1=c1/NFFT2 - call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain - c=c1(0:NMAX/30-1) - return -end subroutine wsprdpsk_downsample - diff --git a/lib/fsk4hf/wsprdpsksim.f90 b/lib/fsk4hf/wsprdpsksim.f90 deleted file mode 100644 index fa5e34e4d..000000000 --- a/lib/fsk4hf/wsprdpsksim.f90 +++ /dev/null @@ -1,175 +0,0 @@ -program wsprdpsksim - -! Generate simulated data for a 2-minute "WSPR-DPSK" mode. Output is saved -! to a *.c2 or *.wav file. - - use wavhdr - include 'wsprdpsk_params.f90' !Set various constants - parameter (NMAX=120*12000) - type(hdr) hwav !Header for .wav file - character arg*12,fname*16 - character msg*22,msgsent*22 - complex c0(0:NMAX/NDOWN-1) - complex c(0:NMAX/NDOWN-1) - complex c0wav(0:NMAX-1) - complex cwav(0:NMAX-1) - real*8 fMHz - integer imessage(NN) - integer*2 iwave(NMAX) !Generated full-length waveform - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: wsprdpsksim "message" f0 DT fsp del nwav nfiles snr' - print*,'Example: wsprdpsksim "K1ABC FN42 30" 50 0.0 0.1 1.0 1 10 -33' - go to 999 - endif - call getarg(1,msg) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Freq relative to WSPR-band center (Hz) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nwav !1 for *.wav file, 0 for *.c2 file - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - twopi=8.0*atan(1.0) - pi=twopi/2.0 - fs=12000.0/NDOWN - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS0/12000.0 - - call genwsprdpsk(msg,msgsent,imessage) !Encode the message, get itone - imessage=2*imessage-1 - write(*,1000) f0,xdt,txt,snrdb,fspread,delay,nfiles,msgsent -1000 format('f0:',f9.3,' DT:',f6.2,' txt:',f6.1,' SNR:',f6.1, & - ' fspread:',f6.1,' delay:',f6.1,' nfiles:',i3,2x,a22) - - - beta=1.0 ! excess bandwidth - if(nwav.eq.0) then - df=fs/(NMAX/NDOWN) ! - c=0 - bw=(1+beta)*baud/2.0 - bf=(1-beta)*baud/2.0 - iw=bw/df - if=bf/df - c(0:if-1)=1.0 - if(iw.gt.if) then - do i=if,iw - c(i)=((1.0+cos(pi*(i-if)/(iw-if)))/2.0)**0.5 - enddo - endif - c(NMAX/NDOWN-1:NMAX/NDOWN-iw:-1)=c(1:iw) - - istart=xdt/dt - c0=0.0 - do i=1,NN - c0(istart+(i-1)*200)=imessage(i) - enddo - call four2a(c0,NMAX/NDOWN,1,1,1) - c0=c0*conjg(c) - ic=f0/df - c0=cshift(c0,ic) - call four2a(c0,NMAX/NDOWN,1,-1,1) - xx=sum(abs(c0(istart:istart+NN*200-1)**2))/(NN*200) - c0=c0/sqrt(xx) - - call sgran() - do ifile=1,nfiles - c=c0 - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - call watterson(c,NMAX/NDOWN,fs,delay,fspread) - endif - c=c*sig - if(snrdb.lt.90) then - do i=0,NMAX/NDOWN-1 !Add gaussian noise at specified SNR - xnoise=gran() - ynoise=gran() - c(i)=c(i) + cmplx(xnoise,ynoise) - enddo - endif -snrtest=sum(abs(c(istart:istart+NN*200-1)**2))/(NN*200)/2.0-1.0 -write(*,*) 'sample SNR: ',10*log10(snrtest)+10*log10(0.4/2.5) - write(fname,1100) ifile -1100 format('000000_',i4.4,'.c2') - open(10,file=fname,status='unknown',access='stream') - fMHz=10.1387d0 - nmin=2 - write(10) fname,nmin,fMHz,c !Save to *.c2 file - close(10) - enddo - else - fs=12000.0 - df=fs/NMAX - dt=1/fs - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - cwav=0 - bw=(1+beta)*baud/2.0 - bf=(1-beta)*baud/2.0 - iw=bw/df - if=bf/df - cwav(0:if-1)=1.0 - if(iw.gt.if) then - do i=if,iw - cwav(i)=((1.0+cos(pi*(i-if)/(iw-if)))/2.0)**0.5 - enddo - endif - cwav(NMAX-1:NMAX-iw:-1)=cwav(1:iw) - - istart=xdt/dt - c0wav=0.0 - do i=1,NN - c0wav(istart+(i-1)*200*NDOWN)=imessage(i) - enddo - call four2a(c0wav,NMAX,1,1,1) - c0wav=c0wav*conjg(cwav) - ic=f0/df - c0wav=cshift(c0wav,-ic) - call four2a(c0wav,NMAX,1,-1,1) - xx=sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN) - c0wav=c0wav/sqrt(xx) -write(*,*) 'Peak power: ',maxval(abs(c0wav)**2) -write(*,*) 'Average power: ',sum(abs(c0wav(istart:istart+NN*200*NDOWN-1))**2)/(NN*200*NDOWN) - call sgran() - do ifile=1,nfiles - cwav=c0wav - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - call watterson(cwav,NMAX,fs,delay,fspread) - endif - cwav=cwav*sig - if(snrdb.lt.90) then - do i=1,NMAX !Add gaussian noise at specified SNR - xnoise=gran() - iwave(i)=100*(real(cwav(i-1)) + xnoise) - enddo - endif -snrtest=sum(real(iwave(istart:istart+NN*200*NDOWN-1)**2)/(NN*200*NDOWN))/100.0**2-1 -write(*,*) 'sample SNR: ',10*log10(snrtest)+10*log10(6.0/2.5) - hwav=default_header(12000,NMAX) - write(fname,1102) ifile -1102 format('000000_',i4.4,'.wav') - open(10,file=fname,status='unknown',access='stream') - write(10) hwav,iwave !Save to *.wav file - close(10) - enddo - endif - write(*,1110) ifile,xdt,f0,snrdb,fname -1110 format(i4,f7.2,f8.2,f7.1,2x,a16) - -999 end program wsprdpsksim diff --git a/lib/fsk4hf/wsprlf.f90 b/lib/fsk4hf/wsprlf.f90 deleted file mode 100644 index efc3e8463..000000000 --- a/lib/fsk4hf/wsprlf.f90 +++ /dev/null @@ -1,110 +0,0 @@ -program wsprlf - - parameter (NN=121) !Total symbols - parameter (NSPS=28800) !Samples per symbol @ fs=12000 Hz - parameter (NZ=NSPS*NN) !Samples in waveform - - character*8 arg - complex c(0:NZ-1) - real*8 twopi,fs,f0,dt,phi,dphi - real x(0:NZ-1) - real p(0:NZ/2) - real h0(0:NSPS/2) !Pulse shape, rising edge - real h1(0:NSPS/2) !Pulse shape, trailing edge - real tmp(NN) - integer id(NN) !Generated data - integer ie(NN) !Differentially encoded data - data fs/12000.d0/ - - nargs=iargc() - if(nargs.ne.3) then - print*,'Usage: wsprlf f0 t1 snr' - goto 999 - endif - call getarg(1,arg) - read(arg,*) f0 - call getarg(2,arg) - read(arg,*) t1 - call getarg(3,arg) - read(arg,*) snrdb - - call random_number(tmp) !Generate random bipolar data - id=1 - where(tmp.lt.0.5) id=-1 - ie(1)=1 - do i=2,NN !Differentially encode - ie(i)=id(i)*ie(i-1) - enddo - - n1=nint(t1*NSPS) - twopi=8.d0*atan(1.d0) - - do i=0,2*n1-1 !Define the shape functions - if(i.le.n1-1) then - h0(i)=0.5*(1.0-cos(0.5*i*twopi/n1)) - else - h1(i-n1)=0.5*(1.0-cos(0.5*i*twopi/n1)) - endif - enddo - if(t1.eq.0.0) h0=1 - if(t1.eq.0.0) h1=1 - -! Shape the channel pulses - x=1. - x(0:n1-1)=h0(0:n1-1) !Leading edge of 1st pulse - do j=2,NN !Leading edges - if(ie(j).ne.ie(j-1)) then - ia=(j-1)*NSPS + 1 - ib=ia+n1-1 - x(ia:ib)=h0(0:n1-1) - endif - enddo - do j=1,NN-1 !Trailing edges - if(ie(j+1).ne.ie(j)) then - ib=j*NSPS - ia=ib-n1+1 - x(ia:ib)=h1(0:n1-1) - endif - enddo - ib=NN*NSPS-1 - ia=ib-n1+1 - x(ia:ib)=h1(0:n1-1) !Trailing edge of last pulse - - dt=1.d0/fs - ts=dt*NSPS - baud=fs/NSPS - write(*,1000) baud,ts -1000 format('Baud:',f6.3,' Tsym:',f6.3) - - dphi=twopi*f0*dt - phi=0.d0 - i=-1 - do j=1,NN !Generate the baseband waveform - a=ie(j) - do k=1,NSPS - i=i+1 - x(i)=a*x(i) - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - c(i)=x(i)*cmplx(cos(xphi),sin(xphi)) - sym=i*dt/ts - if(j.le.20) write(13,1010) sym,x(i),c(i) -1010 format(4f12.6) - enddo - enddo - - call four2a(c,NZ,1,-1,1) !To freq domain - df=fs/NZ - nh=NZ/2 - do i=0,nh - f=i*df - p(i)=real(c(i))**2 + aimag(c(i))**2 - enddo - p=p/maxval(p) - do i=0,nh !Save spectrum for plotting - write(14,1020) i*df,p(i),10.0*log10(p(i)+1.e-8) -1020 format(f10.3,2e12.3) - enddo - -999 end program wsprlf diff --git a/lib/fsk4hf/wsprlf_params.f90 b/lib/fsk4hf/wsprlf_params.f90 deleted file mode 100644 index d0c3f5c7c..000000000 --- a/lib/fsk4hf/wsprlf_params.f90 +++ /dev/null @@ -1,14 +0,0 @@ -!parameter (NDOWN=540) !Downsample factor (default 540) -parameter (NDOWN=30) !Downsample factor (default 540) -parameter (KK=60) !Information bits (50 + CRC10) -parameter (ND=300) !Data symbols: LDPC (300,60), r=1/5 -parameter (NS=109) !Sync symbols (2 x 48 + Barker 13) -parameter (NR=3) !Ramp up/down -parameter (NN=NR+NS+ND) !Total symbols (412) -parameter (NSPS0=8640) !Samples per symbol at 12000 S/s -parameter (NSPS=NSPS0/NDOWN) !Samples per MSK symbol (16) -parameter (N2=2*NSPS) !Samples per OQPSK symbol (32) -parameter (N13=13*N2) !Samples in central sync vector (416) -parameter (NZ=NSPS*NN) !Samples in baseband waveform (6592) -parameter (NZMAX=NSPS0*NN) -parameter (NFFT1=4*NSPS,NH1=NFFT1/2) diff --git a/lib/fsk4hf/wsprlfsim.f90 b/lib/fsk4hf/wsprlfsim.f90 deleted file mode 100644 index 6ee0710bb..000000000 --- a/lib/fsk4hf/wsprlfsim.f90 +++ /dev/null @@ -1,286 +0,0 @@ -program wsprlfsim - -! Simulate characteristics of a potential "WSPR-LF" mode using LDPC (300,60) -! code, OQPSK modulation, and 5 minute T/R sequences. - -! Reception and Demodulation algorithm: -! 1. Compute coarse spectrum; find fc1 = approx carrier freq -! 2. Mix from fc1 to 0; LPF at +/- 0.75*R -! 3. Square, FFT; find peaks near -R/2 and +R/2 to get fc2 -! 4. Mix from fc2 to 0 -! 5. Fit cb13 (central part of csync) to c -> lag, phase -! 6. Fit complex ploynomial for channel equalization -! 7. Get soft bits from equalized data - - include 'wsprlf_params.f90' - -! Q: Would it be better for central Sync array to use both I and Q channels? - - character*8 arg - complex cbb(0:NZ-1) !Complex baseband waveform - complex csync(0:NZ-1) !Sync symbols only, from cbb - complex c(0:NZ-1) !Complex waveform - complex c0(0:NZ-1) !Complex waveform - complex c1(0:NZ-1) !Complex waveform - complex zz(NS+ND) !Complex symbol values (intermediate) - complex z - real xnoise(0:NZ-1) !Generated random noise - real ynoise(0:NZ-1) !Generated random noise - real rxdata(ND),llr(ND) !Soft symbols - real pp(2*NSPS) !Shaped pulse for OQPSK - real a(5) !For twkfreq1 - real aa(20),bb(20) !Fitted polyco's - real t(11) - character*12 label(11) - integer*8 count0,count1,count2,count3,clkfreq - integer nc(11) - integer id(NS+ND) !NRZ values (+/-1) for Sync and Data - integer ierror(NS+ND) - integer icw(NN) - integer itone(NN) - integer*1 msgbits(KK),decoded(KK),apmask(ND),cw(ND) -! integer*1 codeword(ND) - data msgbits/0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1, & - 1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,1/ - data label/'genwsprlf','twkfreq1 a','watterson','noise gen','getfc1w', & - 'getfc2w','twkfreq1 b','xdt loop','cpolyfitw','msksoftsym', & - 'bpdecode300'/ - - nargs=iargc() - if(nargs.ne.6) then - print*,'Usage: wsprlfsim f0(Hz) delay(ms) fspread(Hz) maxn iters snr(dB)' - print*,'Example: wsprlfsim 0 0 0 5 10 -20' - print*,'Set snr=0 to cycle through a range' - go to 999 - endif - call getarg(1,arg) - read(arg,*) f0 !Generated carrier frequency - call getarg(2,arg) - read(arg,*) delay !Delta_t (ms) for Watterson model - call getarg(3,arg) - read(arg,*) fspread !Fspread (Hz) for Watterson model - call getarg(4,arg) - read(arg,*) maxn !Max nterms for polyfit - call getarg(5,arg) - read(arg,*) iters !Iterations at each SNR - call getarg(6,arg) - read(arg,*) snrdb !Specified SNR_2500 - - nc=0 - twopi=8.0*atan(1.0) - fs=NSPS*12000.0/NSPS0 !Sample rate = 22.2222... Hz - dt=1.0/fs !Sample interval (s) - tt=NSPS*dt !Duration of "itone" symbols (s) - ts=2*NSPS*dt !Duration of OQPSK symbols (s) - baud=1.0/tt !Keying rate for "itone" symbols (baud) - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - write(*,1000) fs,f0,delay,fspread,maxn,baud,3*baud,txt,iters -1000 format('fs:',f10.3,' f0:',f5.1,' Delay:',f4.1,' fSpread:',f5.2, & - ' maxn:',i3,/'Baud:',f8.3,' BW:',f5.1,' TxT:',f6.1,' iters:',i4/) - write(*,1004) -1004 format(/' SNR sync data ser ber fer fsigma tsigma', & - ' tsec'/68('-')) - - do i=1,N2 !Half-sine pulse shape - pp(i)=sin(0.5*(i-1)*twopi/(2*NSPS)) - enddo - - t=0. - call system_clock(count0,clkfreq) - call genwsprlf(msgbits,id,icw,cbb,csync,itone)!Generate baseband waveform - call system_clock(count1,clkfreq) - t(1)=float(count1-count0)/float(clkfreq) - nc(1)=nc(1)+1 - do i=0,NZ-1 - write(40,4001) i,cbb(i),csync(i) -4001 format(i8,4f12.6) - enddo - - call system_clock(count0,clkfreq) - a=0. - a(1)=f0 - call twkfreq1(cbb,NZ,fs,a,c0) !Mix baseband to specified frequency - call system_clock(count1,clkfreq) - t(2)=float(count1-count0)/float(clkfreq) - nc(2)=nc(2)+1 - - isna=-20 - isnb=-40 - if(snrdb.ne.0.0) then - isna=nint(snrdb) - isnb=isna - endif - do isnr=isna,isnb,-1 !Loop over SNR range - if(isna.ne.isnb) snrdb=isnr - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - nhard=0 - nhardsync=0 - nfe=0 - sqf=0. - sqt=0. - - call system_clock(count2,clkfreq) - do iter=1,iters !Loop over requested iterations - c=c0 -write(*,*) 'iter ',iter - call system_clock(count0,clkfreq) - if(delay.ne.0.0 .or. fspread.ne.0.0) then - call watterson(c,NZ,fs,delay,fspread) - endif - call system_clock(count1,clkfreq) - t(3)=t(3)+float(count1-count0)/float(clkfreq) - nc(3)=nc(3)+1 - - call system_clock(count0,clkfreq) - c=sig*c !Scale to requested SNR - if(snrdb.lt.90) then - do i=0,NZ-1 !Generate gaussian noise - xnoise(i)=gran() - ynoise(i)=gran() - enddo - c=c + cmplx(xnoise,ynoise) !Add AWGN noise - endif - call system_clock(count1,clkfreq) - t(4)=t(4)+float(count1-count0)/float(clkfreq) - nc(4)=nc(4)+1 - - call system_clock(count0,clkfreq) - call getfc1w(c,fs,fc1) !First approx for freq - call system_clock(count1,clkfreq) - t(5)=t(5)+float(count1-count0)/float(clkfreq) - nc(5)=nc(5)+1 -write(*,*) 'fc1 ',fc1 - call system_clock(count0,clkfreq) - call getfc2w(c,csync,fs,fc1,fc2,fc3) !Refined freq -write(*,*) 'fc1,fc2,fc3 ',fc1,fc2,fc3 - call system_clock(count1,clkfreq) - t(6)=t(6)+float(count1-count0)/float(clkfreq) - nc(6)=nc(6)+1 - sqf=sqf + (fc1+fc2-f0)**2 - - call system_clock(count0,clkfreq) -!NB: Measured performance is about equally good using fc2 or fc3 here: - a(1)=-(fc1+fc2) - a(2:5)=0. - call twkfreq1(c,NZ,fs,a,c) !Mix c down by fc1+fc2 - call system_clock(count1,clkfreq) - t(7)=t(7)+float(count1-count0)/float(clkfreq) - nc(7)=nc(7)+1 - -! The following may not be necessary? -! z=sum(c(3088:3503)*cb13)/208.0 !Get phase from Barker 13 vector -! z0=z/abs(z) -! c=c*conjg(z0) - - call system_clock(count0,clkfreq) -!---------------------------------------------------------------- DT -! Not presently used: - amax=0. - jpk=0 - iaa=0 - ibb=NZ-1 - do j=-20*NSPS,20*NSPS,NSPS/8 - ia=j - ib=NZ-1+j - if(ia.lt.0) then - ia=0 - iaa=-j - else - iaa=0 - endif - if(ib.gt.NZ-1) then - ib=NZ-1 - ibb=NZ-1-j - endif - z=sum(c(ia:ib)*conjg(csync(iaa:ibb))) - if(abs(z).gt.amax) then - amax=abs(z) - jpk=j - endif - enddo - xdt=jpk/fs - sqt=sqt + xdt**2 - call system_clock(count1,clkfreq) - t(8)=t(8)+float(count1-count0)/float(clkfreq) - nc(8)=nc(8)+1 - -!----------------------------------------------------------------- - - nterms=maxn - c1=c - do itry=1,20 - idf=itry/2 - if(mod(itry,2).eq.0) idf=-idf - nhard0=0 - nhardsync0=0 - ifer=1 - a(1)=idf*0.00085 - a(2:5)=0. - call system_clock(count0,clkfreq) - call twkfreq1(c1,NZ,fs,a,c) !Mix c1 into c - call cpolyfitw(c,pp,id,maxn,aa,bb,zz,nhs) - call system_clock(count1,clkfreq) - t(9)=t(9)+float(count1-count0)/float(clkfreq) - nc(9)=nc(9)+1 - - call system_clock(count0,clkfreq) - call msksoftsymw(zz,aa,bb,id,nterms,ierror,rxdata,nhard0,nhardsync0) - call system_clock(count1,clkfreq) - t(10)=t(10)+float(count1-count0)/float(clkfreq) - nc(10)=nc(10)+1 - - if(nhardsync0.gt.35) cycle - rxav=sum(rxdata)/ND - rx2av=sum(rxdata*rxdata)/ND - rxsig=sqrt(rx2av-rxav*rxav) - rxdata=rxdata/rxsig - ss=0.84 - llr=2.0*rxdata/(ss*ss) - apmask=0 - max_iterations=40 - ifer=0 - call system_clock(count0,clkfreq) - call bpdecode300(llr,apmask,max_iterations,decoded,niterations,cw) - call system_clock(count1,clkfreq) - t(11)=t(11)+float(count1-count0)/float(clkfreq) - nc(11)=nc(11)+1 - nbadcrc=0 - if(niterations.ge.0) call chkcrc10(decoded,nbadcrc) - if(niterations.lt.0 .or. count(msgbits.ne.decoded).gt.0 .or. & - nbadcrc.ne.0) ifer=1 - if(ifer.eq.0) exit - enddo !Freq dither loop - nhard=nhard+nhard0 - nhardsync=nhardsync+nhardsync0 - nfe=nfe+ifer - if(nhardsync0+nhard0+niterations+ifer.gt.0) write(42,1045) snrdb, & - nhardsync0,nhard0,niterations,ifer,xdt -1045 format(f6.1,4i6,f8.2) - enddo - call system_clock(count3,clkfreq) - tsec=float(count3-count2)/float(clkfreq) - - fsigma=sqrt(sqf/iters) - tsigma=sqrt(sqt/iters) - ser=float(nhardsync)/(NS*iters) - ber=float(nhard)/(ND*iters) - fer=float(nfe)/iters - write(*,1050) snrdb,nhardsync,nhard,ser,ber,fer,fsigma,tsigma,tsec -1050 format(f6.1,2i7,2f8.4,f7.3,2f8.2f8.3) - enddo - - write(*,1060) NS*iters,ND*iters -1060 format(68('-')/6x,2i7) - - write(*,1065) -1065 format(/'Timing sec frac calls'/39('-')) - do i=1,11 - write(*,1070) label(i),t(i),t(i)/sum(t),nc(i) -1070 format(a12,2f9.3,i8) - enddo - write(*,1072) sum(t),1.0 -1072 format(39('-')/12x,2f10.3) - -999 end program wsprlfsim diff --git a/lib/fsk4hf/wsprsimf.f90 b/lib/fsk4hf/wsprsimf.f90 deleted file mode 100644 index d6ee25d44..000000000 --- a/lib/fsk4hf/wsprsimf.f90 +++ /dev/null @@ -1,113 +0,0 @@ -!------------------------------------------------------------------------------- -! -! This file is part of the WSPR application, Weak Signal Propagation Reporter -! -!------------------------------------------------------------------------------- - -program wsprsim - - use wavhdr - include 'wspr_params.f90' - type(hdr) hwav - character arg*12,fname14*14,fname15*15 - character*22 msg,msgsent - complex c0(0:NMAX/NDOWN-1) - complex c(0:NMAX/NDOWN-1) - integer itone(NN) - integer*2 iwave(NMAX) - real*8 fMHz - -! Get command-line argument(s) - nargs=iargc() - if(nargs.ne.8) then - print*,'Usage: wsprsim "message" f0 DT fsp del nwav nfiles snr' - print*,'Example: wsprsim "K1ABC FN42 30" 50 0.0 0.1 1.0 1 10 -33' - go to 999 - endif - call getarg(1,msg) !Message to be transmitted - call getarg(2,arg) - read(arg,*) f0 !Freq relative to WSPR-band center (Hz) - call getarg(3,arg) - read(arg,*) xdt !Time offset from nominal (s) - call getarg(4,arg) - read(arg,*) fspread !Watterson frequency spread (Hz) - call getarg(5,arg) - read(arg,*) delay !Watterson delay (ms) - call getarg(6,arg) - read(arg,*) nwav !1 for *.wav file, 0 for *.c2 file - call getarg(7,arg) - read(arg,*) nfiles !Number of files - call getarg(8,arg) - read(arg,*) snrdb !SNR_2500 - - twopi=8.0*atan(1.0) - fs=12000.0/NDOWN - dt=1.0/fs - tt=NSPS*dt - baud=12000.0/8192.0 - - txt=NZ*dt !Transmission length (s) - bandwidth_ratio=2500.0/(fs/2.0) - sig=sqrt(bandwidth_ratio) * 10.0**(0.05*snrdb) - if(snrdb.gt.90.0) sig=1.0 - txt=NN*NSPS0/12000.0 - - call genwspr(msg,msgsent,itone) !Encode the message, get itone - - write(*,1000) f0,xdt,txt,snrdb,fspread,delay,nfiles,msgsent -1000 format('f0:',f9.3,' DT:',f6.2,' txt:',f6.1,' SNR:',f6.1, & - ' fspread:',f6.1,' delay:',f6.1,' nfiles:',i3,2x,a22) -! write(*,*) "Channel symbols: " -! write(*,'(162i2)') itone - - h=1.0 - phi=0.0 - c0=0. - k=-1 + nint(xdt/dt) - do j=1,NN - dphi=-twopi*(f0+h*(itone(j)-1.5)*baud)*dt - do i=1,NSPS - k=k+1 - phi=mod(phi+dphi,twopi) - if(k.ge.0 .and. k.lt.NMAX/NDOWN) c0(k)=cmplx(cos(phi),sin(phi)) - enddo - enddo - call sgran() - do ifile=1,nfiles - c=c0 - if(nwav.eq.0) then - if( fspread .ne. 0.0 .or. delay .ne. 0.0 ) then - call watterson(c,NMAX/NDOWN,NN*NSPS,fs,delay,fspread) - endif - c=c*sig - if(snrdb.lt.90) then - do i=0,NMAX/NDOWN-1 !Add gaussian noise at specified SNR - xnoise=gran() - ynoise=gran() - c(i)=c(i) + cmplx(xnoise,ynoise) - enddo - endif - write(fname14,1100) ifile -1100 format('000000_',i4.4,'.c2') - open(10,file=fname14,status='unknown',access='stream') - fMHz=10.1387d0 - nmin=2 - write(10) fname14,nmin,fMHz,c !Save to *.c2 file - close(10) - write(*,1108) ifile,xdt,f0,snrdb,fname14 -1108 format(i4,f7.2,f8.2,f7.1,2x,a14) - else - freq=1500.0+f0 - call wspr_wav(baud,xdt,h,freq,itone,snrdb,iwave) - hwav=default_header(12000,NMAX) - write(fname15,1102) ifile -1102 format('000000_',i4.4,'.wav') - open(10,file=fname15,status='unknown',access='stream') - write(10) hwav,iwave !Save to *.wav file - close(10) - write(*,1110) ifile,xdt,f0,snrdb,fname15 -1110 format(i4,f7.2,f8.2,f7.1,2x,a15) - endif - enddo - -999 end program wsprsim From 48856fcefc31af1269f3aa0b7d4f1298f4b2908a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 17 Dec 2019 20:41:51 +0000 Subject: [PATCH 03/19] Update HRD interface to support the Yaesu FT-920 --- Transceiver/HRDTransceiver.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Transceiver/HRDTransceiver.cpp b/Transceiver/HRDTransceiver.cpp index 82ed7bc9c..d471a5100 100644 --- a/Transceiver/HRDTransceiver.cpp +++ b/Transceiver/HRDTransceiver.cpp @@ -236,7 +236,7 @@ int HRDTransceiver::do_start () vfo_A_button_ = find_button (QRegExp ("^(VFO~A|Main)$")); vfo_B_button_ = find_button (QRegExp ("^(VFO~B|Sub)$")); - vfo_toggle_button_ = find_button (QRegExp ("^(A~/~B)$")); + vfo_toggle_button_ = find_button (QRegExp ("^(A~/~B|VFO~A/B)$")); split_mode_button_ = find_button (QRegExp ("^(Spl~On|Spl_On|Split|Split~On)$")); split_off_button_ = find_button (QRegExp ("^(Spl~Off|Spl_Off|Split~Off)$")); @@ -392,17 +392,17 @@ std::vector HRDTransceiver::find_dropdown_selection (int dropdown, QRegExp void HRDTransceiver::map_modes (int dropdown, ModeMap *map) { // order matters here (both in the map and in the regexps) - map->push_back (std::forward_as_tuple (CW, find_dropdown_selection (dropdown, QRegExp ("^(CW|CW\\(N\\))|CWL$")))); - map->push_back (std::forward_as_tuple (CW_R, find_dropdown_selection (dropdown, QRegExp ("^(CW-R|CW-R\\(N\\)|CW|CWU)$")))); + map->push_back (std::forward_as_tuple (CW, find_dropdown_selection (dropdown, QRegExp ("^(CW|CW\\(N\\)|CW-LSB|CWL)$")))); + map->push_back (std::forward_as_tuple (CW_R, find_dropdown_selection (dropdown, QRegExp ("^(CW-R|CW-R\\(N\\)|CW|CW-USB|CWU)$")))); map->push_back (std::forward_as_tuple (LSB, find_dropdown_selection (dropdown, QRegExp ("^(LSB\\(N\\)|LSB)$")))); map->push_back (std::forward_as_tuple (USB, find_dropdown_selection (dropdown, QRegExp ("^(USB\\(N\\)|USB)$")))); - map->push_back (std::forward_as_tuple (DIG_U, find_dropdown_selection (dropdown, QRegExp ("^(DIG|DIGU|DATA-U|PKT-U|DATA|USER-U|USB)$")))); + map->push_back (std::forward_as_tuple (DIG_U, find_dropdown_selection (dropdown, QRegExp ("^(DIG|DIGU|DATA-U|PKT-U|DATA|AFSK|USER-U|USB)$")))); map->push_back (std::forward_as_tuple (DIG_L, find_dropdown_selection (dropdown, QRegExp ("^(DIG|DIGL|DATA-L|PKT-L|DATA-R|USER-L|LSB)$")))); map->push_back (std::forward_as_tuple (FSK, find_dropdown_selection (dropdown, QRegExp ("^(DIG|FSK|RTTY|RTTY-LSB)$")))); map->push_back (std::forward_as_tuple (FSK_R, find_dropdown_selection (dropdown, QRegExp ("^(DIG|FSK-R|RTTY-R|RTTY|RTTY-USB)$")))); map->push_back (std::forward_as_tuple (AM, find_dropdown_selection (dropdown, QRegExp ("^(AM|DSB|SAM|DRM)$")))); map->push_back (std::forward_as_tuple (FM, find_dropdown_selection (dropdown, QRegExp ("^(FM|FM\\(N\\)|FM-N|WFM)$")))); - map->push_back (std::forward_as_tuple (DIG_FM, find_dropdown_selection (dropdown, QRegExp ("^(PKT-FM|PKT|FM)$")))); + map->push_back (std::forward_as_tuple (DIG_FM, find_dropdown_selection (dropdown, QRegExp ("^(PKT-FM|PKT|DATA\\(FM\\)|FM)$")))); #if WSJT_TRACE_CAT TRACE_CAT ("HRDTransceiver", "for dropdown" << dropdown_names_[dropdown]); From 8b8c2d54b79b3e607581e40852421333e4359485 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 16:02:33 +0100 Subject: [PATCH 04/19] Prep for hot-fix release --- Release_Notes.txt | 14 ++++++++++++++ Versions.cmake | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index 8bab06866..1b10fcaae 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -13,6 +13,20 @@ Copyright 2001 - 2020 by Joe Taylor, K1JT. + Release: WSJT-X 2.2.1 + June 5, 2020 + --------------------- + +WSJT-X 2.2.1 is a bug-fix release that fixes a critical defect found +in the v2.2.0 GA release. Here is a brief summary; + + - Incorporate a revised Hamlib version the address a regression + in rig control of some rigs including the Yaesu FT-991 and FT-891. + + - Include support for the Yaesu FT-920 when controlled by Ham Radio + Deluxe. This change inadvertently missed the v2.2.0 GA release. + + Release: WSJT-X 2.2 June 2, 2020 ------------------- diff --git a/Versions.cmake b/Versions.cmake index ecfe0456f..a36497a1d 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -1,6 +1,6 @@ # Version number components set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 2) -set (WSJTX_VERSION_PATCH 0) +set (WSJTX_VERSION_PATCH 1) set (WSJTX_RC 4) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 1) # set to 1 for final release build From 8833b56d91c3d625ccc57c6629cb3f2e49268901 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 17:43:27 +0100 Subject: [PATCH 05/19] Fix issue with 2D spectrum selection in translated UIs For completeness this fixes the other occurrence of widget signals with text arguments that are liable to misbehaviour with translated UIs. --- widgets/mainwindow.cpp | 8 ++++---- widgets/mainwindow.h | 2 +- widgets/widegraph.cpp | 28 +++++++++++++++++----------- widgets/widegraph.h | 2 +- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 37dad9ebc..0e5fd551a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -812,7 +812,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, char const * const power[] = {"1 mW","2 mW","5 mW","10 mW","20 mW","50 mW","100 mW","200 mW","500 mW", "1 W","2 W","5 W","10 W","20 W","50 W","100 W","200 W","500 W","1 kW"}; for(auto i = 0u; i < sizeof power / sizeof power[0]; ++i) { //Initialize dBm values - ui->TxPowerComboBox->addItem (QString {"%1 dBm %2"}.arg (int ((10. * i / 3.) + .5)).arg (power[i])); + auto dBm = int ((10. * i / 3.) + .5); + ui->TxPowerComboBox->addItem (QString {"%1 dBm %2"}.arg (dBm).arg (power[i]), dBm); } m_dateTimeRcvdRR73=QDateTime::currentDateTimeUtc(); @@ -7781,10 +7782,9 @@ void MainWindow::uploadResponse(QString response) } } -void MainWindow::on_TxPowerComboBox_currentIndexChanged(const QString &arg1) +void MainWindow::on_TxPowerComboBox_currentIndexChanged(int index) { - int i1=arg1.indexOf(" "); - m_dBm=arg1.mid(0,i1).toInt(); + m_dBm = ui->TxPowerComboBox->itemData (index).toInt (); } void MainWindow::on_sbTxPercent_valueChanged(int n) diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 969993098..82f879fcd 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -276,7 +276,7 @@ private slots: void on_actionWSPR_triggered(); void on_actionWSPR_LF_triggered(); void on_syncSpinBox_valueChanged(int n); - void on_TxPowerComboBox_currentIndexChanged(const QString &arg1); + void on_TxPowerComboBox_currentIndexChanged(int); void on_sbTxPercent_valueChanged(int n); void on_cbUploadWSPR_Spots_toggled(bool b); void WSPR_config(bool b); diff --git a/widgets/widegraph.cpp b/widgets/widegraph.cpp index 6234f731a..a78874c79 100644 --- a/widgets/widegraph.cpp +++ b/widgets/widegraph.cpp @@ -315,23 +315,29 @@ void WideGraph::setModeTx(QString modeTx) //setModeTx ui->widePlot->update(); } - //Current-Cumulative-Yellow -void WideGraph::on_spec2dComboBox_currentIndexChanged(const QString &arg1) +void WideGraph::on_spec2dComboBox_currentIndexChanged(int index) { ui->widePlot->setCurrent(false); ui->widePlot->setCumulative(false); ui->widePlot->setLinearAvg(false); ui->widePlot->setReference(false); ui->smoSpinBox->setEnabled(false); - if(arg1=="Current") ui->widePlot->setCurrent(true); - if(arg1=="Cumulative") ui->widePlot->setCumulative(true); - if(arg1=="Linear Avg") { - ui->widePlot->setLinearAvg(true); - ui->smoSpinBox->setEnabled(true); - } - if(arg1=="Reference") { - ui->widePlot->setReference(true); - } + switch (index) + { + case 0: // Current + ui->widePlot->setCurrent(true); + break; + case 1: // Cumulative + ui->widePlot->setCumulative(true); + break; + case 2: // Linear Avg + ui->widePlot->setLinearAvg(true); + ui->smoSpinBox->setEnabled(true); + break; + case 3: // Reference + ui->widePlot->setReference(true); + break; + } replot(); } diff --git a/widgets/widegraph.h b/widgets/widegraph.h index c87bab050..90f7b51aa 100644 --- a/widgets/widegraph.h +++ b/widgets/widegraph.h @@ -68,7 +68,7 @@ protected: private slots: void on_waterfallAvgSpinBox_valueChanged(int arg1); void on_bppSpinBox_valueChanged(int arg1); - void on_spec2dComboBox_currentIndexChanged(const QString &arg1); + void on_spec2dComboBox_currentIndexChanged(int); void on_fSplitSpinBox_valueChanged(int n); void on_fStartSpinBox_valueChanged(int n); void on_paletteComboBox_activated(const QString &palette); From 5525d680875680b087c177cdfc32bcb57db8b764 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 17:47:54 +0100 Subject: [PATCH 06/19] Release note updates --- Release_Notes.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index 1b10fcaae..2c521e75f 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -20,11 +20,14 @@ Copyright 2001 - 2020 by Joe Taylor, K1JT. WSJT-X 2.2.1 is a bug-fix release that fixes a critical defect found in the v2.2.0 GA release. Here is a brief summary; - - Incorporate a revised Hamlib version the address a regression - in rig control of some rigs including the Yaesu FT-991 and FT-891. + - Incorporate a revised Hamlib version the address a regression in + rig control of some rigs including the Yaesu FT-991 and FT-891. - - Include support for the Yaesu FT-920 when controlled by Ham Radio - Deluxe. This change inadvertently missed the v2.2.0 GA release. + - Fix a defect with selecting Wide Graph 2D spectrum types in + translated UIs. + + - Include support for the Yaesu FT-920 when controlled by Ham Radio + Deluxe. This change inadvertently missed the v2.2.0 GA release. Release: WSJT-X 2.2 From 3c2d7ae53e42fa64a6414968d6caaf4da3d9aed2 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 21:27:57 +0100 Subject: [PATCH 07/19] Updated Catalan UI translation, tnx Xavi, EA3W --- translations/wsjtx_ca.ts | 110 +++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/translations/wsjtx_ca.ts b/translations/wsjtx_ca.ts index 08da21769..65955d0c5 100644 --- a/translations/wsjtx_ca.ts +++ b/translations/wsjtx_ca.ts @@ -21,7 +21,7 @@ Are you sure you want to delete the %n selected QSO(s) from the log? sorry i don't understand how to fix this - Segur que vols esborrar els %n QSO's seleccionats del registre ? + Segur que vols esborrar els %n QSO's seleccionats del log ? @@ -251,7 +251,7 @@ Contest Log - Registre de Concurs + Log de Concurs @@ -604,7 +604,7 @@ Format: Save Directory - Desa el directori + Directori de Guardar @@ -1269,7 +1269,7 @@ Error: %2 - %3 Cabrillo Log (*.cbr) - Registre Cabrillo (*.cbr) + Log Cabrillo (*.cbr) @@ -1354,7 +1354,7 @@ Error: %2 - %3 Fox Log - Registre Guineu + Log Fox @@ -1396,7 +1396,7 @@ Error: %2 - %3 ADIF Log (*.adi) - Registre ADIF (*.adi) + Log ADIF (*.adi) @@ -1421,7 +1421,7 @@ Error: %2 - %3 Are you sure you want to erase file FoxQSO.txt and start a new Fox log? - Estàs segur que vols esborrar el fitxer FoxQSO.txt i començar un nou registre de FOX (Guineu)? + Estàs segur que vols esborrar el fitxer FoxQSO.txt i començar un log nou de FOX ? @@ -1875,7 +1875,7 @@ Error: %2 - %3 Log file error - Error al fitxer de registre + Error al fitxer de log @@ -1979,7 +1979,7 @@ Error(%2): %3 Enter this QSO in log - Introdueix aquest QSO al registre + Introdueix aquest QSO al log @@ -1994,7 +1994,7 @@ Error(%2): %3 &Stop - &Atura + &Aturar @@ -2019,7 +2019,7 @@ Error(%2): %3 &Erase - &Esborra + &Esborrar @@ -2145,7 +2145,7 @@ en Groc quan és massa baix Search for callsign in database - Buscar el indicatiu a la base de dades + Buscar l'indicatiu a la base de dades @@ -2431,7 +2431,7 @@ No està disponible per als titulars de indicatiu no estàndard. Fox - Guineu + Fox @@ -3128,7 +3128,7 @@ La llista es pot mantenir a la configuració (F2). Configuration - Configuració + Ajustos @@ -3168,12 +3168,12 @@ La llista es pot mantenir a la configuració (F2). Shift+F6 - Shift+F6 + Majúscules+F6 Delete all *.wav && *.c2 files in SaveDir - Esborra tots els fitxers *.wav && *.c2 del directori Guardar + Esborrar tots els fitxers *.wav i *.c2 @@ -3228,12 +3228,12 @@ La llista es pot mantenir a la configuració (F2). Erase ALL.TXT - Esborrar ALL.TXT + Esborrar el fitxer ALL.TXT Erase wsjtx_log.adi - Esborrar wsjt_lg.adi + Esborrar el fitxer wsjt_log.adi @@ -3248,7 +3248,7 @@ La llista es pot mantenir a la configuració (F2). Prompt me to log QSO - Inclòure el QSO al registre + Inclòure el QSO al log @@ -3285,7 +3285,7 @@ La llista es pot mantenir a la configuració (F2). Runaway Tx watchdog - Vigilant de fugida TX + Seguretat de TX @@ -3345,7 +3345,7 @@ La llista es pot mantenir a la configuració (F2). Open log directory - Obre el directori del registre + Obre el directori del log @@ -3410,7 +3410,7 @@ La llista es pot mantenir a la configuració (F2). &Download Samples ... - &Descarregueu mostres ... + &Descarrega mostres ... @@ -3501,12 +3501,12 @@ La llista es pot mantenir a la configuració (F2). Shift+F1 - Shift+F1 + Majúscules+F1 Fox log - Log Guineu + Log Fox @@ -3516,7 +3516,7 @@ La llista es pot mantenir a la configuració (F2). Reset Cabrillo log ... - Restableix el registre de Cabrillo ... + Restableix el log de Cabrillo ... @@ -3526,12 +3526,12 @@ La llista es pot mantenir a la configuració (F2). Contest Log - Registre de Concurs + Log de Concurs Export Cabrillo log ... - Exporta el registre de Cabrillo ... + Exporta el log de Cabrillo ... @@ -3541,7 +3541,7 @@ La llista es pot mantenir a la configuració (F2). Contest log - Registre de Concurs + Log de Concurs @@ -3573,12 +3573,12 @@ La llista es pot mantenir a la configuració (F2). Error Scanning ADIF Log - Error d'escaneig del registre ADIF + Error d'escaneig del log ADIF Scanned ADIF log, %1 worked before records created - Registre ADIF escanejat, %1 funcionava abans de la creació de registres + Log ADIF escanejat, %1 funcionava abans de la creació de registres @@ -3818,12 +3818,12 @@ La llista es pot mantenir a la configuració (F2). Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. - Tria una altra freqüència de treball. WSJT-X no funcionarà en mode Guineu a les sub-bandes FT8 estàndard. + Tria una altra freqüència de treball. WSJT-X no funcionarà en mode Fox a les sub-bandes FT8 estàndard. Fox Mode warning - Avís de mode Guineu + Avís de mode Fox @@ -3884,7 +3884,7 @@ ja és a CALL3.TXT, vols substituir-lo ? Log file error - Error al fitxer de registre + Error al fitxer de log @@ -3894,7 +3894,7 @@ ja és a CALL3.TXT, vols substituir-lo ? Error sending log to N1MM - Error al enviar el registre a N1MM + Error al enviar el log a N1MM @@ -3937,17 +3937,17 @@ ja és a CALL3.TXT, vols substituir-lo ? Are you sure you want to erase your contest log? - Estàs segur que vols esborrar el registre del concurs ? + Estàs segur que vols esborrar el log del concurs ? Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. - Si fas això, suprimiràs tots els registres de QSO del concurs actual. Es conservaran al fitxer de registre ADIF, però no es podran exportar al registre de Cabrillo. + Si fas això, suprimiràs tots els registres de QSO del concurs actual. Es conservaran al fitxer de log ADIF, però no es podran exportar al log de Cabrillo. Cabrillo Log saved - Registre Cabrillo desat + Log Cabrillo desat @@ -4015,7 +4015,7 @@ UDP server %2:%3 Log File Error - Error al fitxer de registre + Error al fitxer de log @@ -4498,7 +4498,7 @@ Error(%2): %3 Band - Manda + Banda @@ -4883,7 +4883,7 @@ Error(%2): %3 Tx watchdog: - TX vigilant: + Seguretat de TX: @@ -5482,7 +5482,7 @@ channels; then you will usually want to select mono or both here. Selecciona el canal d'àudio que s'utilitza per a la transmissió. A menys de que tinguis diversos equips connectats a diferents -canals, llavors normalment voldras seleccionar mono o +canals, llavors normalment voldràs seleccionar mono o els dos canals. @@ -5494,7 +5494,7 @@ els dos canals. Save Directory - Desa el directori + Directori de Guardar @@ -5605,7 +5605,7 @@ Fes clic, MAJÚ + clic i, CTRL+clic per seleccionar els elements. Reporting and logging settings - Configuració d'informes i registre + Configuració d'informes i registres @@ -5615,7 +5615,7 @@ Fes clic, MAJÚ + clic i, CTRL+clic per seleccionar els elements. The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. - El programa apareixerà un diàleg de QSO de registre parcialment completat quan envieu un missatge de text 73 o lliure. + El programa apareixerà un diàleg de QSO de registre parcialment completat quan enviïs un missatge de text 73 o lliure. @@ -5633,8 +5633,8 @@ Fes clic, MAJÚ + clic i, CTRL+clic per seleccionar els elements. saved by this program. Check this option to save the sent and received reports in the comments field. - Alguns programes de registre no acceptaran el tipus d’informes -desat per aquest programa. + Alguns programes de log no acceptaran el tipus d’informes +desats per aquest programa. Comprova aquesta opció per desar els informes enviats i rebuts al camp de comentaris. @@ -5648,17 +5648,17 @@ al camp de comentaris. Check this option to force the clearing of the DX Call and DX Grid fields when a 73 or free text message is sent. Marca aquesta opció per a forçar l'eliminació dels camps -Crida de DX i Locator DX quan s’envia un missatge de text 73 o lliure. +Indicatiu DX i Locator DX quan s’envia un missatge de text 73 o lliure. Clear &DX call and grid after logging - Buida les graelles Crida i &DX després del registre + Buida les graelles Indicatiu DX i Locator&DX després del registre <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> - <html><head/><body><p>Alguns programes de registre no accepten noms del mode WSJT-X.</p></body></html> + <html><head/><body><p>Alguns programes de log no accepten noms del mode WSJT-X.</p></body></html> @@ -5678,7 +5678,7 @@ Crida de DX i Locator DX quan s’envia un missatge de text 73 o lliure. Log automatically (contesting only) - Registre automàtic (només concurs) + Log automàtic (només concurs) @@ -5799,7 +5799,7 @@ per avaluar la propagació i el rendiment del sistema. Default frequencies and band specific station details setup - Configuració predeterminada de les freqüències i banda amb detalls específics de l'estació + Configuració predeterminada de les freqüències i bandes amb detalls específics de l'estació @@ -5871,7 +5871,7 @@ Fes clic amb el botó dret per a les opcions d'inserció i eliminació. Rescan ADIF Log - Escaneig de nou el registre ADIF + Escaneig de nou el log ADIF @@ -5931,7 +5931,7 @@ Fes clic amb el botó dret per a les opcions d'inserció i eliminació. <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> - <html><head/><body><p>URL de l'últim fitxer de dades de dates i hores de càrrega de ARRL LotW que s'utilitza per ressaltar descodificacions d'estacions que se sap que carreguen el seu arxiu de registre a LotW.</p></body></html> + <html><head/><body><p>URL de l'últim fitxer de dades de dates i hores de càrrega de ARRL LotW que s'utilitza per ressaltar descodificacions d'estacions que se sap que carreguen el seu arxiu de log a LotW.</p></body></html> @@ -6031,12 +6031,12 @@ Fes clic amb el botó dret per a les opcions d'inserció i eliminació. <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> - <html><head/><body><p>Mode FT8 DXpedition: operador Guineu (DXpedition).</p></body></html> + <html><head/><body><p>Mode FT8 DXpedition: operador Fox (DXpedition).</p></body></html> Fox - Guineu + Fox From d0a1818a4309c7ad570e5007826387c19b67f912 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 3 Jun 2020 21:28:45 +0100 Subject: [PATCH 08/19] Release note update --- Release_Notes.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Release_Notes.txt b/Release_Notes.txt index 2c521e75f..a01e108f2 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -29,6 +29,13 @@ in the v2.2.0 GA release. Here is a brief summary; - Include support for the Yaesu FT-920 when controlled by Ham Radio Deluxe. This change inadvertently missed the v2.2.0 GA release. + - Correct a documentation issue with the UDP Message Protocol + Status(1) message Special Operations Mode enumeration values ("WW + DIGI added", Fox, and Hound renumbered). Thanks to Sam, W2JDB, for + raising this issue. + + - Updated Catalan UI translation, tnx Xavi, EA3W. + Release: WSJT-X 2.2 June 2, 2020 From 747975fc4ae145e1079891a86d1d4c18b4ac3ac3 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 2 Jun 2020 22:44:14 +0100 Subject: [PATCH 09/19] Update UDP Status message documentation This for consistency, I suspect inserting a value into the special operations type enumeration will cause external programs some backwards compatibility issues. We should consider reverting this and adding the new value to the end. --- Network/NetworkMessage.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Network/NetworkMessage.hpp b/Network/NetworkMessage.hpp index 8055e2a49..3c5c9268f 100644 --- a/Network/NetworkMessage.hpp +++ b/Network/NetworkMessage.hpp @@ -194,8 +194,9 @@ * 2 -> EU VHF * 3 -> FIELD DAY * 4 -> RTTY RU - * 5 -> FOX - * 6 -> HOUND + * 5 -> WW DIGI + * 6 -> FOX + * 7 -> HOUND * * The Frequency Tolerance and T/R period fields may have a value * of the maximum quint32 value which implies the field is not From c30c3ce4c86d301524c30a2aa86451afaf6302cf Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 4 Jun 2020 03:39:49 +0100 Subject: [PATCH 10/19] Update message aggregator in line with special operation mode values --- UDPExamples/ClientWidget.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/UDPExamples/ClientWidget.cpp b/UDPExamples/ClientWidget.cpp index ecf0b54fe..984b64ad9 100644 --- a/UDPExamples/ClientWidget.cpp +++ b/UDPExamples/ClientWidget.cpp @@ -415,8 +415,9 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const& case 2: special = "[EU VHF]"; break; case 3: special = "[FD]"; break; case 4: special = "[RTTY RU]"; break; - case 5: special = "[Fox]"; break; - case 6: special = "[Hound]"; break; + case 5: special = "[WW DIGI]"; break; + case 6: special = "[Fox]"; break; + case 7: special = "[Hound]"; break; default: break; } de_label_->setText (de_call.size () >= 0 ? QString {"DE: %1%2%3"}.arg (de_call) From a8115a900015abf538e3105e2520196bf67aded2 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 4 Jun 2020 03:41:11 +0100 Subject: [PATCH 11/19] Escape regexp meta-characters in search strings This resolves the regression where Highlight Callsign UDP messages fail when the callsign contains a '+' character. --- widgets/displaytext.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index ae865bc9d..ef91761fc 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -553,7 +553,14 @@ void DisplayText::highlight_callsign (QString const& callsign, QColor const& bg, { return; } - QRegularExpression target {QString {"?"}, QRegularExpression::DontCaptureOption}; + auto regexp = callsign; + // allow for hashed callsigns and escape any regexp metacharacters + QRegularExpression target {QString {"?"} + , QRegularExpression::DontCaptureOption}; QTextCharFormat old_format {currentCharFormat ()}; QTextCursor cursor {document ()}; if (last_period_only) From f0c87b84f20653b1e0981b6ce2cc59edf5234d40 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 4 Jun 2020 11:29:49 +0100 Subject: [PATCH 12/19] =?UTF-8?q?Updated=20Japanese=20&=20Spanish=20UI=20t?= =?UTF-8?q?ranslations,=20Tnx=20Oba,=20JA7UDE,=20&=20C=C3=A9dric,=20EA4AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- translations/wsjtx_es.ts | 518 ++++++++++++++++++++-------------- translations/wsjtx_ja.ts | 581 ++++++++++++++++++++------------------- 2 files changed, 616 insertions(+), 483 deletions(-) diff --git a/translations/wsjtx_es.ts b/translations/wsjtx_es.ts index a1cac784c..e9ec1da8c 100644 --- a/translations/wsjtx_es.ts +++ b/translations/wsjtx_es.ts @@ -20,7 +20,7 @@ Are you sure you want to delete the %n selected QSO(s) from the log? - ¿Estás seguro de que deseas eliminar los %n QSO's seleccionados en el registro? + ¿Estás seguro de que deseas eliminar los %n QSO's seleccionados en el log? @@ -134,7 +134,7 @@ Astronomical Data - Datos astronómicos + Configuración para clonar desde Datos astronómicos @@ -149,7 +149,7 @@ Go to "Menu->File->Settings->Radio" to enable split operation - Ves a "Menú-> Archivo-> Configuración/Ajustes-> Radio" para habilitar la operación dividida + Ves a "Menú-> Archivo-> Configuración-> Radio" para habilitar la operación dividida @@ -190,7 +190,7 @@ About WSJT-X - A cerca de WSJT-X + Acerca de WSJT-X @@ -211,7 +211,8 @@ Freq(MHz) - Frecuencia en MHz + Frecuencia en MHz + Freq.(MHz) @@ -249,7 +250,7 @@ Contest Log - Registro de Concurso + Log de Concurso @@ -290,7 +291,8 @@ K1ABC - EA3RDG + EA3RDG - Neutro, por favor + EA1ABC @@ -315,7 +317,8 @@ New Grid - Nuevo Locator/Grid + Nuevo Locator/Grid + Nuevo Locator @@ -330,7 +333,8 @@ New Grid on Band - Nuevo Locator/Grid en banda + Nuevo Locator/Grid en banda + Nuevo Locator en banda @@ -340,7 +344,8 @@ Uploads to LotW - Subidas a LotW + Subidas a LotW + Subidas a LoTW @@ -535,7 +540,7 @@ Formato: Frequency files (*.qrg);;All files (*.*) - Ficheros de frecuencia (*.qrg);;Todos los ficheros (*.*) + Archivos de frecuencia (*.qrg);;Todos los archivos (*.*) @@ -557,7 +562,7 @@ Formato: Not a valid frequencies file - El fichero de frecuencias no es válido + El archivo de frecuencias no es válido @@ -587,7 +592,8 @@ Formato: Are you sure you want to save only the working frequencies that are currently selected? Click No to save all. - ¿Seguro que quieres guardar sólo las frecuencias de trabajo seleccionadas actualmente? Haz clic en No para guardar todo. + ¿Seguro que quieres guardar sólo las frecuencias de trabajo seleccionadas actualmente? Haz clic en No para guardar todo. + ¿Seguro que quiere guardar sólo las frecuencias de trabajo seleccionadas actualmente? Clic en No para guardar todo. @@ -602,7 +608,8 @@ Formato: Save Directory - Guardar directorio + Guardar directorio + Directorio "Save" @@ -721,17 +728,20 @@ Formato: &Foreground color ... - &Color de primer plano ... + &Color de primer plano ... + &Color de letras ... Choose %1 Foreground Color - Escoge %1 color de primer plano + Olvide copiar el texto original + Escoga %1 color de letras &Unset foreground color - &Color de primer plano desarmado + &Color de primer plano desarmado + &Color de letras predeterminado @@ -741,12 +751,14 @@ Formato: Choose %1 Background Color + Olvide copiar el texto original Escoge %1 color de fondo U&nset background color - C&olor de fondo desarmado + C&olor de fondo desarmado + C&olor de fondo predeterminado @@ -784,12 +796,14 @@ Formato: New Grid - Nuevo Locator/Grid + Nuevo Locator/Grid + Nuevo Locator New Grid on Band - Nuevo Locator/Grid en banda + Nuevo Locator/Grid en banda + Nuevo Locator en banda @@ -839,12 +853,14 @@ Formato: f/g unset - f/g desarmado + f/g desarmado + color letras prederminado b/g unset - b/g desarmado + b/g desarmado + color fondo predeterminado @@ -891,7 +907,8 @@ Formato: Gray time: - Tiempo Gris: + Tiempo Gris: + Línea de sombra @@ -1115,7 +1132,7 @@ Error: %2 - %3 Relative Power (dB) - Poténcia Relativa (dB) + Potencia Relativa (dB) @@ -1143,12 +1160,14 @@ Error: %2 - %3 Configuration to Clone From - Configuración para clonar desde + Configuración para clonar desde + Clonar desde &Source Configuration Name: - &Nombre de la configuración/ajuste de la fuente: + &Nombre de la configuración/ajuste de la fuente: + &Configuración de origen: @@ -1206,7 +1225,7 @@ Error: %2 - %3 Category-Power: - Categoria de Poténcia: + Categoria de Potencia: @@ -1221,7 +1240,8 @@ Error: %2 - %3 NON-ASSISTED - No Asistida + No Asistida + NO ASISTIDA @@ -1262,12 +1282,12 @@ Error: %2 - %3 Save Log File - Guardar archivo de registro + Guardar archivo de log Cabrillo Log (*.cbr) - Registro Cabrillo (*.cbr) + Log Cabrillo (*.cbr) @@ -1329,7 +1349,8 @@ Error: %2 - %3 Grid - Locator/Grid + Locator + Locator @@ -1352,7 +1373,7 @@ Error: %2 - %3 Fox Log - Registro Fox + Log Fox @@ -1389,12 +1410,12 @@ Error: %2 - %3 Export ADIF Log File - Exportar archivo de registro ADIF + Exportar archivo log ADIF ADIF Log (*.adi) - Registro ADIF (*.adi) + Log ADIF (*.adi) @@ -1419,7 +1440,7 @@ Error: %2 - %3 Are you sure you want to erase file FoxQSO.txt and start a new Fox log? - ¿Estás seguro de que deseas borrar el archivo FoxQSO.txt e iniciar un nuevo registro de Fox? + ¿Estás seguro de que deseas borrar el archivo FoxQSO.txt e iniciar un nuevo log de Fox? @@ -1780,7 +1801,8 @@ Error: %2 - %3 Start - Comienzo + Comienzo + Inicio @@ -1791,7 +1813,8 @@ Error: %2 - %3 End - Final + Final + Fin @@ -1806,17 +1829,20 @@ Error: %2 - %3 Rpt Sent - Reporte Enviado + Reporte Enviado + Rpt. Enviado Rpt Rcvd - Reporte Recibido + Reporte Recibido + RPT Recibido Grid - Locator/Grid + Locator/Grid + Locator @@ -1826,7 +1852,8 @@ Error: %2 - %3 Tx power - Poténcia de TX + Potencia de TX + Potencia TX @@ -1873,7 +1900,7 @@ Error: %2 - %3 Log file error - Error de archivo de registro + Error de archivo log @@ -1982,7 +2009,7 @@ Error(%2): %3 Log &QSO - Log &QSO + Guardar &QSO @@ -2037,12 +2064,12 @@ Error(%2): %3 <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> - <html><head/><body><p>Decodifica el período de RX más reciente en la frecuencia QSO</p></body></html> + <html><head/><body><p>Decodificar el período de RX más reciente en la frecuencia QSO</p></body></html> Decode most recent Rx period at QSO Frequency - Decodifica el período de RX más reciente en la frecuencia QSO + Decodificar el período de RX más reciente en la frecuencia QSO @@ -2067,7 +2094,7 @@ Error(%2): %3 Stop transmitting immediately - Deja de transmitir inmediatamente + Detiene TX inmediatamente @@ -2087,7 +2114,7 @@ Error(%2): %3 &Tune - &Sintonizar + &Tono TX @@ -2112,7 +2139,8 @@ Error(%2): %3 Rx Signal - Señal de RX + Señal de RX + Señal RX @@ -2133,7 +2161,8 @@ Amarillo cuando esta muy bajo. DX Grid - Locator/Grid DX + Locator/Grid DX + Locator DX @@ -2153,7 +2182,8 @@ Amarillo cuando esta muy bajo. Locator of station to be worked - Locator/Grid de la estación a trabajar + Locator/Grid de la estación a trabajar + Locator de la estación a trabajar @@ -2163,7 +2193,8 @@ Amarillo cuando esta muy bajo. Add callsign and locator to database - Agregar indicativo y locator/Grid a la base de datos + Agregar indicativo y locator/Grid a la base de datos + Agregar indicativo y locator a la base de datos @@ -2218,17 +2249,18 @@ Amarillo cuando esta muy bajo. <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> - <html><head/><body><p>Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto descodificado.</p></body></html> + <html><head/><body><p>Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto decodificado.</p></body></html> Check to keep Tx frequency fixed when double-clicking on decoded text. - Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto descodificado. + Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto decodificado. Hold Tx Freq - Mantén TX Freq + Mantén TX Freq + Mantener Freq TX @@ -2336,22 +2368,26 @@ Amarillo cuando esta muy bajo. Auto Seq - Secuencia Automática + Secuencia Automática + Secuencia Auto. <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> - <html><head/><body><p>Contesta al primer CQ decodificado.</p></body></html> + <html><head/><body><p>Responde al 1er. CQ decodificado.</p></body></html> + <html><head/><body><p>Activar para responder a la1ra estación decodificada.</p></body></html> Check to call the first decoded responder to my CQ. - Contesta al primer CQ decodificado. + Responde al 1er. CQ decodificado. + Responder al primer decodificado. Call 1st - Contesta al primer CQ + Responde al 1er. CQ + 1er decodificado @@ -2376,7 +2412,8 @@ Amarillo cuando esta muy bajo. Tx even/1st - Alternar periodo TX Par/Impar + Alternar periodo TX Par/Impar + TX segundo 00/30 @@ -2483,7 +2520,8 @@ Cuando no está marcado, puedes ver los resultados de la calibración. Report - Informe de señal + No -> Señal de Recepción + Reporte @@ -2534,17 +2572,17 @@ Cuando no está marcado, puedes ver los resultados de la calibración. <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> - <html><head/><body><p>Haz doble clic en otro indicativo que llama para poner en la cola esa llamada para tú próximo QSO.</p></body></html> + <html><head/><body><p>Haz doble clic en otro indicativo que llama para poner en la cola esa llamada para tú siguiente QSO.</p></body></html> Double-click on another caller to queue that call for your next QSO. - Haz doble clic en otro indicativo que llama para poner en la cola esa llamada para tú próximo QSO. + Haz doble clic en otro indicativo que llama para poner en la cola esa llamada para tú siguiente QSO. Next Call - Próximo Indicativo + Siguiente Indicativo @@ -2735,7 +2773,8 @@ Haz doble clic para restablecer el mensaje estándar 73. Generate Std Msgs - Genera Std Msgs + Genera Mensaje Standar + Genera Mensaje Estándar @@ -2757,7 +2796,7 @@ list. The list can be maintained in Settings (F2). Introduce un mensaje de texto libre (máximo 13 caracteres) o selecciona una macro predefinida de la lista desplegable. Presiona ENTRAR para agregar el texto actual al predefinido -de la lista. La lista se puede mantener en Configuración/Ajustes (F2). +de la lista. La lista se puede mantener en Configuración (F2). @@ -2767,7 +2806,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Next - Próximo + Siguiente @@ -2777,7 +2816,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Calling CQ - Llamada CQ + Llamando CQ @@ -2814,7 +2853,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Answering CQ - Respondiendo a CQ + Respondiendo CQ @@ -2825,7 +2864,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Grid - Locator/Grid + Locator solamente, Grid en inglés + Locator @@ -3046,12 +3086,14 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). <html><head/><body><p>6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> - <html><head/><body><p>Los Locator/Grid de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes.</p></body></html> + <html><head/><body><p>Los Locator/Grid de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes.</p></body></html> + <html><head/><body><p>Los Locator de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes.</p></body></html> 6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. - Los Locator/Grid de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes. + Los Locator/Grid de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes. + Los Locator de 6 dígitos hacen que se envíen 2 mensajes diferentes, el segundo contiene el locator completo, pero sólo un indicativo troceado, las otras estaciones deben haber decodificado el primero una vez antes de poder descodificar el segundo. Marca esta opción para enviar sólo locators de 4 dígitos y se evitará el protocolo de dos mensajes. @@ -3081,7 +3123,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). File - Fichero + Archivo @@ -3111,7 +3153,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Configurations - Configuraciones/Ajustes + No es valido utilizar Ajustes + Configuraciones @@ -3126,7 +3169,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Configuration - Configuración/Ajustes + Ajustes @@ -3166,12 +3209,12 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Shift+F6 - Shift+F6 + Mayúsculas+F6 Delete all *.wav && *.c2 files in SaveDir - Borra todos los archivos *.wav && *.c2 del directorio Guardar + Borrar todos los archivos *.wav y *.c2 @@ -3206,7 +3249,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Save decoded - Guarda el decodificado + Guarda el decodificado + Guardar decodificado @@ -3226,12 +3270,12 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Erase ALL.TXT - Borrar ALL.TXT + Borrar ALL.TXT Erase wsjtx_log.adi - Borrar el fichero wsjtx_log.adi + Borrar el archivo wsjtx_log.adi @@ -3256,7 +3300,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Clear DX Call and Grid after logging - Borrar Indicativo DX y Locator/Grid DX después de registrar un QSO + Borrar Indicativo DX y Locator/Grid DX después de registrar un QSO + Borrar Indicativo y Locator después de guardar QSO @@ -3283,7 +3328,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Runaway Tx watchdog - Vigilante de fuga TX + Seguridad de TX @@ -3333,7 +3378,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Settings... - Configuraciones/Ajustes... + Settings = Ajustes + Ajustes... @@ -3343,7 +3389,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Open log directory - Abrir directorio de registro + Abrir directorio de log @@ -3428,7 +3474,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Release Notes - Notas de lanzamiento + Cambios en la nueva versión @@ -3494,12 +3540,12 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Copyright notice - Aviso de Copyright + Derechos de Autor Shift+F1 - Shift+F1 + Mayúsculas+F1 @@ -3509,37 +3555,40 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). FT8 DXpedition Mode User Guide - Guía del usuario del modo FT8 DXpedition + Guía de usuario del modo FT8 DXpedition (inglés) Reset Cabrillo log ... - Restablecer registro de Cabrillo ... + Restablecer log de Cabrillo ... + Restablecer log Cabrillo ... Color highlighting scheme - Esquema de resaltado de color + Esquema de resaltado de color + Esquema de resaltado de colores Contest Log - Registro de Concurso + Log de Concurso Export Cabrillo log ... - Exportar registro de Cabrillo ... + Exportar log de Cabrillo ... + Exportar log Cabrillo ... Quick-Start Guide to WSJT-X 2.0 - Guía de inicio rápido para WSJT-X 2.0 + Guía de inicio rápido para WSJT-X 2.0 (inglés) Contest log - Registro de Concurso + Log de Concurso @@ -3571,12 +3620,12 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Error Scanning ADIF Log - Error al escanear el registro ADIF + Error al escanear el log ADIF Scanned ADIF log, %1 worked before records created - Registro ADIF escaneado, %1 funcionaba antes de la creación de registros + Log ADIF escaneado, %1 funcionaba antes de la creación de registros @@ -3591,7 +3640,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Configurations... - Configuraciones/Ajustes... + Conmfiguraciones... + Configuraciones... @@ -3643,7 +3693,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). File Open Error - Error de apertura de fichero + Error de apertura del archivo + Error al abrir archivo @@ -3657,7 +3708,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Error saving c2 file - Error al guardar el fichero c2 + Error al guardar el archivo c2 @@ -3696,7 +3747,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Status File Error - Error de estado del fichero + Error de estado del archivo @@ -3763,7 +3814,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). The "fmt.all" file will be renamed as "fmt.bak" - El fichero "fmt.all" será renombrado como "fmt.bak" + El archivo "fmt.all" será renombrado como "fmt.bak" @@ -3802,7 +3853,7 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). No more files to open. - No hay más ficheros para abrir. + No hay más archivos para abrir. @@ -3827,7 +3878,8 @@ de la lista. La lista se puede mantener en Configuración/Ajustes (F2). Last Tx: %1 - Última TX: %1 + Última TX: %1 + Últ TX: %1 @@ -3838,7 +3890,7 @@ To do so, check 'Special operating activity' and ¿Cambiar al modo Concurso VHF EU? Para hacerlo, marca 'Actividad operativa especial' y -'Concurso VHF EU' en la Configuración/Ajustes | Lengüeta avanzada. +'Concurso VHF EU' en la Configuración | Lengüeta avanzada. @@ -3861,7 +3913,8 @@ Para hacerlo, marca 'Actividad operativa especial' y Please enter a valid grid locator - Por favor, introduce un locator/Grid válido + Por favor, introduce un locator/Grid válido + Por favor escriba un locator válido @@ -3883,7 +3936,7 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Log file error - Error de archivo de registro + Error de archivo de log @@ -3893,7 +3946,7 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Error sending log to N1MM - Error al enviar el registro a N1MM + Error al enviar el log a N1MM @@ -3925,7 +3978,7 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Are you sure you want to erase file ALL.TXT? - ¿Estás seguro de que quieres borrar el archivo ALL.TXT? + ¿Estás seguro de que quiere borrar el archivo ALL.TXT? @@ -3936,17 +3989,18 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Are you sure you want to erase your contest log? - ¿Estás seguro de que quieres borrar el registro de tú concurso? + ¿Estás seguro de que quieres borrar el log de tú concurso? Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. - Hacer esto eliminará todos los registros de QSO para el concurso actual. Se guardarán en el archivo de registro de ADIF, pero no estarán disponibles para la exportación en su registro de Cabrillo. + Hacer esto eliminará todos los registros de QSO para el concurso actual. Se guardarán en el archivo log de ADIF, pero no estarán disponibles para la exportación en tú log de Cabrillo. Cabrillo Log saved - Cabrillo Log guardado + Cabrillo Log guardado + Log Cabrillo guardado @@ -3993,7 +4047,7 @@ Servidor UDP %2:%3 File Error - Error en fichero + Error en el archivo @@ -4014,7 +4068,7 @@ Servidor UDP %2:%3 Log File Error - Error de archivo de registro + Error de archivo log @@ -4050,7 +4104,7 @@ Servidor UDP %2:%3 Default - por defecto + Por defecto @@ -4063,12 +4117,14 @@ Servidor UDP %2:%3 &Clone - &Clon + &Clon + &Clonar Clone &Into ... - Clon &a ... + Clon &a ... + Clonar &a ... @@ -4083,37 +4139,44 @@ Servidor UDP %2:%3 &Delete - &Borrar + &Borrar + &Eliminar Clone Into Configuration - Clonar a la configuración + Clonar a la configuración + Clonar a la Configuración Confirm overwrite of all values for configuration "%1" with values from "%2"? - ¿Confirmas la sobrescritura de todos los valores para la configuración "%1" con valores de "%2"? + ¿Confirmas la sobrescritura de todos los valores para la configuración "%1" con valores de "%2"? + ¿Confirmar la sobrescritura de todos los valores para la configuración "%1" con los valores de "%2"? Reset Configuration - Restablecer configuración/ajuste + Restablecer configuración/ajuste + Restablecer configuración Confirm reset to default values for configuration "%1"? - ¿Quieres restablecer a los valores predeterminados para la configuración "%1"? + ¿Quieres restablecer a los valores predeterminados para la configuración "%1"? + ¿Restablecer a los valores predeterminados para la configuración "%1"? Delete Configuration - Eliminar configuración/ajuste + Eliminar configuración/ajuste + Eliminar configuración Confirm deletion of configuration "%1"? - ¿quieres eliminar la configuración/ajuste "%1"? + ¿quieres eliminar la configuración "%1"? + ¿Eliminar la configuración "%1"? @@ -4131,7 +4194,8 @@ Servidor UDP %2:%3 &New name: - &Nombre Nuevo: + &Nombre Nuevo: + Nuevo &Nombre: @@ -4217,7 +4281,7 @@ Servidor UDP %2:%3 Error opening waterfall palette file "%1": %2. - Error al abrir el archivo de paleta en cascada "%1": %2. + Error al abrir el archivo de paleta en cascada "%1": %2. @@ -4568,7 +4632,8 @@ Error(%2): %3 Spec - Espec + Espec + Espec @@ -4588,7 +4653,7 @@ Error(%2): %3 Ref Spec - Ref Espec + Ref Espec @@ -4603,7 +4668,7 @@ Error(%2): %3 Compression factor for frequency scale - Factor de compresión para escala de frecuencia + Factor de compresión para escala de frecuencia @@ -4613,7 +4678,7 @@ Error(%2): %3 Select waterfall palette - Seleccionar paleta de cascada + Seleccionar Paleta de la cascasa @@ -4633,7 +4698,8 @@ Error(%2): %3 Linear Avg - Promedio lineal + Promedio lineal + Linear Avg @@ -4653,7 +4719,8 @@ Error(%2): %3 Start - Empezar + Empezar + Inicio @@ -4678,7 +4745,8 @@ Error(%2): %3 N Avg - Promedio N + Promedio N + N Avg @@ -4693,13 +4761,14 @@ Error(%2): %3 Wide Graph - Gráfico amplio + Gráfico amplio + Cascada - Waterfall Read Palette - Leer paleta + Leer Paleta @@ -4707,7 +4776,8 @@ Error(%2): %3 Settings - Configuraciones/Ajustes + Ajustes en lugar de Configuración + Ajustes @@ -4717,7 +4787,7 @@ Error(%2): %3 General station details and settings. - Detalles generales de la estación y configuraciones/ajustes. + Detalles generales de la estación, configuraciones y ajustes. @@ -4737,22 +4807,26 @@ Error(%2): %3 M&y Grid: - M&i Locator/Grid: + M&i Locator/Grid: + M&y Locator: <html><head/><body><p>Maidenhead locator, preferably 6 characters.</p></body></html> - <html><head/><body><p>Locator/Grid tipo Maidenhead, preferiblemente 6 caracteres.</p></body></html> + <html><head/><body><p>Locator/Grid tipo Maidenhead, preferiblemente 6 caracteres.</p></body></html> + <html><head/><body><p>Locator, preferiblemente 6 caracteres.</p></body></html> Check to allow grid changes from external programs - Marca para permitir cambios de Locator/Grid de programas externos + Marca para permitir cambios de Locator/Grid de programas externos + Marca para permitir cambios de locator por programas externos AutoGrid - Locator/Grid automático + Locator/Grid automático + AutoLocator @@ -4782,7 +4856,7 @@ Error(%2): %3 Full call in Tx3 - Indicativo completo en TX5 + Indicativo completo en TX3 @@ -4792,7 +4866,8 @@ Error(%2): %3 Display - Monitor + Monitor + Mostrar @@ -4802,7 +4877,8 @@ Error(%2): %3 &Tx messages to Rx frequency window - &Mensajes de texto en la ventana de frecuencia RX + &Mensajes de texto en la ventana de frecuencia RX + &Mensajes de TX en la ventana Frecuencia RX @@ -4812,7 +4888,8 @@ Error(%2): %3 Show &DXCC, grid, and worked-before status - Mostrar &DXCC, Locator/Grid y si se ha trabajado antes + Mostrar &DXCC, Locator/Grid y si se ha trabajado antes + Mostrar &DXCC, locator y estatus trabajado B4 @@ -4847,7 +4924,8 @@ Error(%2): %3 Decoded Text Font... - Tipo de fuente en el área de decodificada ... + Tipo de fuente en el área de decodificada ... + Fuente Decodificados... @@ -4877,12 +4955,14 @@ Error(%2): %3 Decode after EME delay - Decodificar después del retardo de EME + Decodificar después del retardo de EME + Decodificar después de retardo EME Tx watchdog: - TX Vigilante: + Seguridad de TX: + Control de TX: @@ -4907,7 +4987,8 @@ Error(%2): %3 Single decode - Decodificación individual + Decodificación individual + Una sola decodificación @@ -4917,7 +4998,8 @@ Error(%2): %3 Allow Tx frequency changes while transmitting - Permitir cambios de frecuencia de transmisión mientras se transmite + Permitir cambios de frecuencia de transmisión mientras se transmite + Permitir cambios de frecuencia TX mientras se transmite @@ -4964,12 +5046,14 @@ cualquier otro mensaje de texto libre. CW ID a&fter 73 - ID de CW d&espués de 73 + ID de CW d&espués de 73 + ID en CW d&espués de 73 Periodic CW ID Inter&val: - Inter&valo de ID de CW periódico: + Inter&valo de ID de CW periódico: + Inter&valo de ID en CW: @@ -4990,12 +5074,14 @@ período tranquilo cuando se realiza la decodificación. Doubl&e-click on call sets Tx enable - Haz dobl&e clic en los conjuntos de indicativos de habilitación de TX + Haz dobl&e clic en los conjuntos de indicativos de habilitación de TX + Dobl&e clic en indicativo activa TX Calling CQ forces Call 1st - Llamar a CQ obliga a llamar primero + Llamar a CQ obliga a llamar primero + Llamar CQ habilita 1er decodificado @@ -5010,7 +5096,7 @@ período tranquilo cuando se realiza la decodificación. Settings that control your CAT interface. - Configuraciones que controlan tú interfaz CAT. + Ajustes que controlan tú interfaz CAT. @@ -5122,7 +5208,7 @@ período tranquilo cuando se realiza la decodificación. Default - por defecto + Por defecto @@ -5182,7 +5268,8 @@ unos pocos, particularmente algunos equipos de Kenwood, lo requieren. Force Control Lines - Líneas de control de fuerza + Líneas de control de fuerza + Forzar @@ -5326,7 +5413,8 @@ esta configuración/ajuste te permite seleccionar qué entrada de audio se usar Transmit Audio Source - Fuente de audio de transmisión + Fuente de audio de transmisión + Fuente de salida de audio @@ -5366,7 +5454,8 @@ esta configuración/ajuste te permite seleccionar qué entrada de audio se usar Test CAT - Test de CAT + Test de CAT + Probar CAT @@ -5384,17 +5473,20 @@ interfaz de radio se comporta como se espera. Test PTT - Test de PTT + Test de PTT + Probar PTT Split Operation - Operación dividida (Split) + Operación dividida (Split) + Operación en Split Fake It - Fíngelo + Fíngelo + Fingir Split @@ -5409,7 +5501,7 @@ interfaz de radio se comporta como se espera. Audio interface settings - Configuraciones del interfaz de audio + Ajustes del interfaz de audio @@ -5503,7 +5595,7 @@ ambos canales. Path to which .WAV files are saved. - Ruta en la que se guardan los ficheros .WAV. + Ruta en la que se guardan los archivos .WAV. @@ -5545,12 +5637,13 @@ ambos canales. Remember power settings by band - Recuerde los ajustes de potencia por banda + Recuerde los ajustes de potencia por banda + Recordar ajustes de potencia por banda Enable power memory during transmit - Habilitar memoria de poténcia durante la transmisión + Habilitar memoria de potencia durante la transmisión @@ -5560,12 +5653,12 @@ ambos canales. Enable power memory during tuning - Habilitar memoria de poténcia durante la sintonización + Habilitar memoria de potencia durante la sintonización Tune - Sintonizar + Tono TX @@ -5594,22 +5687,23 @@ Right click for item specific actions Click, SHIFT+Click and, CRTL+Click to select items Arrastra y suelta elementos para reorganizar el orden Haz clic derecho para acciones específicas del artículo. -Click, SHIFT+Click y, CTRL+Click para seleccionar elementos. +Clic, Mayúsculas+Clic y, CTRL+Clic para seleccionar elementos. Reportin&g - Informe&s + Informe&s Reporting and logging settings - Configuración/ajuste de informes y registros + Ajuste de informes y logs Logging - Registros + Registros + Log @@ -5619,7 +5713,8 @@ Click, SHIFT+Click y, CTRL+Click para seleccionar elementos. Promp&t me to log QSO - Regis&tra el QSO + Regis&tra el QSO + Preguntarme para guardar el QSO @@ -5632,7 +5727,7 @@ Click, SHIFT+Click y, CTRL+Click para seleccionar elementos. saved by this program. Check this option to save the sent and received reports in the comments field. - Algunos programas de registro no aceptarán el tipo de informes + Algunos programas de log no aceptarán el tipo de informes guardado por este programa. Marca esta opción para guardar los informes enviados y recibidos en el campo de comentarios. @@ -5640,24 +5735,28 @@ el campo de comentarios. d&B reports to comments - Informes de los d&B en los comentarios + Informes de los d&B en los comentarios + Guardar reportes d&B en los comentarios Check this option to force the clearing of the DX Call and DX Grid fields when a 73 or free text message is sent. - Marca esta opción para forzar la eliminación de los campos -Llamada DX y Locator/Grid DX cuando se envía un mensaje de texto 73 o libre. + Marca esta opción para forzar la eliminación de los campos +Llamada DX y Locator/Grid DX cuando se envía un mensaje de texto 73 o libre. + Marca esta opción para eliminar los campos +Indicativo DX y Locator DX cuando se envíe un 73 o un mensaje de texto libre. Clear &DX call and grid after logging - Borrar la Llamada &DX y Locator/Grid después del registro + Borrar la Llamada &DX y Locator/Grid después del registro + Borrar Indicativo &DX y locator después de guardado el QSO <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> - <html><head/><body><p>Algunos programas de registro no aceptarán nombres de modo WSJT-X.</p></body></html> + <html><head/><body><p>Algunos programas de log no aceptarán nombres de modo WSJT-X.</p></body></html> @@ -5677,7 +5776,8 @@ Llamada DX y Locator/Grid DX cuando se envía un mensaje de texto 73 o libre. Log automatically (contesting only) - Registro automático (sólo concursos) + Log automático (sólo concursos) + Guardar QSO automáticamente (sólo concursos) @@ -5690,7 +5790,7 @@ Llamada DX y Locator/Grid DX cuando se envía un mensaje de texto 73 o libre. - El programa puede enviar los detalles de su estación y todas las + El programa puede enviar los detalles de su estación y todas las señales decodificadas como puntos en el sitio web http://pskreporter.info. Esto se utiliza para el análisis de baliza inversa que es muy útil para evaluar la propagación y el rendimiento del sistema. @@ -5698,7 +5798,8 @@ para evaluar la propagación y el rendimiento del sistema. Enable &PSK Reporter Spotting - Activa &PSK Reporter + Activa &PSK Reporter + Activar "spotting" en &PSK Reporter @@ -5768,7 +5869,8 @@ para evaluar la propagación y el rendimiento del sistema. Enable logged contact ADIF broadcast - Habilita la transmisión ADIF de contacto registrado + Habilita la transmisión ADIF de contacto registrado + Habilita transmisión ADIF de contacto guardado @@ -5803,7 +5905,7 @@ para evaluar la propagación y el rendimiento del sistema. <html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html> - <html><head/><body><p>Ver&quot;Calibración de Frecuencia&quot;en la Guía del usuario de WSJT-X para obtener detalles sobre cómo determinar estos parámetros para tú equipo.</p></body></html> + <html><head/><body><p>Ver&quot;Calibración de Frecuencia&quot;en la Guía de usuario de WSJT-X para obtener detalles sobre cómo determinar estos parámetros para tú equipo.</p></body></html> @@ -5813,7 +5915,8 @@ para evaluar la propagación y el rendimiento del sistema. Slope: - Pendiente: + Pendiente: + Cadencia: @@ -5823,7 +5926,8 @@ para evaluar la propagación y el rendimiento del sistema. Intercept: - Interceptar: + Interceptar: + Intercepción: @@ -5870,7 +5974,8 @@ Haz clic derecho para insertar y eliminar opciones. Rescan ADIF Log - Escaneo de nuevo el registro ADIF + Escaneo de nuevo el log ADIF + Procesar nuevamente log ADIF @@ -5910,7 +6015,8 @@ Haz clic derecho para insertar y eliminar opciones. Only grid Fields sought - Solo campos de Locator/Grid buscados + Solo campos de Locator/Grid buscados + Solo campos de locator buscados @@ -5925,12 +6031,13 @@ Haz clic derecho para insertar y eliminar opciones. Users CSV file URL: - URL del fichero CSV de los usuarios: + URL del archivo CSV de los usuarios: + Enlace del archivo CSV de los usuarios: <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> - <html><head/><body><p>URL del último fichero de datos de fechas y horas de carga de ARRL LotW que se utiliza para resaltar decodificaciones de estaciones que se sabe que cargan su archivo de registro a LotW.</p></body></html> + <html><head/><body><p>URL del último archivo de datos de fechas y horas de carga de ARRL LotW que se utiliza para resaltar decodificaciones de estaciones que se sabe que cargan su archivo de log a LotW.</p></body></html> @@ -5940,7 +6047,7 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> - <html><head/><body><p>Presiona este botón para obtener el último fichero de datos de fecha y hora de carga de los usuarios de LotW.</p></body></html> + <html><head/><body><p>Presiona este botón para obtener el último archivo de datos de fecha y hora de carga de los usuarios de LotW.</p></body></html> @@ -5950,7 +6057,8 @@ Haz clic derecho para insertar y eliminar opciones. Age of last upload less than: - Edad de la última carga inferior a: + Edad de la última carga inferior a: + Fecha última subida a LoTW inferior a: @@ -5975,7 +6083,8 @@ Haz clic derecho para insertar y eliminar opciones. JT65 VHF/UHF/Microwave decoding parameters - Parámetros de decodificación JT65 VHF/UHF/Microondas + Parámetros de decodificación JT65 VHF/UHF/Microondas + Parámetros decodificación JT65 VHF/UHF/Microondas @@ -6000,12 +6109,14 @@ Haz clic derecho para insertar y eliminar opciones. Two-pass decoding - Decodificación de dos pasos + Decodificación de dos pasos + Decodificación en dos pasos Special operating activity: Generation of FT4, FT8, and MSK144 messages - Actividad operativa especial: generación de mensajes FT4, FT8 y MSK144 + Actividad operativa especial: generación de mensajes FT4, FT8 y MSK144 + Actividad operativa especial: Generación de mensajes FT4, FT8 y MSK144 @@ -6045,7 +6156,8 @@ Haz clic derecho para insertar y eliminar opciones. EU VHF Contest - Concurso EU de VHF + Concurso EU de VHF + Concurso EU VHF @@ -6056,7 +6168,8 @@ Haz clic derecho para insertar y eliminar opciones. RTTY Roundup messages - Mensajes de resumen de RTTY + Mensajes de resumen de RTTY + Mensajes RTTY Roundup @@ -6102,12 +6215,13 @@ Haz clic derecho para insertar y eliminar opciones. Miscellaneous - Diverso + Diverso + Otros Degrade S/N of .wav file: - Degradar S/N del fichero .wav: + Degradar S/N del archivo .wav: @@ -6153,7 +6267,7 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html> - <html><head/><body><p>Genera el audio de TX con el doble del espaciado de tono normal. Destinado a transmisores especiales de LF/MF que usan una división por 2 antes de generar RF.</p></body></html> + <html><head/><body><p>Genera el audio de TX con el doble del espaciado de tono normal. Destinado a transmisores especiales de LF/MF que usan una división por 2 antes de generar RF.</p></body></html> @@ -6213,7 +6327,8 @@ Haz clic derecho para insertar y eliminar opciones. rig-name - Nombre del equipo + No se puede traducir esta parte, es parte del código + rig-name @@ -6223,7 +6338,7 @@ Haz clic derecho para insertar y eliminar opciones. configuration - Configuración/Ajustes + Ajustes @@ -6233,7 +6348,8 @@ Haz clic derecho para insertar y eliminar opciones. language - Idioma + "I" minúscula + idioma diff --git a/translations/wsjtx_ja.ts b/translations/wsjtx_ja.ts index 41b32845b..f88fd17fd 100644 --- a/translations/wsjtx_ja.ts +++ b/translations/wsjtx_ja.ts @@ -888,6 +888,16 @@ Format: Directory + + + File + ファイル + + + + Progress + 進捗 + @@ -1076,7 +1086,7 @@ Error: %2 - %3 Phase (Π) - + 位相 (Π) @@ -1444,26 +1454,26 @@ Error: %2 - %3 FrequencyList_v2 - - + + IARU Region IARU地域 - - + + Mode モード - - + + Frequency 周波数 - - + + Frequency (MHz) 周波数(MHz) @@ -1584,152 +1594,152 @@ Error: %2 - %3 サポートしていないCATタイプ - + Hamlib error: %1 while %2 Hamlibエラー: %1 %2 - + opening connection to rig 無線機への接続 - + getting current frequency 現周波数を取得 - + getting current mode 現モードを取得 - - + + exchanging VFOs VFO入れ替え - - + + getting other VFO frequency もう一方のVFOの周波数を取得 - + getting other VFO mode もう一方のVFOのモードを取得 - + setting current VFO 現VFOを設定 - + getting frequency 周波数を取得 - + getting mode モードを取得 - - + + getting current VFO 現VFOを取得 - - - - + + + + getting current VFO frequency 現VFOの周波数を取得 - - - - - - + + + + + + setting frequency 周波数を設定 - - - - + + + + getting current VFO mode 現VFOのモードを取得 - - - - - + + + + + setting current VFO mode 現VFOモードを設定 - - + + setting/unsetting split mode スプリットのオン/オフ - - + + setting split mode スプリットモードオン - + setting split TX frequency and mode スプリット送信周波数とモードをセット - + setting split TX frequency スプリット送信周波数をセット - + getting split TX VFO mode スプリットモードを取得 - + setting split TX VFO mode スプリット送信VFOのモードをセット - + getting PTT state PTT状態を取得 - + setting PTT on PTTオン - + setting PTT off PTTオフ - + setting a configuration item コンフィグレーション項目をセット - + getting a configuration item コンフィグレーション項目を取得 @@ -1940,12 +1950,12 @@ Error(%2): %3 - - - - - - + + + + + + Band Activity バンド状況 @@ -1957,11 +1967,11 @@ Error(%2): %3 - - - - - + + + + + Rx Frequency 受信周波数 @@ -2266,12 +2276,12 @@ Yellow when too low ▲ - + ▼ - + @@ -2315,7 +2325,7 @@ Yellow when too low - + Fast 高速 @@ -2332,7 +2342,7 @@ Yellow when too low Auto Seq - 自動シーケンス + 自動シーケンス @@ -2423,7 +2433,7 @@ Not available to nonstandard callsign holders. - + Fox Fox @@ -3133,415 +3143,415 @@ ENTERを押してテキストを登録リストに追加. WSJT-Xについて - + Waterfall ウォーターフォール - + Open 開く - + Ctrl+O - + Open next in directory ディレクトリ中の次のファイルを開く - + Decode remaining files in directory ディレクトリ中の残りのファイルをデコード - + Shift+F6 - + Delete all *.wav && *.c2 files in SaveDir SaveDirのすべての*.wavと*.c2ファイルを削除 - + None 無し - + Save all すべて保存 - + Online User Guide オンラインユーザーガイド - + Keyboard shortcuts キーボードショートカット - + Special mouse commands 特別なマウス操作 - + JT9 - + Save decoded デコードしたメッセージを保存 - + Normal 標準 - + Deep ディープ - + Monitor OFF at startup 起動時モニターオフ - + Erase ALL.TXT ALL.TXTを消去 - + Erase wsjtx_log.adi wsjtx_log.adiを消去 - + Convert mode to RTTY for logging ログのためモードをRTTYに変換 - + Log dB reports to Comments dBレポートをコメントに記録 - + Prompt me to log QSO QSOをログするとき知らせる - + Blank line between decoding periods デコードタイミング間に空白行を入れる - + Clear DX Call and Grid after logging ログした後、DXコールサインとグリッドをクリア - + Display distance in miles 距離をマイルで表示 - + Double-click on call sets Tx Enable コールサインをダブルクリックして送信オン - - + + F7 - + Tx disabled after sending 73 73を送った後送信禁止 - - + + Runaway Tx watchdog Txウオッチドッグ発令 - + Allow multiple instances 複数のインスタンス起動許可 - + Tx freq locked to Rx freq 送信周波数を受信周波数にロック - + JT65 - + JT9+JT65 - + Tx messages to Rx Frequency window 送信メッセージを受信周波数ウィンドウへ - + Gray1 - + Show DXCC entity and worked B4 status DXCCエンティティと交信済みステータスを表示 - + Astronomical data 天文データ - + List of Type 1 prefixes and suffixes タイプ1プリフィックス、サフィックスのリスト - + Settings... 設定... - + Local User Guide 各国版ユーザーガイド - + Open log directory ログディレクトリを開く - + JT4 - + Message averaging メッセージ平均化 - + Enable averaging 平均化オン - + Enable deep search ディープサーチをオン - + WSPR WSPR - + Echo Graph エコーグラフ - + F8 - + Echo Echo - + EME Echo mode EMEエコーモード - + ISCAT - + Fast Graph 高速グラフ - + F9 - + &Download Samples ... サンプルをダウンロード(&D)... - + <html><head/><body><p>Download sample audio files demonstrating the various modes.</p></body></html> <html><head/><body><p>いろいろなモードのオーディオファイルをダウンロード.</p></body></html> - + MSK144 - + QRA64 - + Release Notes リリースノート - + Enable AP for DX Call DXコールのAPをオン - + FreqCal - + Measure reference spectrum 参照スペクトラムを測定 - + Measure phase response 位相応答を測定 - + Erase reference spectrum 参照スペクトラムを消去 - + Execute frequency calibration cycle 周波数較正実行 - + Equalization tools ... イコライザー... - + WSPR-LF WSPR-LF - + Experimental LF/MF mode 実験的LF/MFモード - + FT8 - - + + Enable AP AP使用 - + Solve for calibration parameters 較正パラメータ計算 - + Copyright notice 著作権表示 - + Shift+F1 - + Fox log Foxログ - + FT8 DXpedition Mode User Guide FT8 DXペディションモードユーザーガイド - + Reset Cabrillo log ... Cabrilloログをリセット... - + Color highlighting scheme ハイライト設定 - + Contest Log コンテストログ - + Export Cabrillo log ... Cabrilloログをエクスポート... - + Quick-Start Guide to WSJT-X 2.0 WSJT-X 2.0クイックスタートガイド - + Contest log コンテストログ - + Erase WSPR hashtable WSPRハッシュテーブルを消去 - + FT4 @@ -3552,8 +3562,8 @@ ENTERを押してテキストを登録リストに追加. - - + + Receiving 受信中 @@ -3589,21 +3599,21 @@ ENTERを押してテキストを登録リストに追加. - - - - - + + + + - + - + - + - + - + + Message メッセージ @@ -3629,22 +3639,22 @@ ENTERを押してテキストを登録リストに追加. - + Improper mode 不適切なモード - + File Open Error ファイルオープンエラー - - - - + + + + Cannot open "%1" for append: %2 "%2"を追加する"%1"が開けません @@ -3665,15 +3675,15 @@ ENTERを押してテキストを登録リストに追加. - - + + Single-Period Decodes シングルパスデコード - - + + Average Decodes 平均デコード @@ -3694,7 +3704,7 @@ ENTERを押してテキストを登録リストに追加. - + Cannot open "%1" for writing: %2 %2を書き込むための"%1"が開けません @@ -3743,7 +3753,7 @@ ENTERを押してテキストを登録リストに追加. %7%L8 %9%L10 Hz</pre> - + @@ -3760,7 +3770,7 @@ ENTERを押してテキストを登録リストに追加. If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: "The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." - + @@ -3793,32 +3803,32 @@ ENTERを押してテキストを登録リストに追加. これ以上開くファイルがありません. - + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. 他の送信周波数を使ってください. WSJT-Xは30mバンドのWSPRサブバンド中の他のモードを受信せずに送信してしまいます. - + WSPR Guard Band WSPRガードバンド - + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. 他のダイヤル周波数を使ってください. WSJT-XはFT8の標準サブバンドでFoxモードを使えません。 - + Fox Mode warning Foxモード警告 - + Last Tx: %1 最終送信: %1 - + Should you switch to EU VHF Contest mode? To do so, check 'Special operating activity' and @@ -3828,183 +3838,183 @@ To do so, check 'Special operating activity' and 設定|詳細タブで設定変更してください. - + Should you switch to ARRL Field Day mode? ARRLフィールドデーモードに切り替えますか? - + Should you switch to RTTY contest mode? RTTYコンテストモードに切り替えますか? - - - - + + + + Add to CALL3.TXT CALL3.TXTへ追加 - + Please enter a valid grid locator 有効なグリッドロケータを入力してください - + Cannot open "%1" for read/write: %2 %2を読み書きするための"%1"が開けません - + %1 is already in CALL3.TXT, do you wish to replace it? %1 がすでにCALL3.TXTにセットされています。置き換えますか? - + Warning: DX Call field is empty. 警告 DXコールが空白です. - + Log file error ログファイルエラー - + Cannot open "%1" "%1"を開けません - + Error sending log to N1MM N1MMへログを送れません - + Write returned "%1" 応答"%1"を書き込み - + Stations calling DXpedition %1 DXペディション %1を呼ぶ局 - + Hound Hound - + Tx Messages 送信メッセージ - - - + + + Confirm Erase 消去確認 - + Are you sure you want to erase file ALL.TXT? ALL.TXTファイルを消去してよいですか? - - + + Confirm Reset リセット確認 - + Are you sure you want to erase your contest log? コンテストログを消去していいですか? - + Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. 現在のコンテストのQSO記録をすべて消去します。ADIFログには記録されますがCabrilloログにエクスポートすることはできません. - + Cabrillo Log saved Cabrilloログ保存しました - + Are you sure you want to erase file wsjtx_log.adi? wsjtx_log.adiを消してもよいですか? - + Are you sure you want to erase the WSPR hashtable? WSPRのハッシュテーブルを消してもよいですか? - + VHF features warning VHF機能警告 - + Tune digital gain チューンのデジタルゲイン - + Transmit digital gain 送信デジタルゲイン - + Prefixes プリフィックス - + Network Error ネットワークエラー - + Error: %1 UDP server %2:%3 エラー %1 UDPサーバー %2:%3 - + File Error ファイルエラー - + Phase Training Disabled 位相調整オフ - + Phase Training Enabled 位相調整オン - + WD:%1m WD:%1m - - + + Log File Error ログファイルエラー - + Are you sure you want to clear the QSO queues? QSO待ち行列をクリアしてもいいですか? @@ -4134,19 +4144,19 @@ UDPサーバー %2:%3 OmniRig COMサーバーが開始できません - - + + OmniRig: don't know how to set rig frequency OmniRigが無線機周波数をセットできません - - + + OmniRig: timeout waiting for update from rig OmniRig: 無線機からの応答タイムアウト - + OmniRig COM/OLE error: %1 at %2: %3 (%4) OmniRig COM/OLEエラー: %1 at %2 %3 (%4) @@ -4162,9 +4172,8 @@ UDPサーバー %2:%3 QObject - Invalid rig name - \ & / not allowed - 無効な名前 - \ & / は使えません + 無効な名前 - \ & / は使えません @@ -4299,6 +4308,36 @@ Error(%2): %3 Download Samples サンプルをダウンロード + + + &Abort + 中止(&A) + + + + &Refresh + 再読み込み(&R) + + + + &Details + 詳細(&D) + + + + Base URL for samples: + サンプルのURL: + + + + Only use HTTP: + HTTPのみ使用: + + + + Check this is you get SSL/TLS errors + + Input Error @@ -6175,114 +6214,92 @@ Right click for insert and delete options. main - + Fatal error 致命的エラー - + Unexpected fatal error 予期せぬ致命的エラー - Where <rig-name> is for multi-instance support. - ここで<rig-name>は複数インスタンスのサポート. + ここで<rig-name>は複数インスタンスのサポート. - - rig-name - - - - Where <configuration> is an existing one. - ここで<configuration>はすでに設定済みのもの. + ここで<configuration>はすでに設定済みのもの. - - configuration - - - - Where <language> is <lang-code>[-<country-code>]. - ここで<language>は<lang-code>[-<country-code>]. + ここで<language>は<lang-code>[-<country-code>]. - - language - - - - Writable files in test location. Use with caution, for testing only. - テスト用書き込み可能ファイル. 注意してテストだけに使うこと. + テスト用書き込み可能ファイル. 注意してテストだけに使うこと. - Command line error - コマンドラインエラー + コマンドラインエラー + + + Command line help + コマンドラインヘルプ + + + Application version + アプリのバージョン - Command line help - コマンドラインヘルプ - - - - Application version - アプリのバージョン - - - Another instance may be running おそらく他のインスタンスが動作中 - + try to remove stale lock file? 古いロックファイルの削除を試みますか? - + Failed to create a temporary directory 一時的作業ディレクトリーが作成できません - - + + Path: "%1" パス:"%1" - + Failed to create a usable temporary directory 一時的作業ディレクトリが作成できません - + Another application may be locking the directory おそらく他のアプリがディレクトリをロックしています - + Failed to create data directory データ用ディレクトリの作成ができません - + path: "%1" パス: "%1" - + Shared memory error 共有メモリエラー - + Unable to create shared memory segment 共有メモリセグメントが作成できません From 05cd8b3462239d0cc0f48af9c322664b5f228fd1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 4 Jun 2020 11:32:19 -0400 Subject: [PATCH 13/19] Improved logic for the way "Lookup" is processed. --- widgets/mainwindow.cpp | 25 ++++++++++++++++--------- widgets/mainwindow.h | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 37dad9ebc..bfe28899e 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -2065,7 +2065,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e) break; case Qt::Key_L: if(e->modifiers() & Qt::ControlModifier) { - lookup(); + lookup(true); genStdMsgs(m_rpt); return; } @@ -4912,12 +4912,10 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie // i.e. compound version of same base call ui->dxCallEntry->setText (hiscall); } - if (hisgrid.contains (grid_regexp)) { if(ui->dxGridEntry->text().mid(0,4) != hisgrid) ui->dxGridEntry->setText(hisgrid); } - if (!ui->dxGridEntry->text ().size ()) - lookup(); + lookup(false); m_hisGrid = ui->dxGridEntry->text(); QString rpt = message.report(); @@ -5325,9 +5323,10 @@ void MainWindow::clearDX () m_QSOProgress = CALLING; } -void MainWindow::lookup() //lookup() +void MainWindow::lookup(bool lookupButtonClicked) { QString hisCall {ui->dxCallEntry->text()}; + QString hisgrid0 {ui->dxGridEntry->text()}; if (!hisCall.size ()) return; QFile f {m_config.writeable_data_dir ().absoluteFilePath ("CALL3.TXT")}; if (f.open (QIODevice::ReadOnly | QIODevice::Text)) @@ -5337,7 +5336,13 @@ void MainWindow::lookup() //lookup() for(int i=0; i<999999; i++) { n=f.readLine(c,sizeof(c)); if(n <= 0) { - ui->dxGridEntry->clear (); + if(lookupButtonClicked) { + QString msg=hisCall + tr(" not found in CALL3.TXT"); + MessageBox::information_message (this, msg); + } + if(!hisgrid0.contains(grid_regexp)) { + ui->dxGridEntry->clear(); + } break; } QString t=QString(c); @@ -5348,9 +5353,11 @@ void MainWindow::lookup() //lookup() if(i1>0) { hisgrid=hisgrid.mid(0,4); } else { - hisgrid=hisgrid.mid(0,4) + hisgrid.mid(4,2).toLower(); + hisgrid=hisgrid.mid(0,6).toUpper(); + } + if(hisgrid.left(4)==hisgrid0.left(4) or (hisgrid0.size()==0)) { + ui->dxGridEntry->setText(hisgrid); } - ui->dxGridEntry->setText(hisgrid); break; } } @@ -5360,7 +5367,7 @@ void MainWindow::lookup() //lookup() void MainWindow::on_lookupButton_clicked() //Lookup button { - lookup(); + lookup(true); } void MainWindow::on_addButton_clicked() //Add button diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 969993098..7a32c9d97 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -700,7 +700,7 @@ private: void genStdMsgs(QString rpt, bool unconditional = false); void genCQMsg(); void clearDX (); - void lookup(); + void lookup(bool lookupButtonClicked); void ba2msg(QByteArray ba, char* message); void msgtype(QString t, QLineEdit* tx); void stub(); From a906962903ef09d049926638bbcf2e5fe2b67c0a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 4 Jun 2020 20:08:07 +0100 Subject: [PATCH 14/19] Italian UI translation, tnx Marco, PY1ZRJ --- CMakeLists.txt | 1 + translations/wsjtx_it.ts | 6306 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 6307 insertions(+) create mode 100644 translations/wsjtx_it.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e5dd58ba..3dbdb82e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1107,6 +1107,7 @@ set (LANGUAGES ja # Japanese zh # Chinese zh_HK # Chinese per Hong Kong + it # Italian ) foreach (lang_ ${LANGUAGES}) file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/translations/wsjtx_${lang_}.ts ts_) diff --git a/translations/wsjtx_it.ts b/translations/wsjtx_it.ts new file mode 100644 index 000000000..925c411ee --- /dev/null +++ b/translations/wsjtx_it.ts @@ -0,0 +1,6306 @@ + + + + + AbstractLogWindow + + + &Delete ... + &Elimina ... + + + + AbstractLogWindow::impl + + + Confirm Delete + Confermi Elimina + + + + Are you sure you want to delete the %n selected QSO(s) from the log? + + Sei sicuro di voler cancellare il %n selezionato QSO dal log? + Sei sicuro di voler cancellare i %n selezionati QSO dal log? + + + + + Astro + + + + Doppler tracking + Tracciamento Doppler + + + + <html><head/><body><p>One station does all Doppler shift correction, their QSO partner receives and transmits on the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>Una stazione fa tutta tutta la correzione Doppler shift, il loro partner di QSO riceve e trasmette sulla frequenza di sked.</p><p>Se il rig not accetta i comandi CAT QSY mentre è in trasmissione viene applicata una singola correzione per l'intero periodo transmesso.</p></body></html> + + + + Full Doppler to DX Grid + Doppler Pieno alal Griglia DX + + + + <html><head/><body><p>Transmit takes place on sked frequency and receive frequency is corrected for own echoes. </p><p>This mode can be used for calling CQ, or when using Echo mode.</p></body></html> + <html><head/><body><p>La trasmissione ha luogo sulla frequenza di sked e la frequenza di ricezione viene corretta per i propri echi. </p><p>Questo modo può essere usato per chiamare CQ o quando si usa il modo Eco.</p></body></html> + + + + Own Echo + Proprio Eco + + + + <html><head/><body><p>Both stations correct for Doppler shift such that they would be heard on the moon at the sked frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p><p>Use this option also for Echo mode.</p></body></html> + <html><head/><body><p>Entrambe le stazioni correggono per lo shift Doppler in modo che esse sarebbero ascoltate sulla luna alla frequenza di sked.</p><p>Se il rig non accetta i comandi CAT QSY durante la trasmissione una correzione singola viene applicata per l'intero periodo di trasmissione.</p><p>Usare questa opzione anche per il modo Eco.</p></body></html> + + + + Constant frequency on Moon + Frequenza costante sulla Luna + + + + <html><head/><body><p>DX station announces their TX Freq, which is entered as the Sked Freq. Correction applied to RX and TX so you appear on the DX's station's own echo Freq.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>La stazione DX annuncia la sua TX Freq, la quale è inserita come frequenza di Sked La correzione à applicata a RX e TX così appari sulla propria frequenza di Eco della stazione DX</p><p>Se il rig non accetta i comandi CAT QSY durante la trasmissione una correzione singola viene applicata per l'intero periodo di trasmissione.</p></body></html> + + + + On DX Echo + Su Eco DX + + + + <html><head/><body><p>Tune radio manually and select this mode to put your echo on the same frequency.</p><p>If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.</p></body></html> + <html><head/><body><p>Sintonizza la radio manualmente e seleziona questo modoper mettere il tuo ecosulla stessa frequenza.</p><p>Se il rig non accetta i comandi CAT QSY durante la trasmissione una correzione singola viene applicata per l'intero periodo di trasmissione.</p></body></html> + + + + Call DX + Chiama DX + + + + <html><head/><body><p>No Doppler shift correction is applied. This may be used when the QSO partner does full Doppler correction to your grid square.</p></body></html> + <html><head/><body><p>Non è applicata correzione Doppler shift Questo può essere usato quando il partner in QSO esegue una correzione completa Doppler per il tuo grid square.</p></body></html> + + + + None + Nessuna + + + + Sked frequency + Frequenza di Sked + + + + + 0 + 0 + + + + Rx: + Rx: + + + + Tx: + Tx: + + + + <html><head/><body><p>Press and hold the CTRL key to adjust the sked frequency manually with the rig's VFO dial or enter frequency directly into the band entry field on the main window.</p></body></html> + <html><head/><body><p>Premi e mantieni premuto il tasto CTRL per aggiustare la frequenza di sked manualmente con la manopola del VFO del rig o inserisci la frequenza direttamente nel campo di inserimento banda nella finestra principale.</p></body></html> + + + + Astro Data + Dati Astro + + + + Astronomical Data + Dati Astronomici + + + + Doppler Tracking Error + Errore Tracciamento Doppler + + + + Split operating is required for Doppler tracking + Operazione Split richiesta per il tracciamento Doppler + + + + Go to "Menu->File->Settings->Radio" to enable split operation + Vai a "Menu->File->Configurazione->Radio" per abilitare l'operazione split + + + + Bands + + + Band name + Nome Banda + + + + Lower frequency limit + Limite frequenza minore + + + + Upper frequency limit + Limite frequenza superiore + + + + Band + Banda + + + + Lower Limit + Limite inferiore + + + + Upper Limit + Limite superiore + + + + CAboutDlg + + + About WSJT-X + Informazioni su WSJT-X + + + + OK + OK + + + + CPlotter + + + &Set Rx && Tx Offset + &Imposta Rx && Tx Offset + + + + CabrilloLog + + + Freq(MHz) + Freq(MHz) + + + + Mode + Modo + + + + Date & Time(UTC) + Data & Orario(UTC) + + + + Call + Nominativo + + + + Sent + Inviato + + + + Rcvd + Ricevuto + + + + Band + Banda + + + + CabrilloLogWindow + + + Contest Log + Log del Contest + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + <html><head/><body><p>Fare clic con il tasto destro qui per le azioni disponibili.</p></body></html> + + + + Right-click here for available actions. + Fare clic con il tasto destro qui per le azioni disponibili. + + + + CallsignDialog + + + Callsign + Indicativo + + + + ColorHighlighting + + + + + + + + + + + + + + + + + + K1ABC + K1ABC + + + + CQ in message + CQ nel messaggio + + + + My Call in message + Il mio indicativo nel messaggio + + + + Transmitted message + Messaggio Trasmesso + + + + New DXCC + Nuovo DXCC + + + + New Grid + Nuova Griglia + + + + New DXCC on Band + Nuovo DXCC sulla Banda + + + + New Call + Nuovo Indicativo + + + + New Grid on Band + Nuova Griglia su Banda + + + + New Call on Band + Nuovo indicativo sulla Banda + + + + Uploads to LotW + Carica su LotW + + + + New Continent + Nuovo Continente + + + + New Continent on Band + Nuovo Continente sulla Banda + + + + New CQ Zone + Nuova Zona CQ + + + + New CQ Zone on Band + Nuovo Zona CQ sulla Banda + + + + New ITU Zone + Nuova Zona ITU + + + + New ITU Zone on Band + Nuovo Zona ITU sulla Banda + + + + Configuration::impl + + + + + &Delete + &Elimina + + + + + &Insert ... + &Inserisci ... + + + + Failed to create save directory + Impossibile creare la directory di salvataggio + + + + path: "%1% + Percorso: "%1" + + + + Failed to create samples directory + Impossibile creare la directory dei campioni + + + + path: "%1" + Percorso: "%1" + + + + &Load ... + &Carica ... + + + + &Save as ... + &Salva come ... + + + + &Merge ... + &Unisci ... + + + + &Reset + &Ripristina + + + + Serial Port: + Porta Seriale: + + + + Serial port used for CAT control + Porta Seriale usata per il controllo CAT + + + + Network Server: + Server di rete: + + + + Optional hostname and port of network service. +Leave blank for a sensible default on this machine. +Formats: + hostname:port + IPv4-address:port + [IPv6-address]:port + Nome host e porta del servizio di rete opzionali. +Lascia vuoto per un'impostazione predefinita ragionevole su questa macchina. +Formati: + hostname: porta + IPv4-indirizzo: porta + [IPv6-address]: porta + + + + USB Device: + Dispositivo USB: + + + + Optional device identification. +Leave blank for a sensible default for the rig. +Format: + [VID[:PID[:VENDOR[:PRODUCT]]]] + Identificazione del dispositivo opzionale. +Lasciare vuoto per un valore predefinito ragionevole per il rig. +Formato: + [VID [: PID [: VENDOR [: PRODOTTI]]]] + + + + Invalid audio input device + Dispositivo di input audio non valido + + + + Invalid audio out device + Dispositivo di uscita audio non valido + + + + Invalid PTT method + Metodo PTT non valido + + + + Invalid PTT port + Porta PTT non valida + + + + + Invalid Contest Exchange + Scambio Contest non valido + + + + You must input a valid ARRL Field Day exchange + È necessario inserire uno scambioField Day ARRL valido + + + + You must input a valid ARRL RTTY Roundup exchange + È necessario inserire uno scambio Roundup RTTY ARRL valido + + + + Reset Decode Highlighting + Ripristina l'evidenziazione della decodifica + + + + Reset all decode highlighting and priorities to default values + Ripristina tutti i valori di evidenziazione e priorità della decodifica sui valori predefiniti + + + + WSJT-X Decoded Text Font Chooser + Selezionatore font testo decodificato WSJT-X + + + + Load Working Frequencies + Carica frequenze di lavoro + + + + + + Frequency files (*.qrg);;All files (*.*) + File di frequenza (*.qrg);;Tutti i file (*.*) + + + + Replace Working Frequencies + Sostituisci le frequenze di lavoro + + + + Are you sure you want to discard your current working frequencies and replace them with the loaded ones? + Sei sicuro di voler scartare le tue attuali frequenze di lavoro e sostituirle con quelle caricate? + + + + Merge Working Frequencies + Unisci le frequenze di lavoro + + + + + + Not a valid frequencies file + Non è un file di frequenze valido + + + + Incorrect file magic + Magic file errato + + + + Version is too new + La versione è troppo nuova + + + + Contents corrupt + Contenuto corrotto + + + + Save Working Frequencies + Salva frequenze di lavoro + + + + Only Save Selected Working Frequencies + Salva solo le frequenze di lavoro selezionate + + + + Are you sure you want to save only the working frequencies that are currently selected? Click No to save all. + Sei sicuro di voler salvare solo le frequenze di lavoro che sono attualmente selezionate? Fai clic su No per salvare tutto. + + + + Reset Working Frequencies + Ripristina frequenze di lavoro + + + + Are you sure you want to discard your current working frequencies and replace them with default ones? + Sei sicuro di voler scartare le tue attuali frequenze di lavoro e sostituirle con quelle predefinite? + + + + Save Directory + Salva il direttorio + + + + AzEl Directory + AzEl Direttorio + + + + Rig control error + Errore di controllo rig + + + + Failed to open connection to rig + Impossibile aprire la connessione al rig + + + + Rig failure + Rig fallito + + + + DXLabSuiteCommanderTransceiver + + + Failed to connect to DX Lab Suite Commander + + Impossibile connettersi al DX Lab Suite Commander + + + + + DX Lab Suite Commander didn't respond correctly reading frequency: + DX Lab Suite Commander non ha risposto correttamente alla frequenza di lettura: + + + + DX Lab Suite Commander sent an unrecognised TX state: + DX Lab Suite Commander ha inviato uno stato TX non riconosciuto: + + + + DX Lab Suite Commander didn't respond correctly polling TX status: + DX Lab Suite Commander non ha risposto correttamente al polling dello stato TX: + + + + DX Lab Suite Commander rig did not respond to PTT: + DX Lab Suite Commander rig non ha risposto al PTT: + + + + DX Lab Suite Commander didn't respond correctly polling frequency: + DX Lab Suite Commander non ha risposto correttamente alla frequenza di polling: + + + + DX Lab Suite Commander didn't respond correctly polling TX frequency: + DX Lab Suite Commander non ha risposto correttamente alla frequenza di polling TX: + + + + DX Lab Suite Commander sent an unrecognised split state: + DX Lab Suite Commander ha inviato uno stato di divisione non riconosciuto: + + + + DX Lab Suite Commander didn't respond correctly polling split status: + DX Lab Suite Commander non ha risposto correttamente allo stato di suddivisione del polling: + + + + DX Lab Suite Commander sent an unrecognised mode: " + DX Lab Suite Commander ha inviato una modalità non riconosciuta: " + + + + DX Lab Suite Commander didn't respond correctly polling mode: + DX Lab Suite Commander non ha risposto correttamente alla modalità di polling: + + + + DX Lab Suite Commander send command failed + + Comando di invio del comando DX Lab Suite non riuscito + + + + + DX Lab Suite Commander failed to send command "%1": %2 + + DX Lab Suite Commander non è riuscito a inviare il comando "%1": %2 + + + + + DX Lab Suite Commander send command "%1" read reply failed: %2 + + Comando di invio DX Lab Suite Comando "%1" lettura risposta non riuscita: %2 + + + + + DX Lab Suite Commander retries exhausted sending command "%1" + DX Lab Suite Commander ripete il comando di invio esaurito "%1" + + + + DX Lab Suite Commander sent an unrecognized frequency + DX Lab Suite Commander ha inviato una frequenza non riconosciuta + + + + DecodeHighlightingListView + + + &Foreground color ... + &Colore di primo piano ... + + + + Choose %1 Foreground Color + Scegli %1 colore di primo piano + + + + &Unset foreground color + &Annullare colore di primo piano + + + + &Background color ... + &Colore di sfondo ... + + + + Choose %1 Background Color + Scegli %1 colore di sfondo + Scegli.%1 colore di sfondo + + + + U&nset background color + A&nnullare colore di sfondo + + + + &Reset this item to defaults + &Reimposta questa voce ai valori predefiniti + + + + DecodeHighlightingModel + + + CQ in message + CQ nel messaggio + + + + My Call in message + Il mio indicativo nel messaggio + + + + Transmitted message + Messaggio Trasmesso + + + + New DXCC + Nuovo DXCC + + + + New DXCC on Band + Nuovo DXCC sulla Banda + + + + New Grid + Nuova Griglia + + + + New Grid on Band + Nuova Griglia su Banda + + + + New Call + Nuovo Indicativo + + + + New Call on Band + Nuovo indicativo sulla Banda + + + + New Continent + Nuovo Continente + + + + New Continent on Band + Nuovo Continente sulla Banda + + + + New CQ Zone + Nuova Zona CQ + + + + New CQ Zone on Band + Nuovo Zona CQ sulla Banda + + + + New ITU Zone + Nuova Zona ITU + + + + New ITU Zone on Band + Nuovo Zona ITU sulla Banda + + + + LoTW User + Utente LoTW + + + + f/g unset + f/g non impostato + + + + b/g unset + b/g non impostato + + + + Highlight Type + Evidenzia Tipo + + + + Designer + + + &Delete + &Elimina + + + + &Insert ... + &Inserisci ... + + + + Insert &after ... + Inserisci &dopo ... + + + + Import Palette + Importa Tavolozza + + + + + Palettes (*.pal) + Tavolozza (*.pal) + + + + Export Palette + Esporta Tavolozza + + + + Dialog + + + Gray time: + Orario Grayline: + + + + Directory + + + File + File + + + + Progress + Avanzamento + + + + + URL Error + Errore URL + + + + + Invalid URL: +"%1" + URL non valido: +"%1" + + + + + + + + + + JSON Error + Errore JSON + + + + Contents file syntax error %1 at character offset %2 + Errore di sintassi del file di contenuti %1 all'offset del carattere %2 + + + + Contents file top level must be a JSON array + Il file di livello superiore deve essere un array JSON + + + + File System Error + Errore File System + + + + Failed to open "%1" +Error: %2 - %3 + Impossibile aprire il file: +"%1" +Errore: %2 - %3 + + + + Contents entries must be a JSON array + Le voci di contenuto devono essere una matrice JSON + + + + Contents entries must have a valid type + Le voci di contenuto devono avere un tipo valido + + + + Contents entries must have a valid name + Le voci di contenuto devono avere un nome valido + + + + Contents entries must be JSON objects + Le voci del contenuto devono essere oggetti JSON + + + + Contents directories must be relative and within "%1" + Le directory dei contenuti devono essere relative e entro "%1" + + + + Network Error + Errore di Rete + + + + Authentication required + Autenticazione richiesta + + + + DisplayText + + + &Erase + &Cancellare + + + + EchoGraph + + + + Echo Graph + Grafico Eco + + + + <html><head/><body><p>Compression factor for frequency scale</p></body></html> + <html><head/><body><p>Fattore di compressione per scala di frequenza</p></body></html> + <html><head/><body><p>Compression factor for frequency scale</p></body></html> + + + + Bins/Pixel + Bins/Pixel + + + + Gain + Guadagno + + + + <html><head/><body><p>Echo spectrum gain</p></body></html> + <html><head/><body><p>Guadagno dello spettro dell'Eco</p></body></html> + + + + Zero + Zero + + + + <html><head/><body><p>Echo spectrum zero</p></body></html> + <html><head/><body><p>Zero spettro Eco</p></body></html> + + + + <html><head/><body><p>Smoothing of echo spectrum</p></body></html> + <html><head/><body><p>Livellamento dello spettro dell'Eco</p></body></html> + + + + Smooth + Liscio + + + + <html><head/><body><p>Number of echo transmissions averaged</p></body></html> + <html><head/><body><p>Numero medio di trasmissioni di Eco</p></body></html> + + + + N: 0 + N: 0 + + + + <html><head/><body><p>Click to cycle through a sequence of colors and line widths.</p></body></html> + <html><head/><body><p>Fare clic per scorrere una sequenza di colori e larghezze di linea.</p></body></html> + + + + Colors + Colori + + + + EmulateSplitTransceiver + + + Emulated split mode requires rig to be in simplex mode + La modalità split emulato richiede che il rig sia in modalità simplex + + + + EqualizationToolsDialog::impl + + + Phase + Fase + + + + + Freq (Hz) + Freq (Hz) + + + + Phase (Π) + Fase (Π) + + + + Delay (ms) + Ritardo (ms) + + + + Measured + Misurato + + + + Proposed + Proposto + + + + Current + Corrente + + + + Group Delay + Ritardo di Gruppo + + + + Amplitude + Ampiezza + + + + Relative Power (dB) + Potenza Relativa (dB) + + + + Reference + Riferimento + + + + Phase ... + Fase ... + + + + Refresh + Ricaricare + + + + Discard Measured + Elimina Misure + + + + ExistingNameDialog + + + Configuration to Clone From + Configurazione da cui clonare + + + + &Source Configuration Name: + &Nome configurazione sorgente: + + + + ExportCabrillo + + + Dialog + Dialogo + + + + Location: + Posizione: + + + + SNJ + SNJ + + + + Contest: + Contest: + + + + ARRL-RTTY + ARRL-RTTY + + + + Callsign: + Nominativo: + + + + Category-Operator: + Categoria Operatore: + + + + SINGLE-OP + Singolo OP + + + + Category-Transmitter: + Categoria Trasmettitore: + + + + ONE + UNO + + + + Category-Power: + Categoria Potenza: + + + + LOW + BASSA + + + + Category-Assisted: + Categoria Assistita: + + + + NON-ASSISTED + NON ASSISTITA + + + + Category-Band: + Categoria di Banda: + + + + ALL + TUTTO + + + + Claimed-Score: + Punteggio Dichiarato: + + + + Operators: + Operatori: + + + + Club: + Club: + + + + Name: + Nome: + + + + + Address: + Indirizzo: + + + + Save Log File + Salva File di Log + + + + Cabrillo Log (*.cbr) + Log Cabrillo (*.cbr) + + + + Cannot open "%1" for writing: %2 + Impossibile aprire "%1" in scrittura: %2 + + + + Export Cabrillo File Error + Esporta Errore File Cabrillo + + + + FastGraph + + + + Fast Graph + Grafico veloce + + + + Waterfall gain + Guadagno Display a cascata + + + + Waterfall zero + Azzeramento Display a cascata + + + + Spectrum zero + Azzeramento Spettro + + + + <html><head/><body><p>Set reasonable levels for gain and zero sliders.</p></body></html> + <html><head/><body><p>Imposta livelli ragionevoli per guadagno e cursori azzeramento.</p></body></html> + + + + Auto Level + Livello automatico + + + + FoxLog::impl + + + Date & Time(UTC) + Data & Orario(UTC) + + + + Call + Nominativo + + + + Grid + Griglia + + + + Sent + Inviato + + + + Rcvd + Ricevuto + + + + Band + Banda + + + + FoxLogWindow + + + Fox Log + (Registro log della Volpe) + Fox Log + + + + <html><head/><body><p>Right-click here for available actions.</p></body></html> + <html><head/><body><p>Fare clic con il tasto destro qui per le azioni disponibili.</p></body></html> + + + + Callers: + Chiamanti: + + + + + + N + N + + + + In progress: + In corso: + + + + Rate: + Tasso: + + + + &Export ADIF ... + &Esporta ADIF ... + + + + Export ADIF Log File + Esporta il file di Log ADIF + + + + ADIF Log (*.adi) + ADIF Log (*.adi) + + + + Export ADIF File Error + Errore esportazione file ADIF + + + + Cannot open "%1" for writing: %2 + Impossibile aprire "%1" in scrittura: %2 + + + + &Reset ... + &Ricarica ... + + + + Confirm Reset + Conferma Ripristina + + + + Are you sure you want to erase file FoxQSO.txt and start a new Fox log? + Sei sicuro di voler cancellare il file FoxQSO.txt e avviare un nuovo log Fox? + + + + FrequencyDialog + + + Add Frequency + Aggiungi frequenza + + + + IARU &Region: + &Regione IARU: + + + + &Mode: + &Modo: + + + + &Frequency (MHz): + &Frequenza (MHz): + + + + FrequencyList_v2 + + + + IARU Region + Regione IARU + + + + + Mode + Modo + + + + + Frequency + Frequenza + + + + + Frequency (MHz) + Frequenza (MHz) + + + + HRDTransceiver + + + + Failed to connect to Ham Radio Deluxe + + Impossibile connettersi a Ham Radio Deluxe + + + + Failed to open file "%1": %2. + Impossibile aprire il file "%1":%2. + + + + + Ham Radio Deluxe: no rig found + Ham Radio Deluxe: nessun rig trovato + + + + Ham Radio Deluxe: rig doesn't support mode + Ham Radio Deluxe: il rig non supporta la modalità + + + + Ham Radio Deluxe: sent an unrecognised mode + Ham Radio Deluxe: ha inviato una modalità non riconosciuta + + + + Ham Radio Deluxe: item not found in %1 dropdown list + Ham Radio Deluxe: elemento non trovato nell'elenco a discesa%1 + + + + Ham Radio Deluxe: button not available + Ham Radio Deluxe: pulsante non disponibile + + + + Ham Radio Deluxe didn't respond as expected + Ham Radio Deluxe non ha risposto come previsto + + + + Ham Radio Deluxe: rig has disappeared or changed + Ham Radio Deluxe: il rig è scomparso o cambiato + + + + Ham Radio Deluxe send command "%1" failed %2 + + Ham Radio Deluxe comando di invio "%1" non riuscito%2 + + + + + + Ham Radio Deluxe: failed to write command "%1" + Ham Radio Deluxe: impossibile scrivere il comando "%1" + + + + Ham Radio Deluxe sent an invalid reply to our command "%1" + Ham Radio Deluxe ha inviato una risposta non valida al nostro comando "%1" + + + + Ham Radio Deluxe failed to reply to command "%1" %2 + + Ham Radio Deluxe non ha risposto al comando "%1"%2 + + + + + Ham Radio Deluxe retries exhausted sending command "%1" + Ham Radio Deluxe ritenta esaurito il comando di invio "%1" + + + + Ham Radio Deluxe didn't respond to command "%1" as expected + Ham Radio Deluxe non ha risposto al comando "%1" come previsto + + + + HamlibTransceiver + + + + Hamlib initialisation error + Errore di inizializzazione di Hamlib + + + + Hamlib settings file error: %1 at character offset %2 + Errore del file delle impostazioni di Hamlib:%1 all'offset del carattere %2 + + + + Hamlib settings file error: top level must be a JSON object + Errore del file delle impostazioni di Hamlib: il livello principale deve essere un oggetto JSON + + + + Hamlib settings file error: config must be a JSON object + Errore del file delle impostazioni di Hamlib: config deve essere un oggetto JSON + + + + Unsupported CAT type + Tipo CAT non supportato + + + + Hamlib error: %1 while %2 + Errore Hamlib: %1 mentre %2 + + + + opening connection to rig + apertura connessione al rig + + + + getting current frequency + ottenere la frequenza corrente + + + + getting current mode + ottenere la modalità corrente + + + + + exchanging VFOs + scambio di VFO + + + + + getting other VFO frequency + ottenere altra frequenza VFO + + + + getting other VFO mode + ottenere altra modalità VFO + + + + setting current VFO + impostazione del VFO corrente + + + + getting frequency + ottenere la frequenza + + + + getting mode + ottenere il modo + + + + + getting current VFO + ottenere il VFO corrente + + + + + + + getting current VFO frequency + ottenere la frequenza del VFO corrente + + + + + + + + + setting frequency + impostazione della frequenza + + + + + + + getting current VFO mode + ottenere il modo del VFO corrente + + + + + + + + setting current VFO mode + impostare il modo del VFO corrente + + + + + setting/unsetting split mode + impostazione / disinserimento della modalità split + + + + + setting split mode + + + + + setting split TX frequency and mode + impostazione della frequenza e della modalità TX divise + + + + setting split TX frequency + impostazione della frequenza Split TX + + + + getting split TX VFO mode + ottenere la modalità split VFO TX + + + + setting split TX VFO mode + impostazione della modalità VFO split TX + + + + getting PTT state + ottenere lo stato PTT + + + + setting PTT on + attivare PTT + + + + setting PTT off + disattivare PTT + + + + setting a configuration item + impostazione di un elemento di configurazione + + + + getting a configuration item + ottenere un elemento di configurazione + + + + HelpTextWindow + + + Help file error + Aiuto file di errore + + + + Cannot open "%1" for reading + Impossibile aprire "%1" per la lettura + + + + Error: %1 + Errore: %1 + + + + IARURegions + + + + IARU Region + Regione IARU + + + + LogQSO + + + Click OK to confirm the following QSO: + Fare clic su OK per confermare il seguente QSO: + + + + Call + Nominativo + + + + Start + Inizio + + + + + dd/MM/yyyy HH:mm:ss + dd/MM/yyyy HH:mm:ss + + + + End + Fine + + + + Mode + Modo + + + + Band + Banda + + + + Rpt Sent + Rpt Inviato + + + + Rpt Rcvd + Rpt Rcvt + + + + Grid + Griglia + + + + Name + Nome + + + + Tx power + Potenza Tx + + + + + Retain + Mantieni + + + + Comments + Commenti + + + + Operator + Operatore + + + + Exch sent + Exch inviato + + + + Rcvd + Rcvt + + + + + Invalid QSO Data + Dati QSO non validi + + + + Check exchange sent and received + Controlla lo scambio inviato e ricevuto + + + + Check all fields + Controlla tutti i campi + + + + Log file error + Errore file di Log + + + + Cannot open "%1" for append + Impossibile aprire "%1" per aggiungere + + + + Error: %1 + Errore: %1 + + + + LotWUsers::impl + + + Network Error - SSL/TLS support not installed, cannot fetch: +'%1' + Errore di rete - Supporto SSL / TLS non installato, impossibile recuperare: +'%1' + + + + Network Error - Too many redirects: +'%1' + Errore di rete - Troppi reindirizzamenti: +'%1' + + + + Network Error: +%1 + Errore di rete: +%1 + + + + File System Error - Cannot commit changes to: +"%1" + Errore del file system - Impossibile eseguire il commit delle modifiche a: +"%1" + + + + File System Error - Cannot open file: +"%1" +Error(%2): %3 + Errore del file system - Impossibile aprire il file: +"%1" +Errore (%2):%3 + + + + File System Error - Cannot write to file: +"%1" +Error(%2): %3 + Errore del file system - Impossibile scrivere sul file: +"%1" +Errore (%2):%3 + + + + MainWindow + + + WSJT-X by K1JT + WSJT-X di K1JT + + + + + + + + + + Band Activity + Attività di Banda + + + + + UTC dB DT Freq Dr + UTC dB DT Freq Dr + + + + + + + + + Rx Frequency + Frequenza Rx + + + + CQ only + Solo CQ + + + + Enter this QSO in log + Immettere questo QSO nel log + + + + Log &QSO + Log &QSO + + + + Stop monitoring + Interrompere il monitoraggio + + + + &Stop + &Stop + + + + Toggle monitoring On/Off + Attiva / disattiva il monitoraggio + + + + &Monitor + &Monitor + + + + <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + <html><head/><body><p>Cancella la finestra a destra. Fare doppio clic per cancellare entrambe le finestre.</p></body></html> + + + + Erase right window. Double-click to erase both windows. + Cancella la finestra a destra. Fare doppio clic per cancellare entrambe le finestre. + + + + &Erase + &Cancella + + + + <html><head/><body><p>Clear the accumulating message average.</p></body></html> + <html><head/><body><p>Cancella la media dei messaggi accumulati.</p></body></html> + + + + Clear the accumulating message average. + Cancella la media dei messaggi accumulati. + + + + Clear Avg + Cancella media + + + + <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + <html><head/><body><p>Decodifica il periodo Rx più recente alla frequenza QSO</p></body></html> + + + + Decode most recent Rx period at QSO Frequency + Decodifica il periodo Rx più recente alla frequenza QSO + + + + &Decode + &Decodifica + + + + <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + <html><head/><body> <p> Attiva / Disattiva Auto-Tx </p> </body> </html> + + + + Toggle Auto-Tx On/Off + Attiva / Disattiva Auto-Tx + + + + E&nable Tx + &Abilita Tx + + + + Stop transmitting immediately + Interrompere immediatamente la trasmissione + + + + &Halt Tx + &Arresta Tx + + + + <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + <html><head/><body><p>Attiva / disattiva un tono Tx puro</p></body></html> + + + + Toggle a pure Tx tone On/Off + Attiva / disattiva un tono Tx puro + + + + &Tune + &Accorda + + + + Menus + Menù + + + + USB dial frequency + Frequenza di chiamata USB + + + + 14.078 000 + 14.078 000 + + + + <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + <html><head/><body><p>30dB consigliato quando è presente solo rumore<br/>Verde quando buono<br/>Rosso quando può verificarsi distorsione<br/>Giallo quando troppo basso</p></body></html> + + + + Rx Signal + Segnale Rx + + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + 30dB consigliato quando è presente solo rumore +Verde quando è buono +Rosso quando può verificarsi distorsione +Giallo quando troppo basso + + + + DX Call + Nominativo DX + + + + DX Grid + Grid DX + + + + Callsign of station to be worked + Nominativo statione da collegare + + + + Search for callsign in database + Ricerca nominativo nel database + + + + &Lookup + &Ricerca + + + + Locator of station to be worked + Localizzatore della stazione da lavorare + + + + Az: 251 16553 km + Az: 251 16553 km + + + + Add callsign and locator to database + Aggiungi nominativo e localizzatore al database + + + + Add + Aggiungi + + + + Pwr + Potenza + + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + <html><head/><body><p>Se arancione o rosso si è verificato un errore nel controllo rig, fare clic per ripristinare e leggere la frequenza di sintonia. S implica la modalità split.</p></body></html> + + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + Se arancione o rosso si è verificato un errore nel controllo rig, fare clic per ripristinare e leggere la frequenza di sintonia. S implica la modalità split. + + + + ? + ? + + + + Adjust Tx audio level + Regola il livello audio Tx + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + <html><head/><body><p>Seleziona la banda operativa o inserisci la frequenza in MHz o inserisci l'incremento di kHz seguito da k.</p></body></html> + + + + Frequency entry + Immetti la frequenza + + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + Seleziona la banda operativa o inserisci la frequenza in MHz o inserisci l'incremento di kHz seguito da k. + + + + <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> + <html><head/><body><p align="center"> 2015 Giu 17 </p><p align="center"> 01:23:45 </p></body></html> + + + + <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + <html><head/><body><p>Spuntare la casella per mantenere fissa la frequenza Tx quando si fa doppio clic sul testo decodificato.</p></body></html> + + + + Check to keep Tx frequency fixed when double-clicking on decoded text. + Spuntare la casella per mantenere fissa la frequenza Tx quando si fa doppio clic sul testo decodificato. + + + + Hold Tx Freq + Mantenere premuto Tx Freq + + + + Audio Rx frequency + Frequenza audio Rx + + + + + + Hz + Hz + + + + Rx + Rx + + + + Set Tx frequency to Rx Frequency + Impostare la frequenza Tx su Frequenza Rx + + + + ▲ + + + + + Frequency tolerance (Hz) + Tolleranza di frequenza (Hz) + + + + F Tol + F Tol + + + + Set Rx frequency to Tx Frequency + Impostare la frequenza Rx su Frequenza Tx + + + + ▼ + + + + + <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + <html><head/><body><p>Sincronizzazione della soglia. I numeri più bassi accettano segnali di sincronizzazione più deboli.</p></body></html> + + + + Synchronizing threshold. Lower numbers accept weaker sync signals. + Sincronizzazione della soglia. I numeri più bassi accettano segnali di sincronizzazione più deboli. + + + + Sync + Sinc + + + + <html><head/><body><p>Check to use short-format messages.</p></body></html> + <html><head/><body><p>Selezionare per utilizzare i messaggi di formato breve.</p></body></html> + + + + Check to use short-format messages. + Selezionare per utilizzare i messaggi di formato breve. + + + + Sh + Sh + + + + <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + <html><head/><body><p>Selezionare per abilitare le modalità rapide JT9</p></body></html> + + + + Check to enable JT9 fast modes + Selezionare per abilitare le modalità rapide JT9 + + + + + Fast + Veloce + + + + <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + <html><head/><body><p>Selezionare per abilitare il sequenziamento automatico dei messaggi Tx in base ai messaggi ricevuti.</p></body></html> + + + + Check to enable automatic sequencing of Tx messages based on received messages. + Selezionare per abilitare il sequenziamento automatico dei messaggi Tx in base ai messaggi ricevuti. + + + + Auto Seq + Auto Seq + + + + <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + <html><head/><body><p>Selezionare per chiamare il primo risponditore decodificato al mio CQ.</p></body></html> + + + + Check to call the first decoded responder to my CQ. + Selezionare per chiamare il primo risponditore decodificato al mio CQ. + + + + Call 1st + Chiama il 1º + + + + Check to generate "@1250 (SEND MSGS)" in Tx6. + Selezionare per generare "@1250 (INVIO MSGS)" in Tx6. + + + + Tx6 + Tx6 + + + + <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + <html><head/><body><p>Selezionare su Tx in minuti o sequenze di numero pari, iniziando da 0; deselezionare le sequenze dispari.</p></body></html> + + + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + Selezionare su Tx in minuti o sequenze di numero pari, iniziando da 0; deselezionare le sequenze dispari. + + + + Tx even/1st + Tx pari/1º + + + + <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + <html><head/><body> <p> Frequenza di chiamata CQ in kHz sopra l'attuale MHz </p> </body> </html> + + + + Frequency to call CQ on in kHz above the current MHz + Frequenza per chiamare CQ in kHz sopra l'attuale MHz + + + + Tx CQ + Tx CQ + + + + <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + <html><head/><body><p>Spunta questo per chiamare CQ sulla frequenza &quot;Tx CQ&quot;.L' Rx sarà sulla frequenza corrente e il messaggio CQ includerà la frequenza Rx corrente in modo che i chiamanti sappiano su quale frequenza rispondere. Non disponibile per i possessori di nominativi non standard.</p></body></html> + + + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. +Not available to nonstandard callsign holders. + Spunta questo per chiamare CQ sulla frequenza "Tx CQ". Rx sarà sulla frequenza corrente e il messaggio CQ includerà la frequenza Rx corrente in modo che i chiamanti sappiano su quale frequenza rispondere. +Non disponibile per i possessori di nominativi non standard. + + + + Rx All Freqs + Rx Tutte le freq + + + + <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + <html><head/><body> <p> La modalità secondaria determina la spaziatura dei toni; A è il più stretto. </p> </body> </html> + + + + Submode determines tone spacing; A is narrowest. + La modalità secondaria determina la spaziatura dei toni; A è il più stretto. + + + + Submode + Modalità Secondaria + + + + + Fox + Fox + + + + <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + <html><head/><body><p>Spuntare per monitorare i messaggi Sh.</p></body></html> + + + + Check to monitor Sh messages. + Spuntare per monitorare i messaggi Sh. + + + + SWL + SWL + + + + Best S+P + Migliore S+P + + + + <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + <html><head/><body><p>Seleziona questa opzione per avviare la registrazione dei dati di calibrazione.<br/>Mentre la misurazione della correzione della calibrazione è disabilitata.<br/>Se non selezionato puoi visualizzare i risultati della calibrazione.</p></body></html> + + + + Check this to start recording calibration data. +While measuring calibration correction is disabled. +When not checked you can view the calibration results. + Selezionare questo per iniziare a registrare i dati di calibrazione. +Durante la misurazione, la correzione della calibrazione è disabilitata. +Se non selezionato, è possibile visualizzare i risultati della calibrazione. + + + + Measure + Misura + + + + <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + <html><head/><body><p>Rapporto segnale: rapporto segnale-rumore nella larghezza di banda di riferimento di 2500 Hz (dB).</p></body></html> + + + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + Rapporto segnale: rapporto segnale-rumore nella larghezza di banda di riferimento di 2500 Hz (dB). + + + + Report + Rapporto + + + + <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + <html><head/><body><p>TX/RX o Lunghezza della sequenza di calibrazione della frequenza</p></body></html> + + + + Tx/Rx or Frequency calibration sequence length + TX/RX o Lunghezza della sequenza di calibrazione della frequenza + + + + s + s + + + + T/R + T/R + + + + Toggle Tx mode + Attiva / disattiva la modalità Tx + + + + Tx JT9 @ + Tx JT9 @ + + + + Audio Tx frequency + Frequenza Tx audio + + + + + Tx + Tx + + + + Tx# + Tx# + + + + <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> + <html><head/><body><p>Fare doppio clic su un altro chiamante per mettere in coda quella chiamata per il QSO successivo.</p></body></html> + + + + Double-click on another caller to queue that call for your next QSO. + Fare doppio clic su un altro chiamante per mettere in coda quella chiamata per il QSO successivo. + + + + Next Call + Prossima chiamata + + + + 1 + 1 + + + + + + Send this message in next Tx interval + Invia questo messaggio nel prossimo intervallo Tx + + + + Ctrl+2 + Ctrl+2 + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + <html><head/><body><p>Invia questo messaggio nel prossimo intervallo Tx </p><p>Fare doppio clic per alternare l'uso del messaggio Tx1 per avviare un QSO con una stazione (non consentito per i detentori di chiamate composte di tipo 1)</p></body></html> + + + + Send this message in next Tx interval +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + Invia questo messaggio nel prossimo intervallo Tx +Fare doppio clic per attivare / disattivare l'uso del messaggio Tx1 per avviare un QSO con una stazione (non consentito per i detentori di chiamate composte di tipo 1) + + + + Ctrl+1 + Ctrl+1 + + + + + + + Switch to this Tx message NOW + Passa a questo messaggio Tx ADESSO + + + + Tx &2 + Tx &2 + + + + Alt+2 + Alt+2 + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + <html><head/><body><p>Passa a questo messaggio Tx ORA</p><p>Fai doppio clic per attivare o disattivare l'uso del messaggio Tx1 per avviare un QSO con una stazione (non consentito per i detentori di chiamate composte di tipo 1)</p></body></html> + + + + Switch to this Tx message NOW +Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) + Passa a questo messaggio Tx ADESSO +Fare doppio clic per attivare / disattivare l'uso del messaggio Tx1 per avviare un QSO con una stazione (non consentito per i detentori di chiamate composte di tipo 1) + + + + Tx &1 + Tx &1 + + + + Alt+1 + Alt+1 + + + + Ctrl+6 + Ctrl+6 + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + <html><head/><body><p>Invia questo messaggio nel prossimo intervallo Tx</p><p>Fare doppio clic per ripristinare il messaggio 73 standard</p></body></html> + + + + Send this message in next Tx interval +Double-click to reset to the standard 73 message + Invia questo messaggio nel prossimo intervallo Tx +Fare doppio clic per ripristinare il messaggio 73 standard + + + + Ctrl+5 + Ctrl+5 + + + + Ctrl+3 + Ctrl+3 + + + + Tx &3 + Tx &3 + + + + Alt+3 + Alt+3 + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + <html><head/><body><p>Invia questo messaggio nel prossimo intervallo Tx</p><p>Fare doppio clic per alternare tra i messaggi RRR e RR73 in Tx4 (non consentito per i possessori di chiamate composte di tipo 2)</p><p>I messaggi RR73 devono essere utilizzati solo quando si è ragionevolmente sicuri che non saranno necessarie ripetizioni dei messaggi</p></body></html> + + + + Send this message in next Tx interval +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + Invia questo messaggio nel prossimo intervallo Tx +Fare doppio clic per alternare tra i messaggi RRR e RR73 in Tx4 (non consentito per i detentori di chiamate composte di tipo 2) +I messaggi RR73 devono essere utilizzati solo quando si è ragionevolmente sicuri che non saranno necessarie ripetizioni dei messaggi + + + + Ctrl+4 + Ctrl+4 + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + <html><head/><body><p>Passa a questo messaggio Tx ORA</p><p>Fai doppio clic per alternare tra i messaggi RRR e RR73 in Tx4 (non consentito per i possessori di chiamate composte di tipo2)</p><p>I messaggi RR73 devono essere utilizzati solo quando sei ragionevolmente sicuro che non sarà richiesta alcuna ripetizione del messaggio</p></body></html> + + + + Switch to this Tx message NOW +Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) +RR73 messages should only be used when you are reasonably confident that no message repetitions will be required + Passa a questo messaggio Tx ADESSO +Fare doppio clic per alternare tra i messaggi RRR e RR73 in Tx4 (non consentito per i detentori di chiamate composte di tipo2) +I messaggi RR73 devono essere utilizzati solo quando si è ragionevolmente sicuri che non saranno necessarie ripetizioni dei messaggi + + + + Tx &4 + Tx &4 + + + + Alt+4 + Alt+4 + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + <html><head/><body><p>Passa a questo messaggio Tx ADESSO</p><p>Fai doppio clic per ripristinare il messaggio 73 standard</p></body></html> + + + + Switch to this Tx message NOW +Double-click to reset to the standard 73 message + Passa a questo messaggio Tx ADESSO +Fare doppio clic per ripristinare il messaggio 73 standard + + + + Tx &5 + Tx &5 + + + + Alt+5 + Alt+5 + + + + Now + Now + + + + Generate standard messages for minimal QSO + Genera messaggi standard per un QSO minimo + + + + Generate Std Msgs + Genera Std Msgs + + + + Tx &6 + Tx &6 + + + + Alt+6 + Alt+6 + + + + + Enter a free text message (maximum 13 characters) +or select a predefined macro from the dropdown list. +Press ENTER to add the current text to the predefined +list. The list can be maintained in Settings (F2). + Inserisci un messaggio di testo libero (massimo 13 caratteri) +oppure seleziona una macro predefinita dall'elenco a discesa. +Premere INVIO per aggiungere il testo corrente al predefinito +elenco. L'elenco può essere gestito in Impostazioni (F2). + + + + Queue up the next Tx message + Accoda il prossimo messaggio Tx + + + + Next + Prossimo + + + + 2 + 2 + + + + Calling CQ + Chiamando CQ + + + + Generate a CQ message + Genera un messaggio CQ + + + + + + CQ + CQ + + + + Generate message with RRR + Genera un messaggio con RRR + + + + RRR + RRR + + + + Generate message with report + Genera un messaggio con rapporto + + + + dB + dB + + + + Answering CQ + Rispondere al CQ + + + + Generate message for replying to a CQ + Genera messaggio di risposta al CQ + + + + + Grid + Grid + + + + Generate message with R+report + Genera messaggio con R+rapporto + + + + R+dB + R+dB + + + + Generate message with 73 + Genera messaggio con 73 + + + + 73 + 73 + + + + Send this standard (generated) message + Invia questo messaggio standard (generato) + + + + Gen msg + Gen msg + + + + Send this free-text message (max 13 characters) + Invia questo messaggio di testo libero (massimo 13 caratteri) + + + + Free msg + Msg libero + + + + 3 + 3 + + + + Max dB + Max dB + + + + CQ AF + CQ AF + + + + CQ AN + CQ AN + + + + CQ AS + CQ AS + + + + CQ EU + CQ EU + + + + CQ NA + CQ NA + + + + CQ OC + CQ OC + + + + CQ SA + CQ SA + + + + CQ 0 + CQ 0 + + + + CQ 1 + CQ 1 + + + + CQ 2 + CQ 2 + + + + CQ 3 + CQ 3 + + + + CQ 4 + CQ 4 + + + + CQ 5 + CQ 5 + + + + CQ 6 + CQ 6 + + + + CQ 7 + CQ 7 + + + + CQ 8 + CQ 8 + + + + CQ 9 + CQ 9 + + + + Reset + Ripristina + + + + N List + N List + + + + N Slots + N Slots + + + + + Random + Casuale + + + + Call + Nominativo + + + + S/N (dB) + S/N (dB) + + + + Distance + Distanza + + + + More CQs + Più CQs + + + + Percentage of 2-minute sequences devoted to transmitting. + Percentuale di sequenze di 2 minuti dedicate alla trasmissione. + + + + % + % + + + + Tx Pct + Tx Pct + + + + Band Hopping + Band Hopping + + + + Choose bands and times of day for band-hopping. + Scegli le fasce e gli orari del giorno per il band-hopping. + + + + Schedule ... + Programma ... + + + + Upload decoded messages to WSPRnet.org. + Carica messaggi decodificati su WSPRnet.org. + + + + Upload spots + Carica spot + + + + <html><head/><body><p>6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + <html><head/><body><p>I localizzatori a 6 cifre causano l'invio di 2 messaggi diversi, il secondo contiene il localizzatore completo ma solo un nominativo con hash, altre stazioni devono aver decodificato il primo una volta prima di poter decodificare la chiamata nel secondo. Selezionare questa opzione per inviare localizzatori a 4 cifre solo se si eviterà il protocollo a due messaggi.</p></body></html> + + + + 6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + I localizzatori a 6 cifre causano l'invio di 2 messaggi diversi, il secondo contiene il localizzatore completo ma solo un nominativo con hash, altre stazioni devono aver decodificato il primo una volta prima di poter decodificare la chiamata nel secondo. Selezionare questa opzione per inviare localizzatori a 4 cifre solo se si eviterà il protocollo a due messaggi. + + + + Prefer type 1 messages + Preferisci i messaggi di tipo 1 + + + + No own call decodes + Nessuna decodifica del proprio nominativo + + + + Transmit during the next 2-minute sequence. + Trasmettere durante la sequenza di 2 minuti successiva. + + + + Tx Next + Tx Successiva + + + + Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. + Imposta la potenza Tx in dBm (dB sopra 1 mW) come parte del tuo messaggio WSPR. + + + + File + File + + + + View + Vista + + + + Decode + Decodificare + + + + Save + Salva + + + + Help + Aiuto + + + + Mode + Modo + + + + Configurations + Configurazioni + + + + Tools + Strumenti + + + + Exit + Uscita + + + + Configuration + Configurazione + + + + F2 + F2 + + + + About WSJT-X + Informazioni su WSJT-X + + + + Waterfall + Display a cascata + + + + Open + Apri + + + + Ctrl+O + Ctrl+O + + + + Open next in directory + Apri successivo nella directory + + + + Decode remaining files in directory + Decodifica i file rimanenti nella directory + + + + Shift+F6 + Shift+F6 + + + + Delete all *.wav && *.c2 files in SaveDir + Elimina tutti i file * .wav && * .c2 nel direttorio + + + + None + Nessuno + + + + Save all + Salva tutto + + + + Online User Guide + Guida per l'utente online + + + + Keyboard shortcuts + Scorciatoie da tastiera + + + + Special mouse commands + Comandi speciali mouse + + + + JT9 + JT9 + + + + Save decoded + Salva decodificato + + + + Normal + Normale + + + + Deep + Profondo + + + + Monitor OFF at startup + Monitor OFF all'avvio + + + + Erase ALL.TXT + Cancella ALL.TXT + + + + Erase wsjtx_log.adi + Cancella wsjtx_log.adi + + + + Convert mode to RTTY for logging + Convertire la modalità in RTTY per la registrazione + + + + Log dB reports to Comments + Registra rapporto dB nei commenti + + + + Prompt me to log QSO + Avvisami di registrare il QSO + + + + Blank line between decoding periods + Riga vuota tra i periodi di decodifica + + + + Clear DX Call and Grid after logging + Cancella chiamata DX e griglia dopo la registrazione + + + + Display distance in miles + Visualizza la distanza in miglia + + + + Double-click on call sets Tx Enable + Fare doppio clic sui set di chiamate Abilita Tx + + + + + F7 + F7 + + + + Tx disabled after sending 73 + Tx disabilitato dopo l'invio 73 + + + + + Runaway Tx watchdog + Watchdog Tx sfuggito + + + + Allow multiple instances + Consenti più istanze + + + + Tx freq locked to Rx freq + Tx freq bloccato su Rx freq + + + + JT65 + JT65 + + + + JT9+JT65 + JT9+JT65 + + + + Tx messages to Rx Frequency window + Messaggi Tx alla finestra Frequenza Rx + + + + Gray1 + Gray1 + + + + Show DXCC entity and worked B4 status + Mostra entità DXCC e stato B4 lavorato + + + + Astronomical data + Dati Astronomici + + + + List of Type 1 prefixes and suffixes + Elenco di prefissi e suffissi di tipo 1 + + + + Settings... + Impostazioni... + + + + Local User Guide + Guida per l'utente locale + + + + Open log directory + Apri il direttorio del Log + + + + JT4 + JT4 + + + + Message averaging + Media dei messaggi + + + + Enable averaging + Abilita Media + + + + Enable deep search + Abilita ricerca profonda + + + + WSPR + WSPR + + + + Echo Graph + Grafico Eco + + + + F8 + F8 + + + + Echo + Eco + + + + EME Echo mode + Modo Eco EME + + + + ISCAT + ISCAT + + + + Fast Graph + Grafico Veloce + + + + F9 + F9 + + + + &Download Samples ... + &Scarica Campioni ... + + + + <html><head/><body><p>Download sample audio files demonstrating the various modes.</p></body></html> + <html><head/><body><p>Scarica file audio di esempio che dimostrano le varie modalità.</p></body></html> + + + + MSK144 + MSK144 + + + + QRA64 + QRA64 + + + + Release Notes + Note di rilascio + + + + Enable AP for DX Call + Abilita AP per DX Call + + + + FreqCal + FreqCal + + + + Measure reference spectrum + Misurare lo spettro di riferimento + + + + Measure phase response + Misura la risposta di fase + + + + Erase reference spectrum + Cancella spettro di riferimento + + + + Execute frequency calibration cycle + Eseguire il ciclo di calibrazione della frequenza + + + + Equalization tools ... + Strumenti di equalizzazione ... + + + + WSPR-LF + WSPR-LF + + + + Experimental LF/MF mode + Modo Sperimentale LF/MF + + + + FT8 + FT8 + + + + + Enable AP + Abilita AP + + + + Solve for calibration parameters + Risolvi per i parametri di calibrazione + + + + Copyright notice + Avviso sul copyright + + + + Shift+F1 + Shift+F1 + + + + Fox log + Fox log + + + + FT8 DXpedition Mode User Guide + Manuale Utente modo FT8 DXpedition + + + + Reset Cabrillo log ... + Ripristina Cabrillo log ... + + + + Color highlighting scheme + Schema di evidenziazione del colore + + + + Contest Log + Log del Contest + + + + Export Cabrillo log ... + Esporta Log Cabrillo ... + + + + Quick-Start Guide to WSJT-X 2.0 + Guida rapida per WSJT-X 2.0 + + + + Contest log + Log del Contest + + + + Erase WSPR hashtable + Cancella hashtable WSPR + + + + FT4 + FT4 + + + + Rig Control Error + Errore di controllo rig + + + + + + Receiving + Ricevente + + + + Do you want to reconfigure the radio interface? + Vuoi riconfigurare l'interfaccia radio? + + + + Error Scanning ADIF Log + Errore durante la scansione del registro ADIF + + + + Scanned ADIF log, %1 worked before records created + Log ADIF scansionato,%1 ha funzionato prima della creazione dei record + + + + Error Loading LotW Users Data + Errore durante il caricamento dei dati degli utenti di LotW + + + + Error Writing WAV File + Errore durante la scrittura del file WAV + + + + Configurations... + Configurazioni... + + + + + + + + + + + + + + + + + + + Message + Messaggio + + + + Error Killing jt9.exe Process + Errore durante l'uccisione del processo jt9.exe + + + + KillByName return code: %1 + Codice di ritorno KillByName:%1 + + + + Error removing "%1" + Errore durante la rimozione di "%1" + + + + Click OK to retry + Fai clic su OK per riprovare + + + + + Improper mode + Modalità impropria + + + + + File Open Error + Errore apertura file + + + + + + + + Cannot open "%1" for append: %2 + Impossibile aprire "%1" per aggiungere:%2 + + + + Error saving c2 file + Errore salvataggio file c2 + + + + Error in Sound Input + Errore nell'ingresso audio + + + + Error in Sound Output + Errore nell'uscita audio + + + + + + Single-Period Decodes + Decodifiche a periodo singolo + + + + + + Average Decodes + Media Decodifiche + + + + Change Operator + Cambio Operatore + + + + New operator: + Nuovo operatore: + + + + Status File Error + Errore del file di stato + + + + + Cannot open "%1" for writing: %2 + Impossibile aprire "%1" per la scrittura:%2 + + + + Subprocess Error + Errore sottoprocesso + + + + Subprocess failed with exit code %1 + Il sottoprocesso non è riuscito con il codice di uscita%1 + + + + + Running: %1 +%2 + In esecuzione: %1 +%2 + + + + Subprocess error + Errore sottoprocesso + + + + Reference spectrum saved + Spettro di riferimento salvato + + + + Invalid data in fmt.all at line %1 + Dati non validi in fmt.all alla riga%1 + + + + Good Calibration Solution + Buona soluzione di calibrazione + + + + <pre>%1%L2 ±%L3 ppm +%4%L5 ±%L6 Hz + +%7%L8 +%9%L10 Hz</pre> + <pre>%1%L2 ±%L3 ppm +%4%L5 ±%L6 Hz + +%7%L8 +%9%L10 Hz</pre> + + + + Delete Calibration Measurements + Elimina misure di calibrazione + + + + The "fmt.all" file will be renamed as "fmt.bak" + Il file "fmt.all" verrà rinominato come "fmt.bak" + + + + If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: + +"The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group." + Se si utilizza in modo equo qualsiasi parte di WSJT-X in base ai termini della GNU General Public License, è necessario visualizzare in modo evidente la seguente nota sul copyright nell'opera derivata: + +"Gli algoritmi, il codice sorgente, l'aspetto di WSJT-X e dei relativi programmi e le specifiche del protocollo per le modalità FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 sono Copyright (C) 2001-2020 di uno o più dei seguenti autori: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q e altri membri del WSJT Development Group. " + + + + No data read from disk. Wrong file format? + Nessun dato letto dal disco. Formato file errato? + + + + Confirm Delete + Conferma Eliminazione + + + + Are you sure you want to delete all *.wav and *.c2 files in "%1"? + Sei sicuro di voler eliminare tutti i file * .wav e * .c2 in "%1"? + + + + Keyboard Shortcuts + Scorciatoie da tastiera + + + + Special Mouse Commands + Comandi speciali mouse + + + + No more files to open. + Niente più file da aprire. + + + + Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m. + Scegli un'altra frequenza Tx. WSJT-X non trasmetterà consapevolmente un'altra modalità nella sottobanda WSPR a 30 m. + + + + WSPR Guard Band + Banda di guardia WSPR + + + + Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands. + Scegli un'altra frequenza di composizione. WSJT-X non funzionerà in modalità Fox nelle sottobande FT8 standard. + + + + Fox Mode warning + Avviso modalità Fox + + + + Last Tx: %1 + Ultimo Tx:%1 + + + + Should you switch to EU VHF Contest mode? + +To do so, check 'Special operating activity' and +'EU VHF Contest' on the Settings | Advanced tab. + Dovresti passare alla modalità Contest VHF EU? + +Per fare ciò, selezionare "Attività operativa speciale" e +"Contest VHF EU" sulle impostazioni | Scheda Avanzate. + + + + Should you switch to ARRL Field Day mode? + Dovresti passare alla modalità Field Day di ARRL? + + + + Should you switch to RTTY contest mode? + Dovresti passare alla modalità contest RTTY? + + + + + + + Add to CALL3.TXT + Aggiungi a CALL3.TXT + + + + Please enter a valid grid locator + Inserisci un localizzatore di griglia valido + + + + Cannot open "%1" for read/write: %2 + Impossibile aprire "%1" per lettura / scrittura:%2 + + + + %1 +is already in CALL3.TXT, do you wish to replace it? + %1 +è già in CALL3.TXT, desideri sostituirlo? + + + + Warning: DX Call field is empty. + Avviso: il campo Chiamata DX è vuoto. + + + + Log file error + Errore nel file di registro + + + + Cannot open "%1" + Impossibile aprire "%1" + + + + Error sending log to N1MM + Errore durante l'invio del Log a N1MM + + + + Write returned "%1" + Scrivi ha restituito "%1" + + + + Stations calling DXpedition %1 + Stazioni che chiamano la DXpedition %1 + + + + Hound + (Hound=Cane da caccia) + Hound + + + + Tx Messages + Messaggi Tx + + + + + + Confirm Erase + Conferma Cancella + + + + Are you sure you want to erase file ALL.TXT? + Sei sicuro di voler cancellare il file ALL.TXT? + + + + + Confirm Reset + Conferma Ripristina + + + + Are you sure you want to erase your contest log? + Sei sicuro di voler cancellare il tuo Log del contest? + + + + Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log. + In questo modo verranno rimossi tutti i record QSO per il contest corrente. Saranno conservati nel file di registro ADIF ma non saranno disponibili per l'esportazione nel registro Cabrillo. + + + + Cabrillo Log saved + Log Cabrillo salvato + + + + Are you sure you want to erase file wsjtx_log.adi? + Sei sicuro di voler cancellare il file wsjtx_log.adi? + + + + Are you sure you want to erase the WSPR hashtable? + Sei sicuro di voler cancellare la tabella hash WSPR? + + + + VHF features warning + VHF presenta un avviso + + + + Tune digital gain + Ottimizza il guadagno digitale + + + + Transmit digital gain + Trasmetti Guadagno digitale + + + + Prefixes + Prefissi + + + + Network Error + Errore di Rete + + + + Error: %1 +UDP server %2:%3 + Errore:%1 +Server UDP%2:%3 + + + + File Error + Errore File + + + + Phase Training Disabled + Fase di Allenamento Disabilitato + + + + Phase Training Enabled + Fase di allenamento abilitato + + + + WD:%1m + WD:%1m + + + + + Log File Error + Errore file di Log + + + + Are you sure you want to clear the QSO queues? + Sei sicuro di voler cancellare le code QSO? + + + + MessageAveraging + + + + Message Averaging + Media dei messaggi + + + + UTC Sync DT Freq + UTC Sync DT Freq + + + + Modes + + + + Mode + Modo + + + + MultiSettings + + + Default + Default + + + + MultiSettings::impl + + + &Switch To + &Passa a + + + + &Clone + &Clona + + + + Clone &Into ... + &Clona In ... + + + + R&eset + &Ripristina + + + + &Rename ... + &Rinomina ... + + + + &Delete + &Elimina + + + + Clone Into Configuration + Clona nella Configurazione + + + + Confirm overwrite of all values for configuration "%1" with values from "%2"? + Conferma sovrascrittura di tutti i valori per la configurazione "%1" con i valori da "%2"? + + + + Reset Configuration + Ripristina Configurazione + + + + Confirm reset to default values for configuration "%1"? + Conferma ripristino ai valori predefiniti per la configurazione "%1"? + + + + Delete Configuration + Cancella Configurazione + + + + Confirm deletion of configuration "%1"? + Conferma cancellazione della configurazione "%1"? + + + + NameDialog + + + New Configuration Name + Nuovo nome di configurazione + + + + Old name: + Vecchio nome: + + + + &New name: + &Nuovo nome: + + + + OmniRigTransceiver + + + OmniRig: unrecognized mode + OmniRig: modalità non riconosciuta + + + + Failed to start OmniRig COM server + Impossibile avviare il server COM OmniRig + + + + + OmniRig: don't know how to set rig frequency + OmniRig: non so come impostare la frequenza del rig + + + + + OmniRig: timeout waiting for update from rig + OmniRig: timeout in attesa di aggiornamento dal rig + + + + OmniRig COM/OLE error: %1 at %2: %3 (%4) + OmniRig errore.COM/OLE: %1 a %2: %3 (%4) + + + + PollingTransceiver + + + Unexpected rig error + Errore imprevisto del rig + + + + QObject + + + User Defined + Definito dall'utente + + + + Failed to open LotW users CSV file: '%1' + Impossibile aprire ilf file CSV LotW degli utenti: '%1' + + + + OOB + OOB + + + + Too many colours in palette. + Troppi colori nella tavolozza. + + + + Error reading waterfall palette file "%1:%2" too many colors. + Errore lettura del file della tavolozza del display a cascata "%1:%2" troppi colori. + + + + Error reading waterfall palette file "%1:%2" invalid triplet. + Errore lettura del file della tavolozza del display a cascata "%1:%2" terzina invalida. + + + + Error reading waterfall palette file "%1:%2" invalid color. + Errore lettura del file della tavolozza del display a cascata "%1:%2" colore invalido. + + + + Error opening waterfall palette file "%1": %2. + Errore lettura del file della tavolozza del display a cascata "%1: %2. + + + + Error writing waterfall palette file "%1": %2. + Errore lettura del file della tavolozza del display a cascata "%1: %2. + + + + RemoteFile + + + + + + + + File System Error + Errore File System + + + + Cannot rename file: +"%1" +to: "%2" +Error(%3): %4 + Impossibile rinominare il file: +"%1" +a: "%2" +Errore(%3): %4 + + + + Cannot delete file: +"%1" + Impossibile cancellare il file: +"%1" + + + + + + Network Error + Errore di Rete + + + + Too many redirects: %1 + Troppi reindirizzamenti: %1 + + + + Redirect not followed: %1 + Reindirizzamento non seguito: %1 + + + + Cannot commit changes to: +"%1" + Impossibile eseguire il commit delle modifiche a: +"%1" + + + + Cannot open file: +"%1" +Error(%2): %3 + Impossibile aprire il file: +"%1" +Errore(%2): %3 + + + + Cannot make path: +"%1" + Impossibile creare il percorso: +"%1" + + + + Cannot write to file: +"%1" +Error(%2): %3 + Impossibile scrivere sul file: +"%1" +Errore (%2):%3 + + + + SampleDownloader::impl + + + Download Samples + Scarica campioni + + + + &Abort + &Aborta + + + + &Refresh + &Ricarica + + + + &Details + &Dettagli + + + + Base URL for samples: + URL base per i campioni: + + + + Only use HTTP: + Usa solo HTTP: + + + + Check this is you get SSL/TLS errors + Verifica che si ottengano errori SSL / TLS + + + + Input Error + Errore ingresso + + + + Invalid URL format + Formato URL invalido + + + + SoundInput + + + An error opening the audio input device has occurred. + Si è verificato un errore durante l'apertura del dispositivo di input audio. + + + + An error occurred during read from the audio input device. + Si è verificato un errore durante la lettura dal dispositivo di ingresso audio. + + + + Audio data not being fed to the audio input device fast enough. + I dati audio non vengono inviati al dispositivo di input audio abbastanza velocemente. + + + + Non-recoverable error, audio input device not usable at this time. + Errore non recuperabile, dispositivo di input audio non utilizzabile in questo momento. + + + + Requested input audio format is not valid. + Il formato audio di input richiesto non è valido. + + + + Requested input audio format is not supported on device. + Il formato audio di input richiesto non è supportato sul dispositivo. + + + + Failed to initialize audio sink device + Impossibile inizializzare il dispositivo sink audio + + + + Idle + Inattivo + + + + Receiving + Ricevente + + + + Suspended + Sospeso + + + + Interrupted + Interrotto + + + + Error + Errore + + + + Stopped + Fermato + + + + SoundOutput + + + An error opening the audio output device has occurred. + Si è verificato un errore durante l'apertura del dispositivo di uscita audio. + + + + An error occurred during write to the audio output device. + Si è verificato un errore durante la scrittura sul dispositivo di uscita audio. + + + + Audio data not being fed to the audio output device fast enough. + I dati audio non vengono inviati al dispositivo di uscita audio abbastanza velocemente. + + + + Non-recoverable error, audio output device not usable at this time. + Errore non recuperabile, dispositivo di uscita audio non utilizzabile in questo momento. + + + + Requested output audio format is not valid. + Il formato audio di output richiesto non è valido. + + + + Requested output audio format is not supported on device. + Il formato audio di output richiesto non è supportato sul dispositivo. + + + + Idle + Inattivo + + + + Sending + Invio + + + + Suspended + Sospeso + + + + Interrupted + Interrotto + + + + Error + Errore + + + + Stopped + Fermato + + + + StationDialog + + + Add Station + Aggoingi Stazione + + + + &Band: + &Banda: + + + + &Offset (MHz): + &Offset (MHz): + + + + &Antenna: + &Antenna: + + + + StationList::impl + + + Band name + Nome Banda + + + + Frequency offset + Offset di frequenza + + + + Antenna description + Descrizione Antenna + + + + Band + Banda + + + + Offset + Offset + + + + Antenna Description + Descrizione Antenna + + + + TransceiverBase + + + Unexpected rig error + Errore imprevisto del rig + + + + WideGraph + + + Dialog + Dialogo + + + + Controls + Controlli + + + + Spectrum gain + Guadagno Spettro + + + + Palette + Tavolozza + + + + <html><head/><body><p>Enter definition for a new color palette.</p></body></html> + <html><head/><body><p>Inserisci la definizione per una nuova tavolozza di colori.</p></body></html> + + + + Adjust... + Regola... + + + + Waterfall gain + Guadagno Display a cascata + + + + <html><head/><body><p>Set fractional size of spectrum in this window.</p></body></html> + <html><head/><body><p>Imposta la dimensione frazionaria dello spettro in questa finestra.</p></body></html> + + + + % + % + + + + Spec + Spec + + + + <html><head/><body><p>Flatten spectral baseline over the full displayed interval.</p></body></html> + <html><head/><body><p>Appiattire la linea di base spettrale per l'intero intervallo visualizzato.</p></body></html> + + + + Flatten + Appiattire + + + + <html><head/><body><p>Compute and save a reference spectrum. (Not yet fully implemented.)</p></body></html> + <html><head/><body><p>Calcola e salva uno spettro di riferimento. (Non ancora completamente implementato.)</p></body></html> + + + + Ref Spec + Ref Spec + + + + Smoothing of Linear Average spectrum + Livellamento dello spettro medio lineare + + + + Smooth + Liscio + + + + Compression factor for frequency scale + Fattore di compressione per scala di frequenza + + + + Bins/Pixel + Bins/Pixel + + + + Select waterfall palette + Seleziona Tavolozza Display a cascata + + + + <html><head/><body><p>Select data for spectral display</p></body></html> + <html><head/><body><p>Seleziona i dati per la visualizzazione spettrale</p></body></html> + + + + Current + Corrente + + + + Cumulative + Cumulativo + + + + Linear Avg + Media lineare + + + + Reference + Riferimento + + + + <html><head/><body><p>Frequency at left edge of waterfall</p></body></html> + <html><head/><body><p>Frequenza sul bordo sinistro del display a cascata</p></body></html> + + + + Hz + Hz + + + + Start + Inizio + + + + <html><head/><body><p>Decode JT9 only above this frequency</p></body></html> + <html><head/><body><p>Decodifica JT9 solo sopra questa frequenza</p></body></html> + + + + JT9 + JT9 + + + + JT65 + JT65 + + + + Number of FFTs averaged (controls waterfall scrolling rate) + Numero medio di FFT (controlla la velocità di scorrimento del display a cascata) + + + + N Avg + N Avg + + + + Waterfall zero + Azzeramento Display a cascata + + + + Spectrum zero + Azzeramento Spettro + + + + Wide Graph + Grafico Ampio + + + + + Read Palette + Leggi Tavolozza + + + + configuration_dialog + + + Settings + Impostazioni + + + + Genera&l + &Generale + + + + General station details and settings. + Dettagli e impostazioni generali della stazione. + + + + Station Details + Dettagli Stazione + + + + My C&all: + &Mio indicativo: + + + + Station callsign. + Nominativo Stazione. + + + + M&y Grid: + &Mia Griglia: + + + + <html><head/><body><p>Maidenhead locator, preferably 6 characters.</p></body></html> + <html><head/><body><p>Localizzatore Maidenhead, preferibilmente 6 caratteri.</p></body></html> + + + + Check to allow grid changes from external programs + Selezionare per consentire le modifiche alla griglia da programmi esterni + + + + AutoGrid + Griglia Auto + + + + IARU Region: + Regione IARU: + + + + <html><head/><body><p>Select your IARU region.</p></body></html> + <html><head/><body><p>Seleziona la tua regione IARU.</p></body></html> + + + + Message generation for type 2 compound callsign holders: + Generazione di messaggi per titolari di nominativi composti di tipo 2: + + + + <html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html> + <html><head/><body><p>I nominativi composti di tipo 2 sono quelli con prefissi o suffissi non inclusi nella lista consentita (Vedi Aiuto-&gt; Prefissi e suffissi aggiuntivi).</p><p> Questa opzione determina quali messaggi generati devono contenere la chiamata composta completa di tipo 2 anziché il tuo nominativo di base. Si applica solo se si dispone di un nominativo composto di tipo 2.</p><p> Questa opzione controlla il modo in cui vengono generati i messaggi utilizzati per rispondere alle chiamate CQ. I messaggi generati 6 (CQ) e 5 (73) conterranno sempre il tuo nominativo completo. I protocolli JT65 e JT9 consentono alcuni messaggi standard con il tuo nominativo completo a spese di un'altra informazione come la chiamata DX o il tuo localizzatore. </p><p> La scelta del messaggio 1 omette il nominativo DX che potrebbe essere un problema quando si risponde alle chiamate CQ. La scelta del messaggio 3 omette anche il nominativo DX e molte versioni di questo e di altri software non estrarranno il rapporto. Scegliere nessuno dei due significa che il tuo nominativo completo va inserito solo nel tuo messaggio 5 (73), quindi il tuo partner del QSO potrebbe registrare un nominativo errato.</p><p>Nessuna di queste opzioni è perfetta, il messaggio 3 è in genere il migliore ma fai attenzione al tuo partner di QSO che potrebbe non registrare il rapporto che gli hai inviato.</p></body></html> + + + + Full call in Tx1 + Chiamata completa in Tx1 + + + + Full call in Tx3 + Chiamata completa in Tx3 + + + + Full call in Tx5 only + Chiamata completa solo in Tx5 + + + + Display + Display + + + + Show outgoing transmitted messages in the Rx frequency window. + Mostra i messaggi trasmessi in uscita nella finestra Frequenza Rx. + + + + &Tx messages to Rx frequency window + &Tx messaggi alla finestra della frequenza Rx + + + + Show if decoded stations are new DXCC entities or worked before. + Mostra se le stazioni decodificate sono nuove entità DXCC o sono state lavorate prima. + + + + Show &DXCC, grid, and worked-before status + Mostra &DXCC, griglia e stato lavorato prima + + + + <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> + <html><head/><body><p>Verifica che la decodifica di un nuovo periodo inizi nella parte superiore della finestra Attività di banda e non scorra verso l'alto quando la finestra è piena.</p><p>Questo è di aiuto nella selezione di decodifiche da fare doppio clic mentre la decodifica è ancora in corso. Utilizza la barra di scorrimento verticale per rivelare decodifiche oltre la parte inferiore della finestra.</p></body></html> + + + + Start new period decodes at top + Inizia nuovo periodo decodifiche in alto + + + + Show principal prefix instead of country name + Mostra il prefisso principale anziché il nome del paese + + + + Set the font characteristics for the application. + Imposta le caratteristiche del carattere per l'applicazione. + + + + Font... + Tipo Carattere... + + + + Set the font characteristics for the Band Activity and Rx Frequency areas. + Imposta le caratteristiche del carattere per le aree Attività banda e Frequenza Rx. + + + + Decoded Text Font... + Carattere del testo decodificato... + + + + Include a separator line between periods in the band activity window. + Includere una linea di separazione tra i periodi nella finestra dell'attività della banda. + + + + &Blank line between decoding periods + &Riga vuota tra i periodi di decodifica + + + + Show distance to DX station in miles rather than kilometers. + Mostra la distanza dalla stazione DX in miglia anziché in chilometri. + + + + Display dista&nce in miles + Visualizza la dista&nza in miglia + + + + Behavior + Comportamento + + + + Decode after EME delay + Decodifica dopo il ritardo EME + + + + Tx watchdog: + Tx watchdog: + + + + <html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html> + <html><head/><body><p>Numero di minuti prima che le trasmissioni non presidiate vengano interrotte</p></body></html> + + + + Disabled + Disabilitato + + + + minutes + minuti + + + + Enable VHF/UHF/Microwave features + Abilita le funzionalità VHF / UHF / Microonde + + + + Single decode + Decodifica singola + + + + <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> + <html><head/><body><p>Alcuni rig non sono in grado di elaborare i comandi CAT durante la trasmissione. Ciò significa che se stai operando in modalità split potresti dover deselezionare questa opzione. </p></body></html> + + + + Allow Tx frequency changes while transmitting + Consenti cambi di frequenza Tx durante la trasmissione + + + + Don't start decoding until the monitor button is clicked. + Non iniziare la decodifica fino a quando non si fa clic sul pulsante monitor. + + + + Mon&itor off at startup + Mon&itor spento all'avvio + + + + <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> + <html><head/><body><p> Selezionare questa opzione se si desidera tornare automaticamente all'ultima frequenza monitorata quando il monitor è abilitato, lasciarlo deselezionato se si desidera mantenere la frequenza corrente del rig.</p></body></html> + + + + Monitor returns to last used frequency + Il monitor ritorna all'ultima frequenza utilizzata + + + + Alternate F1-F6 bindings + Attacchi F1-F6 alternati + + + + Turns off automatic transmissions after sending a 73 or any other free +text message. + Disattiva le trasmissioni automatiche dopo aver inviato un 73 o qualsiasi altro +messaggio testuale libero. + + + + Di&sable Tx after sending 73 + Di&sabilita Tx dopo l'invio 73 + + + + Send a CW ID after every 73 or free text message. + Invia un ID CW dopo ogni 73 o messaggio di testo libero. + + + + CW ID a&fter 73 + ID CW d&opo 73 + + + + Periodic CW ID Inter&val: + Inter&vallo ID CW periodico: + + + + Send a CW ID periodically every few minutes. +This might be required under your countries licence regulations. +It will not interfere with other users as it is always sent in the +quiet period when decoding is done. + Invia un ID CW periodicamente ogni pochi minuti. +Questo potrebbe essere richiesto dalle normative di licenza dei tuoi paesi. +Non interferirà con altri utenti in quanto viene sempre inviato in +periodo di quiete al termine della decodifica. + + + + Automatic transmission mode. + Modalità di trasmissione automatica. + + + + Doubl&e-click on call sets Tx enable + Far&e doppio clic sul nominativo Abilita il Tx + + + + Calling CQ forces Call 1st + Chiamando CQ forza Call 1º + + + + &Radio + &Radio + + + + Radio interface configuration settings. + Impostazioni di configurazione dell'interfaccia radio. + + + + Settings that control your CAT interface. + Impostazioni che controllano l'interfaccia CAT. + + + + CAT Control + Controllo CAT + + + + + Port: + Porta: + + + + Serial port used for CAT control. + Porta seriale utilizzata per il controllo CAT. + + + + Serial Port Parameters + Parametri Porta Seriale + + + + Baud Rate: + Baud Rate: + + + + Serial port data rate which must match the setting of your radio. + Velocità dati della porta seriale che deve corrispondere all'impostazione della radio. + + + + 1200 + 1200 + + + + 2400 + 2400 + + + + 4800 + 4800 + + + + 9600 + 9600 + + + + 19200 + 19200 + + + + 38400 + 38400 + + + + 57600 + 57600 + + + + 115200 + 115200 + + + + <html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html> + <html><head/><body><p>Numero di bit di dati utilizzati per comunicare con l'interfaccia CAT della radio (in genere otto). </p></body></html> + + + + Data Bits + Bit di dati + + + + D&efault + Pred&efinito + + + + Se&ven + Se&tte + + + + E&ight + O&tto + + + + <html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html> + <html><head/><body><p>Numero di bit di stop utilizzati durante la comunicazione con l'interfaccia CAT della radio</p><p>(consultare il manuale della radio per i dettagli).</p></body></html> + + + + Stop Bits + Bits di Stop + + + + + Default + Predefinito + + + + On&e + &Uno + + + + T&wo + &Due + + + + <html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html> + <html><head/><body><p>Protocollo di controllo del flusso utilizzato tra questo computer e l'interfaccia CAT della radio (in genere &quot;Nessuno&quot; ma qualcuno richiede &quot;Hardware&quot;).</p></body></html> + + + + Handshake + Handshake + + + + &None + &Nessuno + + + + Software flow control (very rare on CAT interfaces). + Controllo del flusso del software (molto raro sulle interfacce CAT). + + + + XON/XOFF + XON/XOFF + + + + Flow control using the RTS and CTS RS-232 control lines +not often used but some radios have it as an option and +a few, particularly some Kenwood rigs, require it). + Controllo del flusso mediante le linee di controllo RTS e CTS RS-232 +non usato spesso ma alcune radio lo hanno come opzione e +alcuni, in particolare (alcuni rig Kenwood, lo richiedono). + + + + &Hardware + &Hardware + + + + Special control of CAT port control lines. + Controllo speciale delle linee di controllo della porta CAT. + + + + Force Control Lines + Forza Linee di controllo + + + + + High + Alto + + + + + Low + Basso + + + + DTR: + DTR: + + + + RTS: + RTS: + + + + How this program activates the PTT on your radio? + In che modo questo programma attiva il PTT sulla radio? + + + + PTT Method + Metodo PTT + + + + <html><head/><body><p>No PTT activation, instead the radio's automatic VOX is used to key the transmitter.</p><p>Use this if you have no radio interface hardware.</p></body></html> + <html><head/><body><p>Nessuna attivazione PTT, invece viene utilizzato il VOX automatico della radio per attivare il trasmettitore.</p><p>Usalo se non hai hardware di interfaccia radio.</p></body></html> + + + + VO&X + VO&X + + + + <html><head/><body><p>Use the RS-232 DTR control line to toggle your radio's PTT, requires hardware to interface the line.</p><p>Some commercial interface units also use this method.</p><p>The DTR control line of the CAT serial port may be used for this or a DTR control line on a different serial port may be used.</p></body></html> + <html><head/><body><p>Utilizzare la linea di controllo DTR RS-232 per attivare / disattivare il PTT della radio, richiede l'hardware per interfacciare la linea.</p><p>Anche alcune unità di interfaccia commerciale utilizzano questo metodo.</p><p>La linea di controllo DTR della porta seriale CAT può essere usata a questo scopo o una linea di controllo DTR su una porta seriale diversa.</p></body></html> + + + + &DTR + &DTR + + + + Some radios support PTT via CAT commands, +use this option if your radio supports it and you have no +other hardware interface for PTT. + Alcune radio supportano PTT tramite comandi CAT, +usa questa opzione se la tua radio la supporta e non hai +altra interfaccia hardware per PTT. + + + + C&AT + C&AT + + + + <html><head/><body><p>Use the RS-232 RTS control line to toggle your radio's PTT, requires hardware to interface the line.</p><p>Some commercial interface units also use this method.</p><p>The RTS control line of the CAT serial port may be used for this or a RTS control line on a different serial port may be used. Note that this option is not available on the CAT serial port when hardware flow control is used.</p></body></html> + <html><head/><body><p>Usa la linea di controllo RS-232 RTS per attivare / disattivare il PTT della tua radio, richiede hardware per interfacciare la linea. </p><p>Anche alcune unità di interfaccia commerciale usano questo metodo.</p><p>La linea di controllo RTS della porta seriale CAT può essere utilizzata per questa o una linea di controllo RTS su una porta seriale diversa. Questa opzione non è disponibile sulla porta seriale CAT quando viene utilizzato il controllo del flusso hardware.</p></body></html> + + + + R&TS + R&TS + + + + <html><head/><body><p>Select the RS-232 serial port utilised for PTT control, this option is available when DTR or RTS is selected above as a transmit method.</p><p>This port can be the same one as the one used for CAT control.</p><p>For some interface types the special value CAT may be chosen, this is used for non-serial CAT interfaces that can control serial port control lines remotely (OmniRig for example).</p></body></html> + <html><head/><body><p>Seleziona la porta seriale RS-232 utilizzata per il controllo PTT, questa opzione è disponibile quando DTR o RTS è selezionato sopra come metodo di trasmissione.</p><p>Questa porta può essere uguale a quello utilizzato per il controllo CAT.</p><p>Per alcuni tipi di interfaccia è possibile scegliere il valore speciale CAT, utilizzato per interfacce CAT non seriali che possono controllare da remoto le linee di controllo della porta seriale ( OmniRig per esempio).</p></body></html> + + + + Modulation mode selected on radio. + Modalità di modulazione selezionata alla radio. + + + + Mode + Modo + + + + <html><head/><body><p>USB is usually the correct modulation mode,</p><p>unless the radio has a special data or packet mode setting</p><p>for AFSK operation.</p></body></html> + <html><head/><body><p>L'USB è di solito la modalità di modulazione corretta,</p><p>a meno che la radio non abbia un'impostazione di dati speciali o modalità pacchetto</p><p>per il funzionamento di AFSK.</p></body></html> + + + + US&B + US&B + + + + Don't allow the program to set the radio mode +(not recommended but use if the wrong mode +or bandwidth is selected). + Non consentire al programma di impostare la modalità radio +(sconsigliato ma utilizzare se la modalità sbagliata +o la larghezza di banda è selezionata). + + + + + None + Nessuno + + + + If this is available then it is usually the correct mode for this program. + Se questo è disponibile, di solito è la modalità corretta per questo programma. + + + + Data/P&kt + Data/P&kt + + + + Some radios can select the audio input using a CAT command, +this setting allows you to select which audio input will be used +(if it is available then generally the Rear/Data option is best). + Alcune radio possono selezionare l'ingresso audio utilizzando un comando CAT, +questa impostazione consente di selezionare quale ingresso audio verrà utilizzato +(se disponibile, in genere l'opzione Posteriore / Dati è la migliore). + + + + Transmit Audio Source + Trasmettere la sorgente audio + + + + Rear&/Data + Rear&/Data + + + + &Front/Mic + &Front/Mic + + + + Rig: + Rig: + + + + Poll Interval: + Intervallo di Interrogazione: + + + + <html><head/><body><p>Interval to poll rig for status. Longer intervals will mean that changes to the rig will take longer to be detected.</p></body></html> + <html><head/><body><p>Intervallo di interrogazione del rig per sapere lo status. Intervalli più lunghi significheranno che le modifiche al rig richiedono più tempo per essere rilevate.</p></body></html> + + + + s + s + + + + <html><head/><body><p>Attempt to connect to the radio with these settings.</p><p>The button will turn green if the connection is successful or red if there is a problem.</p></body></html> + <html><head/><body><p>Tenta di connettersi alla radio con queste impostazioni.</p><p>Il pulsante diventerà verde se la connessione ha esito positivo o rosso in caso di problemi. </p></body></html> + + + + Test CAT + Test CAT + + + + Attempt to activate the transmitter. +Click again to deactivate. Normally no power should be +output since there is no audio being generated at this time. +Check that any Tx indication on your radio and/or your +radio interface behave as expected. + Tentare di attivare il trasmettitore. +Fai di nuovo clic per disattivare. Normalmente non dovrebbe esserci nessuna +potenza in uscita poiché al momento non viene generato audio. +Verificare che qualsiasi indicazione Tx sulla radio e / o sul proprio +l'interfaccia radio si comporta come previsto. + + + + Test PTT + Prova-PTT + + + + Split Operation + Operazione in Split + + + + Fake It + Fai finta + + + + Rig + Rig + + + + A&udio + A&udio + + + + Audio interface settings + Impostazioni dell'interfaccia audio + + + + Souncard + Scheda audio + + + + Soundcard + Scheda audio + + + + Select the audio CODEC to use for transmitting. +If this is your default device for system sounds then +ensure that all system sounds are disabled otherwise +you will broadcast any systems sounds generated during +transmitting periods. + Seleziona l'audio CODEC da utilizzare per la trasmissione. +Se questo è il dispositivo predefinito per i suoni di sistema, allora +assicurarsi che tutti i suoni di sistema siano disabilitati altrimenti +trasmetterai qualsiasi suono di sistema generato durante +periodi di trasmissione. + + + + Select the audio CODEC to use for receiving. + Seleziona l'audio CODEC da utilizzare per la ricezione. + + + + &Input: + &Ingresso: + + + + Select the channel to use for receiving. + Seleziona il canale da utilizzare per la ricezione. + + + + + Mono + Mono + + + + + Left + Sinistro + + + + + Right + Destro + + + + + Both + Entrambi + + + + Select the audio channel used for transmission. +Unless you have multiple radios connected on different +channels; then you will usually want to select mono or +both here. + Seleziona il canale audio utilizzato per la trasmissione. +A meno che tu non abbia più radio collegate su differenti +canali; quindi di solito si desidera selezionare mono o +entrambi qui. + + + + Ou&tput: + Usci&ta: + + + + + Save Directory + Salva directory + + + + Loc&ation: + &Posizione: + + + + Path to which .WAV files are saved. + Percorso in cui vengono salvati i file .WAV. + + + + + TextLabel + Etichetta di testo + + + + Click to select a different save directory for .WAV files. + Fare clic per selezionare una directory di salvataggio diversa per i file .WAV. + + + + S&elect + S&eleziona + + + + + AzEl Directory + AzEl Directory + + + + Location: + Posizione: + + + + Select + Seleziona + + + + Power Memory By Band + Memoria di Potenza per banda + + + + Remember power settings by band + Ricorda le impostazioni di alimentazione per banda + + + + Enable power memory during transmit + Abilita la memoria di potenza durante la trasmissione + + + + Transmit + Trasmetti + + + + Enable power memory during tuning + Abilita la memoria di potenza durante la sintonia + + + + Tune + Accorda + + + + Tx &Macros + Tx &Macros + + + + Canned free text messages setup + Impostazione dei messaggi di testo libero + + + + &Add + &Aggiungi + + + + &Delete + &Elimina + + + + Drag and drop items to rearrange order +Right click for item specific actions +Click, SHIFT+Click and, CRTL+Click to select items + Trascina e rilascia elementi per riorganizzare l'ordine +Fare clic con il tasto destro per azioni specifiche dell'oggetto +Fare clic, MAIUSC + clic e, CRTL + clic per selezionare gli elementi + + + + Reportin&g + &Segnalazione + + + + Reporting and logging settings + Impostazioni di report e registrazione + + + + Logging + Registrazione + + + + The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. + Il programma aprirà una finestra di dialogo Log QSO parzialmente completata quando si invia un messaggio di testo libero o 73. + + + + Promp&t me to log QSO + Avvisami di regis&trare il QSO + + + + Op Call: + Nominativo Op: + + + + Some logging programs will not accept the type of reports +saved by this program. +Check this option to save the sent and received reports in the +comments field. + (Registrazione=Log) + Alcuni programmi di registrazione non accettano il tipo di report +salvato da questo programma. +Seleziona questa opzione per salvare i rapporti inviati e ricevuti nel +campo commenti. + + + + d&B reports to comments + Riporta d&B nei commenti + + + + Check this option to force the clearing of the DX Call +and DX Grid fields when a 73 or free text message is sent. + Seleziona questa opzione per forzare la cancellazione della chiamata DX +e i campi della Griglia DX quando viene inviato un messaggio di testo libero o 73. + + + + Clear &DX call and grid after logging + (Griglia=GRID LOCATOR) + Cancella chiamata &DX e la griglia dopo la registrazione + + + + <html><head/><body><p>Some logging programs will not accept WSJT-X mode names.</p></body></html> + (Registrazione=Log) + <html><head/><body><p>Alcuni programmi di registrazione non accettano i nomi della modalità WSJT-X.</p></body></html> + + + + Con&vert mode to RTTY + Con&vertire la modalità in RTTY + + + + <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> + <html><head/><body><p>Il nominativo dell'operatore, se diverso dal nominativo della stazione.</p></body></html> + + + + <html><head/><body><p>Check to have QSOs logged automatically, when complete.</p></body></html> + <html><head/><body><p>Verifica che i QSO siano registrati automaticamente, quando completi. </p></body></html> + + + + Log automatically (contesting only) + (Registra=Scrivi nel Log) + Registra automaticamente (solo in contest) + + + + Network Services + Servizi di rete + + + + The program can send your station details and all +decoded signals as spots to the http://pskreporter.info web site. +This is used for reverse beacon analysis which is very useful +for assessing propagation and system performance. + Il programma può inviare i dettagli della tua stazione e tutto il resto +segnali decodificati come spot per il sito Web http://pskreporter.info. +Questo è usato per l'analisi del beacon inverso che è molto utile +per valutare la propagazione e le prestazioni del sistema. + + + + Enable &PSK Reporter Spotting + Abilita rilevamento &PSK Reporter + + + + UDP Server + UDP Server + + + + UDP Server: + UDP Server: + + + + <html><head/><body><p>Optional hostname of network service to receive decodes.</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable the broadcasting of UDP status updates.</p></body></html> + <html><head/><body><p>Nome host facoltativo del servizio di rete per ricevere decodifiche.</p><p>Formati:</p><ul style="margin-top: 0px; margin-bottom: 0px; margine-sinistra: 0px; margine-destra: 0px; -qt-list-indent: 1;"><li style="margin-top: 12px; margin-bottom: 0px; margin-left: 0px; margin- right: 0px; -qt-block-indent: 0; text-indent: 0px;">hostname</li><li style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin -right: 0px; -qt-block-indent: 0; text-indent: 0px;">Indirizzo IPv4</li><li style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px ; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;">Indirizzo IPv6</li><li style="margin-top: 0px; margin-bottom: 0px; margin-left : 0px; margine-destra: 0px; -qt-block-indent: 0; text-indent: 0px;">Indirizzo gruppo multicast IPv4</li><li style="margin-top: 0px; margin-bottom: 0px ; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;">Indirizzo gruppo multicast IPv6</li></ul><p>Deselezionando questo campo si disabilita la trasmissione di aggiornamenti di stato UDP.</p></Body></html> + + + + UDP Server port number: + Porta del Server UDP: + + + + <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be broadcast.</p></body></html> + <html><head/><body><p>Immettere il numero di porta del servizio del server UDP a cui WSJT-X deve inviare gli aggiornamenti. Se questo è zero, non verranno trasmessi aggiornamenti.</p></body></html> + + + + <html><head/><body><p>With this enabled WSJT-X will accept certain requests back from a UDP server that receives decode messages.</p></body></html> + <html><head/><body><p>Con questo abilitato WSJT-X accetterà alcune richieste di ritorno da un server UDP che riceve messaggi di decodifica.</p></body></html> + + + + Accept UDP requests + Accetta richieste UDP + + + + <html><head/><body><p>Indicate acceptance of an incoming UDP request. The effect of this option varies depending on the operating system and window manager, its intent is to notify the acceptance of an incoming UDP request even if this application is minimized or hidden.</p></body></html> + <html><head/><body><p>Indica l'accettazione di una richiesta UDP in arrivo. L'effetto di questa opzione varia a seconda del sistema operativo e del gestore delle finestre, il suo intento è di notificare l'accettazione di una richiesta UDP in arrivo anche se questa applicazione è ridotta a icona o nascosta.</p></body></html> + + + + Notify on accepted UDP request + Notifica su richiesta UDP accettata + + + + <html><head/><body><p>Restore the window from minimized if an UDP request is accepted.</p></body></html> + <html><head/><body><p>Ripristina la finestra da minimizzata se viene accettata una richiesta UDP.</p></body></html> + + + + Accepted UDP request restores window + Finestra di ripristino richieste UDP accettate + + + + Secondary UDP Server (deprecated) + Server UDP Secondario (obsoleto) + + + + <html><head/><body><p>When checked, WSJT-X will broadcast a logged contact in ADIF format to the configured hostname and port. </p></body></html> + <html><head/><body><p>Se selezionato, WSJT-X trasmetterà un contatto registrato in formato ADIF al nome host e alla porta configurati.</p></body></html> + + + + Enable logged contact ADIF broadcast + Abilita trasmissione ADIF del contatto registrato + + + + Server name or IP address: + + + + + <html><head/><body><p>Optional host name of N1MM Logger+ program to receive ADIF UDP broadcasts. This is usually 'localhost' or ip address 127.0.0.1</p><p>Formats:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv4 multicast group address</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IPv6 multicast group address</li></ul><p>Clearing this field will disable broadcasting of ADIF information via UDP.</p></body></html> + <html><head/><body><p>Nome host facoltativo del programma Logger + N1MM per ricevere trasmissioni UDP ADIF. Di solito si tratta di "localhost" o indirizzo IP 127.0.0.1</p><p>Formati:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">hostname</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo IPv4</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo IPv6</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo di gruppo multicast IPv4</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indirizzo di gruppo multicast IPv6</li></ul><p>La cancellazione di questo campo disabiliterà la trasmissione di informazioni ADIF tramite UDP.</p></body></html> + + + + Server port number: + Numero porta Server: + + + + <html><head/><body><p>Enter the port number that WSJT-X should use for UDP broadcasts of ADIF log information. For N1MM Logger+, this value should be 2333. If this is zero, no updates will be broadcast.</p></body></html> + <html><head/><body><p>Immettere il numero di porta che WSJT-X deve utilizzare per le trasmissioni UDP delle informazioni del registro ADIF. Per N1MM Logger +, questo valore dovrebbe essere 2333. Se questo è zero, non verrà trasmesso alcun aggiornamento.</p></body></html> + + + + Frequencies + Frequenze + + + + Default frequencies and band specific station details setup + Frequenze predefinite e impostazione specifiche dei dettagli della stazione per banda + + + + <html><head/><body><p>See &quot;Frequency Calibration&quot; in the WSJT-X User Guide for details of how to determine these parameters for your radio.</p></body></html> + <html><head/><body><p>Vedere &quot;Calibrazione di Frequenza&quot;nella Guida dell'utente WSJT-X per i dettagli su come determinare questi parametri per la radio.</p></body></html> + + + + Frequency Calibration + Calibrazione di Frequenza + + + + Slope: + Inclinazione: + + + + ppm + ppm + + + + Intercept: + Intercetta: + + + + Hz + Hz + + + + Working Frequencies + Frequenze di Lavoro + + + + <html><head/><body><p>Right click to maintain the working frequencies list.</p></body></html> + <html><head/><body><p>Fare clic con il tasto destro per mantenere l'elenco delle frequenze di lavoro.</p></body></html> + + + + Station Information + Informazioni Stazione + + + + Items may be edited. +Right click for insert and delete options. + Gli articoli possono essere modificati. +Fare clic con il tasto destro per inserire ed eliminare le opzioni. + + + + Colors + Colori + + + + Decode Highlightling + Evidenziazione Decodifica + + + + <html><head/><body><p>Click to scan the wsjtx_log.adi ADIF file again for worked before information</p></body></html> + <html><head/><body><p>Fare clic per scansionare nuovamente il file ADIF wsjtx_log.adi alla ricerca di informazioni se collegato prima</p></body></html> + + + + Rescan ADIF Log + Eseguire nuovamente la scansione del registro ADIF + + + + <html><head/><body><p>Push to reset all highlight items above to default values and priorities.</p></body></html> + <html><head/><body><p>Premere per ripristinare tutti gli elementi evidenziati sopra ai valori e alle priorità predefiniti.</p></body></html> + + + + Reset Highlighting + Ripristina l'evidenziazione + + + + <html><head/><body><p>Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.</p><p>Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.</p></body></html> + <html><head/><body><p>Abilitare o disabilitare utilizzando le caselle di controllo e fare clic con il pulsante destro del mouse su un elemento per modificare o annullare il colore di primo piano, il colore di sfondo o ripristinare l'elemento sui valori predefiniti. Trascina e rilascia gli elementi per cambiarne la priorità, più in alto nell'elenco ha una priorità più alta.</p><p>Nota che ogni colore di primo piano o di sfondo può essere impostato o non impostato, non impostato significa che non è assegnato per quello di quell'elemento possono essere applicati articoli di tipo e priorità inferiore.</p></body></html> + + + + <html><head/><body><p>Check to indicate new DXCC entities, grid squares, and callsigns per mode.</p></body></html> + <html><head/><body><p>Selezionare per indicare nuove entità DXCC, quadrati della griglia e nominativi per modalità.</p></body></html> + + + + Highlight by Mode + Evidenzia per modalità + + + + Include extra WAE entities + Includi entità WAE extra + + + + Check to for grid highlighting to only apply to unworked grid fields + Verificare che l'evidenziazione della griglia si applichi solo ai campi della griglia non lavorati + + + + Only grid Fields sought + Sono stati cercati solo i campi della griglia + + + + <html><head/><body><p>Controls for Logbook of the World user lookup.</p></body></html> + <html><head/><body><p>Controlli per la ricerca degli utenti di Logbook of the World.</p></body></html> + + + + Logbook of the World User Validation + Convalida dell'utente Logbook of the World + + + + Users CSV file URL: + URL del file CSV degli utenti: + + + + <html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html> + <html><head/><body><p>URL del file di dati e date dell'ultimo caricamento dell'utente ARRL LotW utilizzato per evidenziare i decodificatori dalle stazioni note per caricare il loro file di registro su LotW.</p></body></html> + + + + https://lotw.arrl.org/lotw-user-activity.csv + https://lotw.arrl.org/lotw-user-activity.csv + + + + <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> + <html><head/><body><p>Premere questo pulsante per recuperare l'ultimo file di dati di data e ora di caricamento dell'utente LotW.</p></body></html> + + + + Fetch Now + Scarica ora + + + + Age of last upload less than: + Periodo dell'ultimo caricamento inferiore a: + + + + <html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html> + <html><head/><body><p>Regola questa casella di selezione per impostare la soglia del periodo dell'ultima data di caricamento dell'utente di LotW accettata come utente corrente di LotW.</p></body></html> + + + + days + giorni + + + + Advanced + Avanzato + + + + <html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html> + <html><head/><body><p>Parametri selezionabili dall'utente per la decodifica JT65 VHF/UHF/Microonde.</p></body></html> + + + + JT65 VHF/UHF/Microwave decoding parameters + JT65 Parametri di decodifica VHF/UHF/Microonde + + + + Random erasure patterns: + Schemi di cancellazione casuali: + + + + <html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html> + <html><head/><body><p>Il numero massimo di schemi di cancellazione per il decodificatore stocastico Reed Solomon a decisione morbida è 10^(n/2)</p></body></html> + + + + Aggressive decoding level: + Livello di decodifica aggressivo: + + + + <html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html> + <html><head/><body><p>Livelli più alti aumenteranno la probabilità di decodifica, ma aumenteranno anche la probabilità di una decodifica falsa.</p></body></html> + + + + Two-pass decoding + Decodifica a due passaggi + + + + Special operating activity: Generation of FT4, FT8, and MSK144 messages + Attività operativa speciale: Generazione di messaggi FT4, FT8 e MSK144 + + + + <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> + (Hound=Cane da caccia) + <html><head/><body><p>FT8 DXpedition mode: operator Hound chiama il DX.</p></body></html> + + + + Hound + Hound (Cane da caccia) + + + + <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> + <html><head/><body><p>Contests Nordamericani VHF/UHF/Microonde e altri in cui un localizzatore di griglia a 4 caratteri è lo scambio richiesto.</p></body></html> + + + + NA VHF Contest + NA VHF Contest + + + + <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> + <html><head/><body><p>Modalità FT8 DXpedition: operatore Fox (DXpedition).</p></body></html> + + + + Fox + (Fox=Volpe) + Fox + + + + <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> + <html><head/><body><p>Contest VHF + Europei che richiedono un rapporto segnale, numero di serie e localizzatore a 6 caratteri.</p></body></html> + + + + EU VHF Contest + EU VHF Contest + + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + <html><head/><body><p>ARRL RTTY Roundup e contests simili. Lo scambio è stato USA, provincia Canadese o &quot;DX&quot;</p></body></html> + + + + RTTY Roundup messages + Messaggi Roundup RTTY + + + + RTTY RU Exch: + Scambio RTTY RU: + + + + NJ + NJ + + + + + <html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html> + <html><head/><body><p>Scambio di Field Day ARRL: numero di trasmettitori, classe e sezione ARRL / RAC o&quot;DX&quot;.</p></body></html> + + + + ARRL Field Day + ARRL Field Day + + + + FD Exch: + Scambio FD: + + + + 6A SNJ + 6A SNJ + + + + <html><head/><body><p>World-Wide Digi-mode contest</p><p><br/></p></body></html> + <html><head/><body><p>Contest Digi-Mode mondiale</p><p><br/></p></body></html> + + + + WW Digi Contest + WW Digi Contest + + + + Miscellaneous + Miscellanea + + + + Degrade S/N of .wav file: + Degrada S/N del file .wav: + + + + + For offline sensitivity tests + Per test di sensibilità offline + + + + dB + dB + + + + Receiver bandwidth: + Larghezza di banda ricevitore: + + + + Hz + Hz + + + + Tx delay: + Ritardo Tx: + + + + Minimum delay between assertion of PTT and start of Tx audio. + Ritardo minimo tra l'asserzione del PTT e l'avvio dell'audio Tx. + + + + s + ..s + + + + Tone spacing + Spaziatura dei toni + + + + <html><head/><body><p>Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.</p></body></html> + <html><head/><body><p>Genera audio Tx con una spaziatura del doppio del tono normale. Destinato a trasmettitori speciali LF / MF che utilizzano un divisore per 2 prima di generare RF.</p></body></html> + + + + x 2 + x 2 + + + + <html><head/><body><p>Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.</p></body></html> + <html><head/><body><p>Genera audio Tx con una spaziatura dei toni quattro volte superiore. Destinato a trasmettitori speciali LF / MF che utilizzano un divisore per 4 prima di generare RF.</p></body></html> + + + + x 4 + x 4 + + + + Waterfall spectra + Spettro Display a cascata + + + + Low sidelobes + Lobi laterali bassi + + + + Most sensitive + Più sensibile + + + + <html><head/><body><p>Discard (Cancel) or apply (OK) configuration changes including</p><p>resetting the radio interface and applying any soundcard changes</p></body></html> + <html><head/><body><p>Annulla (Annulla) o applica (OK) le modifiche alla configurazione incluso</p><p>ripristinando l'interfaccia radio e applicando eventuali modifiche alla scheda audio</p></body></html> + + + + main + + + + Fatal error + Errore fatale + + + + + Unexpected fatal error + Errore fatale inatteso + + + + Another instance may be running + Un'altra istanza potrebbe essere in esecuzione + + + + try to remove stale lock file? + Provo a rimuovere il file di blocco non aggiornato? + + + + Failed to create a temporary directory + Impossibile creare una directory temporanea + + + + + Path: "%1" + Percorso: "%1" + + + + Failed to create a usable temporary directory + Impossibile creare una directory temporanea utilizzabile + + + + Another application may be locking the directory + Un'altra applicazione potrebbe bloccare la directory + + + + Failed to create data directory + Impossibile creare la directory dei dati + + + + path: "%1" + percorso: "%1" + + + + Shared memory error + Errore di memoria condivisa + + + + Unable to create shared memory segment + Impossibile creare il segmento di memoria condivisa + + + + wf_palette_design_dialog + + + Palette Designer + Designer Tavolozza + + + + <html><head/><body><p>Double click a color to edit it.</p><p>Right click to insert or delete colors.</p><p>Colors at the top represent weak signals</p><p>and colors at the bottom represent strong</p><p>signals. You can have up to 256 colors.</p></body></html> + <html><head/><body><p>Doppio click su un colore per editarlo.</p><p>Click destro per inserire o cancellare colori.</p><p>I colori in alto rappresentano segnali deboli</p><p>e i colori in basso rappresentano segnali </p><p>forti. Puoi avere fino a 256 colori.</p></body></html> + + + From e441bfe5dcd4ab4f24d3ecc519328fa61657aed0 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Jun 2020 13:43:49 +0100 Subject: [PATCH 15/19] =?UTF-8?q?Updated=20Spanish=20UI=20translation,=20t?= =?UTF-8?q?nx=20C=C3=A9dric,=20EA4AC,=20&=20Xavi,=20EA3W?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- translations/wsjtx_es.ts | 357 ++++++++++++++++++++++++++------------- 1 file changed, 235 insertions(+), 122 deletions(-) diff --git a/translations/wsjtx_es.ts b/translations/wsjtx_es.ts index e9ec1da8c..61a5cea8f 100644 --- a/translations/wsjtx_es.ts +++ b/translations/wsjtx_es.ts @@ -58,7 +58,7 @@ Own Echo - Propio eco + Propio Eco @@ -78,7 +78,7 @@ On DX Echo - DX Echo encendido + Encender DX Eco @@ -134,7 +134,8 @@ Astronomical Data - Configuración para clonar desde Datos astronómicos + Configuración para clonar desde Datos astronómicos + Datos Astronómicos @@ -391,7 +392,8 @@ &Insert ... - &Introducir ... + &Introducir ... + &Agregar ... @@ -508,7 +510,8 @@ Formato: You must input a valid ARRL Field Day exchange - Debes introducir un intercambio de Field Day del ARRL válido + Debes introducir un intercambio de Field Day del ARRL válido + Debes introducir un intercambio de Field Day (ARRL) válido @@ -523,7 +526,7 @@ Formato: Reset all decode highlighting and priorities to default values - Restablecer todo el resaltado y las prioridades de decodificación a los valores predeterminados + Restablecer todo el resaltado y las prioridades de decodificación a los valores predeterminados @@ -878,17 +881,20 @@ Formato: &Insert ... - &Introducir ... + &Introducir ... + &Agregar ... Insert &after ... - Introducir &después ... + Introducir &después ... + Agregar &después ... Import Palette - Importar la paleta + Importar la paleta + Importar Paleta @@ -899,7 +905,8 @@ Formato: Export Palette - Exportar la paleta + Exportar la paleta + Exportar Paleta @@ -908,7 +915,7 @@ Formato: Gray time: Tiempo Gris: - Línea de sombra + Línea de sombra @@ -1010,7 +1017,8 @@ Error: %2 - %3 Echo Graph - Gráfico de eco + Gráfico de eco + Gráfico de Eco @@ -1030,7 +1038,8 @@ Error: %2 - %3 <html><head/><body><p>Echo spectrum gain</p></body></html> - <html><head/><body><p>Ganancia de espectro de eco</p></body></html> + <html><head/><body><p>Ganancia de espectro de eco</p></body></html> + <html><head/><body><p>Ganancia de espectro de Eco</p></body></html> @@ -1040,7 +1049,7 @@ Error: %2 - %3 <html><head/><body><p>Echo spectrum zero</p></body></html> - <html><head/><body><p>Espectro de eco cero</p></body></html> + <html><head/><body><p>Espectro de eco cero</p></body></html> @@ -1373,7 +1382,8 @@ Error: %2 - %3 Fox Log - Log Fox + Log Fox + Log "Fox" @@ -1440,7 +1450,8 @@ Error: %2 - %3 Are you sure you want to erase file FoxQSO.txt and start a new Fox log? - ¿Estás seguro de que deseas borrar el archivo FoxQSO.txt e iniciar un nuevo log de Fox? + ¿Estás seguro de que deseas borrar el archivo FoxQSO.txt e iniciar un nuevo log de Fox? + ¿Está seguro que desea borrar el archivo FoxQSO.txt e iniciar un nuevo log de "Fox"? @@ -2004,7 +2015,8 @@ Error(%2): %3 Enter this QSO in log - Entra este QSO al log + Entra este QSO al log + Guarda este QSO en el log @@ -2014,7 +2026,8 @@ Error(%2): %3 Stop monitoring - Deja de monitorizar + Deja de monitorizar + Detener la monitorización @@ -2024,7 +2037,8 @@ Error(%2): %3 Toggle monitoring On/Off - Activar/desactivar la monitorización + Activar/desactivar la monitorización + Activa/Desactiva la monitorización @@ -2034,7 +2048,8 @@ Error(%2): %3 <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> - <html><head/><body><p>Borrar ventana derecha. Haz doble clic para borrar ambas ventanas.</p></body></html> + <html><head/><body><p>Borrar ventana derecha. Haz doble clic para borrar ambas ventanas.</p></body></html> + <html><head/><body><p>Clic para borrar ventana derecha. Doble clic para borrar ambas ventanas.</p></body></html> @@ -2069,7 +2084,8 @@ Error(%2): %3 Decode most recent Rx period at QSO Frequency - Decodificar el período de RX más reciente en la frecuencia QSO + Decodificar el período de RX más reciente en la frecuencia QSO + Decodifica el período más reciente de RX en la frecuencia del QSO @@ -2079,12 +2095,14 @@ Error(%2): %3 <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> - <html><head/><body><p>Activar/desactivar TX</p></body></html> + <html><head/><body><p>Activar/desactivar TX</p></body></html> + <html><head/><body><p>Activar/Desactivar TX</p></body></html> Toggle Auto-Tx On/Off - Activar/desactivar TX + Activar/desactivar TX + Activa/Desactiva Auto-TX @@ -2094,7 +2112,8 @@ Error(%2): %3 Stop transmitting immediately - Detiene TX inmediatamente + Detiene TX inmediatamente + Detener TX inmediatamente @@ -2104,12 +2123,14 @@ Error(%2): %3 <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> - <html><head/><body><p>Activar/desactivar un tono de transmisión puro</p></body></html> + <html><head/><body><p>Activar/desactivar un tono de transmisión puro</p></body></html> + <html><head/><body><p>Activa/Desactiva la transmisión de un tono </p></body></html> Toggle a pure Tx tone On/Off - Activar/desactivar un tono de transmisión puro + Activar/desactivar un tono de transmisión puro + Activar/Desactivar TX con tono @@ -2134,7 +2155,8 @@ Error(%2): %3 <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> - <html><head/><body><p>30dB recomendado cuando solo hay ruido presente,<br/>Verde cuando el nivel es bueno,<br/>Rojo cuando puede ocurrir recortes y<br/>Amarillo cuando esta muy bajo.</p></body></html> + <html><head/><body><p>30dB recomendado cuando solo hay ruido presente,<br/>Verde cuando el nivel es bueno,<br/>Rojo cuando puede ocurrir recortes y<br/>Amarillo cuando esta muy bajo.</p></body></html> + <html><head/><body><p>30 dB recomendado cuando solo hay ruido presente.<br/>Verde: Nivel de audio aceptable.<br/>Rojo: Pueden ocurrir fallos de audio.<br/>Amarillo: Nivel de audio muy bajo.</p></body></html> @@ -2172,7 +2194,7 @@ Amarillo cuando esta muy bajo. Search for callsign in database - Buscar el indicativo en la base de datos + Buscar el indicativo en la base de datos (CALL3.TXT) @@ -2254,7 +2276,8 @@ Amarillo cuando esta muy bajo. Check to keep Tx frequency fixed when double-clicking on decoded text. - Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto decodificado. + Marca para mantener fija la frecuencia de transmisión al hacer doble clic en el texto decodificado. + Marca para mantener fija la frecuencia de TX al hacer doble clic en un texto decodificado. @@ -2265,7 +2288,8 @@ Amarillo cuando esta muy bajo. Audio Rx frequency - Frecuencia de audio en RX + Frecuencia de audio en RX + Frecuencia de RX @@ -2282,7 +2306,8 @@ Amarillo cuando esta muy bajo. Set Tx frequency to Rx Frequency - Coloca la frecuencia de RX en la de TX + Coloca la frecuencia de RX en la de TX + Coloca la frecuencia de TX en la de RX @@ -2302,7 +2327,8 @@ Amarillo cuando esta muy bajo. Set Rx frequency to Tx Frequency - Coloca la frecuencia de TX en la de RX + Coloca la frecuencia de TX en la de RX + Coloca la frecuencia de RX en la de TX @@ -2402,7 +2428,8 @@ Amarillo cuando esta muy bajo. <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> - <html><head/><body><p>Marca a TX en minutos o secuencias de números pares, a partir de 0; desmarca las secuencias impares.</p></body></html> + <html><head/><body><p>Marca a TX en minutos o secuencias de números pares, a partir de 0; desmarca las secuencias impares.</p></body></html> + <html><head/><body><p>Marca para transmitir en secuencias o minutos pares, comenzando por 0; desmarca para transmitir en las secuencias o minutos impares.</p></body></html> @@ -2413,7 +2440,7 @@ Amarillo cuando esta muy bajo. Tx even/1st Alternar periodo TX Par/Impar - TX segundo 00/30 + TX segundo par @@ -2466,7 +2493,8 @@ No está disponible para los titulares de indicativo no estándar. Fox - Fox + Fox + "Fox" @@ -2556,7 +2584,8 @@ Cuando no está marcado, puedes ver los resultados de la calibración. Audio Tx frequency - Frecuencia de audio de TX + Frecuencia de audio de TX + Frecuencia de TX @@ -2645,8 +2674,10 @@ Haz doble clic para alternar el uso del mensaje TX1 para iniciar un QSO con una Switch to this Tx message NOW Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) - Cambia a este mensaje de TX AHORA. -Haz doble clic para alternar el uso del mensaje TX1 para iniciar un QSO con una estación (no está permitido para titulares de indicativos compuestos de tipo 1). + Cambia a este mensaje de TX AHORA. +Haz doble clic para alternar el uso del mensaje TX1 para iniciar un QSO con una estación (no está permitido para titulares de indicativos compuestos de tipo 1). + Cambia a este mensaje de TX AHORA. +Doble clic para alternar el uso del mensaje TX1 para iniciar un QSO con una estación.(no permitido para titulares de indicativos compuestos de tipo 1) @@ -2724,9 +2755,12 @@ Los mensajes RR73 solo deben usarse cuando esté razonablemente seguro de que no Switch to this Tx message NOW Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) RR73 messages should only be used when you are reasonably confident that no message repetitions will be required - Cambia a este mensaje de TX AHORA. + Cambia a este mensaje de TX AHORA. Haz doble clic para alternar entre los mensajes RRR y RR73 en TX4 (no está permitido para titulares de indicativos compuestos de tipo 2). -Los mensajes RR73 solo deben usarse cuando esté razonablemente seguro de que no se requerirán repeticiones de mensajes. +Los mensajes RR73 solo deben usarse cuando esté razonablemente seguro de que no se requerirán repeticiones de mensajes. + Cambia a este mensaje de TX AHORA. +Doble clic para alternar entre los mensajes RRR y RR73 en TX4 (no está permitido para titulares de indicativos compuestos de tipo 2). +Mensajes RR73 solo deben usarse cuando esté razonablemente seguro de que no se requerirán repeticiones de mensajes. @@ -2747,8 +2781,10 @@ Los mensajes RR73 solo deben usarse cuando esté razonablemente seguro de que no Switch to this Tx message NOW Double-click to reset to the standard 73 message - Cambia a este mensaje de TX AHORA. -Haz doble clic para restablecer el mensaje estándar 73. + Cambia a este mensaje de TX AHORA. +Haz doble clic para restablecer el mensaje estándar 73. + Cambia a este mensaje de TX AHORA. +Doble clic para cambiar al mensaje estándar 73. @@ -2768,7 +2804,8 @@ Haz doble clic para restablecer el mensaje estándar 73. Generate standard messages for minimal QSO - Genera mensajes estándar para un QSO mínimo + Genera mensajes estándar para un QSO mínimo + Genera los mensajes estándares para realizar un QSO @@ -3133,7 +3170,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Decode - Decodifica + Decodifica + Decodificar @@ -3184,7 +3222,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Waterfall - Cascada + Cascada + Cascada - Waterfall @@ -3209,7 +3248,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Shift+F6 - Mayúsculas+F6 + Mayúsculas+F6 + Mayúsculas+F6 @@ -3250,7 +3290,7 @@ de la lista. La lista se puede mantener en Configuración (F2). Save decoded Guarda el decodificado - Guardar decodificado + Guardar lo decodificado @@ -3265,7 +3305,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Monitor OFF at startup - Monitor apagado al inicio + Monitor apagado al inicio + "Monitor" apagado al inicio @@ -3280,12 +3321,14 @@ de la lista. La lista se puede mantener en Configuración (F2). Convert mode to RTTY for logging - Convierte el modo a RTTY después de registrar el QSO + Convierte el modo a RTTY después de registrar el QSO + Convierte a modo RTTY para guardar el QSO Log dB reports to Comments - Pon los informes de recepción en dB en Comentarios + Pon los informes de recepción en dB en Comentarios + Guardar reportes dB en los Comentarios @@ -3373,7 +3416,8 @@ de la lista. La lista se puede mantener en Configuración (F2). List of Type 1 prefixes and suffixes - Lista de prefijos y sufijos de tipo 1 + Lista de prefijos y sufijos de tipo 1 + Lista de prefijos tipo 1 y sufijos @@ -3429,12 +3473,13 @@ de la lista. La lista se puede mantener en Configuración (F2). Echo - Echo + Echo + Eco EME Echo mode - Modo EME Echo + Modo EME Eco @@ -3535,7 +3580,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Solve for calibration parameters - Resolver para parámetros de calibración + Resolver para parámetros de calibración + Resolver parámetros de calibración @@ -3545,12 +3591,14 @@ de la lista. La lista se puede mantener en Configuración (F2). Shift+F1 - Mayúsculas+F1 + Mayúsculas+F1 + Mayúsculas+F1 Fox log - Log Fox + Log Fox + Log "Fox" @@ -3630,7 +3678,8 @@ de la lista. La lista se puede mantener en Configuración (F2). Error Loading LotW Users Data - Error al cargar datos de usuarios de LotW + +Error al cargar datos de usuarios de LotW @@ -3989,7 +4038,8 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Are you sure you want to erase your contest log? - ¿Estás seguro de que quieres borrar el log de tú concurso? + ¿Estás seguro de que quieres borrar el log de tú concurso? + ¿Está seguro que quiere borrar el log de concurso? @@ -4005,7 +4055,8 @@ ya está en CALL3.TXT, ¿deseas reemplazarlo? Are you sure you want to erase file wsjtx_log.adi? - ¿Estás seguro de que quieres borrar el archivo wsjtx_log.adi? + ¿Estás seguro de que quieres borrar el archivo wsjtx_log.adi? + ¿Está seguro que quiere borrar el archivo wsjtx_log.adi? @@ -4124,7 +4175,7 @@ Servidor UDP %2:%3 Clone &Into ... Clon &a ... - Clonar &a ... + Clonar &desde ... @@ -4533,7 +4584,8 @@ Error(%2): %3 &Offset (MHz): - &Desplazamiento en MHz: + &Desplazamiento en MHz: + &Desplazamiento (MHz): @@ -4846,7 +4898,8 @@ Error(%2): %3 <html><head/><body><p>Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&gt;Add-on prefixes and suffixes).</p><p>This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.</p><p>This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.</p><p>Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.</p><p>None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.</p></body></html> - <html><head/><body><p>Los indicativos compuestos del tipo 2 son aquellos con prefijos o sufijos no incluidos en la lista previa permitida (Consulta Ayuda, Prefijos y sufijos adicionales). </P><p>Esta opción determina qué mensajes generados deben contener tu indicativo de tipo completo 2 en lugar de tu indicativo base. Sólo se aplica si tienes un indicativo compuesto de tipo 2.</P><p>Esta opción controla la forma en que se generan los mensajes que se utilizan para responder a llamadas de CQ. Los mensajes generados 6 (CQ) y 5 (73) siempre contendrán tu indicativo completo. Los protocolos JT65 y JT9 permiten algunos mensajes estándar con tu indicativo completo a costa de otra información, como la llamada DX o el locator/Grid.</P> <p>La elección del mensaje 1 omite el indicativo de DX , que puede ser un problema cuando se responde a las llamadas de CQ. La elección del mensaje 3 también omite el indicativo de DX y muchas versiones de este software, puede no extraer el informe. Si escoges ninguno, no significa que sólo tu indicativo completo aparezca al mensaje 5 (73) de manera que el otro operador de QSO puede registrar el indicativo erróneo.</P><p> Ninguna de estas opciones es perfecta, el mensaje 3 suele ser el mejor, pero ten en cuenta que el otro operador de QSO puede no registrar el informe que le envías.</p></body></html> + <html><head/><body><p>Los indicativos compuestos del tipo 2 son aquellos con prefijos o sufijos no incluidos en la lista previa permitida (Consulta Ayuda, Prefijos y sufijos adicionales). </P><p>Esta opción determina qué mensajes generados deben contener tu indicativo de tipo completo 2 en lugar de tu indicativo base. Sólo se aplica si tienes un indicativo compuesto de tipo 2.</P><p>Esta opción controla la forma en que se generan los mensajes que se utilizan para responder a llamadas de CQ. Los mensajes generados 6 (CQ) y 5 (73) siempre contendrán tu indicativo completo. Los protocolos JT65 y JT9 permiten algunos mensajes estándar con tu indicativo completo a costa de otra información, como la llamada DX o el locator/Grid.</P> <p>La elección del mensaje 1 omite el indicativo de DX , que puede ser un problema cuando se responde a las llamadas de CQ. La elección del mensaje 3 también omite el indicativo de DX y muchas versiones de este software, puede no extraer el informe. Si escoges ninguno, no significa que sólo tu indicativo completo aparezca al mensaje 5 (73) de manera que el otro operador de QSO puede registrar el indicativo erróneo.</P><p> Ninguna de estas opciones es perfecta, el mensaje 3 suele ser el mejor, pero ten en cuenta que el otro operador de QSO puede no registrar el informe que le envías.</p></body></html> + <html><head/><body><p>Los indicativos compuestos del tipo 2 son aquellos con prefijos o sufijos no incluidos en la lista previa permitida (Consulta en "Ayuda - Lista de prefijos tipo 1 y sufijos). </P><p>Esta opción determina qué mensajes generados deben contener tu indicativo de tipo completo 2 en lugar de tu indicativo base. Sólo se aplica si tienes un indicativo compuesto de tipo 2.</P><p>Esta opción controla la forma en que se generan los mensajes que se utilizan para responder a llamadas de CQ. Los mensajes generados 6 (CQ) y 5 (73) siempre contendrán tu indicativo completo. Los protocolos JT65 y JT9 permiten algunos mensajes estándar con tu indicativo completo a costa de otra información, como la llamada DX o el locator/Grid.</P> <p>La elección del mensaje 1 omite el indicativo de DX , que puede ser un problema cuando se responde a las llamadas de CQ. La elección del mensaje 3 también omite el indicativo de DX y muchas versiones de este software, puede no extraer el informe. Si escoges ninguno, no significa que sólo tu indicativo completo aparezca al mensaje 5 (73) de manera que el otro operador de QSO puede registrar el indicativo erróneo.</P><p> Ninguna de estas opciones es perfecta, el mensaje 3 suele ser el mejor, pero ten en cuenta que el otro operador de QSO puede no registrar el informe que le envías.</p></body></html> @@ -4878,12 +4931,13 @@ Error(%2): %3 &Tx messages to Rx frequency window &Mensajes de texto en la ventana de frecuencia RX - &Mensajes de TX en la ventana Frecuencia RX + &Mensajes de TX en la ventana Frecuencia de RX Show if decoded stations are new DXCC entities or worked before. - Mostrar si las estaciones decodificadas son entidades DXCC nuevas o las has trabajado antes. + Mostrar si las estaciones decodificadas son entidades DXCC nuevas o las has trabajado antes. + Mostrar si las estaciones decodificadas son nuevas entidades DXCC o se ha trabajado antes. @@ -4894,12 +4948,14 @@ Error(%2): %3 <html><head/><body><p>Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.</p><p>This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.</p></body></html> - <html><head/><body><p>Comprueba que tengas decodificaciones para comenzar un nuevo período en la parte superior de la ventana de Actividad de banda y no muevas la parte superior cuando la ventana esté llena.</p><p> Esto sirve para ayudar a seleccionar decodificaciones, puedes hacer doble clic mientras la decodificación aún está en curso. Utiliza la barra de desplazamiento vertical de Actividad de banda para ver decodificaciones pasadas en la parte inferior de la ventana.</P></body></html> + <html><head/><body><p>Comprueba que tengas decodificaciones para comenzar un nuevo período en la parte superior de la ventana de Actividad de banda y no muevas la parte superior cuando la ventana esté llena.</p><p> Esto sirve para ayudar a seleccionar decodificaciones, puedes hacer doble clic mientras la decodificación aún está en curso. Utiliza la barra de desplazamiento vertical de Actividad de banda para ver decodificaciones pasadas en la parte inferior de la ventana.</P></body></html> + <html><head/><body><p>Marcar para que las nuevas decodificaciones comiencen en la parte superior de la ventana de "Actividad en la banda" y no se desplacen hacia arriba cuando la ventana esté llena.</p><p> Esto sirve para seleccionar decodificaciones y hacerles doble clic mientras la decodificación aún está en curso. Utiliza la barra de desplazamiento vertical de la ventana "Actividad en la banda" para ver decodificaciones que esten en la parte inferior de la ventana.</P></body></html> Start new period decodes at top - Inicia un nuevo periodo de decodificaciones en la parte superior + Inicia un nuevo periodo de decodificaciones en la parte superior + Nuevo periodo de decodificaciones desde la parte superior de la ventana @@ -4909,7 +4965,8 @@ Error(%2): %3 Set the font characteristics for the application. - Define las características de la fuente para la aplicación. + Define las características de la fuente para la aplicación. + Cambia la fuente de letras para la aplicación. @@ -4919,7 +4976,8 @@ Error(%2): %3 Set the font characteristics for the Band Activity and Rx Frequency areas. - Establece las características de la fuente para las áreas de Actividad de banda y Frecuencia de RX. + Establece las características de la fuente para las áreas de Actividad de banda y Frecuencia de RX. + Cambiar la fuente de letras para las ventanas "Actividad en la banda" y "Frecuencia de RX". @@ -4930,12 +4988,14 @@ Error(%2): %3 Include a separator line between periods in the band activity window. - Incluye una línea de separación entre períodos en la ventana de actividad de la banda. + Incluye una línea de separación entre períodos en la ventana de actividad de la banda. + Incluye una línea de separación entre períodos de decodificación en la ventana "Actividad en la banda". &Blank line between decoding periods - &Línea en blanco entre períodos de decodificación + &Línea en blanco entre períodos de decodificación + &Línea de separación entre períodos de decodificación @@ -4967,7 +5027,8 @@ Error(%2): %3 <html><head/><body><p>Number of minutes before unattended transmissions are aborted</p></body></html> - <html><head/><body><p>Número de minutos antes de que se cancelen las transmisiones desatendidas</p></body></html> + <html><head/><body><p>Número de minutos antes de que se cancelen las transmisiones desatendidas</p></body></html> + <html><head/><body><p>Número de minutos antes que se cancelen las transmisiones desatendidas</p></body></html> @@ -4993,7 +5054,8 @@ Error(%2): %3 <html><head/><body><p>Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.</p></body></html> - <html><head/><body><p>Algunos equipos no pueden procesar comandos CAT mientras transmiten. Esto significa que si estás operando en modo dividido (split) puede que tengas que desmarcar esta opción.</p></body></html> + <html><head/><body><p>Algunos equipos no pueden procesar comandos CAT mientras transmiten. Esto significa que si estás operando en modo dividido (split) puede que tengas que desmarcar esta opción.</p></body></html> + <html><head/><body><p>Algunos equipos no pueden procesar comandos CAT mientras transmiten. Esto significa que si está operando en modo "split", puede que tenga que desmarcar esta opción.</p></body></html> @@ -5014,12 +5076,14 @@ Error(%2): %3 <html><head/><body><p>Check this if you wish to automatically return to the last monitored frequency when monitor is enabled, leave it unchecked if you wish to have the current rig frequency maintained.</p></body></html> - <html><head/><body><p>Marca esto si deseas volver automáticamente a la última frecuencia monitoreada cuando el monitor está habilitado, déjalo sin marcar si deseas mantener la frecuencia actual del equipo.</p></body></html> + <html><head/><body><p>Marca esto si deseas volver automáticamente a la última frecuencia monitoreada cuando el monitor está habilitado, déjalo sin marcar si deseas mantener la frecuencia actual del equipo.</p></body></html> + <html><head/><body><p>Marcar si desea volver automáticamente a la última frecuencia monitoreada cuando el "Monitor" está habilitado, déjar sin marcar si desea mantener la frecuencia actual del equipo.</p></body></html> Monitor returns to last used frequency - El monitor vuelve a la última frecuencia utilizada + El monitor vuelve a la última frecuencia utilizada + "Monitor" vuelve a la última frecuencia utilizada @@ -5030,8 +5094,9 @@ Error(%2): %3 Turns off automatic transmissions after sending a 73 or any other free text message. - Apaga las transmisiones automáticas después de enviar un 73 o -cualquier otro mensaje de texto libre. + Apaga las transmisiones automáticas después de enviar un 73 o +cualquier otro mensaje de texto libre. + Desactiva TX después de enviar un 73 o cualquier mensaje de texto libre. @@ -5041,7 +5106,8 @@ cualquier otro mensaje de texto libre. Send a CW ID after every 73 or free text message. - Envía una ID de CW después de cada 73 o mensaje de texto libre. + Envía una ID de CW después de cada 73 o mensaje de texto libre. + Envía una ID en CW después de cada 73 o mensaje de texto libre. @@ -5069,7 +5135,8 @@ período tranquilo cuando se realiza la decodificación. Automatic transmission mode. - Modo de transmisión automática. + Modo de transmisión automática. + Activa TX cuando se hace doble clic sobre indicativo @@ -5096,7 +5163,8 @@ período tranquilo cuando se realiza la decodificación. Settings that control your CAT interface. - Ajustes que controlan tú interfaz CAT. + Ajustes que controlan tú interfaz CAT. + Ajustes que controlan el interface CAT. @@ -5172,7 +5240,8 @@ período tranquilo cuando se realiza la decodificación. <html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html> - <html><head/><body><p>Número de bits de datos utilizados para comunicarse con la interfaz CAT de tú equipo (generalmente ocho).</p></body></html> + <html><head/><body><p>Número de bits de datos utilizados para comunicarse con la interfaz CAT de tú equipo (generalmente ocho).</p></body></html> + <html><head/><body><p>Número de bits de datos utilizados para comunicarse con la interface CAT del equipo (generalmente ocho).</p></body></html> @@ -5182,7 +5251,7 @@ período tranquilo cuando se realiza la decodificación. D&efault - por d&efecto + Por d&efecto @@ -5197,7 +5266,8 @@ período tranquilo cuando se realiza la decodificación. <html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html> - <html><head/><body><p>Número de bits de parada utilizados al comunicarse con la interfaz CAT de tú equipo</p><p>(consulta el manual de tú equipo para más detalles).</p></body></html> + <html><head/><body><p>Número de bits de parada utilizados al comunicarse con la interfaz CAT de tú equipo</p><p>(consulta el manual de tú equipo para más detalles).</p></body></html> + <html><head/><body><p>Número de bits de parada utilizados al comunicarse con la interface CAT del equipo</p><p>(consulta el manual del equipo para más detalles).</p></body></html> @@ -5310,7 +5380,8 @@ unos pocos, particularmente algunos equipos de Kenwood, lo requieren. <html><head/><body><p>No PTT activation, instead the radio's automatic VOX is used to key the transmitter.</p><p>Use this if you have no radio interface hardware.</p></body></html> - <html><head/><body><p>Sin activación de PTT, en cambio, el VOX automático del equipo se usa para conectar el transmisor.</p><p>Usa esto si no tienes hardware de interfaz de radio.</p></body></html> + <html><head/><body><p>Sin activación de PTT, en cambio, el VOX automático del equipo se usa para conectar el transmisor.</p><p>Usa esto si no tienes hardware de interfaz de radio.</p></body></html> + <html><head/><body><p>Sin activación de PTT, se usa el VOX del equipo para activar el transmisor.</p><p>Usar esta opción si no se tiene una interface de radio.</p></body></html> @@ -5320,7 +5391,8 @@ unos pocos, particularmente algunos equipos de Kenwood, lo requieren. <html><head/><body><p>Use the RS-232 DTR control line to toggle your radio's PTT, requires hardware to interface the line.</p><p>Some commercial interface units also use this method.</p><p>The DTR control line of the CAT serial port may be used for this or a DTR control line on a different serial port may be used.</p></body></html> - <html><head/><body><p>Usa la línea de control RS-232 DTR para alternar el PTT de tú equipo, requiere hardware para interconectar la línea.</p><p>Algunas unidades de interfaz comerciales también usan este método.</p><p>La línea de control DTR del puerto serie CAT se puede usar para esto o se puede usar una línea de control DTR en un puerto serie diferente.</p></body></html> + <html><head/><body><p>Usa la línea de control RS-232 DTR para alternar el PTT de tú equipo, requiere hardware para interconectar la línea.</p><p>Algunas unidades de interfaz comerciales también usan este método.</p><p>La línea de control DTR del puerto serie CAT se puede usar para esto o se puede usar una línea de control DTR en un puerto serie diferente.</p></body></html> + <html><head/><body><p>Usa la línea de control RS-232 DTR para activar el PTT del equipo, se requiere de "hardware" para el envio de señales.</p><p>Algunas unidades de interfaz comerciales también usan este método.</p><p>La línea de control DTR del puerto serie CAT se puede usar para esto o se puede usar una línea de control DTR en un puerto serie diferente.</p></body></html> @@ -5332,9 +5404,9 @@ unos pocos, particularmente algunos equipos de Kenwood, lo requieren.Some radios support PTT via CAT commands, use this option if your radio supports it and you have no other hardware interface for PTT. - Algunos equipos admiten PTT a través de comandos CAT, + Algunos equipos admiten PTT a través de comandos CAT, usa esta opción si tú equipo lo admite y no tiene -otra interfaz de hardware para PTT. +una interface para PTT. @@ -5369,7 +5441,8 @@ otra interfaz de hardware para PTT. <html><head/><body><p>USB is usually the correct modulation mode,</p><p>unless the radio has a special data or packet mode setting</p><p>for AFSK operation.</p></body></html> - <html><head/><body><p>USB suele ser el modo de modulación correcto,</p><p>a menos que la radio tenga una configuración/ajuste especial de datos o modo de paquete</p><p>para operación AFSK.</p></body></html> + <html><head/><body><p>USB suele ser el modo de modulación correcto,</p><p>a menos que la radio tenga una configuración/ajuste especial de datos o modo de paquete</p><p>para operación AFSK.</p></body></html> + <html><head/><body><p>USB suele ser usualmente el modo correcto,</p><p>a menos que la radio tenga un ajuste de modo especifico para "data o packet"</p><p>para operación en AFSK.</p></body></html> @@ -5381,9 +5454,12 @@ otra interfaz de hardware para PTT. Don't allow the program to set the radio mode (not recommended but use if the wrong mode or bandwidth is selected). - No permitas que el programa configure el modo del equipo + No permitas que el programa configure el modo del equipo (no se recomienda pero se usa si el modo es incorrecto -o se selecciona el ancho de banda). +o se selecciona el ancho de banda). + No permite que el programa configure el modo en el equipo +(no se recomienda, pero usese si un modo incorrecto +o ancho de banda es seleccionado). @@ -5399,7 +5475,8 @@ o se selecciona el ancho de banda). Data/P&kt - Datos/P&kt + Datos/P&kt + Data/P&kt @@ -5480,13 +5557,13 @@ interfaz de radio se comporta como se espera. Split Operation Operación dividida (Split) - Operación en Split + Operación en "Split" Fake It Fíngelo - Fingir Split + Fingir "Split" @@ -5585,7 +5662,8 @@ ambos canales. Save Directory - Guardar directorio + Guardar directorio + Directorio "save" @@ -5632,13 +5710,14 @@ ambos canales. Power Memory By Band - Memoriza la potencia por banda + Memoriza la potencia por banda + Recuerdala potencia por banda Remember power settings by band Recuerde los ajustes de potencia por banda - Recordar ajustes de potencia por banda + Recuerda ajustes de potencia por banda @@ -5685,9 +5764,12 @@ ambos canales. Drag and drop items to rearrange order Right click for item specific actions Click, SHIFT+Click and, CRTL+Click to select items - Arrastra y suelta elementos para reorganizar el orden + Arrastra y suelta elementos para reorganizar el orden Haz clic derecho para acciones específicas del artículo. -Clic, Mayúsculas+Clic y, CTRL+Clic para seleccionar elementos. +Clic, Mayúsculas+Clic y, CTRL+Clic para seleccionar elementos. + Arrastra y suelta elementos para reorganizar el orden +Clic derecho para acciones específicas del elemento. +Clic, Mayús+Clic y CTRL+Clic para seleccionar elementos. @@ -5708,7 +5790,9 @@ Clic, Mayúsculas+Clic y, CTRL+Clic para seleccionar elementos. The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message. - El programa mostrará un cuadro de diálogo Log QSO parcialmente completado cuando envíe un mensaje de texto 73 o libre. + El programa mostrará un cuadro de diálogo Log QSO parcialmente completado cuando envíe un mensaje de texto 73 o libre. + El programa mostrará un cuadro de diálogo con datos del QSO parcialmente +completados cuando envíe un 73 o mensaje de texto libre. @@ -5727,9 +5811,13 @@ Clic, Mayúsculas+Clic y, CTRL+Clic para seleccionar elementos. saved by this program. Check this option to save the sent and received reports in the comments field. - Algunos programas de log no aceptarán el tipo de informes + Algunos programas de log no aceptarán el tipo de informes guardado por este programa. Marca esta opción para guardar los informes enviados y recibidos en +el campo de comentarios. + Algunos libros de guardia no aceptan el tipo de reportes +guardados por este programa. +Marca esta opción para guardar los reportes enviados y recibidos en el campo de comentarios. @@ -5771,7 +5859,8 @@ Indicativo DX y Locator DX cuando se envíe un 73 o un mensaje de texto libre. <html><head/><body><p>Check to have QSOs logged automatically, when complete.</p></body></html> - <html><head/><body><p>Marca para que los QSO's se registren automáticamente, cuando se completen.</p></body></html> + <html><head/><body><p>Marca para que los QSO's se registren automáticamente, cuando se completen.</p></body></html> + <html><head/><body><p>Marca para que los QSO's se guarden automáticamente, cuando se completen.</p></body></html> @@ -5790,9 +5879,13 @@ Indicativo DX y Locator DX cuando se envíe un 73 o un mensaje de texto libre. - El programa puede enviar los detalles de su estación y todas las + El programa puede enviar los detalles de su estación y todas las señales decodificadas como puntos en el sitio web http://pskreporter.info. Esto se utiliza para el análisis de baliza inversa que es muy útil +para evaluar la propagación y el rendimiento del sistema. + Este programa puede enviar los detalles de su estación y todas las +señales decodificadas como "spots" a la página web http://pskreporter.info. +Esto se utiliza para el análisis de "reverse beacon" que es muy útil para evaluar la propagación y el rendimiento del sistema. @@ -5829,7 +5922,8 @@ para evaluar la propagación y el rendimiento del sistema. <html><head/><body><p>With this enabled WSJT-X will accept certain requests back from a UDP server that receives decode messages.</p></body></html> - <html><head/><body><p>Con esto habilitado, WSJT-X aceptará ciertas solicitudes de un servidor UDP que recibe mensajes de decodificación.</p></body></html> + <html><head/><body><p>Con esto habilitado, WSJT-X aceptará ciertas solicitudes de un servidor UDP que recibe mensajes de decodificación.</p></body></html> + <html><head/><body><p>Si se habilita, WSJT-X aceptará ciertas solicitudes de un servidor UDP que recibe mensajes decodificados.</p></body></html> @@ -5839,7 +5933,8 @@ para evaluar la propagación y el rendimiento del sistema. <html><head/><body><p>Indicate acceptance of an incoming UDP request. The effect of this option varies depending on the operating system and window manager, its intent is to notify the acceptance of an incoming UDP request even if this application is minimized or hidden.</p></body></html> - <html><head/><body><p>Indica la aceptación de una solicitud UDP entrante. El efecto de esta opción varía según el sistema operativo y el administrador de ventanas, su intención es notificar la aceptación de una solicitud UDP entrante, incluso si esta aplicación está minimizada u oculta.</p></body></html> + <html><head/><body><p>Indica la aceptación de una solicitud UDP entrante. El efecto de esta opción varía según el sistema operativo y el administrador de ventanas, su intención es notificar la aceptación de una solicitud UDP entrante, incluso si esta aplicación está minimizada u oculta.</p></body></html> + <html><head/><body><p>Indica la aceptación de una solicitud UDP entrante. El efecto de esta opción varía según el sistema operativo y el "Window Manager", su intención es notificar la aceptación de una solicitud UDP entrante, incluso si esta aplicación está minimizada u oculta.</p></body></html> @@ -5864,7 +5959,8 @@ para evaluar la propagación y el rendimiento del sistema. <html><head/><body><p>When checked, WSJT-X will broadcast a logged contact in ADIF format to the configured hostname and port. </p></body></html> - <html><head/><body><p>Cuando se marca, WSJT-X transmitirá un contacto registrado en formato ADIF al nombre de host y puerto configurados. </p></body></html> + <html><head/><body><p>Cuando se marca, WSJT-X transmitirá un contacto registrado en formato ADIF al nombre de host y puerto configurados. </p></body></html> + <html><head/><body><p>Si se marca , WSJT-X difundirá el contacto guardado, en formato ADIF, al servidor y puerto configurados. </p></body></html> @@ -5953,8 +6049,10 @@ para evaluar la propagación y el rendimiento del sistema. Items may be edited. Right click for insert and delete options. - Se pueden editar ítems. -Haz clic derecho para insertar y eliminar opciones. + Se pueden editar ítems. +Haz clic derecho para insertar y eliminar opciones. + Se puede editar elementos. +Clic derecho para insertar y eliminar opciones. @@ -5990,12 +6088,14 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Enable or disable using the check boxes and right-click an item to change or unset the foreground color, background color, or reset the item to default values. Drag and drop the items to change their priority, higher in the list is higher in priority.</p><p>Note that each foreground or background color may be either set or unset, unset means that it is not allocated for that item's type and lower priority items may apply.</p></body></html> - <html><head/><body><p>Activa o desactiva las casillas de verificación y haz clic con el botón derecho en un elemento para cambiar o desactivar el color del primer plano, el color de fondo o restablecer el elemento a los valores predeterminados. Arrastra y suelta los elementos para cambiar su prioridad, mayor en la lista es mayor en prioridad.</p><p>Ten en cuenta que cada color de primer plano o de fondo puede estar configurado o no, lo que significa que no está asignado para ese tipo de elemento y pueden aplicarse elementos de menor prioridad.</p></body></html> + <html><head/><body><p>Activa o desactiva las casillas de verificación y haz clic con el botón derecho en un elemento para cambiar o desactivar el color del primer plano, el color de fondo o restablecer el elemento a los valores predeterminados. Arrastra y suelta los elementos para cambiar su prioridad, mayor en la lista es mayor en prioridad.</p><p>Ten en cuenta que cada color de primer plano o de fondo puede estar configurado o no, lo que significa que no está asignado para ese tipo de elemento y pueden aplicarse elementos de menor prioridad.</p></body></html> + <html><head/><body><p>Activar o desactivar usando las casillas de verificación. Clic con el botón derecho en un elemento para cambiar o volver al color predeterminado tanto de las letras como el color de fondo. Arrastrar y soltar los elementos para cambiar su prioridad; los primeros en la lista tienen mayor prioridad.</p><p>Cada color de letras o fondo puede estar configurado o no, no configurado significa que no está asignado para este elemento y pueden aplicarse elementos de menor prioridad.</p></body></html> <html><head/><body><p>Check to indicate new DXCC entities, grid squares, and callsigns per mode.</p></body></html> - <html><head/><body><p>Marca para indicar nuevas entidades DXCC, Locator y indicativos por modo.</p></body></html> + <html><head/><body><p>Marca para indicar nuevas entidades DXCC, Locator y indicativos por modo.</p></body></html> + <html><head/><body><p>Marcar para indicar nueva entidad DXCC, locator e indicativos por modo.</p></body></html> @@ -6010,7 +6110,8 @@ Haz clic derecho para insertar y eliminar opciones. Check to for grid highlighting to only apply to unworked grid fields - Marca para que el resaltado de Locator sólo se aplique a los campos de Locator no trabajados + Marca para que el resaltado de Locator sólo se aplique a los campos de Locator no trabajados + Marcar para que el resaltado de locator sólo se aplique a los campos no trabajados @@ -6021,7 +6122,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Controls for Logbook of the World user lookup.</p></body></html> - <html><head/><body><p>Controles para la búsqueda de usuarios de Logbook of the World (LoTW).</p></body></html> + <html><head/><body><p>Controles para la búsqueda de usuarios de Logbook of the World (LoTW).</p></body></html> + <html><head/><body><p>Búsqueda de usuarios de LoTW.</p></body></html> @@ -6047,7 +6149,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Push this button to fetch the latest LotW user's upload date and time data file.</p></body></html> - <html><head/><body><p>Presiona este botón para obtener el último archivo de datos de fecha y hora de carga de los usuarios de LotW.</p></body></html> + <html><head/><body><p>Presiona este botón para obtener el último archivo de datos de fecha y hora de carga de los usuarios de LotW.</p></body></html> + <html><head/><body><p>Presionar este botón para descargar archivo de LoTW con la última fecha/hora de subida de los usuarios.</p></body></html> @@ -6121,7 +6224,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> - <html><head/><body><p>Modo FT8 DXpedition: operador Hound llamando al DX.</p></body></html> + <html><head/><body><p>Modo FT8 DXpedition: operador Hound llamando al DX.</p></body></html> + <html><head/><body><p>Modo FT8 DXpedition: Operador "Hound" llamando al DX.</p></body></html> @@ -6131,7 +6235,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> - <html><head/><body><p>Concursos norteamericanos de VHF/UHF/microondas y otros en los que se requiere un locator de 4 caracteres.</p></body></html> + <html><head/><body><p>Concursos norteamericanos de VHF/UHF/microondas y otros en los que se requiere un locator de 4 caracteres.</p></body></html> + <html><head/><body><p>Concursos VHF/UHF/Microondas de norteamérica y otros en los cuales se requiere un intercambio de locator de 4 caracteres.</p></body></html> @@ -6141,7 +6246,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> - <html><head/><body><p>Modo FT8 DXpedition: operador FOX (DXpedition).</p></body></html> + <html><head/><body><p>Modo FT8 DXpedition: operador FOX (DXpedition).</p></body></html> + <html><head/><body><p>Modo FT8 DXpedition: Operador "FOX" (DXpedition).</p></body></html> @@ -6151,7 +6257,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> - <html><head/><body><p>Concursos europeos de VHF y superiores que requieren un informe de señal, número de serie y locator de 6 caracteres.</p></body></html> + <html><head/><body><p>Concursos europeos de VHF y superiores que requieren un informe de señal, número de serie y locator de 6 caracteres.</p></body></html> + <html><head/><body><p>Concursos europeos de VHF y concursos que requieran reporte de señal, número de serie y locator de 6 caracteres.</p></body></html> @@ -6163,13 +6270,14 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> - <html><head/><body><p>Resumen de ARRL RTTY y concursos similares. El intercambio es el estado de EE.UU., La provincia canadiense o &quot;DX&quot;.</p></body></html> + <html><head/><body><p>Resumen de ARRL RTTY y concursos similares. El intercambio es el estado de EE.UU., La provincia canadiense o &quot;DX&quot;.</p></body></html> + <html><head/><body><p>ARRL RTTY Roundup y concursos similares. Intercambio, estado de EE.UU., provincia de Canadá o "DX".</p></body></html> RTTY Roundup messages Mensajes de resumen de RTTY - Mensajes RTTY Roundup + RTTY Roundup @@ -6185,7 +6293,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html> - <html><head/><body><p>Intercambio de ARRL Field Day: número de transmisores, clase y sección ARRL/RAC o &quot;DX&quot;.</p></body></html> + <html><head/><body><p>Intercambio de ARRL Field Day: número de transmisores, clase y sección ARRL/RAC o &quot;DX&quot;.</p></body></html> + <html><head/><body><p>ARRL Field Day (intercambio): número de transmisores, "Class" y sección ARRL/RAC o "DX".</p></body></html> @@ -6205,12 +6314,14 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>World-Wide Digi-mode contest</p><p><br/></p></body></html> - <html><head/><body><p>Concurso World-Wide Digi-mode</p><p><br/></p></body></html> + <html><head/><body><p>Concurso World-Wide Digi-mode</p><p><br/></p></body></html> + <html><head/><body><p>Concurso World-Wide Digi DX</p><p><br/></p></body></html> WW Digi Contest - Concurso WW Digi + Concurso WW Digi + Concurso WW Digi DX @@ -6302,7 +6413,8 @@ Haz clic derecho para insertar y eliminar opciones. <html><head/><body><p>Discard (Cancel) or apply (OK) configuration changes including</p><p>resetting the radio interface and applying any soundcard changes</p></body></html> - <html><head/><body><p>Descartar (Cancelar) o aplicar (OK) cambios de configuración/ajuste que incluyen</p><p>restablecer la interfaz de radio y aplicar cualquier cambio en la tarjeta de sonido</p></body></html> + <html><head/><body><p>Descartar (Cancelar) o aplicar (OK) cambios de configuración/ajuste que incluyen</p><p>restablecer la interfaz de radio y aplicar cualquier cambio en la tarjeta de sonido</p></body></html> + <html><head/><body><p>"Aceptar" o "Cancelar" cambios de configuración, incluyendo el restablecer la interface de radio y aplicar cualquier cambio en la tarjeta de sonido</p></body></html> @@ -6428,7 +6540,8 @@ Haz clic derecho para insertar y eliminar opciones. Palette Designer - Diseñador de paleta + Diseñador de paleta + Diseñador de Paleta From 342896c3592e6d86e3147c82cf0f678431227374 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Jun 2020 13:47:23 +0100 Subject: [PATCH 16/19] Updated release note --- Release_Notes.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index a01e108f2..c1bb53c4a 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -34,7 +34,11 @@ in the v2.2.0 GA release. Here is a brief summary; DIGI added", Fox, and Hound renumbered). Thanks to Sam, W2JDB, for raising this issue. - - Updated Catalan UI translation, tnx Xavi, EA3W. + - Updated Catalan UI translation, tnx Xavi, EA3W. + + - Italian UI translation, tnx Marco, PY1ZRJ. + + - Updated Spanish UI translation, tnx Cdric, EA4AC. Release: WSJT-X 2.2 From d919af68a570f30d992fa927e9c07b92ca55675f Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Jun 2020 17:55:45 +0100 Subject: [PATCH 17/19] Repair UDP Highlight Callsign regression When passing the 'Highlight last' parameter as true occasional matches in prior periods could be incorrectly highlighted. This fix should also improve performance when there is a large decode history, and highlight request for a new callsign is received. --- widgets/displaytext.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/widgets/displaytext.cpp b/widgets/displaytext.cpp index ef91761fc..f0f17f648 100644 --- a/widgets/displaytext.cpp +++ b/widgets/displaytext.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include "Configuration.hpp" #include "Network/LotWUsers.hpp" @@ -126,8 +125,6 @@ namespace void DisplayText::appendText(QString const& text, QColor bg, QColor fg , QString const& call1, QString const& call2) { -// qDebug () << "DisplayText::appendText: text:" << text << "Nbsp pos:" << text.indexOf (QChar::Nbsp); - auto cursor = textCursor (); cursor.movePosition (QTextCursor::End); auto block_format = cursor.blockFormat (); @@ -548,7 +545,6 @@ namespace void DisplayText::highlight_callsign (QString const& callsign, QColor const& bg, QColor const& fg, bool last_period_only) { - // qDebug () << "DisplayText::highlight_callsign: callsign:" << callsign << "last period:" << last_period_only; if (!callsign.size ()) { return; @@ -575,10 +571,10 @@ void DisplayText::highlight_callsign (QString const& callsign, QColor const& bg, { period_start = prior; } - while (!cursor.isNull () && cursor > period_start) + cursor = period_start; + while (!cursor.isNull ()) { - cursor = document ()->find (target, cursor - , QTextDocument::FindBackward | QTextDocument::FindWholeWords); + cursor = document ()->find (target, cursor, QTextDocument::FindWholeWords); if (!cursor.isNull () && cursor.hasSelection ()) { if (bg.isValid () || fg.isValid ()) From 44c999c2e1f16b7084bbbd481afee3093b4e69e8 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Jun 2020 18:19:03 +0100 Subject: [PATCH 18/19] Release note update --- Release_Notes.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Release_Notes.txt b/Release_Notes.txt index c1bb53c4a..ce6a8abaa 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -23,9 +23,21 @@ in the v2.2.0 GA release. Here is a brief summary; - Incorporate a revised Hamlib version the address a regression in rig control of some rigs including the Yaesu FT-991 and FT-891. - - Fix a defect with selecting Wide Graph 2D spectrum types in + - Repair a defect in 6 character gridsquare lookup from the CALL3.TXT + database, and improve "Lookup" button processing. + + - Repair a defect with selecting Wide Graph 2D spectrum types in translated UIs. + - Repair a regression that blocked the Highlight Callsign UDP request + from highlighting terms including a '+' character. + + - Repair a regression where occasional Highlight Callsign UDP + requests with the 'Highlight last' parameter as true highlighted a + match in a prior period. This fix include a performance improvement + when processing any Highlight Callsign request with 'Highlight + last' as true. + - Include support for the Yaesu FT-920 when controlled by Ham Radio Deluxe. This change inadvertently missed the v2.2.0 GA release. From 01a1a421d55e452dc107ecf717245294984f5727 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 5 Jun 2020 23:34:57 +0100 Subject: [PATCH 19/19] Release prep --- NEWS | 40 ++++++++++++++++++++++++++++++++++++++++ Release_Notes.txt | 6 +++--- Versions.cmake | 2 +- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 626f697db..0ec8549f7 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,46 @@ Copyright 2001 - 2020 by Joe Taylor, K1JT. + Release: WSJT-X 2.2.1 + June 6, 2020 + --------------------- + +WSJT-X v2.2.1 is a bug fix release that fixes regressions found in the +prior v2.2.0 release. Here is a brief summary; + + - Incorporate a revised Hamlib version the address a regression in + rig control of some rigs including the Yaesu FT-991 and FT-891. + + - Repair a defect in 6 character gridsquare lookup from the CALL3.TXT + database, and improve "Lookup" button processing. + + - Repair a defect with selecting Wide Graph 2D spectrum types in + translated UIs. + + - Repair a regression that blocked the Highlight Callsign UDP request + from highlighting terms including a '+' character. + + - Repair a regression where occasional Highlight Callsign UDP + requests with the 'Highlight last' parameter as true highlighted a + match in a prior period. This fix include a performance improvement + when processing any Highlight Callsign request with 'Highlight + last' as true. + + - Include support for the Yaesu FT-920 when controlled by Ham Radio + Deluxe. This change inadvertently missed the v2.2.0 GA release. + + - Correct a documentation issue with the UDP Message Protocol + Status(1) message Special Operations Mode enumeration values ("WW + DIGI added", Fox, and Hound renumbered). Thanks to Sam, W2JDB, for + raising this issue. + + - Updated Catalan UI translation, tnx Xavi, EA3W. + + - Italian UI translation, tnx Marco, PY1ZRJ. + + - Updated Spanish UI translation, tnx Cédric, EA4AC. + + Release: WSJT-X 2.2 June 2, 2020 ------------------- diff --git a/Release_Notes.txt b/Release_Notes.txt index ce6a8abaa..a1b300d4f 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -14,11 +14,11 @@ Copyright 2001 - 2020 by Joe Taylor, K1JT. Release: WSJT-X 2.2.1 - June 5, 2020 + June 6, 2020 --------------------- -WSJT-X 2.2.1 is a bug-fix release that fixes a critical defect found -in the v2.2.0 GA release. Here is a brief summary; +WSJT-X v2.2.1 is a bug fix release that fixes regressions found in the +prior v2.2.0 release. Here is a brief summary; - Incorporate a revised Hamlib version the address a regression in rig control of some rigs including the Yaesu FT-991 and FT-891. diff --git a/Versions.cmake b/Versions.cmake index a36497a1d..d71b6bb0e 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 2) set (WSJTX_VERSION_PATCH 1) -set (WSJTX_RC 4) # release candidate number, comment out or zero for development versions +#set (WSJTX_RC 1) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 1) # set to 1 for final release build