Squashed commit of the following:

commit 0d6833b23da2519155ee93b98b4144240b356730
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Sep 5 14:06:47 2019 -0400

    Bump version

commit 17705fcff6a22529f3dec45aa95cad90feb78c63
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Sep 5 10:36:03 2019 -0400

    Updated configration labeling for idle timeout

commit a9f8aa9549c1c6b62201a6c102d91649ee17b9a5
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Sep 5 10:07:11 2019 -0400

    Decoder params tests

commit 94e524741020fd8b3925233a189cedf0a8a282cc
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Sep 4 21:24:23 2019 -0400

    Fixed decoder bug that crashed the software

commit 4fdbfc8d9082e0f52513a5c215489b13558972f9
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Sep 4 21:02:52 2019 -0400

    Decoder params tweak

commit 1e25ac41d442372f09b254d957e0d9e31773254e
Merge: 97a0fb5 552cd7f
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Sep 4 18:17:40 2019 -0400

    Merge branch 'fortran-cleanup' of bitbucket.org:widefido/js8call-private into fortran-cleanup

commit 97a0fb51b37c24e2638400dc5694fc4e988ae4f2
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Sep 4 18:15:25 2019 -0400

    Heartbeat as a mode does not work if slow mode does not work. Tabling this idea for now.

commit 552cd7fe5fc81c712b57b5f3ea79599177e53f69
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 23:35:14 2019 +0000

    js8_params.f90 edited online with Bitbucket

commit 7c9e960b863148a4ecbca4f61584536471623ea2
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 16:28:52 2019 -0400

    Do not randomize offset at startup

commit cff7b90dbb9aada2944e668a9bcf078470af4608
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 16:20:19 2019 -0400

    Slow label for button

commit 977145dee89ccd7da4d43ce0bc2f9b79243aa200
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 16:17:36 2019 -0400

    Experimental slow mode

commit 27c128e0b327e1c077a9b49e11750bef2f3c26eb
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 15:26:01 2019 -0400

    HBs are Normal

commit 89792f91abf22dcd7c512bf7362f5e2e1cb36374
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 14:16:27 2019 -0400

    Update heartbeat UI for more clarity

commit f5cebbcdabe37d90b75ca7e8d1675a553e107c83
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 11:58:53 2019 -0400

    Optimize decode params

commit b14003bb34d93f9e93d7d4ad4241d619963c3a65
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 11:30:00 2019 -0400

    Shrink speed column for Joe ;)

commit 35f4446146efc9fd7044af3b56b0b93664238b24
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 10:54:28 2019 -0400

    Fixed fast mode decoder for directed messages

commit 64212acc30dd360348a72b354899a5b0de28aa83
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 10:05:11 2019 -0400

    Simplified decoder callbacks

commit a026766517d282a3fda0258356f6f22fee2a916f
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Sep 3 09:50:33 2019 -0400

    Commentary

commit 9d28b1ff5bd5cda7a04028218a01639e3902bf7b
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Sep 2 23:33:22 2019 -0400

    Let's experiment with a new UI for HB

commit a013d66d8b8d16cc941a14eb76af2ce23b7bb6d5
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Sep 2 21:44:26 2019 -0400

    31.25 baud experiment

commit 0671458bf588dd94710c5ba34f20695e13a28d31
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Sep 2 15:31:43 2019 -0400

    Added basic foundation for slow mode, coming soon.

commit 8b9aed6e29b093e8fb736ebdbdf0fbe12a820e8e
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Sep 2 09:59:08 2019 -0400

    Display SPEED+AUTO

commit 5f5af250c1c5b610e8969b32c01654d3467f0973
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sun Sep 1 09:45:39 2019 -0400

    Added mode speed option to the activity tables

commit 82fa0335fdd41f0a578149e0211d6307293c739d
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 23:14:07 2019 -0400

    Remember mode speed setting

commit 79ec805b223099bb4d552dc612a6c97a8982525e
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 21:14:04 2019 -0400

    Remove unused sync vars

commit fc52dfcc320e59f6c7ca58ba277cb70469419587
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 21:12:11 2019 -0400

    Timing delta max

commit 62b8fc5054d3611d40d7441d57d695df594b8446
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 17:14:08 2019 -0400

    Fast modes optionally can use huff encoding for data... we'll see which is best

commit 44c357aff3e1c6687e93fb843917bd420888b397
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 17:03:21 2019 -0400

    Added ability to use a different message packing algorithm for fast modes

commit e075a078eb75509ef690e6c78c0e797ada569b94
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 16:18:14 2019 -0400

    Fixed symbol offset in sync code for turbo mode

commit a130b5d4a594e9bceece003be0ba72abb05a9f90
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 31 16:09:27 2019 -0400

    Added WPM to menu

commit 98cacab7bfc243492b6dec703d216d378cc3d34d
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 30 23:18:58 2019 -0400

    Key eater

commit eef58e2c88d010c7f3917a111243eae744a425c3
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 30 16:07:31 2019 -0400

    Reorganizing js8dec for better understanding and less confusion between it and JS8b

commit 08c14f966e1cda836ca90a8bd1ccd5ae68ec8dd7
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 30 14:20:52 2019 -0400

    Do no expose relay and messaging to fast and turbo modes

commit c605a31c266866f78eb043812af837ead6442ede
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 30 12:02:41 2019 -0400

    Do not allow mode speed changes if transmitting

commit add062e657a5215f9a4a1ae3ee82063aa85cf0e4
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Aug 29 23:02:31 2019 -0400

    Fixed bug where tones were not generated with the correct costas arrays...causing really poor synchronization and failed decodes. I'm surprised it worked at all :P

commit cd492b5dd9fd62b5518a5711a1ef8ec522ea08fe
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Aug 29 21:56:45 2019 -0400

    Back to 20 baud. It has the best decodability, imho

commit a2266cd00b8bd14c77bdbc8fc18818689e969858
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Aug 29 14:27:29 2019 -0400

    Back to 20 baud with some decoder optimizations

commit 86413042e75873585bcb40236da67f2d64870859
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 23:04:47 2019 -0400

    Try 24 baud

commit a6704162b37d1c0704f43a64ab6b8a0a6e3c1cba
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 17:09:12 2019 -0400

    Fixed legacy compiler issue with mode text

commit 2fdbcc12e5f0c8cc8062c745af0930db4472cd9c
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 10:17:23 2019 -0400

    Function for determining current mode

commit 82e70345baa665418a51307f0309f2b7dcb3d3b7
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 09:59:26 2019 -0400

    Don't write the log

commit d3380e01676537f4bab9a05932cb5a59de3cf45f
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 09:59:03 2019 -0400

    Fixed issues with turbo decode with partial sync code

commit c2a8ebb8f305e67fcb2597d25e062663722a0d73
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 28 03:30:02 2019 -0400

    Working through better decoding of fast modes

commit 7ca93f8c6a7970559577c9dfd833eb92a1b91a0c
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 23:23:34 2019 -0400

    Trying for better TX/RX delays

commit b99271b4feaa7e41c7b88219cb3c7d43dbe7b48d
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 22:57:02 2019 -0400

    Added flags to easily enable/disable the faster modes

commit 32d913a7f7d3deb6a8d66651d51673ec451d2500
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 22:43:20 2019 -0400

    Added mode button

commit c7cc90548591638bfc5a4a8895036dd67b155aaa
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 22:17:42 2019 -0400

    Updated start delay for the modes

commit b91dc63f92101cd8b6adbf9de588c4ffd10bfc10
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 21:55:57 2019 -0400

    Late threshold for turbo mode is 1/2 the delay

commit 09ec95fab1307e65aa9bd462d60525afd2a770fe
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 21:52:55 2019 -0400

    Renamed mode menu items

commit a4e5a9ed9bce66c625e4df1182cd3c91a6ba44dd
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 21:50:45 2019 -0400

    Only enable networking and autoreply for normal JS8

commit fc558d5823c46fc5d3dc651610b7af43e7519165
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 21:14:12 2019 -0400

    Fixed spot button tooltip

commit 9a9965d543540a2d215bcbfff34934846afe507a
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 27 10:04:31 2019 -0400

    Working selectable decoder

commit 4a9cdbc52dae1d857c102d8777f1aded4fac87bb
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 26 20:53:30 2019 -0400

    Mode menu selection of the submodes. Turbo decoder disabled right now. Naming to be determined

commit a3acbf7c243f7aa740c229ae178fffa528e68933
Merge: 8ea554d daa8cc2
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 26 13:29:14 2019 -0400

    Merge branch 'ft8call-develop' into fortran-cleanup

commit 8ea554d79904c9b2f3ccf1027bf4d41fb25e6fe3
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 26 09:53:21 2019 -0400

    Use indx variable instead of computed

commit 067e65500328133f921b172e515babbcc0df831b
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sun Aug 25 22:41:00 2019 -0400

    Make it easier to flip between modes

commit a544a7635201072f3ea20483353edf2e79dc813d
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sun Aug 25 21:18:46 2019 -0400

    Fixed sync issues with multi costas. Added log statements for future debugging

commit a8f3ead932017ae7d98fdb9a779bf3bb44bd395d
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sun Aug 25 15:54:59 2019 -0400

    Playing around with different costas arrays

commit fa89fe11a15d26abadd5102c8980620cfeffccd9
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sun Aug 25 15:51:45 2019 -0400

    Added reference to 7x7 costas arrays

commit 2417ebed6139534214f76ce94bdf1f54a966760a
Merge: 6011f1e 32fcabd
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 24 23:41:39 2019 -0400

    Merge branch 'ft8call-develop' into fortran-cleanup

commit 6011f1e807b1814399477d3c172db46831a090c6
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 24 23:35:42 2019 -0400

    Back to 10 baud. Update late threshold to be computed to 3/4 dead air time.

commit 41d3995861226f7208b2773430010a48abc125c1
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 24 15:36:12 2019 -0400

    Trying out 20 baud

commit a8d77e9e5b98f3f0bf19f68b53199b5952e8aaad
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 24 15:23:36 2019 -0400

    Fixed up sync quarter symbol constant

commit 7050722436b9c629ea00649e6b3c81d7af7be82a
Author: Jordan Sherer <jordan@widefido.com>
Date:   Sat Aug 24 14:43:48 2019 -0400

    Computed symbol stop

commit f130fe87abdccbabd2e71f2771b789c7f46d57ca
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 23 20:56:59 2019 -0400

    Added reference to 7x7 costas arrays

commit 53e91858f5a4e9ce78c38ef65c77e87f1903c058
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 23 16:34:51 2019 -0400

    Back to 10 baud

commit 1ae79d566ebd9a40ad3cf4a07977ef0e09615d91
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 23 15:14:41 2019 -0400

    Testing 31.25 baud

commit 7e033c28ae090d6c3f5a63fa651ee51c3243d61c
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 23 15:14:17 2019 -0400

    Experimenting with a few different baudrates

commit 050e24ad3a040924ded6d641004ae63da47e4251
Author: Jordan Sherer <jordan@widefido.com>
Date:   Fri Aug 23 12:25:50 2019 -0400

    Added ldpcsim for js8

commit d309a75d860e39737dec732560432a191290b258
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Aug 22 22:42:11 2019 -0400

    Experimental submode switching

commit 74f72bb24a22631b8b69942ea0633bb0564b8aa3
Author: Jordan Sherer <jordan@widefido.com>
Date:   Thu Aug 22 22:41:53 2019 -0400

    Allow switching decoders based on submode

commit f8740a23b27e80fa53350e140d4638a27cd6e975
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 23:43:18 2019 -0400

    Initial spike of js8 fortran code

commit 31625316639f79246b4a2e3d0cea4507bf0547f9
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 23:09:00 2019 -0400

    Remove fix contest message

commit c0e0862afa8ae2d47e9577562399b8c9bc929c6a
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 21:05:05 2019 -0400

    Cleanup unused text files and batch files

commit 1b3aa55869f0c310e6c911a7cbb3fe269bc7421a
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 21:00:38 2019 -0400

    Removed fast_decode and dx

commit 49e5cabff25c13620a9d2c6fc6ddd4988f1be217
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 20:54:39 2019 -0400

    Cleaning up msk stuff

commit 8bde6f391f4b23d2a2e9d55685d96bc647a462f6
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 21 20:44:39 2019 -0400

    Initial cleanup pass of qra, ftrsd, and wsprd
This commit is contained in:
Jordan Sherer 2019-09-05 14:07:24 -04:00
parent daa8cc2c3e
commit c24e931f09
206 changed files with 3792 additions and 22217 deletions

View File

@ -295,6 +295,12 @@ set (wsjt_FSRCS
lib/timer_impl.f90
lib/timer_module.f90
lib/wavhdr.f90
lib/js8b_module.f90
lib/js8b_decode.f90
lib/js8c_module.f90
lib/js8c_decode.f90
lib/js8d_module.f90
lib/js8d_decode.f90
# remaining non-module sources
lib/addit.f90
@ -311,6 +317,7 @@ set (wsjt_FSRCS
lib/azdist.f90
lib/badmsg.f90
lib/ft8/baseline.f90
# lib/js8/baselinejs8.f90
lib/bpdecode40.f90
lib/bpdecode144.f90
lib/ft8/bpdecode174.f90
@ -350,7 +357,6 @@ set (wsjt_FSRCS
lib/ft8/extractmessage174.f90
lib/fano232.f90
lib/fast9.f90
lib/fast_decode.f90
lib/fchisq.f90
lib/fchisq0.f90
lib/fchisq65.f90
@ -361,7 +367,6 @@ set (wsjt_FSRCS
lib/filbig.f90
lib/ft8/filt8.f90
lib/fitcal.f90
lib/fix_contest_msg.f90
lib/flat1.f90
lib/flat1a.f90
lib/flat1b.f90
@ -378,19 +383,16 @@ set (wsjt_FSRCS
lib/freqcal.f90
lib/ft8/ft8apset.f90
lib/ft8/ft8b.f90
# lib/js8/js8params.f90
# lib/js8/js8b.f90
lib/ft8/ft8code.f90
lib/ft8/ft8_downsample.f90
# lib/js8/js8_downsample.f90
lib/ft8/ft8sim.f90
lib/gen4.f90
lib/gen65.f90
lib/gen9.f90
lib/geniscat.f90
lib/ft8/genft8.f90
lib/genmsk144.f90
lib/genmsk40.f90
lib/genqra64.f90
lib/js8/genjs8.f90
lib/ft8/genft8refsig.f90
lib/genwspr.f90
# lib/js8/genjs8refsig.f90
lib/geodist.f90
lib/getlags.f90
lib/getmet4.f90
@ -401,7 +403,6 @@ set (wsjt_FSRCS
lib/ft8/h1.f90
lib/hash.f90
lib/hint65.f90
lib/hspec.f90
lib/indexx.f90
lib/init_random_seed.f90
lib/interleave4.f90
@ -414,6 +415,9 @@ set (wsjt_FSRCS
lib/jtmsg.f90
lib/ldpcsim144.f90
lib/ft8/ldpcsim174.f90
lib/js8/ldpcsim174js8b.f90
lib/js8/ldpcsim174js8c.f90
lib/js8/ldpcsim174js8d.f90
lib/ldpcsim40.f90
lib/libration.f90
lib/lorentzian.f90
@ -423,20 +427,6 @@ set (wsjt_FSRCS
lib/moondopjpl.f90
lib/morse.f90
lib/move.f90
lib/msk144d2.f90
lib/msk40decodeframe.f90
lib/msk144decodeframe.f90
lib/msk144sd.f90
lib/msk40spd.f90
lib/msk144spd.f90
lib/msk40sync.f90
lib/msk144sync.f90
lib/msk40_freq_search.f90
lib/msk144_freq_search.f90
lib/mskrtd.f90
lib/msk144signalquality.f90
lib/msk144sim.f90
lib/mskrtd.f90
lib/ft8/osd174.f90
lib/pctile.f90
lib/peakdt9.f90
@ -466,6 +456,7 @@ set (wsjt_FSRCS
lib/stdmsg.f90
lib/subtract65.f90
lib/ft8/subtractft8.f90
# lib/js8/subtractjs8.f90
lib/sun.f90
lib/symspec.f90
lib/symspec2.f90
@ -474,7 +465,9 @@ set (wsjt_FSRCS
lib/sync64.f90
lib/sync65.f90
lib/ft8/sync8.f90
# lib/js8/syncjs8.f90
lib/ft8/sync8d.f90
# lib/js8/syncjs8d.f90
lib/sync9.f90
lib/sync9f.f90
lib/sync9w.f90
@ -502,46 +495,24 @@ set (wsjt_FSRCS
# temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit
set_source_files_properties (lib/slasubs.f PROPERTIES COMPILE_FLAGS -O2)
set (ka9q_CSRCS
lib/ftrsd/decode_rs.c
lib/ftrsd/encode_rs.c
lib/ftrsd/init_rs.c
)
set_source_files_properties (${ka9q_CSRCS} PROPERTIES COMPILE_FLAGS -Wno-sign-compare)
set (qra_CSRCS
lib/qra/qra64/qra64.c
lib/qra/qra64/qra64_subs.c
lib/qra/qracodes/npfwht.c
lib/qra/qracodes/pdmath.c
lib/qra/qracodes/qra12_63_64_irr_b.c
lib/qra/qracodes/qra13_64_64_irr_e.c
lib/qra/qracodes/qracodes.c
lib/qra/qracodes/normrnd.c
)
set (sqlite3_CSRCS
vendor/sqlite3/sqlite3.c
)
set (wsjt_CSRCS
${ka9q_CSRCS}
lib/ftrsd/ftrsdap.c
lib/sgran.c
lib/golay24_table.c
lib/gran.c
lib/igray.c
lib/init_random_seed.c
lib/ldpc32_table.c
lib/wsprd/nhash.c
lib/nhash.c
lib/tab.c
lib/tmoonsub.c
lib/usleep.c
lib/vit213.c
lib/wisdom.c
lib/wrapkarn.c
${ldpc_CSRCS}
${qra_CSRCS}
)
set (wsjt_qt_UISRCS
@ -1026,6 +997,15 @@ target_link_libraries (wsjt_qtmm Qt5::Multimedia)
add_executable (ldpcsim174 lib/ft8/ldpcsim174.f90 wsjtx.rc)
target_link_libraries (ldpcsim174 wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8b lib/js8/ldpcsim174js8b.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8b wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8c lib/js8/ldpcsim174js8c.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8c wsjt_fort wsjt_cxx)
add_executable (ldpcsim174js8d lib/js8/ldpcsim174js8d.f90 wsjtx.rc)
target_link_libraries (ldpcsim174js8d wsjt_fort wsjt_cxx)
add_executable (js8 ${js8_FSRCS} ${js8_CXXSRCS} wsjtx.rc)
if (${OPENMP_FOUND} OR APPLE)
if (APPLE)

View File

@ -890,56 +890,43 @@ text message.</string>
<item row="3" column="1">
<widget class="QLineEdit" name="auto_blacklist_line_edit"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>Idle Timeout</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_32">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>Disable automatic transmissions after:</string>
</property>
<property name="buddy">
<cstring>tx_watchdog_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="tx_watchdog_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes before unattended heartbeat transmissions are aborted.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="specialValueText">
<string>Disabled</string>
</property>
<property name="suffix">
<string> minutes of inactivity</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
</layout>
<item row="4" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Idle timeout - disable autoreply after:</string>
</property>
<property name="buddy">
<cstring>tx_watchdog_spin_box</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="tx_watchdog_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes before unattended heartbeat transmissions are aborted.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="specialValueText">
<string>Disabled</string>
</property>
<property name="suffix">
<string> minutes of inactivity</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>1440</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
</layout>
</widget>
@ -4383,12 +4370,12 @@ soundcard changes</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
</buttongroups>
</ui>

View File

@ -71,7 +71,19 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
m_toneSpacing = toneSpacing;
m_bFastMode=fastMode;
m_TRperiod=TRperiod;
unsigned delay_ms = 1920 == m_nsps && 15 == m_period ? 500 : 250; // 1000;
unsigned delay_ms = 0;
if(m_TRperiod == JS8A_TX_SECONDS){
delay_ms = JS8A_START_DELAY_MS;
}
else if(m_TRperiod == JS8B_TX_SECONDS){
delay_ms = JS8B_START_DELAY_MS;
}
else if(m_TRperiod == JS8C_TX_SECONDS){
delay_ms = JS8C_START_DELAY_MS;
}
else if(m_TRperiod == JS8D_TX_SECONDS){
delay_ms = JS8D_START_DELAY_MS;
}
// noise generator parameters
if (m_addNoise) {

View File

@ -1,6 +1,6 @@
# Version number components
set (WSJTX_VERSION_MAJOR 1)
set (WSJTX_VERSION_MINOR 2)
set (WSJTX_VERSION_MAJOR 2)
set (WSJTX_VERSION_MINOR 0)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build

BIN
bsj.mod Normal file

Binary file not shown.

View File

@ -7,19 +7,31 @@
#define RX_SAMPLE_RATE 12000
#define JS8_NUM_SYMBOLS 79
#define JS8_ENABLE_JS8B 1
#define JS8_ENABLE_JS8C 1
#define JS8_ENABLE_JS8D 0
#ifndef JS8_80HZ
#define JS8_80HZ 0
#endif
#define JS8A_SYMBOL_SAMPLES 1920
#define JS8A_TX_SECONDS 15
#define JS8A_START_DELAY_MS 500
#if JS8_80HZ
#define JS8_SYMBOL_SAMPLES 1200 // 480 // 600 // 1200 // 1920
#define JS8_TX_SECONDS 10 // 5 // 6 // 10 // 15
#define JS8_SYMBOL_STOP 32 // 12 // 16 // 32 // 50 // ??? no idea why this works...
#define JS8B_SYMBOL_SAMPLES 1200
#define JS8B_TX_SECONDS 10
#define JS8B_START_DELAY_MS 200
#define JS8C_SYMBOL_SAMPLES 600
#define JS8C_TX_SECONDS 6
#define JS8C_START_DELAY_MS 100
#define JS8D_IS_ULTRA 1
#if JS8D_IS_ULTRA
#define JS8D_SYMBOL_SAMPLES 384
#define JS8D_TX_SECONDS 4
#define JS8D_START_DELAY_MS 100
#else
#define JS8_SYMBOL_SAMPLES 1920
#define JS8_TX_SECONDS 15
#define JS8_SYMBOL_STOP 50
#define JS8D_SYMBOL_SAMPLES 4000
#define JS8D_TX_SECONDS 30
#define JS8D_START_DELAY_MS 100
#endif
#ifndef TEST_FOX_WAVE_GEN

View File

@ -15,7 +15,7 @@ namespace
QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{2}|\d{3}))|[A-Z0-9/]+)\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"};
}
DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString const& my_grid)
DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString const& my_grid, int submode)
: string_ {the_string.left (the_string.indexOf (QChar::Nbsp))} // discard appended info
, padding_ {string_.indexOf (" ") > 4 ? 2 : 0} // allow for seconds
, contest_mode_ {contest_mode}
@ -25,6 +25,7 @@ DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString
, isHeartbeat_(false)
, isAlt_(false)
, bits_{0}
, submode_{submode}
{
if(message_.length() >= 1) {
message_ = message_.left (21).remove (QRegularExpression {"[<>]"});
@ -69,12 +70,13 @@ DecodedText::DecodedText (QString const& the_string, bool contest_mode, QString
tryUnpack();
}
DecodedText::DecodedText (QString const& js8callmessage, int bits):
DecodedText::DecodedText (QString const& js8callmessage, int bits, int submode):
frameType_(Varicode::FrameUnknown),
message_(js8callmessage),
isHeartbeat_(false),
isAlt_(false),
bits_(bits)
bits_(bits),
submode_(submode)
{
is_standard_ = QRegularExpression("^(CQ|DE|QRZ)\\s").match(message_).hasMatch();
@ -89,9 +91,13 @@ bool DecodedText::tryUnpack(){
bool unpacked = false;
if(!unpacked){
unpacked = tryUnpackData();
unpacked = tryUnpackFastData();
}
if(!unpacked){
unpacked = tryUnpackData();
}
if(!unpacked){
unpacked = tryUnpackHeartbeat();
}
@ -115,6 +121,10 @@ bool DecodedText::tryUnpackHeartbeat(){
return false;
}
if((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData){
return false;
}
bool isAlt = false;
quint8 type = Varicode::FrameUnknown;
quint8 bits3 = 0;
@ -159,6 +169,10 @@ bool DecodedText::tryUnpackCompound(){
return false;
}
if((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData){
return false;
}
QStringList cmp;
if(!parts.at(0).isEmpty()){
cmp.append(parts.at(0));
@ -188,6 +202,10 @@ bool DecodedText::tryUnpackDirected(){
return false;
}
if((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData){
return false;
}
quint8 type = Varicode::FrameUnknown;
QStringList parts = Varicode::unpackDirectedMessage(m, &type);
@ -218,7 +236,11 @@ bool DecodedText::tryUnpackData(){
// data frames calls will always be 12+ chars and contain no spaces.
if(m.length() < 12 || m.contains(' ')){
return false;
return false;
}
if((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData){
return false;
}
QString data = Varicode::unpackDataMessage(m);
@ -232,6 +254,33 @@ bool DecodedText::tryUnpackData(){
return true;
}
bool DecodedText::tryUnpackFastData(){
QString m = message().trimmed();
// data frames calls will always be 12+ chars and contain no spaces.
if(m.length() < 12 || m.contains(' ')){
return false;
}
if((bits_ & Varicode::JS8CallData) != Varicode::JS8CallData){
return false;
}
if(submode_ != Varicode::JS8CallFast && submode_ != Varicode::JS8CallTurbo && submode_ != Varicode::JS8CallUltra){
return false;
}
QString data = Varicode::unpackFastDataMessage(m);
if(data.isEmpty()){
return false;
}
message_ = data;
frameType_ = Varicode::FrameData;
return true;
}
QStringList DecodedText::messageWords () const
{
if (is_standard_)

View File

@ -30,14 +30,15 @@
class DecodedText
{
public:
explicit DecodedText (QString const& message, bool, QString const& my_grid);
explicit DecodedText (QString const& js8callmessage, int bits);
explicit DecodedText (QString const& message, bool, QString const& my_grid, int submode);
explicit DecodedText (QString const& js8callmessage, int bits, int submode);
bool tryUnpack();
bool tryUnpackHeartbeat();
bool tryUnpackCompound();
bool tryUnpackDirected();
bool tryUnpackData();
bool tryUnpackFastData();
quint8 frameType() const { return frameType_; }
@ -110,6 +111,7 @@ private:
QString message_;
bool is_standard_;
int bits_;
int submode_;
};
#endif // DECODEDTEXT_H

BIN
js8.mod Normal file

Binary file not shown.

BIN
js8a.mod Normal file

Binary file not shown.

BIN
js8params.mod Normal file

Binary file not shown.

View File

@ -1,5 +1,20 @@
#include "keyeater.h"
bool KeyPressEater::eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
bool processed = false;
emit this->keyPressed(obj, keyEvent, &processed);
if(processed){
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
bool EscapeKeyPressEater::eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

View File

@ -5,6 +5,20 @@
#include <QKeyEvent>
#include <QMouseEvent>
class KeyPressEater : public QObject
{
Q_OBJECT
public:
KeyPressEater(){}
virtual ~KeyPressEater(){}
protected:
bool eventFilter(QObject *obj, QEvent *event);
public:
Q_SIGNAL void keyPressed(QObject *obj, QKeyEvent *evt, bool *pProcessed);
};
class EscapeKeyPressEater : public QObject
{
Q_OBJECT

View File

@ -1,39 +0,0 @@
Before using the new "CQ nnn ..." feature in JTMSK mode, I suggest
performing the following tests of the necessary CAT control for your
radio. (I'm assuming that you already have some experience with
JTMSK.)
TEST 1:
--------------------------------------------------------------------------
1. Start WSJT-X
2. Settings: "Enable VHF/UHF/Microwave features, "Rx frequency offset
with 'CQ nnn ...'", Split=Rig, or Split="Fake it"
3. Main screen settings: Band=50.280, mode=JTMSK, T/R=15 s
4. Activate CQRx, set CQ Rx=265
==> Rx dial should now read 50.265 and Tx6 should be queued
5. Click "Enable Tx"
==> Tx sequences should occur at 50.280, Rx at 50.265
With most rigs, this test should work with Split configured as either
"Rig" or "Fake it".
TEST 2:
--------------------------------------------------------------------------
1. Start WSJT-X
2. Settings: MyCall=K1JT, "Enable VHF/UHF/Microwave features,
"Rx frequency offset with 'CQ nnn ...'", Split=Rig or "Fake it"
4. Main screen settings: Band=50.280, mode=JTMSK, T/R=15 s
5. Open file 150826_120515.wav
==> see decoded message "K1JT VE1SKY FN74"
6. Click "Monitor" to restart monitoring
7. Activate CQRx, set CQ Rx=265
==> Rx dial should now read 50.265; Tx6 should be queued
8. Click "Enable Tx"
==> Tx sequences should occur at 50.280, Rx at 50.265
9. After the start of a transmission, double-click on the decoded message
"K1JT VE1SKY FN74"
==> Tx2 should be generated and queued; transmission will pause
briefly, Tx freq changed to 50.265, then Tx resumed.
The test file is posted at
http://physics.princeton.edu/pulsar/K1JT/150826_120515.wav

View File

@ -1,186 +0,0 @@
White Paper: FT8 for DXpeditions
-----------------------------------
Joe Taylor, K1JT - October 27, 2017
Assumptions:
1. WSJT-X will have two distinct options that enable the maximum-rate
QSO exchanges described below. Fox must select "Fox"; all Hounds must
select "Hound".
2. There will be an announced basic dial frequency for each band, say
f0=14082 kHz for 20m. This is the basic Channel.
3. Fox always transmits in the 1st sequence, 200-800 Hz above f0.
4. Hounds call in 2nd sequence, 1000-5000 Hz above f0. Hounds
transmitting below f0+1000 Hz will not be answered.
5. If found necessary, additional Channels may be defined in which
Hounds can transmit. (However, I suggest that CQ-by-call-area may
be easier to implement and use; and the software could be made to
prevent Hounds in the wrong area from transmitting.)
6. Ideally, Fox and Hounds should all use CAT control configured with
*Split Operation* set to *Rig* or *Fake It*, and transceiver dial
frequencies should best be calibrated to within a few Hz. (WSJT-X
provides tools that make this fairly easy to do.)
When Fox is running a pileup, QSOs will look something like the
following exchanges. Here I've assumed the Fox callsign is KH1DX,
his locator AJ10:
------------------------------------------------------------------------
Fox Hounds
------------------------------------------------------------------------
1. CQ KH1DX AJ10
2. KH1DX K1ABC FN42, KH1DX W9XYZ EN37, ...
3. K1ABC KH1DX -13
4. KH1DX K1ABC R-11
5. K1ABC RR73; W9XYZ <KH1DX> -17
6. ... no copy from W9XYZ ...
7. W9XYZ KH1DX -17
8. ... no copy from W9XYZ ...
9. G4AAA KH1DX -11
10. KH1DX G4AAA R-03
11. G4AAA RR73; DL3BBB <KH1DX> -12
12. KH1DX DL3BBB R-09
13. DL3BBB RR73; DE <KH1DX>
14. ...
------------------------------------------------------------------------
All messages except those containing "<...>" are standard FT8 messages
(i3bit=0, iFreeText=0). Hounds transmit only standard messages.
Fox transmits standard messages and also special messages with
i3bit=1. The special messages contain a callsign whose completed QSO
is being acknowledged; a callsign for the next station to be worked; a
hash code corresponding to the Fox callsign; and a signal report.
Users will see the Fox callsign enclosed in angle brackets, <KH1DX>.
The 72-bit message payload contains two 28-bit callsigns, a 10-bit
hash code, and a 6-bit signal report. If no call has been queued up
by Fox for the next QSO, the acknowledgment message takes the
abbreviated form shown in line 13 above.
When a Hound receives a message with i3bit=1, the decoder interprets
the remaining 72 bits as described above. If the 10-bit hash code
matches that for Fox's callsign, the message is displayed as in the
QSO exchanges shown above. Otherwise the message is considered a
false decode and is not displayed.
Station Setup and Operation for FOX
-----------------------------------
A wide Rx bandwidth (up to 5 kHz) is selected. The basic dial
frequency is set 1 kHz above f0 (thus 14083 kHz in my example) and the
audio TxFreq somewhere between -200 and -800 Hz. (Yes, negative
numbers are OK. *Split Operation* will reset the Tx dial frequency as
needed and will keep the generated Tx audio frequency between 1500 and
2000 Hz.) Hounds with audio TxFreq set to N Hz will be received by Fox
at N-1000 Hz.
WSJT-X at Fox will maintain and display a list of all decoded Hounds
calling Fox in the past 2 to 4 Rx cycles. The list might look
something like this (but typically will be much longer):
----------------------------
Call Grid Rpt Freq
----------------------------
AA2UK FM29 -11 240
AD9H EN61 +02 1260
K0TPP EM48 -15 1980
N2BJ EN61 +11 540
N4NDR EL98 -17 4620
NX4E EM70 +00 3780
ON3LA JN29 -10 3300
PD9BG JO21 -21 2100
PJ4/KA1XYZ FK60 -07 1020
VE1SKY FN74 +03 1620
WB2REM EL97 -13 3060
...
----------------------------
Fox can choose to have the list sorted on any column.
Fox selects a Hound to call next by clicking on a line. Or he can hit
"F1" to have the program select a caller according to one of these
criteria (maybe others as well?):
- Weakest caller
- Strongest caller
- Strongest one below -N dB (with N selectable)
- Choose a call at random
- Random choice with S/N between snrMin and snrMax dB.
After a particular Hound has been called, Fox's Auto-Sequencer looks
for a response containing "R+rpt" originating from that same callsign.
If such a message is received, Fox's next transmission will be the
special "acknowledge-and-call-next" type, with i3bit=1. If the
expected message is not received, as in example line 6 above, the
report is sent to the same station again. If the second attempt fails
and another Hound callsign has been queued up, the QSO is aborted and
the next Hound is called.
Station Setup and Operation for Hounds
--------------------------------------
Dial frequency is set to f0, 14082 kHz in my example. Rx bandwidth and
displayed range on the Wide Graph can be anything convenient, say 200
to 2600 Hz. (Signal from Fox will be expected between 200 and 800
Hz.) Enter callsign and locator of Fox on WSJT-X main window as *DX
Call* and *DX Grid*. Choose a TxFreq offset of 1000 + 60*N for some N
in the range 1 to 80 (maybe even higher?). Move TxFreq as desired,
hoping to find a clear slot, by using Shift+F11 and Shift+F12.
- Hit F1 to call Fox in your next Tx sequence. Yes, you must hit F1
repeatedly, in order to keep calling.
- The Auto-sequencer will watch for a decoded message that contains
"MyCall DXcall rpt" or "MyCall <DXcall> rpt". When one of these is
received, your next transmission will be "DXcall MyCall R+rpt",
sent automatically.
- After you send the "R+rpt" message, AutoSeq will watch for a
message that starts with "MyCall RR73; ...". When that is
received, you're in his log, and you'll be prompted to log the QSO.
Random thoughts
---------------
Fox's decoder has access to signals in a 4 kHz (maybe even 5 kHz?)
window. At 60 Hz intervals, that's enough for around 65 (or 80?)
non-overlapping Hound signals. If the pileup becomes too deep, more
spectrum might be used; but note that WSJT-X can't access more than 5
kHz at one time. A better solution might be for Fox to call "CQ n
KH1DX AJ10", where n is a single digit indicating call area. The
decoder could then limit the list of eligible calls to those in the
specified call area. After decoding such a CQ, the software at Hound
could refuse to transmit unless MyCall falls in the specified call
area. (Other special CQ formats can be imagined that would limit the
eligible Hound callsigns even further.)
We haven't thought much, yet, about logging issues for Fox. I imagine
we could do what's necessary to join a N1MM+ logging network, if that's
deemed desirable.
A few questions:
Q1: Should the Auto-Sequencer allow for other cases in which a QSO has
been initiated by Fox, but one of next two messages is not copied by
either Fox or Hound? For example, what if K1ABC does not copy message
#5? Should he keep sending his message "KH1DX K1ABC R-11" ? If Fox
receives this message again, should he acknowledge again? And poor
W9XYZ, who never received an acknowledgment, will probably keep
sending "KH1DX W9XYZ R-19", or whatever. If Fox eventually copies the
message, should the program remember that W9XYZ had been called, and
thus send him an acknowledgment?
Q2: Should we provide a stack for several to-be-called callsigns,
rather than just one? Should re-ordering of calls in the stack be
permitted?
Q3: Can we handle WSJT-X "Type 1" and "Type 2" compound callsigns, for
Hounds?

View File

@ -1,71 +0,0 @@
Auto-Sequencing algorithm for DXpedition station:
Start:
CQMsg = "CQ KH1DX" (or "CQ UP KH1DX", "CQ 116 KH1DX", etc.)
TxMsg = CQMsg
Ntry = 0
QCALL = "" # Callsign of current QSO partner
go to Transmit
Transmit:
TX # (... takes 13.6 s)
go to Receive
Receive:
RX # (... takes ~14 s)
N = number of decodes # RxMsg[i], i=1,N
if(N == 0)
go to Transmit
J = index of a reply from current QCALL # RxMsg[J] = "KH1DX QCALL R<rpt>"
if(QCALL == "") # No QSO in progress
Select new QCALL # Op chooses a caller
if(QCALL == "")
TxMsg = CQMsg # No callers, we'll CQ again
else # QSO in progress
if(J >= 1) # Expected message was received
log the QSO with QCALL
QCALL = ""
Select new QCALL # Op chooses a new caller
if(QCALL != "")
TxMsg = "73 NOW QCALL <rpt>" # Start a new QSO
else
TxMsg = "73 " + CQMsg # No callers, we'll CQ again
else
Ntry = Ntry + 1 # Expected msg not received
if(Ntry <= NtryMax)
go to Transmit # Ask for a repeat
else
QCALL = "" # Max tries exceeded, abort this QSO
Select new QCALL # Choose a new caller
if(QCALL != "")
TxMsg = "NIL NOW QCALL <rpt>" # Start a new QSO
else
TxMsg = "NIL " + CQMSG # No callers, we'll CQ again
go to Transmit
Auto-Sequencing algorithm for those calling the DXpedition:
Start:
TxMsg = "KH1DX MyCall"
InQSO = false
Transmit:
TX # (... takes 13.6 s)
go to Receive
Receive:
RX # (... takes ~14 s)
if(RxMsg[i] contains "MyCall <rpt>")
InQSO = true
TxMsg = "KH1DX MyCall R<rpt>"
go to Transmit
if(RxMsg[i] contains "<rpt>")
TxEnable = false
go to Receive
if(RxMsg[i] contains "CQ KH1DX")
TxEnable = true
go to Transmit

View File

@ -1,395 +0,0 @@
Fast Modes in WSJT-X
--------------------
#######################################################################
IMPORTANT - IMPORTANT - IMPORTANT - IMPORTANT - IMPORTANT - IMPORTANT
Third-party individuals (i.e., others not part of the WSJT development
team) have been compiling WSJT-X from the open source code and making
unauthorized "releases" of their builds. I do NOT reccommend use of
unauthorized builds on the air. If a program revision has been released
in an official way, you will see it listed here.
If you operate with an unauthorized "rXXXX" code revisions in our
experimental code branch you have no idea what you've got. Quite
possibly, the program was built from an intermediate temporary "save"
of various files, and was not even supposed to produce a usable
program. Your observetions about what works or does not work are then
worse than useless -- they waste your time and ours.
So please, PLEASE, *PLEASE*: use *authorized*, "released* revisions
of this still-in-development software, like the revisions described here.
*ALSO:* If you choose to try an experimental release of JTMSK, please
accept the responsibility of reporting on your results. You can send
reports to the "wsjtgroup" reflector, wsjtgroup@yahoogroups.com, or
email them directly to me. All suggestions for improvements are
welcome!
Bug reports should include details on how to reproduce the undesirable
program behavior. Reports on decoding performance are especially
useful when accompanied by example *.wav files with signals that
you think should have decoded, but did not.
#######################################################################
September 18, 2015
-----------------
New alpha release of experimental WSJT-X v1.6.1, r5910
------------------------------------------------------
Changes since revision 5889 include the following:
1. Improved behavior for auto-QSY with "CQ nnn ..." feature. (May not
be exactly correct, yet, for all radios. Please report if you find
problems with your rig.)
2. Allow optional use of Wide Graph in fast modes.
3. Add UTC labels to Fast Graph spectrograms.
4. Display correct DXCC entiry for "CQ nnn ..." messages.
5. Implement "Save Decoded" for fast modes.
6. Select Tx6 when "CQ Rx nnn" is enabled.
7. Fix bug in setting of TRperiod after switch to ISCAT mode.
8. Display proper symbol '&' in Tx messages in JTMSK mode.
To download this alpha release for Windows, paste the following link
into your browser:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5910-win32.exe
-- 73, Joe, K1JT
#######################################################################
September 12, 2015
-----------------
New alpha release of experimental WSJT-X v1.6.1, r5889
------------------------------------------------------
A principal new feature in this release is designed to promote the use
of an agreed "calling frequency" for transmissions of the form
CQ 265 K1ABC FN42
signifying that K1ABC will listen for replies on 50.265 (or 144.265,
or whatever) and will complete the QSO there. The feature uses the
rig-control features of WSJT-X to handle the necessary frequency
switching.
##########################################################################
Changes since revision 5865 include the following:
1. New features that allow automatic rig control when you transmit or
respond to messages of the form "CQ 265 K1ABC FN42" on an agreed
calling frequency. This feature should be especially useful for
meteor scatter.
2. Yellow-highlighted "Tx" messages in the right text window are now
properly labeled with 6-digit UTC (hhmmss) in all fast modes.
3. Fixed a bug (introduced in r5865) that inhibited transmitting in
JT4 mode.
4. Fixed a bug that caused Wide Graph to continue issuing green
separator lines at short (e.g. 15 s) intervals after you have switched
to a slow mode.
5. Fixed several more GUI appearance bugs associated with changing
modes or submodes.
6. Fixed a bug in which double-clicking on the Fast Graph could cause
program crashes.
7. Fixed a bug that sometimes caused "high tones" to be emitted in
JTMSK mode.
#######################################################################
Here's a brief description of how to use the "CQ nnn ..." features.
1. On program startup, go to the Settings | General tab and tick the
box labeled 'Rx frequency offset with "CQ nnn ..."'
2. Select JTMSK mode and 50.280 (or your some other agreed calling
frequency) from the drop-down band menu. Remember that this menu is
not pre-populated with preferred frequencies for all modes on all
bands. Use Settings | Frequencies to add your desired modes and
frequencies to the list.
3. Tick the unlabeled checkbox just under the "Report: spinner to
activate the "CQ Rx nnn" spinner. Set this control to your desired
QSO frequency in kHz above the nominal band edge. On 6 meters, for
example, "265" means "50.265".
4. Your transceiver dial frequency should now show 50.265. Changes to
the "CQ Rx nnn" spinner value should be reflected immediately in the
transceiver dial frequency, the displayed value on the WSJT-X main
screen, and in Tx message #6, the "CQ nnn... " message.
5. When you transmit the Tx6 message, the Tx frequency will be set at
the calling frequency. Otherwise (when receiving, or when
transmitting any of the messages Tx1 through Tx5) the offset frequency
(50.265 in my example) will be used.
6. If you double-click on a received "CQ nnn ..." message on the
calling frequency, your rig will QSY to specified response frequency,
e.g. 50.265, for both Rx and Tx.
7. To go back to listening on the calling frequency, uncheck the box
that activated the "CQ Rx nnn" spinner.
#######################################################################
Fair warning: I have not yet tested all possible combinations of
"Split Operation" configuration (i.e., "None", "Rig", and "Fake it").
If you normally use Split operation, that should be OK for the "CQ
nnn ..." feature.
As always, please report any bugs that you find in r5889, including
pertinent details on your settings and the exact series of steps
required to reproduce the bug.
To download this alpha release for Windows, paste the following link
into your browser:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5889-win32.exe
-- 73, Joe, K1JT
#######################################################################
New alpha release of experimental WSJT-X v1.6.1, r5865
------------------------------------------------------
This alpha release of WSJT-X includes major improvements to the JTMSK
decoder. Changes since revision 5823 include the following:
1. On-screen controls labeled "Rx nnnn Hz" and "F Tol" (Rx frequency
and tolerance) now function as expected in JTMSK mode. The frequency
search range can be up to 500 Hz, but note that sensitivity is
necessarily reduced for signals off frequency by more than about 250
Hz. Normally you should leave Rx Freq set at 1500 Hz; suitable values
for F Tol are 100 to 500 Hz.
2. The JTMSK decoder now makes good use of strong, short pings (as
short as 0.1 s) as well as weak pings several times longer.
3. Improved calculation of S/N and frequency of decoded signals.
4. Unified appearance of window titles on all non-modal windows.
5. CW ID is disabled (for now, at least) when operating in any of the
WSJT fast modes.
6. In WSPR mode, display of "Receiving ... <band>" messages is
disabled when band-hopping is not in use.
7. Fixed several bugs affecting status and visibility of certain
on-screen controls after changes in operating mode.
8. Fixed a bug allowing display of duplicate decodes for the same
signal.
9. Fixed a bug preventing compilation on 64-bit systems, and cleaned
up some harmless compiler warnings.
#######################################################################
Summary Description of JTMSK Protocol
JTMSK uses the same standard message structure as slow modes JT4, JT9,
and JT65. User information is "source encoded" to 72 bits. A 15-bit
CRC is appended and a convolutional code with constraint length K=13
and rate r=1/2 is applied, making a total of (72+15+12)*2 = 198
information bits. Three copies of the "Barker-11" code and three
even-parity bits are added for synchronization, making a total of
198+33+3 = 234 channel symbols. Modulation uses a constant-envelope,
continuous-phase "minimum-shift keying" (MSK) waveform, with tone
frequencies of 1000 and 2000 Hz.
#######################################################################
To download this alpha release for Windows, paste the following link
into your browser:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5865-win32.exe
-- 73, Joe, K1JT
August 28, 2015
---------------
New release of experimental WSJT-X v1.6.1, r5823
------------------------------------------------
To download for Windows, paste the following link into your browser:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5823-win32.exe
This experimental version of WSJT-X introduces a new fast mode called
JTMSK. The letters MS, of course, imply meteor scatter; the three
letters MSK mean "Minimum Shift Keying", the modulation scheme used in
this mode.
Revision 5823 also includes a number of (mostly minor) bug fixes
relative to r5789.
IMPORTANT: If you choose to try JTMSK, please accept the
responsibility of reporting on your results. You can send reports to
the "wsjtgroup" reflector, wsjtgroup@yahoogroups.com or email them
directly to me. All suggestions for improvements are welcome! Bug
reports should include details on how to reproduce the undesirable
program behavior.
The present JTMSK decoder has been optimized for short pings. It does
not yet do a wide search for proper frequency alignment; you and your
QSO partner need to be "on frequency" to within +/- 100 Hz or better.
The decoder does not (yet) attempt to make optimal use of weak, slowly
varying signals. These and other characteristics may be improved in
coming revisions.
KNOWN BUG: At present you should use T/R sequence lengths 15 s in
JTMSK mode. If you have a program crash, open Windows Task Manager,
select the "Processes" tab, right-click on wsjtx.exe, and select "End
Process Tree". Then restart the program.
I view JTMSK as a candidate for replacing both FSK441 and JTMS for all
meteor scatter work. JTMSK has the major advantage of including
strong forward error correction (FEC), similar in usage to the schemes
used for many years in JT4, JT9, and JT65. The structure of user
messages and the format of minimal QSOs is also identical to those
other modes. But JTMSK is very fast, transmitting its full encoded
message content in 0.117 s, in a 2 kHz bandwidth. JTMSK therefore
makes much better use of short pings than (for example) JT9H can do.
The Tx waveform of JTMSK has been carefully designed to have a number
of desirable features. All messages are exactly the same length: 72
bits of user information are followed by a 15-bit CRC and encoded into
198 channel bits with a convolutional code (constraint length K=13,
rate r=1/2). Three sequences of the "Barker-11" code are added, along
with three parity bits, making a total of 234 channel bits in each
message. The MSK symbols for these bits are transmitted at 2000 baud,
and the full encoded message is repeated every 117 ms.
A summary description of modulation parameters for all WSJT(-X) modes
is shown in a table posted here:
http://physics.princeton.edu/pulsar/K1JT/wsjt_modes.txt and
illustrated graphically here:
http://physics.princeton.edu/pulsar/K1JT/wsjt_modes.pdf
-- 73, Joe, K1jT
August 15, 2015
---------------
New release of experimental WSJT-X v1.6.1, r5789
Changes since WSJT-X v1.6.1, revision 5779:
1. Major speedup (5x) of fast-JT9 decoder.
2. Corrected logic for Auto-Sequencing operation.
3. Stop after sending 73 five times in auto-sequence mode.
4. Add an "Auto-Level" control to Fast Graph window.
5. Send fast-mode decodes to PSKreporter web site.
6. Support automatic logging via JTAlert-X.
7. Send fast-mode output to file ALL.TXT.
8. Better definition of dB levels for fast-JT9 signals.
9. Rationalize the GUI behavior when changing mode, submode, fast/slow
status, and T/R period.
10. Correct a flaw in the display of multiple decodes in a single
fast-JT9 sequence.
11. Fix minor bugs reported by G3WDG, ND0B, OZ1PIF, and others.
To download for Windows, paste the following link into your browser:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5789-win32.exe
Please keep in mind that this is an experimental version of WSJT-X.
Bug reports and other feedback will be much appreciated, and will help
to make the program better!
-- 73, Joe, K1JT
August 11, 2015
---------------
Since its origin in the dark ages (ca. 2001) WSJT has supported "fast"
modes (designed for meteor scatter, etc.) and "slow" modes (optimized
for EME and other weak-signal propagation types). The most recent new
mode, JT9, now has *both* fast and slow submodes.
JT9A (the "original" JT9) is like JT65 and JT4: its T/R sequences are
one minute long, and its primary goal is best possible sensitivity for
very weak, approximately steady signals. The new experimental JT9
submodes use the same message structure, encoding, and modulation type
(9-tone FSK) as JT9A, but wider tone spacing and (optionally) faster
keying rates.
You can download an experimental version of WSJT-X (v1.6.1, r5779) here:
http://physics.princeton.edu/pulsar/K1JT/wsjtx-1.6.1-r5779-win32.exe
The fast submodes currently being tested, JT9E - JT9H, have been found
highly effective for meteors and ionoscatter propagation on 6 and 10
meters. Sensitivity is similar to ISCAT, or slightly better.
Decoding is much more reliable, because the JT9 protocol includes
strong forward error correction. Decoding results are like those for
all the WSJT "slow" modes: you should see messages exactly as they
were transmitted, or nothing at all. A potential side benefit is
automatic reporting of decodes to PSKreporter.
For details on the modulation parameters of the JT9 submodes, see the
table posted at
http://physics.princeton.edu/pulsar/K1JT/wsjt_modes.txt.
WSJT-X v1.6.1 r5779 has the following changes from r5769:
1. Numerous bug fixes
2. Double-click on decoded message now behaves properly
3. Faster decoding (further optimization still to come)
4. Decoded text is highlighted as in WSJT-X slow modes
5. Optional auto-sequencing
Fair warning: auto-sequencing is basically functional, but scarcely
tested. Please watch what it is doing, and tell us how you think it
should be improved!
If you use WSJT-X also for other modes and other purposes, you may
want to save several different sets of configuration settings. In
that case it's convenient to use the "-r xxx" option and start the
program from a command-prompt window. For example:
C:\Users\joe> cd \wsjt\wsjtx\bin
C:\WSJT\wsjtx\bin> wsjtx -r xxx
... where "xxx" can be anything you like, for example "ISCAT",
"FAST9", etc.
Proper configuration for the JT9 fast modes includes the following
settings:
On the Settings | General tab:
- check "Enable VHF/UHF/Microwave features"
Main window settings:
- Mode JT9
- Tx 700 Hz
- Rx 700 Hz
- Sync 0
- Submode G ... or E, F, and H (H not legal in US on 10m)
- Tick "Fast"
- T/R 30 s (also 5, 10, 15 s)
- FTol 500
Please keep in mind that this is an experimental version of WSJT-X.
It still has some rough edges, and no doubt some bugs. Your feedback
will be much appreciated, and will help to make the program better!
-- 73, Joe, K1JT

View File

@ -1,71 +0,0 @@
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: qratest.exe tplt.exe
all: qra64d.exe
OBJS1 = qratest.o qra64a.o ana64.o sync64a.o four2a.o smo.o smo121.o averms.o \
timer_module.o packjt.o twkfreq.o spec64.o fmtmsg.o pctile.o \
grid2deg.o deg2grid.o shell.o badmsg.o qra64_subs.o \
qracodes.o npfwht.o pdmath.o qra12_63_64_irr_b.o \
qra13_64_64_irr_e.o qra64.o image.o \
zplt64a.o zplt64b.o lorentzian.o fchisq0.o peakup.o sync64.o
qra64_subs.o: qra/qra64/qra64_subs.c
gcc -c -O2 -o qra64_subs.o qra/qra64/qra64_subs.c
qracodes.o: qra/qracodes/qracodes.c
gcc -c -O2 -o qracodes.o qra/qracodes/qracodes.c
qra64.o: qra/qra64/qra64.c
gcc -c -O2 -o qra64.o qra/qra64/qra64.c
npfwht.o: qra/qracodes/npfwht.c
gcc -c -O2 -o npfwht.o qra/qracodes/npfwht.c
pdmath.o: qra/qracodes/pdmath.c
gcc -c -O2 -o pdmath.o qra/qracodes/pdmath.c
qra12_63_64_irr_b.o: qra/qracodes/qra12_63_64_irr_b.c
gcc -c -O2 -o qra12_63_64_irr_b.o qra/qracodes/qra12_63_64_irr_b.c
qra13_64_64_irr_e.o: qra/qracodes/qra13_64_64_irr_e.c
gcc -c -O2 -o qra13_64_64_irr_e.o qra/qracodes/qra13_64_64_irr_e.c
qratest.exe: $(OBJS1)
$(FC) -o qratest.exe $(OBJS1) C:\JTSDK\fftw3f\libfftw3f-3.dll
OBJS2 = tplt.o zplt64.o image.o
tplt.exe: $(OBJS2)
$(FC) -o tplt.exe $(OBJS2)
OBJS3 = qra64d.o sync64a.o four2a.o smo.o smo121.o averms.o \
timer_module.o packjt.o twkfreq.o spec64.o fmtmsg.o pctile.o \
grid2deg.o deg2grid.o shell.o badmsg.o qra64_subs.o \
qracodes.o npfwht.o pdmath.o qra12_63_64_irr_b.o \
qra13_64_64_irr_e.o qra64.o image.o \
zplt64a.o zplt64b.o lorentzian.o fchisq0.o peakup.o sync64.o
qra64d.exe: $(OBJS3)
$(FC) -o qra64d.exe $(OBJS3) C:\JTSDK\fftw3f\libfftw3f-3.dll
.PHONY : clean
clean:
$(RM) *.o qratest.exe tplt.exe

View File

@ -1,153 +0,0 @@
# Makefile for MinGW on Windows
#
# Needed libraries are located using the following variables:
#
# QT_DIR - point this at the root of your Qt installation
# FFTW3_DIR - point this at the fftw v3 installation directory
#
# e.g.
# make -f Makefile.MinGW \
# QT_DIR=c:/Qt/5.2.1/mingw48_32 \
# FFTW3_DIR = c:/fftw-3.3.3-dll32-2
#
# Windows re-direct:
# C> make > junk1 2>&1
# Set paths
EXE_DIR = ..\\..\\wsjtx_install
QT_DIR = C:/wsjt-env/Qt5/5.2.1/mingw48_32
FFTW3_DIR = ..
INCPATH = -I${QT_DIR}/include/QtCore -I${QT_DIR}/include
# Compilers
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
RANLIB = ranlib
MKDIR = mkdir -p
CP = cp
RM = rm -f
FFLAGS = -O2 -fbounds-check -Wall -Wno-precision-loss -fno-second-underscore
CFLAGS = -I. -fbounds-check -mno-stack-arg-probe
# 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: libjt9.a libastro.a jt9.exe jt9code.exe jt65code.exe
OBJS1 = prog_args.o options.o pctile.o graycode.o sort.o ssort.o chkmsg.o \
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
fmtmsg.o grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
nchar.o four2a.o grid2deg.o pfxdump.o f77_wisdom.o \
symspec.o analytic.o db.o genjt9.o flat1.o smo.o \
packbits.o unpackbits.o encode232.o interleave9.o \
entail.o fano232.o gran.o sync9.o decode9.o \
fil3.o decoder.o grid2n.o n2grid.o timer.o \
softsym.o getlags.o afc9.o fchisq.o twkfreq.o downsam9.o \
peakdt9.o symspec2.o stdmsg.o morse.o azdist.o geodist.o \
fillcom.o chkss2.o zplot9.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat3.o polfit.o determ.o baddata.o
libjt9.a: $(OBJS1)
$(AR) libjt9.a $(OBJS1)
$(RANLIB) libjt9.a
OBJS2 = jt9.o jt9a.o jt9b.o jt9c.o ipcomm.o sec_midn.o usleep.o
LIBS2 = -L${QT_DIR}/lib -lQt5Core
jt9.exe: $(OBJS2) libjt9.a
$(CXX) -o jt9.exe $(OBJS2) $(LIBS2) libjt9.a \
-L$(FFTW3_DIR) -lfftw3f-3 $(shell $(FC) -print-file-name=lib$(FC).a)
-$(MKDIR) $(EXE_DIR)
$(CP) jt9.exe $(EXE_DIR)
OBJS3 = jt9sim.o
jt9sim.exe: $(OBJS3) libjt9.a
$(FC) -o jt9sim.exe $(OBJS3) libjt9.a
OBJS4 = jt9code.o
jt9code.exe: $(OBJS4) libjt9.a
$(FC) -o jt9code.exe $(OBJS4) libjt9.a
$(CP) jt9code.exe $(EXE_DIR)
OBJS5 = jt65.o
jt65.exe: $(OBJS5) libjt9.a
$(FC) -o jt65.exe $(OBJS5) libjt9.a -L$(FFTW3_DIR) -lfftw3f-3
OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \
coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \
dcoord.o
libastro.a: $(OBJS7)
$(AR) libastro.a $(OBJS7)
$(RANLIB) libastro.a
OBJS6 = jt65code.o
jt65code.exe: $(OBJS6) libjt9.a
$(FC) -o jt65code.exe $(OBJS6) libjt9.a
$(CP) jt65code.exe $(EXE_DIR)
sync9.o: sync9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c sync9.f90
spec9.o: spec9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c spec9.f90
peakdt9.o: peakdt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c peakdt9.f90
jt9sim.o: jt9sim.f90 jt9sync.f90
$(FC) $(FFLAGS) -c jt9sim.f90
genjt9.o: genjt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c genjt9.f90
redsync.o: redsync.f90 jt9sync.f90
$(FC) $(FFLAGS) -c redsync.f90
unpackmsg.o: unpackmsg.f90
$(FC) -c -O0 -fbounds-check -Wall -Wno-precision-loss unpackmsg.f90
ipcomm.o: ipcomm.cpp
$(CXX) -c $(INCPATH) ipcomm.cpp
sec_midn.o: sec_midn.f90
$(FC) -c -fno-second-underscore sec_midn.f90
#rig_control.o: rig_control.c
# $(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include rig_control.c
tstrig.o: tstrig.c
$(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include tstrig.c
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
$(RM) *.o libjt9.a wsjtx.exe jt9sim.exe jt9.exe jt65.exe

View File

@ -1,122 +0,0 @@
# Makefile for MinGW on Windows
# Windows re-direct:
# C> make > junk1 2>&1
# Set paths
EXE_DIR = ../../wsjtx_install
INCPATH = -I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include/QtCore' \
-I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include' \
-I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include/ActiveQt' \
-I'release' -I'.' -I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/mkspecs/win32-g++'
# Compilers
CC = gcc
CXX = g++
FC = g95
FFLAGS = -O2 -fbounds-check -Wall -Wno-precision-loss -fno-second-underscore
CFLAGS = -I. -fbounds-check -mno-stack-arg-probe
# 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: libjt9.a jt9sim.exe jt9.exe jt9code.exe jt65.exe
OBJS1 = pctile.o graycode.o sort.o ssort.o \
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
nchar.o four2a.o grid2deg.o pfxdump.o f77_wisdom.o \
symspec.o analytic.o db.o genjt9.o \
packbits.o unpackbits.o encode232.o interleave9.o \
entail.o fano232.o gran.o sync9.o decode9.o \
fil3.o decoder.o grid2n.o n2grid.o timer.o \
softsym.o getlags.o afc9.o fchisq.o twkfreq.o downsam9.o \
peakdt9.o symspec2.o stdmsg.o morse.o azdist.o geodist.o \
fillcom.o chkss2.o zplot9.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o
libjt9.a: $(OBJS1)
ar cr libjt9.a $(OBJS1)
ranlib libjt9.a
OBJS2 = jt9.o jt9a.o jt9b.o jt9c.o ipcomm.o sec_midn.o usleep.o
LIBS2 = -L'c:/QtSDK/Desktop/Qt/4.7.4/mingw/lib' -lQtCore4
jt9.exe: $(OBJS2) libjt9.a
$(CXX) -o jt9.exe $(OBJS2) $(LIBS2) libjt9.a ../libfftw3f_win.a \
c:/MinGW/lib/libf95.a
mkdir -p $(EXE_DIR)
cp jt9.exe $(EXE_DIR)
OBJS3 = jt9sim.o
jt9sim.exe: $(OBJS3) libjt9.a
$(FC) -o jt9sim.exe $(OBJS3) libjt9.a
OBJS4 = jt9code.o
jt9code.exe: $(OBJS4) libjt9.a
$(FC) -o jt9code.exe $(OBJS4) libjt9.a
OBJS5 = jt65.o
jt65.exe: $(OBJS5) libjt9.a
$(FC) -o jt65.exe $(OBJS5) libjt9.a ../libfftw3f_win.a
sync9.o: sync9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c sync9.f90
spec9.o: spec9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c spec9.f90
peakdt9.o: peakdt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c peakdt9.f90
jt9sim.o: jt9sim.f90 jt9sync.f90
$(FC) $(FFLAGS) -c jt9sim.f90
genjt9.o: genjt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c genjt9.f90
redsync.o: redsync.f90 jt9sync.f90
$(FC) $(FFLAGS) -c redsync.f90
unpackmsg.o: unpackmsg.f90
$(FC) -c -O0 -fbounds-check -Wall -Wno-precision-loss unpackmsg.f90
ipcomm.o: ipcomm.cpp
$(CXX) -c $(INCPATH) ipcomm.cpp
sec_midn.o: sec_midn.f90
$(FC) -c -fno-second-underscore sec_midn.f90
#rig_control.o: rig_control.c
# $(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include rig_control.c
tstrig.o: tstrig.c
$(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include tstrig.c
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
rm -f *.o libjt9.a wsjtx.exe jt9sim.exe jt9.exe jt65.exe

View File

@ -1,84 +0,0 @@
# Set paths
EXE_DIR = ../../wsjtx_exp_install_latest
QT_DIR = /usr/include/qt5
INCPATH = -I${QT_DIR} -I${QT_DIR}/QtCore
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
MKDIR = mkdir -p
CP = cp
RANLIB = ranlib
RM = rm -f
FFLAGS = -I/opt/local/include -O3 -funroll-loops -Wall -Wno-conversion -fno-second-underscore -DUNIX
CFLAGS = -I. -fbounds-check -fPIE
# 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: libjt9.a jt65 jt65sim t3
OBJS1 = astrosub.o astro0.o astro.o sun.o coord.o tmoonsub.o \
fmtmsg.o deg2grid.o\
prog_args.o options.o pctile.o graycode.o sort.o chkmsg.o \
igray.o fftw3mod.o packjt.o\
four2a.o grid2deg.o wisdom.o \
symspec.o analytic.o db.o \
encode232.o interleave9.o\
entail.o fano232.o gran.o sync9.o \
fil3.o decoder.o fqso_first.o \
twkfreq.o symspec2.o shell.o sync65.o peakup.o slope.o xcor.o\
chkss2.o zplot9.o flat1.o flat2.o \
symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat4.o determ.o baddata.o subtract65.o
libjt9.a: $(OBJS1)
$(AR) libjt9.a $(OBJS1)
$(RANLIB) libjt9.a
OBJS7 = jt65.o
jt65: $(OBJS7) libjt9.a libsfrsd.a
$(FC) -o jt65 $(OBJS7) -L. -L/opt/local/lib -L./sfrsd2 -ljt9 -lsfrsd -lfftw3f_threads -lfftw3f
$(CP) jt65 $(EXE_DIR)
OBJS2 = jt65sim.o wavhdr.o
jt65sim: $(OBJS2) libjt9.a
$(FC) -o jt65sim $(OBJS2) -L. -L/opt/local/lib -ljt9 -lfftw3f
$(CP) jt65sim $(EXE_DIR)
OBJS3 = t3.o
t3: $(OBJS3) libjt9.a
$(FC) -o t3 $(OBJS3) -L. -L/opt/local/lib -ljt9
OBJS6 = jt65code.o
jt65code: $(OBJS6) libjt9.a
$(FC) -o jt65code $(OBJS6) libjt9.a
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
$(RM) *.o libjt9.a jt65

View File

@ -1,76 +0,0 @@
# Set paths
EXE_DIR = C:/JTSDK/wsjtx_exp/install/Debug/bin
QT_DIR = /usr/include/qt5
INCPATH = -I${QT_DIR} -I${QT_DIR}/QtCore
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
MKDIR = mkdir -p
CP = cp
RANLIB = ranlib
RM = rm -f
FFLAGS = -O2 -Wall -Wno-conversion -fno-second-underscore
CFLAGS = -I. -fbounds-check -fPIE -DBIGSYM
# 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: libjt9.a jt65 jt65sim
OBJS1 = astrosub.o astro0.o astro.o sun.o coord.o tmoonsub.o \
fmtmsg.o deg2grid.o\
prog_args.o options.o pctile.o graycode.o sort.o chkmsg.o \
igray.o fftw3mod.o packjt.o\
four2a.o grid2deg.o wisdom.o \
symspec.o analytic.o db.o \
encode232.o interleave9.o \
entail.o fano232.o gran.o sync9.o decjt9.o \
fil3.o decoder.o timer.o exp_decode65.o fqso_first.o \
twkfreq.o symspec2.o shell.o sync65.o peakup.o slope.o xcor.o\
fillcom.o chkss2.o zplot9.o flat1.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat4.o determ.o baddata.o subtract65.o
libjt9.a: $(OBJS1)
$(AR) libjt9.a $(OBJS1)
$(RANLIB) libjt9.a
OBJS7 = jt65.o
jt65: $(OBJS7) libjt9.a libsfrsd.a
$(FC) -o jt65 $(OBJS7) -L. -L./sfrsd2 -ljt9 -lsfrsd \
C:\JTSDK\fftw3f\libfftw3f-3.dll
OBJS2 = jt65sim.o wavhdr.o
jt65sim: $(OBJS2) libjt9.a
$(FC) -o jt65sim $(OBJS2) -L. -ljt9 C:\JTSDK\fftw3f\libfftw3f-3.dll
$(CP) jt65sim.exe $(EXE_DIR)
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
$(RM) *.o libjt9.a jt65

View File

@ -1,74 +0,0 @@
# Set paths
EXE_DIR = ../../wsjtx_install
CC = clang
CXX = g++
FC = gfortran
AR = ar cr
MKDIR = mkdir -p
CP = cp
RANLIB = ranlib
RM = rm -f
FFLAGS = -I/opt/local/include -Wall -Wno-conversion -fno-second-underscore -DUNIX
CFLAGS = -I. -fbounds-check -fPIE
# 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: libjt9.a jt65 jt65sim
OBJS1 = astrosub.o astro0.o astro.o sun.o coord.o tmoonsub.o \
fmtmsg.o deg2grid.o\
prog_args.o options.o pctile.o graycode.o sort.o chkmsg.o \
igray.o fftw3mod.o packjt.o\
four2a.o grid2deg.o wisdom.o \
symspec.o analytic.o db.o \
encode232.o interleave9.o\
entail.o fano232.o sgran.o gran.o sync9.o decjt9.o \
fil3.o decoder.o timer.o exp_decode65.o fqso_first.o\
twkfreq.o symspec2.o shell.o sync65.o peakup.o slope.o xcor.o\
fillcom.o chkss2.o zplot9.o flat1.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat4.o determ.o baddata.o subtract65.o
libjt9.a: $(OBJS1)
$(AR) libjt9.a $(OBJS1)
$(RANLIB) libjt9.a
OBJS7 = jt65.o
jt65: $(OBJS7) libjt9.a libftrsd.a
$(FC) -o jt65 $(OBJS7) -L. -L/opt/local/lib -L./ftrsd -ljt9 -lftrsd -lfftw3f_threads -lfftw3f
$(CP) jt65 $(EXE_DIR)
OBJS2 = jt65sim.o wavhdr.o
jt65sim: $(OBJS2) libjt9.a
$(FC) -o jt65sim $(OBJS2) -L. -L/opt/local/lib -ljt9 -lfftw3f
$(CP) jt65sim $(EXE_DIR)
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
$(RM) *.o libjt9.a jt65

View File

@ -1,58 +0,0 @@
# Set paths
EXE_DIR = ..\\..\\wsjtx_install
QT_DIR = C:/wsjt-env/Qt5/5.2.1/mingw48_32
FFTW3_DIR = ..
INCPATH = -I${QT_DIR}/include/QtCore -I${QT_DIR}/include
# Compilers
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
RANLIB = ranlib
MKDIR = mkdir -p
CP = cp
RM = rm -f
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: jt9w
OBJS1 = jt9w.o smo.o sync9w.o pctile.o shell.o lorentzian.o fchisq0.o \
softsym9w.o four2a.o interleave9.o jt9fano.o fano232.o packjt.o \
deg2grid.o grid2deg.o fmtmsg.o db.o decode9w.o
jt9w: $(OBJS1)
$(FC) -o jt9w $(OBJS1) -lfftw3f
OBJS2 = t1.o four2a.o db.o
t1: $(OBJS2)
$(FC) -o t1 $(OBJS2) -lfftw3f
OBJS3 = t2.o four2a.o db.o
t2: $(OBJS3)
$(FC) -o t2 $(OBJS3) -lfftw3f
OBJS4 = t3.o four2a.o db.o
t3: $(OBJS4)
$(FC) -o t3 $(OBJS4) -lfftw3f
.PHONY : clean
clean:
$(RM) *.o JTMSKcode JTMSKcode.exe

View File

@ -1,58 +0,0 @@
# Set paths
EXE_DIR = ..\\..\\wsjtx_install
QT_DIR = C:/wsjt-env/Qt5/5.2.1/mingw48_32
FFTW3_DIR = ..
INCPATH = -I${QT_DIR}/include/QtCore -I${QT_DIR}/include
# Compilers
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
RANLIB = ranlib
MKDIR = mkdir -p
CP = cp
RM = rm -f
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: jt9w
OBJS1 = jt9w.o smo.o sync9w.o pctile.o shell.o lorentzian.o fchisq0.o \
softsym9w.o four2a.o interleave9.o jt9fano.o fano232.o packjt.o \
deg2grid.o grid2deg.o fmtmsg.o db.o decode9w.o
jt9w: $(OBJS1)
$(FC) -o jt9w $(OBJS1) -lfftw3f
OBJS2 = t1.o four2a.o db.o
t1: $(OBJS2)
$(FC) -o t1 $(OBJS2) -lfftw3f
OBJS3 = t2.o four2a.o db.o
t2: $(OBJS3)
$(FC) -o t2 $(OBJS3) -lfftw3f
OBJS4 = t3.o
t3: $(OBJS4)
$(FC) -o t3 $(OBJS4) -L. -ljt9 C:\JTSDK\fftw3f\libfftw3f-3.dll
.PHONY : clean
clean:
$(RM) *.o JTMSKcode JTMSKcode.exe

View File

@ -1,137 +0,0 @@
# Makefile for MinGW on Windows
# Windows re-direct:
# C> make > junk1 2>&1
# Set paths
EXE_DIR = ../../wsjtx_install
INCPATH = -I'C:/JTSDK/Qt5/5.2.1/mingw48_32/include/QtCore' \
-I'C:/JTSDK/Qt5/5.2.1/mingw48_32/include/'
# Compilers
CC = c:/JTSDK/Qt5/Tools/mingw48_32/bin/gcc
FC = c:/JTSDK/Qt5/Tools/mingw48_32/bin/gfortran
CXX = c:/JTSDK/Qt5/Tools/mingw48_32/bin/g++
FFLAGS = -O3 -Wall -Wno-conversion -fno-second-underscore -DWIN32
CFLAGS = -I. -DWIN32
# 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: libjt9.a libastro.a jt9.exe jt9code.exe jt65code.exe jt9sim.exe
OBJS1 = pctile.o graycode.o sort.o chkmsg.o \
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
nchar.o four2a.o grid2deg.o pfxdump.o wisdom.o \
symspec.o analytic.o db.o genjt9.o flat1.o smo.o \
packbits.o unpackbits.o encode232.o interleave9.o \
entail.o fano232.o gran.o sync9.o jt9fano.o \
fil3.o decoder.o grid2n.o n2grid.o timer.o \
softsym.o getlags.o afc9.o fchisq.o twkfreq.o downsam9.o \
peakdt9.o symspec2.o stdmsg.o morse.o azdist.o geodist.o \
fillcom.o chkss2.o zplot9.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat4.o polfit.o determ.o baddata.o prog_args.o \
options.o fmtmsg.o decjt9.o
libjt9.a: $(OBJS1)
ar cr libjt9.a $(OBJS1)
ranlib libjt9.a
OBJS2 = jt9.o jt9a.o jt9b.o jt9c.o ipcomm.o sec_midn.o usleep.o
LIBS2 = -L'C:/JTSDK/Qt5/5.2.1/mingw48_32/lib' -lQt5Core
jt9.exe: $(OBJS2) libjt9.a
$(CXX) -o jt9.exe -static $(OBJS2) $(LIBS2) libjt9.a \
C:\JTSDK\fftw3f\libfftw3f-3.dll -lgfortran
# mkdir -p $(EXE_DIR)
cp jt9.exe $(EXE_DIR)
OBJS3 = jt9sim.o
jt9sim.exe: $(OBJS3) libjt9.a
$(FC) -o jt9sim.exe $(OBJS3) libjt9.a
OBJS4 = jt9code.o
jt9code.exe: $(OBJS4) libjt9.a
$(FC) -o jt9code.exe $(OBJS4) libjt9.a
cp jt9code.exe $(EXE_DIR)
OBJS5 = jt65.o
jt65.exe: $(OBJS5) libjt9.a
$(FC) -o jt65.exe $(OBJS5) libjt9.a ../libfftw3f_win.a
OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \
coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \
dcoord.o
libastro.a: $(OBJS7)
ar cr libastro.a $(OBJS7)
ranlib libastro.a
OBJS6 = jt65code.o
jt65code.exe: $(OBJS6) libjt9.a
$(FC) -o jt65code.exe $(OBJS6) libjt9.a
cp jt65code.exe $(EXE_DIR)
sync9.o: sync9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c sync9.f90
spec9.o: spec9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c spec9.f90
peakdt9.o: peakdt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c peakdt9.f90
jt9sim.o: jt9sim.f90 jt9sync.f90
$(FC) $(FFLAGS) -c jt9sim.f90
genjt9.o: genjt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c genjt9.f90
redsync.o: redsync.f90 jt9sync.f90
$(FC) $(FFLAGS) -c redsync.f90
unpackmsg.o: unpackmsg.f90
$(FC) -c -O0 -fbounds-check -Wall -Wno-precision-loss unpackmsg.f90
ipcomm.o: ipcomm.cpp
$(CXX) -c $(INCPATH) ipcomm.cpp
sec_midn.o: sec_midn.f90
$(FC) -c -fno-second-underscore sec_midn.f90
#rig_control.o: rig_control.c
# $(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include rig_control.c
tstrig.o: tstrig.c
$(CC) -c -Wall -I..\..\..\hamlib-1.2.15.3\include tstrig.c
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
rm -f *.o libjt9.a wsjtx.exe jt9sim.exe jt9.exe jt65.exe

View File

@ -1,115 +0,0 @@
# Set paths
EXE_DIR = ../../wsjtx_install
QT_DIR = /usr/include/qt5
INCPATH = -I${QT_DIR} -I${QT_DIR}/QtCore
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
MKDIR = mkdir -p
CP = cp
RANLIB = ranlib
RM = rm -f
FFLAGS = -O3 -funroll-loops -Wall -Wno-conversion -fno-second-underscore -DUNIX
CFLAGS = -I. -fbounds-check -fPIE
# 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: libjt9.a jt9sim jt9 jt9code jt65code
OBJS1 = astrosub.o astro0.o astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \
fmtmsg.o geocentric.o moon2.o toxyz.o dot.o dcoord.o \
prog_args.o options.o pctile.o graycode.o sort.o chkmsg.o \
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
nchar.o four2a.o grid2deg.o pfxdump.o wisdom.o \
symspec.o analytic.o db.o genjt9.o jt9fano.o \
packbits.o unpackbits.o encode232.o interleave9.o \
entail.o fano232.o gran.o sync9.o decjt9.o \
fil3.o decoder.o grid2n.o n2grid.o timer.o \
softsym.o peakdt9.o getlags.o afc9.o fchisq.o \
twkfreq.o downsam9.o symspec2.o ipcomm.o sleep_msec.o \
stdmsg.o sec_midn.o usleep.o azdist.o geodist.o morse.o \
fillcom.o chkss2.o zplot9.o flat1.o flat2.o \
jt65a.o symspec65.o flat65.o ccf65.o decode65a.o \
filbig.o fil6521.o afc65b.o decode65b.o setup65.o \
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
move.o indexx.o graycode65.o twkfreq65.o smo.o smo121.o \
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
flat4.o polfit.o determ.o baddata.o
libjt9.a: $(OBJS1)
$(AR) libjt9.a $(OBJS1)
$(RANLIB) libjt9.a
OBJS2 = jt9.o jt9a.o jt9b.o jt9c.o
jt9: $(OBJS2) libjt9.a
$(CXX) -o jt9 $(OBJS2) -L. -ljt9 -lQt5Core -lfftw3f_threads -lfftw3f `$(FC) -print-file-name=libgfortran.so`
$(MKDIR) -p $(EXE_DIR)
$(CP) jt9 $(EXE_DIR)
OBJS3 = jt9sim.o
jt9sim: $(OBJS3) libjt9.a
$(FC) -o jt9sim $(OBJS3) -L. -ljt9
OBJS4 = jt9code.o
jt9code: $(OBJS4) libjt9.a
$(FC) -o jt9code $(OBJS4) -L. -ljt9
$(CP) jt9code $(EXE_DIR)
OBJS6 = jt65code.o
jt65code: $(OBJS6) libjt9.a
$(FC) -o jt65code $(OBJS6) libjt9.a
$(CP) jt65code $(EXE_DIR)
sync9.o: sync9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c sync9.f90
peakdf9.o: peakdf9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c peakdf9.f90
peakdt9.o: peakdt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c peakdt9.f90
jt9sim.o: jt9sim.f90 jt9sync.f90
$(FC) $(FFLAGS) -c jt9sim.f90
genjt9.o: genjt9.f90 jt9sync.f90
$(FC) $(FFLAGS) -c genjt9.f90
redsync.o: redsync.f90 jt9sync.f90
$(FC) $(FFLAGS) -c redsync.f90
ipcomm.o: ipcomm.cpp
$(CXX) -c $(INCPATH) -fPIE ipcomm.cpp
sec_midn.o: sec_midn.f90
$(FC) -c -fno-second-underscore sec_midn.f90
init_rs.o: init_rs.c
$(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c
encode_rs.o: encode_rs.c
$(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c
decode_rs.o: decode_rs.c
$(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c
.PHONY : clean
clean:
$(RM) *.o libjt9.a wsjtx jt9sim jt9 jt9code

View File

@ -1,71 +0,0 @@
# Set paths
EXE_DIR = ..\\..\\wsjtx_install
QT_DIR = C:/wsjt-env/Qt5/5.2.1/mingw48_32
FFTW3_DIR = ..
INCPATH = -I${QT_DIR}/include/QtCore -I${QT_DIR}/include
# Compilers
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
RANLIB = ranlib
MKDIR = mkdir -p
CP = cp
RM = rm -f
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: jt9code JTMSKcode
all: jtmsk JTMSKcode
OBJS4 = jt9code.o packjt.o fmtmsg.o gen9.o deg2grid.o grid2deg.o \
entail.o encode232.o interleave9.o graycode.o igray.o
jt9code: $(OBJS4)
$(FC) -o jt9code $(OBJS4)
OBJS5 = JTMSKcode.o packjt.o fmtmsg.o genmsk.o deg2grid.o grid2deg.o \
entail.o nhash.o tab.o vit213.o
JTMSKcode: $(OBJS5)
$(FC) -o JTMSKcode $(OBJS5)
OBJS6 = jtmsk.o jtmsk.o analytic.o four2a.o db.o mskdf.o pctile.o \
sort.o tweak1.o syncmsk.o genmsk.o packjt.o fmtmsg.o indexx.o \
deg2grid.o grid2deg.o entail.o nhash.o tab.o vit213.o
jtmsk: $(OBJS6)
$(FC) -o jtmsk $(OBJS6) -lfftw3f
OBJS1 = t1.o four2a.o db.o
t1: $(OBJS1)
$(FC) -o t1 $(OBJS1) -lfftw3f
OBJS2 = t2.o four2a.o db.o
t2: $(OBJS2)
$(FC) -o t2 $(OBJS2) -lfftw3f
OBJS6 = t6.o four2a.o db.o
t6: $(OBJS6)
$(FC) -o t6 $(OBJS6) -lfftw3f
nhash.o: wsprd/nhash.h wsprd/nhash.c
$(CC) -c -O2 wsprd/nhash.c
.PHONY : clean
clean:
$(RM) *.o JTMSKcode JTMSKcode.exe

View File

@ -1,75 +0,0 @@
# Set paths
EXE_DIR = ..\\..\\wsjtx_install
QT_DIR = C:/wsjt-env/Qt5/5.2.1/mingw48_32
FFTW3_DIR = ..
INCPATH = -I${QT_DIR}/include/QtCore -I${QT_DIR}/include
# Compilers
CC = gcc
CXX = g++
FC = gfortran
AR = ar cr
RANLIB = ranlib
MKDIR = mkdir -p
CP = cp
RM = rm -f
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: jt9code JTMSKcode.exe
all: jtmsk.exe JTMSKsim.exe JTMSKcode.exe fixwav.exe
OBJS3 = JTMSKsim.o wavhdr.o gran.o four2a.o db.o
JTMSKsim.exe: $(OBJS3)
$(FC) -o JTMSKsim.exe $(OBJS3) C:\JTSDK\fftw3f\libfftw3f-3.dll
OBJS4 = jt9code.o packjt.o fmtmsg.o gen9.o deg2grid.o grid2deg.o \
entail.o encode232.o interleave9.o graycode.o igray.o
jt9code: $(OBJS4)
$(FC) -o jt9code $(OBJS4)
OBJS5 = JTMSKcode.o packjt.o fmtmsg.o genmsk.o deg2grid.o grid2deg.o \
entail.o tab.o vit213.o hashing.o nhash.o
JTMSKcode.exe: $(OBJS5)
$(FC) -o JTMSKcode.exe $(OBJS5)
OBJS6 = jtmsk.o analytic.o four2a.o db.o pctile.o \
shell.o tweak1.o syncmsk.o genmsk.o packjt.o fmtmsg.o indexx.o \
deg2grid.o grid2deg.o entail.o hashing.o nhash.o tab.o vit213.o \
mskdt.o rectify_msk.o timer.o jtmsk_decode.o genmsk_short.o \
jtmsk_short.o golay24_table.o hash.o
jtmsk.exe: $(OBJS6)
$(FC) -o jtmsk.exe $(OBJS6) C:\JTSDK\fftw3f\libfftw3f-3.dll
OBJS1 = fixwav.o wavhdr.o
fixwav.exe: $(OBJS1)
$(FC) -o fixwav.exe $(OBJS1)
OBJS2 = t2.o four2a.o db.o
t2: $(OBJS2)
$(FC) -o t2 $(OBJS2) C:\JTSDK\fftw3f\libfftw3f-3.dll
OBJS6 = t6.o four2a.o db.o
t6: $(OBJS6)
$(FC) -o t6 $(OBJS6) C:\JTSDK\fftw3f\libfftw3f-3.dll
.PHONY : clean
clean:
$(RM) *.o JTMSKcode JTMSKcode.exe

View File

@ -1,78 +0,0 @@
program allsim
! Generate simulated data for WSJT-X slow modes: JT4, JT9, JT65, QRA64,
! and WSPR. Also unmodulated carrier and 20 WPM CW.
use wavhdr
use packjt
parameter (NMAX=60*12000)
type(hdr) h
integer*2 iwave(NMAX) !Generated waveform (no noise)
integer itone(206) !Channel symbols (values 0-8)
integer icw(250)
integer*1 msgbits(87)
logical*1 bcontest
real*4 dat(NMAX)
character message*22,msgsent*22,arg*8,mygrid*6
nargs=iargc()
if(nargs.ne.1) then
print*,'Usage: allsim <snr>'
go to 999
endif
call getarg(1,arg)
read(arg,*) snrdb !S/N in dB (2500 hz reference BW)
message='CQ KA2ABC FN20'
mygrid='FN20 '
bcontest=.false.
rmsdb=25.
rms=10.0**(0.05*rmsdb)
sig=10.0**(0.05*snrdb)
npts=NMAX
call init_random_seed() !Seed Fortran RANDOM_NUMBER generator
call sgran() !Seed C rand generator (used in gran)
h=default_header(12000,npts)
open(10,file='000000_0000.wav',access='stream',status='unknown')
do i=1,npts !Generate gaussian noise
dat(i)=gran()
enddo
itone=0
call addit(itone,12000,85,6912,400,sig,dat) !Unmodulated carrier
call morse('CQ CQ DE KA2ABC KA2ABC',icw,ncw)
! print*,ncw
! write(*,3001) icw(1:ncw)
!3001 format(50i1)
call addcw(icw,ncw,600,sig,dat) !CW
call genwspr(message,msgsent,itone)
call addit(itone,12000,86,8192,800,sig,dat) !WSPR (only 59 s of data)
call gen9(message,0,msgsent,itone,itype)
call addit(itone,12000,85,6912,1000,sig,dat) !JT9
call gen4(message,0,msgsent,itone,itype)
call addit(itone,11025,206,2520,1200,sig,dat) !JT4
i3bit=0 ! ### TEMPORARY ??? ###
call genft8(message,mygrid,bcontest,i3bit,msgsent,msgbits,itone)
call addit(itone,12000,79,1920,1400,sig,dat) !FT8
call genqra64(message,0,msgsent,itone,itype)
call addit(itone,12000,84,6912,1600,sig,dat) !QRA64
call gen65(message,0,msgsent,itone,itype)
call addit(itone,11025,126,4096,1800,sig,dat) !JT65
iwave(1:npts)=nint(rms*dat(1:npts))
write(10) h,iwave(1:npts)
close(10)
999 end program allsim

View File

@ -1,124 +0,0 @@
Brief Description of chkfft, by K1JT
------------------------------------
Discrete Fourier transforms (DFTs) are found at the root of most
digital signal processing tasks. In WSJT and its sister programs the
transforms are done using the FFTW library, and subroutine four2
provides a convenient interface to the library. Program chkfft is a
command-line utility offering a convenient way to test FFT execution
times under a variety of circumstances.
To compile chkfft in Linux:
$ gfortran -o chkfft chkfft.f90 four2a.f90 f77_wisdom.f90 gran.c -lfftw3f
To compile chkfft in Windows (you may need to customize the hard-coded
path shown here for libfftw3f-3.dll):
> gfortran -o chkfft chkfft.f90 four2a.f90 f77_wisdom.f90 gran.c \
/JTSDK-QT/appsupport/runtime/libfftw3f-3.dll
To see a brief usage message, type chkfft at the command prompt:
$ chkfft
Usage: chkfft <nfft | infile> nr nw nc np
nfft: length of FFT
nfft=0: do lengths 2^n, n=2^4 to 2^23
infile: name of file with nfft values, one per line
nr: 0/1 to not read (or read) wisdom
nw: 0/1 to not write (or write) wisdom
nc: 0/1 for real or complex data
np: 0-4 patience for finding best algorithm
As an example, to measure the speed of a complex DFT of length 131072:
#######################################################################
$ chkfft 131072 0 1 1 2
nfft: 131072 nr: 0 nw 1 nc: 1 np: 2
NFFT Time rms MHz MFlops iters tplan
-------------------------------------------------------------
131072 0.0021948 0.00000032 59.72 5076.1 231 2.9
#######################################################################
Program output shows that on the test machine the average time for one
forward (or inverse) transform of length N=131072 is about 2.2 ms,
corresponding to slightly over 5 GFlops computing speed. The planning
time in FFTW was 2.9 s.
Running the command again with parameter nr=1 will use the
"wisdom" already accumulated for complex N=131072 FFTs. The execution
speed will be essentially the same, but no planning time is required:
#######################################################################
$ chkfft 131072 1 1 1 2
nfft: 131072 nr: 1 nw 1 nc: 1 np: 2
NFFT Time rms MHz MFlops iters tplan
-------------------------------------------------------------
131072 0.0021575 0.00000032 60.75 5164.0 235 0.0
#######################################################################
Optimized algorithms can compute DFTs much faster for lengths that are
the product of small integers. Length N=131072 = 2^17 is a good
example, and FFTs should be very efficient. For comparison, look at
the speed for N=131071, a prime number. The average time is now about
7 times larger:
#######################################################################
C:\JTSDK-QT\src\wsjtx\lib>chkfft 131071 1 1 1 2
nfft: 131071 nr: 1 nw 1 nc: 1 np: 2
NFFT Time rms MHz MFlops iters tplan
-------------------------------------------------------------
131071 0.0153637 0.00000065 8.53 725.2 33 5.6
#######################################################################
Here's an example that measures execution times for all integral
power-of-2 lengths from 2^4 to 2^23:
#######################################################################
$ chkfft 0 1 1 1 2
nfft: 0 nr: 1 nw 1 nc: 1 np: 2
n N=2^n Time rms MHz MFlops iters tplan
---------------------------------------------------------------
4 16 0.0000003 0.00000014 58.61 1172.2 1000000 0.0
5 32 0.0000004 0.00000016 89.19 2229.6 1000000 0.0
6 64 0.0000006 0.00000016 109.44 3283.2 866975 0.0
7 128 0.0000009 0.00000021 135.92 4757.1 538369 0.0
8 256 0.0000016 0.00000020 158.40 6335.8 313701 0.0
9 512 0.0000032 0.00000021 162.53 7313.8 160943 0.1
10 1024 0.0000067 0.00000023 152.53 7626.5 75521 0.1
11 2048 0.0000136 0.00000025 150.42 8273.3 37239 0.2
12 4096 0.0000316 0.00000027 129.75 7784.8 16060 0.3
13 8192 0.0000720 0.00000026 113.75 7393.8 7040 0.5
14 16384 0.0001620 0.00000028 101.11 7078.0 3129 0.9
15 32768 0.0003227 0.00000030 101.53 7615.1 1571 1.7
16 65536 0.0010020 0.00000030 65.41 5232.5 506 4.1
17 131072 0.0021575 0.00000032 60.75 5164.0 235 0.0
18 262144 0.0053937 0.00000032 48.60 4374.2 94 3.6
19 524288 0.0190668 0.00000034 27.50 2612.2 27 6.8
20 1048576 0.0468001 0.00000035 22.41 2240.5 11 2.4
21 2097152 0.0936012 0.00000036 22.41 2352.5 6 31.6
22 4194304 0.1949997 0.00000037 21.51 2366.0 3 9.8
23 8388608 0.4212036 0.00000038 19.92 2290.3 2 112.9
#######################################################################
Test data for all transforms is gaussian random noise of zero mean and
standard deviation 1. Tabulated values of "rms" are the
root-mean-square differences between the original data and the
back-transfmred data.
File nfft.dat contains all numbers between 2^3 and 2^23 with no factor
greater than 7, followed by their factors. These numbers are good
choices for FFT lengths. File all_fft.out gives the result on one
machine of running the command
$ chkfft nfft.dat 0 1 1 2
Take note: this task may take as much as 24 hours, or even more!

View File

@ -3,43 +3,42 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
!$ use omp_lib
use prog_args
use timer_module, only: timer
use jt4_decode
use jt65_decode
use jt9_decode
use ft8_decode
use js8b_decode
use js8c_decode
use js8d_decode
include 'jt9com.f90'
include 'timer_common.inc'
type, extends(jt4_decoder) :: counting_jt4_decoder
integer :: decoded
end type counting_jt4_decoder
type, extends(jt65_decoder) :: counting_jt65_decoder
integer :: decoded
end type counting_jt65_decoder
type, extends(jt9_decoder) :: counting_jt9_decoder
integer :: decoded
end type counting_jt9_decoder
type, extends(ft8_decoder) :: counting_ft8_decoder
integer :: decoded
end type counting_ft8_decoder
type, extends(js8b_decoder) :: counting_js8b_decoder
integer :: decoded
end type counting_js8b_decoder
type, extends(js8c_decoder) :: counting_js8c_decoder
integer :: decoded
end type counting_js8c_decoder
type, extends(js8d_decoder) :: counting_js8d_decoder
integer :: decoded
end type counting_js8d_decoder
real ss(184,NSMAX)
logical baddata,newdat65,newdat9,single_decode,bVHF,bad0,newdat,ex
logical baddata,newdat65,newdat9,single_decode,bVHF,bad0,newdat
integer*2 id2(NTMAX*12000)
type(params_block) :: params
real*4 dd(NTMAX*12000)
character(len=20) :: datetime
character(len=12) :: mycall, hiscall
character(len=6) :: mygrid, hisgrid
save
type(counting_jt4_decoder) :: my_jt4
type(counting_jt65_decoder) :: my_jt65
type(counting_jt9_decoder) :: my_jt9
type(counting_ft8_decoder) :: my_ft8
type(counting_ft8_decoder) :: my_js8a
type(counting_js8b_decoder) :: my_js8b
type(counting_js8c_decoder) :: my_js8c
type(counting_js8d_decoder) :: my_js8d
!cast C character arrays to Fortran character strings
datetime=transfer(params%datetime, datetime)
@ -49,10 +48,10 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
hisgrid=transfer(params%hisgrid,hisgrid)
! initialize decode counts
my_jt4%decoded = 0
my_jt65%decoded = 0
my_jt9%decoded = 0
my_ft8%decoded = 0
my_js8a%decoded = 0
my_js8b%decoded = 0
my_js8c%decoded = 0
my_js8d%decoded = 0
single_decode=iand(params%nexp_decode,32).ne.0
bVHF=iand(params%nexp_decode,64).ne.0
@ -79,20 +78,55 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
endif
endif
if(params%nmode.eq.8) then
! We're in FT8 mode
call timer('decft8 ',0)
if(params%nmode.eq.8 .and. params%nsubmode.eq.3) then
! We're in JS8 mode C
call timer('decjs8d ',0)
newdat=params%newdat
call my_ft8%decode(ft8_decoded,id2,params%nQSOProgress,params%nfqso, &
call my_js8d%decode(js8d_decoded,id2,params%nQSOProgress,params%nfqso, &
params%nftx,newdat,params%nutc,params%nfa,params%nfb, &
params%nexp_decode,params%ndepth,logical(params%nagain), &
logical(params%lft8apon),logical(params%lapcqonly),params%napwid, &
mycall,mygrid,hiscall,hisgrid)
call timer('decft8 ',1)
if(nfox.gt.0) then
n30min=minval(n30fox(1:nfox))
n30max=maxval(n30fox(1:nfox))
endif
call timer('decjs8d ',1)
go to 800
endif
if(params%nmode.eq.8 .and. params%nsubmode.eq.2) then
! We're in JS8 mode C
call timer('decjs8c ',0)
newdat=params%newdat
call my_js8c%decode(js8c_decoded,id2,params%nQSOProgress,params%nfqso, &
params%nftx,newdat,params%nutc,params%nfa,params%nfb, &
params%nexp_decode,params%ndepth,logical(params%nagain), &
logical(params%lft8apon),logical(params%lapcqonly),params%napwid, &
mycall,mygrid,hiscall,hisgrid)
call timer('decjs8c ',1)
go to 800
endif
if(params%nmode.eq.8 .and. params%nsubmode.eq.1) then
! We're in JS8 mode B
call timer('decjs8b ',0)
newdat=params%newdat
call my_js8b%decode(js8b_decoded,id2,params%nQSOProgress,params%nfqso, &
params%nftx,newdat,params%nutc,params%nfa,params%nfb, &
params%nexp_decode,params%ndepth,logical(params%nagain), &
logical(params%lft8apon),logical(params%lapcqonly),params%napwid, &
mycall,mygrid,hiscall,hisgrid)
call timer('decjs8b ',1)
go to 800
endif
if(params%nmode.eq.8) then
! We're in JS8 mode A
call timer('decjs8a ',0)
newdat=params%newdat
call my_js8a%decode(js8a_decoded,id2,params%nQSOProgress,params%nfqso, &
params%nftx,newdat,params%nutc,params%nfa,params%nfb, &
params%nexp_decode,params%ndepth,logical(params%nagain), &
logical(params%lft8apon),logical(params%lapcqonly),params%napwid, &
mycall,mygrid,hiscall,hisgrid)
call timer('decjs8a ',1)
go to 800
endif
@ -122,27 +156,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
! id2(1:nz)=0 ! temporarily disabled as it can breaak the JT9 decoder, maybe others
endif
if(params%nmode.eq.4 .or. params%nmode.eq.65) open(14,file=trim(temp_dir)// &
'/avemsg.txt',status='unknown')
if(params%nmode.eq.164) open(17,file=trim(temp_dir)//'/red.dat', &
status='unknown')
if(params%nmode.eq.4) then
jz=52*nfsample
if(params%newdat) then
if(nfsample.eq.12000) call wav11(id2,jz,dd)
if(nfsample.eq.11025) dd(1:jz)=id2(1:jz)
endif
call my_jt4%decode(jt4_decoded,dd,jz,params%nutc,params%nfqso, &
params%ntol,params%emedelay,params%dttol,logical(params%nagain), &
params%ndepth,logical(params%nclearave),params%minsync, &
params%minw,params%nsubmode,mycall,hiscall, &
hisgrid,params%nlist,params%listutc,jt4_average)
go to 800
endif
npts65=52*12000
if(params%nmode.eq.164) npts65=54*12000
if(baddata(id2,npts65)) then
nsynced=0
ndecoded=0
@ -154,268 +168,25 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
newdat9=params%newdat
!$call omp_set_dynamic(.true.)
!$omp parallel sections num_threads(2) copyin(/timer_private/) shared(ndecoded) if(.true.) !iif() needed on Mac
!$omp section
if(params%nmode.eq.65 .or. params%nmode.eq.164 .or. &
(params%nmode.eq.(65+9) .and. params%ntxmode.eq.65)) then
! We're in JT65 or QRA64 mode, or should do JT65 first
if(newdat65) dd(1:npts65)=id2(1:npts65)
nf1=params%nfa
nf2=params%nfb
call timer('jt65a ',0)
call my_jt65%decode(jt65_decoded,dd,npts65,newdat65,params%nutc, &
nf1,nf2,params%nfqso,ntol65,params%nsubmode,params%minsync, &
logical(params%nagain),params%n2pass,logical(params%nrobust), &
ntrials,params%naggressive,params%ndepth,params%emedelay, &
logical(params%nclearave),mycall,hiscall, &
hisgrid,params%nexp_decode,params%nQSOProgress, &
logical(params%ljt65apon))
call timer('jt65a ',1)
else if(params%nmode.eq.9 .or. (params%nmode.eq.(65+9) .and. params%ntxmode.eq.9)) then
! We're in JT9 mode, or should do JT9 first
call timer('decjt9 ',0)
call my_jt9%decode(jt9_decoded,ss,id2,params%nfqso, &
newdat9,params%npts8,params%nfa,params%nfsplit,params%nfb, &
params%ntol,params%nzhsym,logical(params%nagain),params%ndepth, &
params%nmode,params%nsubmode,params%nexp_decode)
call timer('decjt9 ',1)
endif
!$omp section
if(params%nmode.eq.(65+9)) then !Do the other mode (we're in dual mode)
if (params%ntxmode.eq.9) then
if(newdat65) dd(1:npts65)=id2(1:npts65)
nf1=params%nfa
nf2=params%nfb
call timer('jt65a ',0)
call my_jt65%decode(jt65_decoded,dd,npts65,newdat65,params%nutc, &
nf1,nf2,params%nfqso,ntol65,params%nsubmode,params%minsync, &
logical(params%nagain),params%n2pass,logical(params%nrobust), &
ntrials,params%naggressive,params%ndepth,params%emedelay, &
logical(params%nclearave),mycall,hiscall, &
hisgrid,params%nexp_decode,params%nQSOProgress, &
logical(params%ljt65apon))
call timer('jt65a ',1)
else
call timer('decjt9 ',0)
call my_jt9%decode(jt9_decoded,ss,id2,params%nfqso, &
newdat9,params%npts8,params%nfa,params%nfsplit,params%nfb, &
params%ntol,params%nzhsym,logical(params%nagain), &
params%ndepth,params%nmode,params%nsubmode,params%nexp_decode)
call timer('decjt9 ',1)
end if
endif
!$omp end parallel sections
! JT65 is not yet producing info for nsynced, ndecoded.
800 ndecoded = my_jt4%decoded + my_jt65%decoded + my_jt9%decoded + my_ft8%decoded
800 ndecoded = my_js8a%decoded + my_js8b%decoded + my_js8c%decoded
write(*,1010) nsynced,ndecoded
1010 format('<DecodeFinished>',2i4)
call flush(6)
if(params%nmode.eq.4 .or. params%nmode.eq.65) close(14)
return
contains
subroutine jt4_decoded(this,snr,dt,freq,have_sync,sync,is_deep, &
decoded0,qual,ich,is_average,ave)
implicit none
class(jt4_decoder), intent(inout) :: this
integer, intent(in) :: snr
real, intent(in) :: dt
integer, intent(in) :: freq
logical, intent(in) :: have_sync
logical, intent(in) :: is_deep
character(len=1), intent(in) :: sync
character(len=22), intent(in) :: decoded0
real, intent(in) :: qual
integer, intent(in) :: ich
logical, intent(in) :: is_average
integer, intent(in) :: ave
character*22 decoded
character*3 cflags
if(ich.eq.-99) stop !Silence compiler warning
if (have_sync) then
decoded=decoded0
cflags=' '
if(decoded.ne.' ') cflags='f '
if(is_deep) then
cflags(1:2)='d1'
write(cflags(3:3),'(i1)') min(int(qual),9)
if(qual.ge.10.0) cflags(3:3)='*'
if(qual.lt.3.0) decoded(22:22)='?'
endif
if(is_average) then
write(cflags(2:2),'(i1)') min(ave,9)
if(ave.ge.10) cflags(2:2)='*'
endif
write(*,1000) params%nutc,snr,dt,freq,sync,decoded,cflags
1000 format(i4.4,i4,f5.1,i5,1x,'$',a1,1x,a22,1x,a3)
else
write(*,1000) params%nutc,snr,dt,freq
end if
select type(this)
type is (counting_jt4_decoder)
this%decoded = this%decoded + 1
end select
end subroutine jt4_decoded
subroutine jt4_average (this, used, utc, sync, dt, freq, flip)
implicit none
class(jt4_decoder), intent(inout) :: this
logical, intent(in) :: used
integer, intent(in) :: utc
real, intent(in) :: sync
real, intent(in) :: dt
integer, intent(in) :: freq
logical, intent(in) :: flip
character(len=1) :: cused, csync
cused = '.'
csync = '*'
if (used) cused = '$'
if (flip) csync = '$'
write(14,1000) cused,utc,sync,dt,freq,csync
1000 format(a1,i5.4,f6.1,f6.2,i6,1x,a1)
end subroutine jt4_average
subroutine jt65_decoded(this,sync,snr,dt,freq,drift,nflip,width, &
decoded0,ft,qual,nsmo,nsum,minsync)
use jt65_decode
subroutine js8_decoded (sync,snr,dt,freq,decoded,nap,qual)
implicit none
class(jt65_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
integer, intent(in) :: freq
integer, intent(in) :: drift
integer, intent(in) :: nflip
real, intent(in) :: width
character(len=22), intent(in) :: decoded0
integer, intent(in) :: ft
integer, intent(in) :: qual
integer, intent(in) :: nsmo
integer, intent(in) :: nsum
integer, intent(in) :: minsync
integer i,nap,nft
logical is_deep,is_average
character decoded*22,csync*2,cflags*3
if(width.eq.-9999.0) stop !Silence compiler warning
!$omp critical(decode_results)
decoded=decoded0
cflags=' '
is_deep=ft.eq.2
if(ft.ge.80) then !QRA64 mode
nft=ft-100
csync=': '
if(sync-3.4.ge.float(minsync) .or. nft.ge.0) csync=':*'
if(nft.lt.0) then
write(*,1009) params%nutc,snr,dt,freq,csync,decoded
else
write(*,1009) params%nutc,snr,dt,freq,csync,decoded,nft
1009 format(i4.4,i4,f5.1,i5,1x,a2,1x,a22,i2)
endif
go to 100
endif
if(ft.eq.0 .and. minsync.ge.0 .and. int(sync).lt.minsync) then
write(*,1010) params%nutc,snr,dt,freq
else
is_average=nsum.ge.2
if(bVHF .and. ft.gt.0) then
cflags='f '
if(is_deep) then
cflags(1:2)='d1'
write(cflags(3:3),'(i1)') min(qual,9)
if(qual.ge.10) cflags(3:3)='*'
if(qual.lt.3) decoded(22:22)='?'
endif
if(is_average) then
write(cflags(2:2),'(i1)') min(nsum,9)
if(nsum.ge.10) cflags(2:2)='*'
endif
nap=ishft(ft,-2)
if(nap.ne.0) then
write(cflags(1:3),'(a1,i1)') 'a',nap
endif
endif
csync='# '
i=0
if(bVHF .and. nflip.ne.0 .and. &
sync.ge.max(0.0,float(minsync))) then
csync='#*'
if(nflip.eq.-1) then
csync='##'
if(decoded.ne.' ') then
do i=22,1,-1
if(decoded(i:i).ne.' ') exit
enddo
if(i.gt.18) i=18
decoded(i+2:i+4)='OOO'
endif
endif
endif
write(*,1010) params%nutc,snr,dt,freq,csync,decoded,cflags
1010 format(i4.4,i4,f5.1,i5,1x,a2,1x,a22,1x,a3)
endif
100 call flush(6)
!$omp end critical(decode_results)
select type(this)
type is (counting_jt65_decoder)
this%decoded = this%decoded + 1
end select
end subroutine jt65_decoded
subroutine jt9_decoded (this, sync, snr, dt, freq, drift, decoded)
use jt9_decode
implicit none
class(jt9_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
integer, intent(in) :: drift
character(len=22), intent(in) :: decoded
!$omp critical(decode_results)
write(*,1000) params%nutc,snr,dt,nint(freq),decoded
1000 format(i4.4,i4,f5.1,i5,1x,'@ ',1x,a22)
call flush(6)
!$omp end critical(decode_results)
select type(this)
type is (counting_jt9_decoder)
this%decoded = this%decoded + 1
end select
end subroutine jt9_decoded
subroutine ft8_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use ft8_decode
implicit none
class(ft8_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
character(len=37), intent(in) :: decoded
character c1*12,c2*12,g2*4,w*4,ctmp*12
integer i0,i1,i2,i3,i4,i5,i6,n30,nwrap
character c1*12,c2*12,g2*4,w*4
integer i0,i1,i2,i3,i4,i5,n30,nwrap
integer, intent(in) :: nap
real, intent(in) :: qual
character*2 annot
@ -488,12 +259,103 @@ contains
call flush(6)
return
end subroutine js8_decoded
subroutine js8a_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use ft8_decode
implicit none
class(ft8_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual)
select type(this)
type is (counting_ft8_decoder)
this%decoded = this%decoded + 1
end select
return
end subroutine ft8_decoded
end subroutine js8a_decoded
subroutine js8b_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use js8b_decode
implicit none
class(js8b_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual)
select type(this)
type is (counting_js8b_decoder)
this%decoded = this%decoded + 1
end select
return
end subroutine js8b_decoded
subroutine js8c_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use js8c_decode
implicit none
class(js8c_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual)
select type(this)
type is (counting_js8c_decoder)
this%decoded = this%decoded + 1
end select
return
end subroutine js8c_decoded
subroutine js8d_decoded (this,sync,snr,dt,freq,decoded,nap,qual)
use js8d_decode
implicit none
class(js8d_decoder), intent(inout) :: this
real, intent(in) :: sync
integer, intent(in) :: snr
real, intent(in) :: dt
real, intent(in) :: freq
character(len=37), intent(in) :: decoded
integer, intent(in) :: nap
real, intent(in) :: qual
save
call js8_decoded(sync, snr, dt, freq, decoded, nap, qual)
select type(this)
type is (counting_js8d_decoder)
this%decoded = this%decoded + 1
end select
return
end subroutine js8d_decoded
end subroutine multimode_decoder

View File

@ -1,23 +0,0 @@
subroutine dxped_fifo(cx,gx,isnrx)
parameter (NCALLS=268)
character*6 xcall(NCALLS)
character*4 xgrid(NCALLS)
integer isnr(NCALLS)
character cx*6,gx*4
common/dxpfifo/nc,isnr,xcall,xgrid
if(nc.lt.NCALLS) then
nc=nc+1
cx=xcall(nc)
gx=xgrid(nc)
isnrx=isnr(nc)
else
cx=' '
gx=' '
isnrx=0
endif
return
end subroutine dxped_fifo

View File

@ -1,97 +0,0 @@
subroutine fast_decode(id2,narg,ntrperiod,line,mycall_12, &
hiscall_12)
parameter (NMAX=30*12000)
integer*2 id2(NMAX)
integer*2 id2a(NMAX)
integer*2 id2b(NMAX)
integer narg(0:14)
real dat(30*12000)
complex cdat(262145),cdat2(262145)
real psavg(450)
logical pick,first
character*6 cfile6
character*80 line(100)
character*12 mycall_12,hiscall_12
character*6 mycall,hiscall
data first/.true./,nutca/0/,nutcb/0/
save npts,cdat,cdat2,id2a,id2b,nutca,nutcb
if(first) then
id2a=0
id2b=0
first=.false.
endif
mycall=mycall_12(1:6)
hiscall=hiscall_12(1:6)
nutc=narg(0)
ndat0=narg(1)
nsubmode=narg(2)
newdat=narg(3)
minsync=narg(4)
npick=narg(5)
t0=0.001*narg(6)
t1=0.001*narg(7)
tmid=0.5*(t0+t1)
maxlines=narg(8)
nmode=narg(9)
nrxfreq=narg(10)
ntol=narg(11)
nhashcalls=narg(12)
line(1:100)(1:1)=char(0)
if(t0.gt.float(ntrperiod)) go to 900
if(t0.gt.t1) go to 900
if(nmode.eq.102) then
call fast9(id2,narg,line)
go to 900
endif
if(newdat.eq.1) then
cdat2=cdat
ndat=ndat0
call wav11(id2,ndat,dat)
nzz=11025*ntrperiod
if(ndat.lt.nzz) dat(ndat+1:nzz)=0.0
ndat=min(ndat,30*11025)
call ana932(dat,ndat,cdat,npts) !Make downsampled analytic signal
endif
! Now cdat() is the downsampled analytic signal.
! New sample rate = fsample = BW = 11025 * (9/32) = 3100.78125 Hz
! NB: npts, nsps, etc., are all reduced by 9/32
write(cfile6,'(i6.6)') nutc
nfreeze=1
mousedf=0
mousebutton=0
mode4=1
if(nsubmode.eq.1) mode4=2
nafc=0
ndebug=0
t2=0.
ia=1
ib=npts
pick=.false.
if(npick.gt.0) then
pick=.true.
dt=1.0/11025.0 * (32.0/9.0)
ia=t0/dt + 1.
ib=t1/dt + 1.
t2=t0
endif
jz=ib-ia+1
line(1:100)(1:1)=char(0)
if(npick.eq.2) then
call iscat(cdat2(ia),jz,3,40,t2,pick,cfile6,minsync,ntol,NFreeze, &
MouseDF,mousebutton,mode4,nafc,ndebug,psavg,nmax,nlines,line)
else
call iscat(cdat(ia),jz,3,40,t2,pick,cfile6,minsync,ntol,NFreeze, &
MouseDF,mousebutton,mode4,nafc,ndebug,psavg,maxlines,nlines,line)
endif
900 return
end subroutine fast_decode

41
lib/fer
View File

@ -1,41 +0,0 @@
#!/bin/bash
# jt65 end-to-end simulator. Run enough cases to get a given
# number of successful decodes or a given number of errors
# For better performance, copy this script and jt65, jt65sim
# executables to a ramdisk and run from there.
mode=C
spread=4.0
for i in `seq 0 21`;
do
nruns=0
ndecodes=0
ngood=0
nbad=0
snr=$((-25+$i))
#while [ $[ $nruns - $ngood ] -lt 200 ]
#while [ $ngood -lt 200 ]
while [ $nruns -lt 1000 ]
do
rm 000000_0001.wav
./jt65sim -m $mode -n 1 -d $spread -s \\$snr > /dev/null
rm decoded.txt
./jt65 -m $mode -a 10 -f 1500 -n 1000 -s 000000_0001.wav > decoded.txt
if [ -e decoded.txt ]; then
nd=$( wc -l < decoded.txt )
ng=$( grep "K1ABC" decoded.txt | wc -l )
nb=$[$nd-$ng]
ndecodes=$[$ndecodes + $nd]
ngood=$[$ngood + $ng]
nbad=$[$nbad + $nb]
fi
nruns=$[$nruns + 1]
nmissed=$[$nruns-$ngood]
pe=$( echo "scale=5; $nmissed/$nruns" | bc -l )
ps=$( echo "scale=5; $ngood/$nruns" | bc -l )
echo -en snr: $snr nruns: $nruns ndecodes: $ndecodes ngood: $ngood nbad: $nbad nmissed: $nmissed wer: $pe success: $ps"\r"
done
echo snr: $snr nruns: $nruns ndecodes: $ndecodes ngood: $ngood nbad: $nbad nmissed: $nmissed wer: $pe success: $ps
done

View File

@ -1,195 +0,0 @@
program fer65
! End-to-end simulator for testing JT65.
! Options
! jt65sim jt65
!----------------------------------------------------------------
! -a aggressive
! -d Doppler spread -d depth
! -f Number of files -f freq
! -m (sub)mode -m (sub)mode
! -n number of generated sigs -n ntrials
! -t Time offset (s) -r robust sync
! -p Do not seed random #s -c mycall
! -x hiscall
! -g hisgrid
! -X hinted-decode flags
! -s S/N in 2500 Hz -s single-decode mode
implicit real*8 (a-h,o-z)
real*8 s(7),sq(7)
character arg*12,cmnd*100,decoded*22,submode*1,csync*1,f1*15,f2*15
character*12 outfile
logical syncok
nargs=iargc()
if(nargs.ne.7) then
print*,'Usage: fer65 submode fspread snr1 snr2 Navg DS iters'
print*,'Example: fer65 C 3.0 -28 -12 8 1 1000'
go to 999
endif
call getarg(1,submode)
call getarg(2,arg)
read(arg,*) d
call getarg(3,arg)
read(arg,*) snr1
call getarg(4,arg)
read(arg,*) snr2
call getarg(5,arg)
read(arg,*) navg
call getarg(6,arg)
read(arg,*) nds
call getarg(7,arg)
read(arg,*) iters
write(outfile,1001) submode,d,navg,nds
1001 format(a1,f6.2,'_',i2.2,'_',i1)
if(outfile(2:2).eq.' ') outfile(2:2)='0'
if(outfile(3:3).eq.' ') outfile(3:3)='0'
ndepth=3
if(navg.gt.1) ndepth=ndepth+16
if(nds.ne.0) ndepth=ndepth+32
dfmax=3
if(submode.eq.'b' .or. submode.eq.'B') dfmax=6
if(submode.eq.'c' .or. submode.eq.'C') dfmax=11
ntrials=1000
naggressive=10
open(20,file=outfile,status='unknown')
open(21,file='fer65.21',status='unknown')
write(20,1000) submode,iters,ntrials,naggressive,d,ndepth,navg,nds
1000 format(/'JT65',a1,' Iters:',i5,' T:',i6,' Aggr:',i3, &
' Dop:',f6.2,' Depth:',i2,' Navg:',i3,' DS:',i2)
write(20,1002)
1002 format(/' dB nsync ngood nbad sync dsnr ', &
'DT Freq Nsum Width'/85('-'))
flush(20)
do isnr=0,20
snr=snr1+isnr
if(snr.gt.snr2) exit
nsync=0
ngood=0
nbad=0
s=0.
sq=0.
do iter=1,iters
write(cmnd,1010) submode,d,snr,navg
1010 format('./jt65sim -n 1 -m ',a1,' -d',f7.2,' -s \\',f5.1,' -f',i3,' >devnull')
call unlink('000000_????.wav')
call system(cmnd)
if(navg.gt.1) then
do i=navg,2,-1
j=2*i-1
write(f1,1011) i
write(f2,1011) j
1011 format('000000_',i4.4,'.wav')
call rename(f1,f2)
enddo
endif
call unlink('decoded.txt')
call unlink('fort.13')
isync=0
nsnr=0
dt=0.
nfreq=0
ndrift=0
nwidth=0
cmnd='./jt65 -m A -a 10 -c K1ABC -f 1500 -n 1000 -d 5 -s 000000_????.wav > decoded.txt'
cmnd(11:11)=submode
write(cmnd(47:48),'(i2)') ndepth
call system(cmnd)
open(13,file='fort.13',status='old',err=20)
do i=1,navg
read(13,1012) nutc,isync,nsnr,dt,nfreq,ndrift,nwidth,decoded, &
nft,nsum,nsmo
1012 format(i4,i4,i5,f6.2,i5,i4,i3,1x,a22,5x,3i3)
if(nft.gt.0) exit
enddo
close(13)
syncok=abs(dt).lt.0.2 .and. float(abs(nfreq-1500)).lt.dfmax
csync=' '
if(syncok) csync='*'
write(21,1014) nutc,isync,nsnr,dt,nfreq,ndrift,nwidth, &
nft,nsum,nsmo,csync,decoded(1:16),nft,nsum,nsmo
1014 format(i4,i4,i5,f6.2,i5,i4,3x,4i3,1x,a1,1x,a16,i2,2i3)
flush(21)
if(syncok) then
nsync=nsync+1
s(1)=s(1) + isync
sq(1)=sq(1) + isync*isync
s(6)=s(6) + nwidth
sq(6)=sq(6) + nwidth*nwidth
if(decoded.eq.'K1ABC W9XYZ EN37 ') then
ngood=ngood+1
s(2)=s(2) + nsnr
s(3)=s(3) + dt
s(4)=s(4) + nfreq
s(5)=s(5) + ndrift
s(7)=s(7) + nsum
sq(2)=sq(2) + nsnr*nsnr
sq(3)=sq(3) + dt*dt
sq(4)=sq(4) + nfreq*nfreq
sq(5)=sq(5) + ndrift*ndrift
sq(7)=sq(7) + nsum*nsum
else if(decoded.ne.' ') then
nbad=nbad+1
print*,'Nbad:',nbad,decoded
endif
endif
20 continue
fsync=float(nsync)/iter
fgood=float(ngood)/iter
fbad=float(nbad)/iter
write(*,1020) nint(snr),iter,isync,nsnr,dt,nfreq,ndrift,nwidth,fsync, &
fgood,fbad,decoded(1:16),nft,nsum,nsmo
1020 format(i3,i5,i3,i4,f6.2,i5,i3,i3,2f6.3,f7.4,1x,a16,i2,2i3)
enddo
if(nsync.ge.1) then
xsync=s(1)/nsync
xwidth=s(6)/nsync
endif
esync=0.
if(nsync.ge.2) then
esync=sqrt(sq(1)/nsync - xsync**2)
ewidth=sqrt(sq(6)/nsync - xwidth**2)
endif
if(ngood.ge.1) then
xsnr=s(2)/ngood
xdt=s(3)/ngood
xfreq=s(4)/ngood
xdrift=s(5)/ngood
xsum=s(7)/ngood
endif
if(ngood.ge.2) then
esnr=sqrt(sq(2)/ngood - xsnr**2)
edt=sqrt(sq(3)/ngood - xdt**2)
efreq=sqrt(sq(4)/ngood - xfreq**2)
edrift=sqrt(sq(5)/ngood - xdrift**2)
esum=sqrt(sq(7)/ngood - xsum**2)
endif
dsnr=xsnr-snr
dfreq=xfreq-1500.0
if(ngood.eq.0) then
dsnr=0.
dfreq=0.
endif
write(20,1100) snr,nsync,ngood,nbad,xsync,esync,dsnr,esnr, &
xdt,edt,dfreq,efreq,xsum,esum,xwidth,ewidth
1100 format(f5.1,2i6,i4,2f6.1,f6.1,f5.1,f6.2,f5.2,6f5.1)
flush(20)
if(ngood.ge.int(0.99*iters)) exit
enddo
999 end program fer65

View File

@ -1,72 +0,0 @@
program fersum
character mode*5
character infile*40
real dop(0:9)
real thresh(0:9,12),threshsync(0:9,12)
data dop/0.25,0.5,1.0,2.0,4.0,8.0,16.0,32.0,64.0,128.0/
nargs=iargc()
if(nargs.ne.1) then
print*,'Usage: fersum <infile>'
go to 999
endif
call getarg(1,infile)
open(10,file=infile,status='old')
thresh=0.
threshsync=0.
do iblk=1,999
1 read(10,1002,end=100) mode,iters,ntot,naggr,d,navg,nds
1002 format(a5,8x,i5,4x,i6,7x,i3,6x,f6.2,17x,i3,5x,i2)
write(33,*) iblk,mode
if(mode.eq.' ') go to 1
read(10,1002)
read(10,1002)
read(10,1002)
nsync0=0
ngood0=0
xsum0=0.
do n=1,99
read(10,1010,end=100) snr,nsync,ngood,nbad,xsync,esync,dsnr,esnr, &
xdt,edt,dfreq,efreq,xsum,esum,xwidth,ewidth
1010 format(f5.1,2i6i4,2f6.1,f6.1,f5.1,f6.2,f5.2,6f5.1)
if(snr.eq.0.0) exit
if(mode(5:5).eq.'A') nmode=1
if(mode(5:5).eq.'B') nmode=2
if(mode(5:5).eq.'C') nmode=3
j=nint(log(d)/log(2.0) + 2.0)
if(navg.eq.1 .and. nds.eq.0) k=nmode
if(navg.eq.1 .and. nds.eq.1) k=nmode+3
if(navg.gt.1 .and. nds.eq.0) k=nmode+6
if(navg.gt.1 .and. nds.eq.1) k=nmode+9
if(nsync0.le.iters/2 .and. nsync.ge.iters/2) then
threshsync(j,k)=snr-float(nsync-iters/2)/(nsync-nsync0)
endif
if(ngood0.le.iters/2 .and. ngood.ge.iters/2) then
threshold=snr-float(ngood-iters/2)/(ngood-ngood0)
xsumavg=max(1.0,0.5*(xsum0+xsum))
! write(*,1020) mode,iters,ntot,naggr,d,navg,nds,threshold,xsumavg
!1020 format(a5,i7,i7,i3,f7.2,i3,i3,f7.1,f6.1)
thresh(j,k)=threshold
endif
nsync0=nsync
ngood0=ngood
xsum0=xsum
enddo
enddo
100 write(12,1100)
1100 format(' ')
do i=0,9
write(12,1110) dop(i),thresh(i,1:12)
1110 format(f6.2,13f6.1)
enddo
write(12,1110)
do i=0,9
write(12,1110) dop(i),threshsync(i,1:12)
enddo
999 end program fersum

View File

@ -1,32 +0,0 @@
subroutine fix_contest_msg(mygrid,msg)
! If distance from mygrid to grid1 is more thsn 10000 km, change "grid1"
! to "R grid2" where grid2 is the antipodes of grid1.
character*6 mygrid
character*22 msg
character*6 g1,g2
logical isgrid
isgrid(g1)=g1(1:1).ge.'A' .and. g1(1:1).le.'R' .and. g1(2:2).ge.'A' .and. &
g1(2:2).le.'R' .and. g1(3:3).ge.'0' .and. g1(3:3).le.'9' .and. &
g1(4:4).ge.'0' .and. g1(4:4).le.'9' .and. g1(1:4).ne.'RR73'
n=len(trim(msg))
if(n.lt.4) return
g1=msg(n-3:n)//' '
if(isgrid(g1)) then
call azdist(mygrid,g1,0.d0,nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter)
if(ndkm.gt.10000) then
call grid2deg(g1,dlong,dlat)
dlong=dlong+180.0
if(dlong.gt.180.0) dlong=dlong-360.0
dlat=-dlat
call deg2grid(dlong,dlat,g2)
msg=msg(1:n-4)//'R '//g2(1:4)
endif
endif
return
end subroutine fix_contest_msg

View File

@ -81,7 +81,6 @@ program ft8code
call extractmessage174(decoded,message,ncrcflag)
decoded=decoded0
if(bcontest) call fix_contest_msg(mygrid6,message)
bad=" "
comment=' '
if(itype.ne.6 .and. message.ne.msgchk) bad="*"

View File

@ -121,12 +121,6 @@ contains
hd=nharderrors+dmin
call timer('ft8b ',1)
if(nbadcrc.eq.0) then
! call jtmsg(message,iflag)
if(bcontest) then
call fix_contest_msg(mygrid6,message)
msg37(1:22)=message
endif
! if(iand(iflag,31).ne.0) message(22:22)='?'
ldupe=.false.
do id=1,ndecodes
if(message.eq.allmessages(id).and.nsnr.le.allsnrs(id)) ldupe=.true.
@ -136,11 +130,6 @@ contains
allmessages(ndecodes)=message
allsnrs(ndecodes)=nsnr
endif
! write(81,1004) nutc,ncand,icand,ipass,iaptype,iappass, &
! nharderrors,dmin,hd,min(sync,999.0),nint(xsnr), &
! xdt,nint(f1),message
!1004 format(i6.6,2i4,3i2,i3,3f6.1,i4,f6.2,i5,2x,a22)
! flush(81)
if(.not.ldupe .and. associated(this%callback)) then
qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)

View File

@ -1,53 +0,0 @@
# Makefile for Windows in JTSDK-PY environment
# Re-direct stdout and stderr: cmd.exe bash
# make > junk 2>&1 make &> junk
CC = gcc
FC = gfortran
FFLAGS = -O2 -DWIN32 -fbounds-check -fno-second-underscore -Wall \
-Wno-conversion -Wno-character-truncation
CFLAGS = -I. -DWIN32 -DWin32 -DBIGSYM -DHAVE_STRUCT_TIMESPEC
# 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: libftrsd.a
OBJS1 = extract2.o ftrsd2.o init_rs_int.o encode_rs_int.o decode_rs_int.o
libftrsd.a: $(OBJS1)
ar cr libftrsd.a $(OBJS1)
ranlib libftrsd.a
cp libftrsd.a ..
# Build rsdtest
OBJS2 = rsdtest.o
rsdtest: $(OBJS2) ../libjt.a
$(FC) -o rsdtest $(OBJS2) libftrsd.a ../libjt.a ../libpthreadGC2.a
ftrsd: ftrsd.o encode_rs_int.o decode_rs_int.o init_rs_int.o
gcc -g -o $@ $^
encode_rs_int.o: encode_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
decode_rs_int.o: decode_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
init_rs_int.o: init_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
.PHONY : clean
clean:
rm -rf *.o libjt.a rsdtest ftrsd

View File

@ -1,30 +0,0 @@
srcdir = .
prefix = /usr/local
exec_prefix=${prefix}
CC=gcc
CFLAGS=-I/usr/local/include -Wall -O2
all: encode_rs_int.o decode_rs_int.o init_rs_int.o sfrsd2.o sfrsd.o sfrsd
encode_rs_int.o: encode_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
decode_rs_int.o: decode_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
init_rs_int.o: init_rs.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
sfrsd2.o: sfrsd2.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
sfrsd.o: sfrsd.c
gcc -DBIGSYM=1 $(CFLAGS) -c -o $@ $^
sfrsd: sfrsd.o encode_rs_int.o decode_rs_int.o init_rs_int.o sfrsd2.o
gcc -g -o $@ $^
clean:
rm -f *.o *.a sfrsd

View File

@ -1,38 +0,0 @@
# Makefile for Windows in JTSDK-PY environment
# Re-direct stdout and stderr: cmd.exe bash
# make > junk 2>&1 make &> junk
CC = gcc
FC = gfortran
FFLAGS = -O2 -DWIN32 -fbounds-check -fno-second-underscore -Wall \
-Wno-conversion -Wno-character-truncation
CFLAGS = -I. -DWIN32 -DWin32 -DBIGSYM -DHAVE_STRUCT_TIMESPEC
# 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: rsdtest
# Build rsdtest
OBJS2 = rsdtest.o extract2.o demod64b.o sfrsd3.o
rsdtest: $(OBJS2) ../libjt.a
$(FC) -o rsdtest $(OBJS2) ../libjt.a ../libpthreadGC2.a
sfrsd: sfrsd.o encode_rs_int.o decode_rs_int.o init_rs_int.o
gcc -g -o $@ $^
.PHONY : clean
clean:
rm -rf *.o libjt.a rsdtest sfrsd

View File

@ -1,268 +0,0 @@
/* Reed-Solomon decoder
* Copyright 2002 Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
* Modified by Steve Franke, K9AN, for use in a soft-symbol RS decoder
*/
#ifdef DEBUG
#include <stdio.h>
#endif
#include <stdlib.h>
#include <string.h>
#define min(a,b) ((a) < (b) ? (a) : (b))
#ifdef FIXED
#include "fixed.h"
#elif defined(BIGSYM)
#include "int.h"
#else
#include "char.h"
#endif
int DECODE_RS(
#ifndef FIXED
void *p,
#endif
DTYPE *data, int *eras_pos, int no_eras, int calc_syn){
#ifndef FIXED
struct rs *rs = (struct rs *)p;
#endif
int deg_lambda, el, deg_omega;
int i, j, r,k;
DTYPE u,q,tmp,num1,num2,den,discr_r;
DTYPE lambda[NROOTS+1]; // Err+Eras Locator poly
static DTYPE s[51]; // and syndrome poly
DTYPE b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1];
DTYPE root[NROOTS], reg[NROOTS+1], loc[NROOTS];
int syn_error, count;
if( calc_syn ) {
/* form the syndromes; i.e., evaluate data(x) at roots of g(x) */
for(i=0;i<NROOTS;i++)
s[i] = data[0];
for(j=1;j<NN;j++){
for(i=0;i<NROOTS;i++){
if(s[i] == 0){
s[i] = data[j];
} else {
s[i] = data[j] ^ ALPHA_TO[MODNN(INDEX_OF[s[i]] + (FCR+i)*PRIM)];
}
}
}
/* Convert syndromes to index form, checking for nonzero condition */
syn_error = 0;
for(i=0;i<NROOTS;i++){
syn_error |= s[i];
s[i] = INDEX_OF[s[i]];
}
if (!syn_error) {
/* if syndrome is zero, data[] is a codeword and there are no
* errors to correct. So return data[] unmodified
*/
count = 0;
goto finish;
}
}
memset(&lambda[1],0,NROOTS*sizeof(lambda[0]));
lambda[0] = 1;
if (no_eras > 0) {
/* Init lambda to be the erasure locator polynomial */
lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))];
for (i = 1; i < no_eras; i++) {
u = MODNN(PRIM*(NN-1-eras_pos[i]));
for (j = i+1; j > 0; j--) {
tmp = INDEX_OF[lambda[j - 1]];
if(tmp != A0)
lambda[j] ^= ALPHA_TO[MODNN(u + tmp)];
}
}
#if DEBUG >= 1
/* Test code that verifies the erasure locator polynomial just constructed
Needed only for decoder debugging. */
/* find roots of the erasure location polynomial */
for(i=1;i<=no_eras;i++)
reg[i] = INDEX_OF[lambda[i]];
count = 0;
for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) {
q = 1;
for (j = 1; j <= no_eras; j++)
if (reg[j] != A0) {
reg[j] = MODNN(reg[j] + j);
q ^= ALPHA_TO[reg[j]];
}
if (q != 0)
continue;
/* store root and error location number indices */
root[count] = i;
loc[count] = k;
count++;
}
if (count != no_eras) {
printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras);
count = -1;
goto finish;
}
#if DEBUG >= 2
printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n");
for (i = 0; i < count; i++)
printf("%d ", loc[i]);
printf("\n");
#endif
#endif
}
for(i=0;i<NROOTS+1;i++)
b[i] = INDEX_OF[lambda[i]];
/*
* Begin Berlekamp-Massey algorithm to determine error+erasure
* locator polynomial
*/
r = no_eras;
el = no_eras;
while (++r <= NROOTS) { /* r is the step number */
/* Compute discrepancy at the r-th step in poly-form */
discr_r = 0;
for (i = 0; i < r; i++){
if ((lambda[i] != 0) && (s[r-i-1] != A0)) {
discr_r ^= ALPHA_TO[MODNN(INDEX_OF[lambda[i]] + s[r-i-1])];
}
}
discr_r = INDEX_OF[discr_r]; /* Index form */
if (discr_r == A0) {
/* 2 lines below: B(x) <-- x*B(x) */
memmove(&b[1],b,NROOTS*sizeof(b[0]));
b[0] = A0;
} else {
/* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */
t[0] = lambda[0];
for (i = 0 ; i < NROOTS; i++) {
if(b[i] != A0)
t[i+1] = lambda[i+1] ^ ALPHA_TO[MODNN(discr_r + b[i])];
else
t[i+1] = lambda[i+1];
}
if (2 * el <= r + no_eras - 1) {
el = r + no_eras - el;
/*
* 2 lines below: B(x) <-- inv(discr_r) *
* lambda(x)
*/
for (i = 0; i <= NROOTS; i++)
b[i] = (lambda[i] == 0) ? A0 : MODNN(INDEX_OF[lambda[i]] - discr_r + NN);
} else {
/* 2 lines below: B(x) <-- x*B(x) */
memmove(&b[1],b,NROOTS*sizeof(b[0]));
b[0] = A0;
}
memcpy(lambda,t,(NROOTS+1)*sizeof(t[0]));
}
}
/* Convert lambda to index form and compute deg(lambda(x)) */
deg_lambda = 0;
for(i=0;i<NROOTS+1;i++){
lambda[i] = INDEX_OF[lambda[i]];
if(lambda[i] != A0)
deg_lambda = i;
}
/* Find roots of the error+erasure locator polynomial by Chien search */
memcpy(&reg[1],&lambda[1],NROOTS*sizeof(reg[0]));
count = 0; /* Number of roots of lambda(x) */
for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) {
q = 1; /* lambda[0] is always 0 */
for (j = deg_lambda; j > 0; j--){
if (reg[j] != A0) {
reg[j] = MODNN(reg[j] + j);
q ^= ALPHA_TO[reg[j]];
}
}
if (q != 0)
continue; /* Not a root */
/* store root (index-form) and error location number */
#if DEBUG>=2
printf("count %d root %d loc %d\n",count,i,k);
#endif
root[count] = i;
loc[count] = k;
/* If we've already found max possible roots,
* abort the search to save time
*/
if(++count == deg_lambda)
break;
}
if (deg_lambda != count) {
/*
* deg(lambda) unequal to number of roots => uncorrectable
* error detected
*/
count = -1;
goto finish;
}
/*
* Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
* x**NROOTS). in index form. Also find deg(omega).
*/
deg_omega = 0;
for (i = 0; i < NROOTS;i++){
tmp = 0;
j = (deg_lambda < i) ? deg_lambda : i;
for(;j >= 0; j--){
if ((s[i - j] != A0) && (lambda[j] != A0))
tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])];
}
if(tmp != 0)
deg_omega = i;
omega[i] = INDEX_OF[tmp];
}
omega[NROOTS] = A0;
/*
* Compute error values in poly-form. num1 = omega(inv(X(l))), num2 =
* inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form
*/
for (j = count-1; j >=0; j--) {
num1 = 0;
for (i = deg_omega; i >= 0; i--) {
if (omega[i] != A0)
num1 ^= ALPHA_TO[MODNN(omega[i] + i * root[j])];
}
num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)];
den = 0;
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
for (i = min(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) {
if(lambda[i+1] != A0)
den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])];
}
if (den == 0) {
#if DEBUG >= 1
printf("\n ERROR: denominator = 0\n");
#endif
count = -1;
goto finish;
}
/* Apply error to data */
if (num1 != 0) {
data[loc[j]] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])];
}
}
finish:
if(eras_pos != NULL){
for(i=0;i<count;i++)
eras_pos[i] = loc[i];
}
return count;
}

View File

@ -1,47 +0,0 @@
/* Reed-Solomon encoder
* Copyright 2002, Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*/
#include <string.h>
#ifdef FIXED
#include "fixed.h"
#elif defined(BIGSYM)
#include "int.h"
#else
#include "char.h"
#endif
void ENCODE_RS(
#ifndef FIXED
void *p,
#endif
DTYPE *data, DTYPE *bb){
#ifndef FIXED
struct rs *rs = (struct rs *)p;
#endif
int i, j;
DTYPE feedback;
memset(bb,0,NROOTS*sizeof(DTYPE));
for(i=0;i<NN-NROOTS;i++){
feedback = INDEX_OF[data[i] ^ bb[0]];
if(feedback != A0){ /* feedback term is non-zero */
#ifdef UNNORMALIZED
/* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
* always be for the polynomials constructed by init_rs()
*/
feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
#endif
for(j=1;j<NROOTS;j++)
bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
}
/* Shift */
memmove(&bb[0],&bb[1],sizeof(DTYPE)*(NROOTS-1));
if(feedback != A0)
bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
else
bb[NROOTS-1] = 0;
}
}

View File

@ -1,145 +0,0 @@
subroutine extract2(s3,nadd,ntrials,param,msg)
real s3(64,63)
real tmp(4032)
integer np1(0:7,0:7),np2(0:7,0:7),np0(0:7,0:7)
integer ns(0:7,0:7)
integer perr(0:7,0:7),pmr2(0:7,0:7)
character msg*22
integer dat4(12)
integer mrsym(0:62),mr2sym(0:62),mrprob(0:62),mr2prob(0:62)
integer correct(0:62)
integer param(0:7)
integer indx(0:62)
logical first
real*8 tt
common/extcom/ntdecode
data ndone/0/,ngood/0/,nbad/0/,first/.true./
save
if(first) then
np1=0
np2=0
np0=0
ns=0
first=.false.
endif
nfail=0
1 call demod64a(s3,nadd,mrsym,mrprob,mr2sym,mr2prob,ntest,nlow)
! if(ntest.lt.50 .or. nlow.gt.20) then
! ncount=-999 !Flag bad data
! go to 900
! endif
call chkhist(mrsym,nhist,ipk)
if(nhist.ge.20) then
nfail=nfail+1
call pctile(s3,tmp,4032,50,base) ! ### or, use ave from demod64a ?
do j=1,63
s3(ipk,j)=base
enddo
go to 1
endif
call graycode(mrsym,63,-1)
call interleave63(mrsym,-1)
call interleave63(mrprob,-1)
call graycode(mr2sym,63,-1)
call interleave63(mr2sym,-1)
call interleave63(mr2prob,-1)
nverbose=0
call ftrsd2(mrsym,mrprob,mr2sym,mr2prob,ntrials,nverbose,correct, &
param,indx,tt,ntry)
ncandidates=param(0)
nhard=param(1)
nsoft=param(2)
nera=param(3)
ngmd=param(4)
ndone=ndone+1
do i=1,12
dat4(i)=correct(12-i)
enddo
msg=' '
! if(nhard.ge.0) then
if(nhard.ge.0 .and. nhard.le.42 .and. nsoft.le.32 .and. &
(nhard+nsoft).le.73) then
call unpackmsg(dat4,msg) !Unpack the user message
if(msg.eq.'VK7MO K1JT FN20 ') then
ngood=ngood+1
do k=0,62
j=indx(k)
i=(62-j)
p1=mrprob(i)/255.0 + 1.e-10
p2=mr2prob(i)/255.0
ii=k/8
jj=7.9999*p2/p1
ns(ii,jj)=ns(ii,jj)+1
if(correct(j).eq.mrsym(i)) then
np1(ii,jj)=np1(ii,jj)+1
else
np0(ii,jj)=np0(ii,jj)+1
endif
if(correct(j).eq.mr2sym(i)) np2(ii,jj)=np2(ii,jj)+1
enddo
else
nbad=nbad+1
endif
endif
fgood=float(ngood)/ndone
fbad=float(nbad)/ndone
nboth=nhard+nsoft
if(nhard.lt.0) then
nsoft=99
nera=99
nboth=99
endif
write(*,1010) ndone,fgood,fbad,ncandidates,nhard,nsoft,nera,nboth, &
ntry,tt,msg
write(32,1010) ndone,fgood,fbad,ncandidates,nhard,nsoft,nera,nboth, &
ntry,tt,msg
1010 format(i4,2f7.3,i7,4i3,i8,f8.1,1x,a22)
flush(32)
if(msg.eq.'VK7MO K1JT FN20 ') then
write(33,1012) ndone,ngood,nbad,ntry,log10(float(1+ntry))
1012 format(4i8,f8.3)
flush(33)
endif
rewind 40
write(40,1080)
1080 format('Totals:')
write(40,1090) ns
1090 format(8i7)
write(40,1091)
1091 format(/'error:')
write(40,1090) np0
write(40,1092)
1092 format(/'sym = mrsym:')
write(40,1090) np1
write(40,1093)
1093 format(/'sym = mr2sym:')
write(40,1090) np2
write(40,1095)
1095 format(/'Probability of error:')
perr=nint(100.0*float(np0)/(ns+0.001))
write(40,1096) perr
1096 format(8i7)
write(40,1097)
1097 format(/'P(mr2 correct | mr not correct) :')
pmr2=nint(100.0*float(np2)/(np0+0.001))
write(40,1096) pmr2
flush(40)
return
end subroutine extract2

View File

@ -1,213 +0,0 @@
/*
ftrsd2.c
A soft-decision decoder for the JT65 (63,12) Reed-Solomon code.
This decoding scheme is built around Phil Karn's Berlekamp-Massey
errors and erasures decoder. The approach is inspired by a number of
publications, including the stochastic Chase decoder described
in "Stochastic Chase Decoding of Reed-Solomon Codes", by Leroux et al.,
IEEE Communications Letters, Vol. 14, No. 9, September 2010 and
"Soft-Decision Decoding of Reed-Solomon Codes Using Successive Error-
and-Erasure Decoding," by Soo-Woong Lee and B. V. K. Vijaya Kumar.
Steve Franke K9AN and Joe Taylor K1JT
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "rs2.h"
static void *rs;
void getpp_(int workdat[], float *pp);
void ftrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[],
int* ntrials0, int correct[], int param[], int ntry[])
{
int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63];
int workdat[63];
int indexes[63];
int era_pos[51];
int i, j, numera, nerr, nn=63;
int ntrials = *ntrials0;
int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768;
int ntotal=0,ntotal_min=32768,ncandidates;
int nera_best=0;
float pp,pp1,pp2;
static unsigned int nseed;
// Power-percentage symbol metrics - composite gnnf/hf
int perr[8][8] = {
{ 4, 9, 11, 13, 14, 14, 15, 15},
{ 2, 20, 20, 30, 40, 50, 50, 50},
{ 7, 24, 27, 40, 50, 50, 50, 50},
{13, 25, 35, 46, 52, 70, 50, 50},
{17, 30, 42, 54, 55, 64, 71, 70},
{25, 39, 48, 57, 64, 66, 77, 77},
{32, 45, 54, 63, 66, 75, 78, 83},
{51, 58, 57, 66, 72, 77, 82, 86}};
// Initialize the KA9Q Reed-Solomon encoder/decoder
unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51;
rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0);
// Reverse the received symbol vectors for BM decoder
for (i=0; i<63; i++) {
rxdat[i]=mrsym[62-i];
rxprob[i]=mrprob[62-i];
rxdat2[i]=mr2sym[62-i];
rxprob2[i]=mr2prob[62-i];
}
// Sort rxprob to find indexes of the least reliable symbols
int k, pass, tmp, nsym=63;
int probs[63];
for (i=0; i<63; i++) {
indexes[i]=i;
probs[i]=rxprob[i];
}
for (pass = 1; pass <= nsym-1; pass++) {
for (k = 0; k < nsym - pass; k++) {
if( probs[k] < probs[k+1] ) {
tmp = probs[k];
probs[k] = probs[k+1];
probs[k+1] = tmp;
tmp = indexes[k];
indexes[k] = indexes[k+1];
indexes[k+1] = tmp;
}
}
}
// See if we can decode using BM HDD, and calculate the syndrome vector.
memset(era_pos,0,51*sizeof(int));
numera=0;
memcpy(workdat,rxdat,sizeof(rxdat));
nerr=decode_rs_int(rs,workdat,era_pos,numera,1);
if( nerr >= 0 ) {
// Hard-decision decoding succeeded. Save codeword and some parameters.
nhard=0;
for (i=0; i<63; i++) {
if( workdat[i] != rxdat[i] ) nhard=nhard+1;
}
memcpy(correct,workdat,63*sizeof(int));
param[0]=0;
param[1]=nhard;
param[2]=0;
param[3]=0;
param[4]=0;
param[5]=0;
param[7]=1000*1000;
ntry[0]=0;
return;
}
/*
Hard-decision decoding failed. Try the FT soft-decision method.
Generate random erasure-locator vectors and see if any of them
decode. This will generate a list of "candidate" codewords. The
soft distance between each candidate codeword and the received
word is estimated by finding the largest (pp1) and second-largest
(pp2) outputs from a synchronized filter-bank operating on the
symbol spectra, and using these to decide which candidate
codeword is "best".
*/
nseed=1; //Seed for random numbers
float ratio;
int thresh, nsum;
int thresh0[63];
ncandidates=0;
nsum=0;
int ii,jj;
for (i=0; i<nn; i++) {
nsum=nsum+rxprob[i];
j = indexes[62-i];
ratio = (float)rxprob2[j]/((float)rxprob[j]+0.01);
ii = 7.999*ratio;
jj = (62-i)/8;
thresh0[i] = 1.3*perr[ii][jj];
}
if(nsum<=0) return;
pp1=0.0;
pp2=0.0;
for (k=1; k<=ntrials; k++) {
memset(era_pos,0,51*sizeof(int));
memcpy(workdat,rxdat,sizeof(rxdat));
/*
Mark a subset of the symbols as erasures.
Run through the ranked symbols, starting with the worst, i=0.
NB: j is the symbol-vector index of the symbol with rank i.
*/
numera=0;
for (i=0; i<nn; i++) {
j = indexes[62-i];
thresh=thresh0[i];
long int ir;
// Generate a random number ir, 0 <= ir < 100 (see POSIX.1-2001 example).
nseed = nseed * 1103515245 + 12345;
ir = (unsigned)(nseed/65536) % 32768;
ir = (100*ir)/32768;
if((ir < thresh ) && numera < 51) {
era_pos[numera]=j;
numera=numera+1;
}
}
nerr=decode_rs_int(rs,workdat,era_pos,numera,0);
if( nerr >= 0 ) {
// We have a candidate codeword. Find its hard and soft distance from
// the received word. Also find pp1 and pp2 from the full array
// s3(64,63) of synchronized symbol spectra.
ncandidates=ncandidates+1;
nhard=0;
nsoft=0;
for (i=0; i<63; i++) {
if(workdat[i] != rxdat[i]) {
nhard=nhard+1;
if(workdat[i] != rxdat2[i]) {
nsoft=nsoft+rxprob[i];
}
}
}
nsoft=63*nsoft/nsum;
ntotal=nsoft+nhard;
getpp_(workdat,&pp);
if(pp>pp1) {
pp2=pp1;
pp1=pp;
nsoft_min=nsoft;
nhard_min=nhard;
ntotal_min=ntotal;
memcpy(correct,workdat,63*sizeof(int));
nera_best=numera;
ntry[0]=k;
} else {
if(pp>pp2 && pp!=pp1) pp2=pp;
}
if(nhard_min <= 41 && ntotal_min <= 71) break;
}
if(k == ntrials) ntry[0]=k;
}
param[0]=ncandidates;
param[1]=nhard_min;
param[2]=nsoft_min;
param[3]=nera_best;
param[4]=1000.0*pp2/pp1;
param[5]=ntotal_min;
param[6]=ntry[0];
param[7]=1000.0*pp2;
param[8]=1000.0*pp1;
if(param[0]==0) param[2]=-1;
return;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,40 +0,0 @@
CC = gcc
FC = gfortran
# 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: mfsk probs.out
OBJS1 = prob.o binomial_subs.o
prob: $(OBJS1)
$(FC) -o prob $(OBJS1)
OBJS2 = mfsk.o binomial_subs.o
mfsk: $(OBJS2)
$(FC) -o mfsk $(OBJS2)
OBJS3 = bodide.o binomial_subs.o
bodide: $(OBJS3)
$(FC) -o bodide $(OBJS3)
probs.out: prob
# x N X s
prob 35 63 40 40 > probs.out
prob 37 63 40 45 >> probs.out
prob 37 53 40 45 >> probs.out
prob 38 53 40 47 >> probs.out
clean:
rm -rf *.o prob probs.out

View File

@ -1,69 +0,0 @@
#include <stdio.h>
#include <limits.h>
/* Original code copied from
http://rosettacode.org/wiki/Evaluate_binomial_coefficients
*/
/* We go to some effort to handle overflow situations */
static unsigned long gcd_ui(unsigned long x, unsigned long y) {
unsigned long t;
if (y < x) { t = x; x = y; y = t; }
while (y > 0) {
t = y; y = x % y; x = t; /* y1 <- x0 % y0 ; x1 <- y0 */
}
return x;
}
unsigned long binomial(unsigned long n, unsigned long k) {
unsigned long d, g, r = 1;
if (k == 0) return 1;
if (k == 1) return n;
if (k >= n) return (k == n);
if (k > n/2) k = n-k;
for (d = 1; d <= k; d++) {
if (r >= ULONG_MAX/n) { /* Possible overflow */
unsigned long nr, dr; /* reduced numerator / denominator */
g = gcd_ui(n, d); nr = n/g; dr = d/g;
g = gcd_ui(r, dr); r = r/g; dr = dr/g;
if (r >= ULONG_MAX/nr) return 0; /* Unavoidable overflow */
r *= nr;
r /= dr;
n--;
} else {
r *= n--;
r /= d;
}
}
return r;
}
int main() {
//Get test results
printf("%lu\n", binomial(5, 3)); // 10
printf("%lu\n", binomial(40, 19)); // 131282408400
printf("%lu\n", binomial(67, 31)); // 11923179284862717872
// Compute special cases for paper on TF soft-decision RS decoder:
double a,b,c,p;
a=(double)binomial(40, 35);
b=(double)binomial(23, 5);
c=(double)binomial(63, 40);
p=a*b/c;
printf("%e %e %e %e\n",a,b,c,p);
a=(double)binomial(40, 36);
b=(double)binomial(23, 4);
c=(double)binomial(63, 40);
p=a*b/c;
printf("%e %e %e %e\n",a,b,c,p);
a=(double)binomial(40, 37);
b=(double)binomial(23, 8);
c=(double)binomial(63, 45);
p=a*b/c;
printf("%e %e %e %e\n",a,b,c,p);
return 0;
}

View File

@ -1,55 +0,0 @@
#include <stdio.h>
#include <limits.h>
/* Original code copied from
http://rosettacode.org/wiki/Evaluate_binomial_coefficients
*/
/* We go to some effort to handle overflow situations */
static unsigned long long gcd_ui(unsigned long long x, unsigned long long y) {
unsigned long long t;
if (y < x) { t = x; x = y; y = t; }
while (y > 0) {
t = y; y = x % y; x = t; /* y1 <- x0 % y0 ; x1 <- y0 */
}
return x;
}
unsigned long long binomial(unsigned long long n, unsigned long long k) {
unsigned long long d, g, r = 1;
if (k == 0) return 1;
if (k == 1) return n;
if (k >= n) return (k == n);
if (k > n/2) k = n-k;
for (d = 1; d <= k; d++) {
if (r >= ULLONG_MAX/n) { /* Possible overflow */
unsigned long long nr, dr; /* reduced numerator / denominator */
g = gcd_ui(n, d); nr = n/g; dr = d/g;
g = gcd_ui(r, dr); r = r/g; dr = dr/g;
if (r >= ULLONG_MAX/nr) return 0; /* Unavoidable overflow */
r *= nr;
r /= dr;
n--;
} else {
r *= n--;
r /= d;
}
}
return r;
}
unsigned long long binomial_(int *n, int *k)
{
// printf("n=%d k=%d %lu\n",*n,*k,binomial(*n,*k));
return binomial(*n,*k);
}
double hypergeo_(int *x, int *NN, int *XX, int *s)
{
double a,b,c;
a=(double)binomial(*XX, *x);
b=(double)binomial(*NN-*XX, *s-*x);
c=(double)binomial(*NN, *s);
return a*b/c;
}

View File

@ -1,11 +0,0 @@
fspread0 0.2, BM (ntrials=0)
-22.0 0.09
-21.5 0.20
-21.0 0.36
-20.5 0.55
-20.0 0.69
-19.5 0.83
-19.0 0.91
-18.5 0.960
-18.0 0.978
-17.5 0.987

View File

@ -1,8 +0,0 @@
-24.5 0.000
-24.0 0.006
-23.5 0.046 0.066
-23.0 0.250 0.305
-22.5 0.630 0.701
-22.0 0.900 0.945
-21.5 0.992 0.9974
-21.0 0.99987

View File

@ -1,43 +0,0 @@
Es/No P(word error)
----------------------
0.0 0.9008E+00 0.1000E+01
0.5 0.8877E+00 0.1000E+01
1.0 0.8724E+00 0.1000E+01
1.5 0.8545E+00 0.1000E+01
2.0 0.8338E+00 0.1000E+01
2.5 0.8096E+00 0.1000E+01
3.0 0.7817E+00 0.1000E+01
3.5 0.7496E+00 0.1000E+01
4.0 0.7128E+00 0.1000E+01
4.5 0.6712E+00 0.1000E+01
5.0 0.6246E+00 0.9998E+00
5.5 0.5731E+00 0.9964E+00
6.0 0.5170E+00 0.9629E+00
6.5 0.4572E+00 0.7979E+00
7.0 0.3949E+00 0.4327E+00
7.5 0.3316E+00 0.1100E+00
8.0 0.2696E+00 0.9707E-02
8.5 0.2109E+00 0.2303E-03
9.0 0.1578E+00 0.1170E-05
9.5 0.1121E+00 0.1027E-08
10.0 0.7499E-01 0.1263E-12
10.5 0.4684E-01 0.1768E-17
11.0 0.2703E-01 0.2282E-23
11.5 0.1426E-01 0.2200E-30
12.0 0.6789E-02 -.1348E-32
12.5 0.2879E-02 -.1733E-32
13.0 0.1072E-02 -.2119E-32
13.5 0.3448E-03 0.3081E-32
14.0 0.9421E-04 0.3852E-33
14.5 0.2148E-04 -.1156E-32
15.0 0.4006E-05 -.1733E-32
15.5 0.5984E-06 0.2215E-32
16.0 0.6994E-07 -.4430E-32
16.5 0.6230E-08 -.3081E-32
17.0 0.4105E-09 -.2889E-32
17.5 0.1934E-10 -.1926E-33
18.0 0.6266E-12 0.3852E-32
18.5 0.1335E-13 -.1926E-33
19.0 0.1777E-15 0.2119E-32
19.5 0.1396E-17 0.1733E-32
20.0 0.6076E-20 -.3852E-33

View File

@ -1,43 +0,0 @@
Es/No P(word error)
----------------------
0.0 0.9008E+00 0.1000E+01
0.5 0.8877E+00 0.1000E+01
1.0 0.8724E+00 0.1000E+01
1.5 0.8545E+00 0.1000E+01
2.0 0.8338E+00 0.9999E+00
2.5 0.8096E+00 0.9991E+00
3.0 0.7817E+00 0.9944E+00
3.5 0.7496E+00 0.9713E+00
4.0 0.7128E+00 0.8887E+00
4.5 0.6712E+00 0.6883E+00
5.0 0.6246E+00 0.3865E+00
5.5 0.5731E+00 0.1310E+00
6.0 0.5170E+00 0.2215E-01
6.5 0.4572E+00 0.1536E-02
7.0 0.3949E+00 0.3562E-04
7.5 0.3316E+00 0.2223E-06
8.0 0.2696E+00 0.2951E-09
8.5 0.2109E+00 0.6449E-13
9.0 0.1578E+00 0.1758E-17
9.5 0.1121E+00 0.4426E-23
10.0 0.7499E-01 0.7428E-30
10.5 0.4684E-01 -.1733E-32
11.0 0.2703E-01 0.1348E-32
11.5 0.1426E-01 0.2985E-32
12.0 0.6789E-02 -.1348E-32
12.5 0.2879E-02 -.1733E-32
13.0 0.1072E-02 -.2119E-32
13.5 0.3448E-03 0.3081E-32
14.0 0.9421E-04 0.3852E-33
14.5 0.2148E-04 -.1156E-32
15.0 0.4006E-05 -.1733E-32
15.5 0.5984E-06 0.2215E-32
16.0 0.6994E-07 -.4430E-32
16.5 0.6230E-08 -.3081E-32
17.0 0.4105E-09 -.2889E-32
17.5 0.1934E-10 -.1926E-33
18.0 0.6266E-12 0.3852E-32
18.5 0.1335E-13 -.1926E-33
19.0 0.1777E-15 0.2119E-32
19.5 0.1396E-17 0.1733E-32
20.0 0.6076E-20 -.3852E-33

View File

@ -1,43 +0,0 @@
Es/No P(word error)
----------------------
0.0 0.9008E+00 0.1000E+01
0.5 0.8877E+00 0.1000E+01
1.0 0.8724E+00 0.9999E+00
1.5 0.8545E+00 0.9996E+00
2.0 0.8338E+00 0.9977E+00
2.5 0.8096E+00 0.9889E+00
3.0 0.7817E+00 0.9559E+00
3.5 0.7496E+00 0.8599E+00
4.0 0.7128E+00 0.6586E+00
4.5 0.6712E+00 0.3780E+00
5.0 0.6246E+00 0.1397E+00
5.5 0.5731E+00 0.2826E-01
6.0 0.5170E+00 0.2632E-02
6.5 0.4572E+00 0.9396E-04
7.0 0.3949E+00 0.1052E-05
7.5 0.3316E+00 0.2965E-08
8.0 0.2696E+00 0.1650E-11
8.5 0.2109E+00 0.1388E-15
9.0 0.1578E+00 0.1316E-20
9.5 0.1121E+00 0.1021E-26
10.0 0.7499E-01 -.9630E-33
10.5 0.4684E-01 -.1733E-32
11.0 0.2703E-01 0.1348E-32
11.5 0.1426E-01 0.2985E-32
12.0 0.6789E-02 -.1348E-32
12.5 0.2879E-02 -.1733E-32
13.0 0.1072E-02 -.2119E-32
13.5 0.3448E-03 0.3081E-32
14.0 0.9421E-04 0.3852E-33
14.5 0.2148E-04 -.1156E-32
15.0 0.4006E-05 -.1733E-32
15.5 0.5984E-06 0.2215E-32
16.0 0.6994E-07 -.4430E-32
16.5 0.6230E-08 -.3081E-32
17.0 0.4105E-09 -.2889E-32
17.5 0.1934E-10 -.1926E-33
18.0 0.6266E-12 0.3852E-32
18.5 0.1335E-13 -.1926E-33
19.0 0.1777E-15 0.2119E-32
19.5 0.1396E-17 0.1733E-32
20.0 0.6076E-20 -.3852E-33

View File

@ -1,54 +0,0 @@
program bodide
! Compute probability of word error for a bounded distance decoder.
! Hardwired for non-coherent 64-FSK and the JT65 RS (63,12) code on GF(64).
!
! Let ps be symbol error probability.
! The probability of getting an error pattern with e symbol errors is:
! ps^e * (1-ps)*(n-e)
! The number of error patterns with e errors is binomial(63,e)
! Overall probability of getting a word with e errors is:
! P(e)= binomial(63,e)* ps^e * (1-ps)*(n-e)
! Probability that word is correct is P(0 to 25 errors) = sum{e=0}^{25} P(e)
! Probability that word is wrong is 1-P(0 to 25 errors)
! P_word_error=1-( sum_{e=0}^{t} P(e) )
!
implicit real*16 (a-h,o-z)
integer*8 binomial
integer x,s,XX,NN,M
character arg*8
nargs=iargc()
if(nargs.ne.1) then
print*,'Probability of word error for noncoherent 64-FSK with bounded distance decoding'
print*,'Usage: bounded_distance D'
print*,'Example: bounded_distance 25'
go to 999
endif
call getarg(1,arg)
read(arg,*) nt
M=64
write(*,1012)
1012 format('Es/No P(word error)'/ &
'----------------------')
do isnr=0,40
esno=10**(isnr/2.0/10.0)
hsum=0.d0
do k=1,M-1
h=binomial(M-1,k)
h=h*((-1)**(k+1))/(k+1)
h=h*exp(-esno*k/(k+1))
hsum=hsum + h
enddo
ps=hsum
hsum=0.d0
do i=0,nt
h=binomial(63,i)
h=h*ps**i
h=h*(1-ps)**(63-i)
hsum=hsum+h
enddo
pw=1-hsum
write(*,'(f4.1,4x,e10.4,4x,e10.4)') isnr/2.0, ps, pw
enddo
999 end program bodide

View File

@ -1,4 +0,0 @@
7.5 0.05 BM
6.9 0.015 Theory
5.55 0.05 KV
5.3 0.005 FT

View File

@ -1,24 +0,0 @@
# gnuplot script for comparison to theoretical word error rate for
# bounded distance decoding
# run: gnuplot fig_bodide.gnuplot
# then: pdflatex fig_bodide.tex
set term epslatex standalone size 6in,2*6/3in
set output "fig_bodide.tex"
set xlabel "$E_b/N_0$ (dB)"
set ylabel "Word Error Rate"
set style func linespoints
set key off
set tics in
set mxtics 2
set mytics 10
set grid
set logscale y
plot [3:9] [1e-4:1] \
"bmdata.dat" using ($1+29.1):(1-$2) with linespoints lt 2 lw 2 pt 2, \
"ftdata-100000.dat" using ($1+29.1):(1-$3) with linespoints lt 1 lw 2 pt 7, \
"bmtheory25.dat" using ($1-0.6):3 with linespoints lt 1 pt 5, \
"kvasd-15.dat" using ($1+29.1):(1-$3) with linespoints lt 4 pt 6, \
"bodide.lab" with labels

View File

@ -1,14 +0,0 @@
# gnuplot script for "ntrials_vs_nhard" figure
# run: gnuplot fig_ntrials_vs_nhard.gnuplot
# then: pdflatex fig_ntrials_vs_nhard.tex
#
set term epslatex standalone size 6in,2*6/3in
set output "fig_ntrials_vs_nhard.tex"
set xlabel "Errors in received word, $X$"
set ylabel "Number of trials"
set tics in
set mxtics 5
set mytics 10
#set grid
set logscale y
plot "stats-100000-24db-3.dat" using 1:4 pt 12 notitle

View File

@ -1,25 +0,0 @@
# gnuplot script for "Percent copy" figure
# run: gnuplot fig_psuccess.gnuplot
# then: pdflatex fig_psuccess.tex
#
set term epslatex standalone size 6in,4in
set output "fig_psuccess.tex"
set xlabel "SNR in 2500 Hz Bandwidth (dB)"
set ylabel "Percent copy"
set style func linespoints
set key off
set tics in
set mxtics 2
set mytics 2
set grid
plot [-30:-18] [0:105] \
"stats_0.0" using 1:($4)/10.0 with linespoints lt 2 lw 2 pt 2, \
"stats_0.0" using 1:($5)/10.0 with linespoints lt 1 lw 2 pt 3, \
"stats_0.0" using 1:($6)/10.0 with linespoints lt 3 lw 2 pt 4, \
"stats_0.2" using 1:($4)/10.0 with linespoints lt 2 pt 2, \
"stats_0.2" using 1:($5)/10.0 with linespoints lt 1 pt 3, \
"stats_0.2" using 1:($6)/10.0 with linespoints lt 3 pt 4, \
"stats_1.0" using 1:($4)/10.0 with linespoints lt 2 pt 2, \
"stats_1.0" using 1:($5)/10.0 with linespoints lt 1 pt 3, \
"stats_1.0" using 1:($6)/10.0 with linespoints lt 3 pt 4, \
"psuccess.lab" with labels

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

View File

@ -1,23 +0,0 @@
# gnuplot script for "Percent copy" figure
# run: gnuplot fig_wer.gnuplot
# then: pdflatex fig_wer.tex
#
set term epslatex standalone size 6in,4in
set output "fig_wer.tex"
set xlabel "$E_b/N_0$ (dB)"
set ylabel "Word Error Rate"
set style func linespoints
set key off
set tics in
set mxtics 2
set mytics 10
set grid
set logscale y
plot [3:7] "ftdata-100000.dat" using ($1+29.1):(1-$2) with linespoints lt 1 pt 7 title 'FT-100K', \
"ftdata-10000.dat" using ($1+29.1):(1-$2) with linespoints lt 1 pt 7 title 'FT-10K', \
"ftdata-1000.dat" using ($1+29.1):(1-$2) with linespoints lt 1 pt 7 title 'FT-1K', \
"kvasd-8.dat" using ($1+29.1):(1-$2) with linespoints lt 2 pt 8 title 'KV-8', \
"kvasd-12.dat" using ($1+29.1):(1-$2) with linespoints lt 2 pt 8 title 'KV-12', \
"kvasd-15.dat" using ($1+29.1):(1-$2) with linespoints lt 2 pt 8 title 'KV-15', \
"bmdata.dat" using ($1+29.1):(1-$2) with linespoints pt 7 title 'BM', \
"wer.lab" with labels

Binary file not shown.

View File

@ -1,23 +0,0 @@
# gnuplot script for "Percent copy" figure
# run: gnuplot fig_wer2.gnuplot
# then: pdflatex fig_wer2.tex
#
set term epslatex standalone size 6in,6*2/3in
set output "fig_wer2.tex"
set xlabel "SNR in 2500 Hz Bandwidth (dB)"
set ylabel "Percent Copy"
set style func linespoints
set key off
set tics in
set mxtics 2
set mytics 5
set grid
plot [-27:-22] [0:110] \
"ftdata-100000.dat" using 1:(100*$3) with linespoints lt 1 lw 2 pt 7, \
"ftdata-10000.dat" using 1:(100*$3) with linespoints lt 1 lw 2 pt 7, \
"ftdata-1000.dat" using 1:(100*$3) with linespoints lt 1 lw 2 pt 7, \
"ftdata-100.dat" using 1:(100*$3) with linespoints lt 1 lw 2 pt 7, \
"ftdata-10.dat" using 1:(100*$2) with linespoints lt 1 lw 2 pt 7, \
"kvasd-15.dat" using 1:(100*$2) with linespoints lt 4 pt 6, \
"bmdata.dat" using 1:(100*$2) with linespoints lt 2 lw 2 pt 2, \
"wer2.lab" with labels

View File

@ -1,21 +0,0 @@
# gnuplot script for "Percent copy" figure
# run: gnuplot fig_wer3.gnuplot
# then: pdflatex fig_wer3.tex
#
set term epslatex standalone size 6in,6*2/3in
set output "fig_wer3.tex"
set xlabel "SNR in 2500 Hz Bandwidth (dB)"
set ylabel "Percent Copy"
set style func linespoints
set key off
set tics in
set mxtics 2
set mytics 10
set grid
set label "r6315" at -25.25,30
set label "r6330" at -26.0,30
set label "$T=10^5$" at -22.8,15
set label "$d=0.0$" at -22.8,10
plot [-27:-22] [0:110] \
"ftdata-100000.dat" using 1:(100*$3) with linespoints lt 1 pt 7 title 'FT-100K', \
"ftdata-100000.dat" using 1:(100*$2) with linespoints lt 1 pt 7 title 'FT-100K'

View File

@ -1,10 +0,0 @@
snr psuccess ntrials 10, r6321, r6333
-26.0 0.0
-25.5 0.007
-25.0 0.039
-24.5 0.157 0.14
-24.0 0.362
-23.5 0.701 0.681
-23.0 0.914
-22.5 0.985 0.988
-22.0 1.0 1.0

View File

@ -1,10 +0,0 @@
snr psuccess ntrials 100, r6321, r6333
-26.0 0.003 0.003
-25.5 0.033 0.037
-25.0 0.113 0.113
-24.5 0.315 0.330
-24.0 0.635 0.670
-23.5 0.908 0.903
-23.0 0.977 0.984
-22.5 0.9986 0.999
-22.0 1.0 1.0

View File

@ -1,9 +0,0 @@
snr psuccess ntrials 1000, r6315, r6333
-26.0 0.010 0.022
-25.5 0.052 0.097
-25.0 0.22 0.262
-24.5 0.51 0.535
-24.0 0.80 0.844
-23.5 0.956 0.968
-23.0 0.9958 0.9963
-22.5 1.0 1.0

View File

@ -1,11 +0,0 @@
snr psuccess ntrials 10000 r6315, r6330
-27.0 0.000 0.001
-26.5 0.004 0.014
-26.0 0.03 0.066
-25.5 0.107 0.208 0.19
-25.0 0.353 0.424 0.40 (2)
-24.5 0.653 0.725
-24.0 0.913 0.913
-23.5 0.983 0.988
-23.0 0.998 0.999
-22.0 1.0 1.0

View File

@ -1,11 +0,0 @@
snr psuccess 100000 trials r6315, r6330,
-27.0 0.0 0.011
-26.5 0.007 0.035
-26.0 0.057 0.135
-25.5 0.207 0.326
-25.0 0.531 0.568
-24.5 0.822 0.836
-24.0 0.953 0.966
-23.5 0.99423 0.996
-23.0 0.99967 0.99974 302956/303056, 218991/219046

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
kvasd with xlambda=12.000
-26.0 0.017
-25.5 0.085
-25.0 0.282
-24.5 0.600
-24.0 0.865
-23.5 0.975
-23.0 0.9988

View File

@ -1,9 +0,0 @@
kvasd with xlambda=15.000, second # is with r6333 sync
-26.5 0.0035 0.002 109/31294 6/3000
-26.0 0.019 0.022 223/11445, 432/20000
-25.5 0.098 0.091 491/5000, 1835/20000
-25.0 0.310 0.315 1548/5000, 1574/5000
-24.5 0.626 0.612 3132/5000, 3058/5000
-24.0 0.898 0.886 4488/5000, 4433/5000
-23.5 0.984 0.986 12330/12530, 19712/20000
-23.0 0.99919 0.99914 245273/245473 232491/232691

View File

@ -1,8 +0,0 @@
kvasd with xlambda=8 AWGN
-26.0 0.008
-25.5 0.061
-25.0 0.233
-24.5 0.539
-24.0 0.847
-23.5 0.966
-23.0 0.9980

View File

@ -1,33 +0,0 @@
program mfsk
! Compute probability of symbol error for non-coherent MFSK
implicit real*16 (a-h,o-z)
integer*8 binomial
integer x,s,XX,NN,M
real*16 hypergeo, snr, term, sum
character arg*8
nargs=iargc()
if(nargs.ne.1) then
print*,'Probability of symbol error for noncoherent MFSK'
print*,'Usage: mfsk M'
print*,'Example: mfsk 64'
go to 999
endif
call getarg(1,arg)
read(arg,*) M
write(*,1012)
1012 format('Es/No P(symbol error)'/ &
'----------------------')
do isnr=0,40
esno=10**(isnr/2.0/10.0)
hsum=0.d0
do k=1,M-1
h=binomial(M-1,k)
h=h*((-1)**(k+1))/(k+1)
h=h*exp(-esno*k/(k+1))
hsum=hsum + h
enddo
write(*,'(f4.1,4x,e10.4)') isnr/2.0, hsum
enddo
999 end program mfsk

View File

@ -1,41 +0,0 @@
program prob
implicit real*8 (a-h,o-z)
integer*8 binomial
integer x,s,XX,NN
real*8 hypergeo
character arg*8
nargs=iargc()
if(nargs.ne.4) then
print*,'Usage: prob x N X s'
print*,'Example: prob 35 63 40 40'
go to 999
endif
call getarg(1,arg)
read(arg,*) x
call getarg(2,arg)
read(arg,*) NN
call getarg(3,arg)
read(arg,*) XX
call getarg(4,arg)
read(arg,*) s
! print*,binomial(5, 3) ! 10
! print*,binomial(40, 19) ! 131282408400
write(*,1010) x,NN,XX,s
1010 format(//' x=',i2,' N=',i2,' X=',i2,' s=',i2)
write(*,1012)
1012 format(/' x P(x|N,X,s) P(>=x|N,X,s) '/ &
'-------------------------------')
hsum=0.d0
do ix=x,XX
h=hypergeo(ix,NN,XX,s)
hsum=hsum + h
write(*,1020) ix,h,hsum
1020 format(i3,2d13.4)
enddo
999 end program prob

View File

@ -1,14 +0,0 @@
-21.5 55 BM
-24.5 50 FT
-27.0 68 DS
-25.2 25 0
-25.7 37 0.2
-24.6 16 1.0
-22.6 35 0
-20.9 29 0.2
-19.5 35 1.0
-28.5 25 1.0
-28.2 56 0.2
-28.5 72 0

View File

@ -1,930 +0,0 @@
35 19 45 12
34 20 46 6
35 27 43 4519
33 21 44 11
32 22 39 8
34 21 48 333
30 20 42 2
38 25 43 12
38 25 49 2958
28 20 43 10
41 29 44 4070
32 19 44 1
28 19 43 2
38 28 43 10421
25 0 0 0
36 24 42 8
38 25 42 243
39 25 45 81
33 17 39 2
38 25 39 157
37 27 45 1
31 18 39 8
35 22 41 2
31 20 45 32
40 30 45 11123
34 25 48 516
37 22 49 73
32 19 45 2
39 25 43 49
35 25 42 12
43 32 45 3645
35 21 45 124
39 26 48 31
40 26 48 23
36 25 43 169
33 21 41 8
31 21 49 3
37 23 46 2
32 27 41 8
36 23 43 2112
29 19 49 4
34 24 41 170
27 15 44 1
34 21 43 2
39 25 47 28
30 18 43 10
37 22 40 8
42 33 48 64709
36 25 43 10
35 20 51 17
37 28 45 301
34 18 40 9
34 25 47 23
39 28 43 4856
36 24 45 7057
35 25 47 769
38 28 47 208
39 27 47 52290
35 22 44 85
34 23 48 7
37 21 47 82
42 25 39 1677
29 17 41 8
41 24 46 656
35 24 43 2
38 22 45 10400
36 20 42 14
33 22 46 2
25 0 0 0
33 20 45 12
30 17 45 1
34 20 43 40
32 21 42 14
28 15 44 1
37 23 42 8
32 21 40 8
39 28 44 65
30 17 41 2
32 25 44 134
38 24 43 12
38 23 47 153
39 26 42 8
37 20 47 35
39 27 47 1003
36 23 45 215
38 28 49 46
34 24 47 200
35 23 40 8
30 19 44 1
38 25 43 32
32 22 39 103
33 23 42 2
34 24 47 6
33 22 43 13
42 28 43 2127
34 22 41 113
39 30 41 517
30 17 42 8
32 20 45 1
34 20 51 17
32 15 39 9
37 23 47 223
28 15 43 1
38 24 42 251
41 26 45 2
39 25 49 7
35 26 47 237
32 18 43 25
33 23 43 8
41 29 43 2667
28 17 45 1
34 23 47 53
32 19 39 9
34 24 42 59
36 22 44 8
34 20 45 59
37 24 45 12
28 17 44 1
41 29 43 24865
32 19 46 6
33 22 47 6
36 20 47 143
36 22 47 34
33 19 39 9
38 22 44 523
34 24 42 737
36 24 39 170
35 22 43 2
32 19 48 22
33 20 49 76
42 24 49 6910
37 22 47 94
40 24 43 6
35 25 45 33
29 22 41 2
40 24 46 2096
37 20 45 135
36 26 43 113
36 21 43 13
37 24 47 49
35 24 43 54
37 22 43 8
35 23 44 2
30 20 43 11
39 30 47 2870
42 33 44 585
26 17 45 2
41 29 47 79
40 24 46 836
33 19 45 201
34 21 39 13
33 21 49 60
35 24 44 248
33 24 43 24
39 29 44 151
31 23 46 1
36 23 46 1
41 27 47 5565
42 26 47 378
35 27 45 4571
40 30 47 6422
32 20 42 8
38 28 45 449
38 26 47 595
39 24 47 1555
41 25 49 645
32 19 40 8
35 25 45 97
25 0 0 0
30 19 44 25
31 18 45 1
41 24 51 6915
34 23 46 1917
30 19 43 2
35 22 47 20
38 23 43 882
30 20 48 5
37 25 44 919
34 20 45 74
38 25 46 394
39 21 49 738
35 20 47 22
40 30 47 190
41 27 45 1515
39 27 49 55
35 25 41 994
39 27 47 7117
37 22 46 19
33 21 41 2
34 18 47 19
30 20 46 6
31 21 46 1
36 24 47 98
40 24 43 39
38 25 45 138
41 27 47 33
40 29 49 2510
36 26 43 2
34 21 45 1
40 26 49 1924
36 17 43 2
38 27 45 68
34 22 45 61
32 22 40 8
37 19 43 4784
32 16 43 8
38 27 50 46
35 21 43 38
35 22 49 4
38 27 49 31
39 28 47 4677
30 18 45 2
43 28 47 8235
38 28 43 830
32 21 47 15
37 24 42 10
37 23 45 259
37 25 45 35
40 24 45 524
35 19 44 1
36 23 45 84
36 24 50 17
31 20 46 1
35 24 42 74
42 27 47 1445
40 28 48 31
36 23 45 151
34 22 46 6
33 24 49 16
30 20 45 2
38 22 43 125
40 25 49 64
35 23 49 86
38 24 46 613
42 25 47 4232
34 24 43 31
32 18 41 2
37 26 43 70
37 27 41 14
37 22 39 129
38 27 49 3
32 22 47 15
41 27 41 472
38 24 43 25
35 28 43 309
41 25 47 82
40 23 43 8
40 21 43 1716
38 22 48 5
37 20 47 22
42 28 43 315
32 23 43 79
25 0 0 0
42 23 47 2245
35 24 45 2
41 25 44 12
36 23 43 1
36 19 45 151
41 28 45 2207
40 27 45 76
34 20 47 6
41 28 46 370
38 20 45 12
32 20 43 8
39 24 45 8
41 27 47 26941
35 23 46 3
34 25 41 14
43 27 47 26905
35 25 45 2
32 20 50 3
31 17 41 2
38 26 47 4157
33 24 41 2
41 29 43 26513
35 22 45 297
37 26 44 99
33 19 43 10
39 23 45 138
39 26 47 1320
33 22 42 2
42 32 45 791
33 23 51 3
38 25 43 8
40 27 49 1210
43 27 45 32969
37 26 49 108
38 18 45 1268
40 28 49 7810
36 25 44 47
38 27 48 20
34 20 44 10
41 27 45 429
33 18 43 8
29 17 45 1
40 25 42 9
30 21 49 4
37 22 45 10
23 0 0 0
36 15 45 2509
29 21 45 18
33 23 45 53
43 27 49 7533
37 28 45 2652
36 24 49 31
32 20 43 25
42 27 49 1500
41 26 45 8
40 25 47 152
37 26 45 151
37 27 43 139
34 20 47 4
31 21 43 44
37 28 45 241
35 25 45 422
33 22 45 6
39 26 48 23
38 27 49 359
42 26 45 1430
36 28 47 116
33 23 41 232
38 25 47 73
35 24 43 16
42 29 47 398
38 27 49 2203
32 20 47 3
32 18 48 3
36 23 47 44
37 24 48 147
39 22 45 31
31 20 44 1
34 21 43 8
39 27 47 201
34 23 44 12
34 24 43 8
36 17 46 2
41 27 47 8709
41 26 45 112
37 23 47 216
38 24 45 93
32 19 45 44
34 22 45 8
33 24 41 14
34 22 41 9
35 23 42 136
36 26 43 3272
34 18 44 40
38 25 43 316
29 23 39 9
35 23 45 2
41 29 42 136
37 26 43 12
34 21 46 43
39 21 47 23
40 29 49 14666
36 19 45 400
37 24 43 8
35 19 44 2
36 26 45 14
36 22 43 103
33 19 45 6
35 24 43 1
31 22 43 80
35 23 46 22
28 18 41 2
35 24 45 31
34 24 47 46
37 24 42 2
37 27 43 525
31 16 41 9
30 18 45 2
39 25 47 1416
37 24 46 23
40 28 49 5
39 26 46 2071
28 13 42 8
31 17 47 3
34 22 49 3
42 23 47 61
30 21 41 2
40 23 47 208
38 22 48 6
35 17 40 8
36 20 45 32
37 22 47 1116
41 28 47 14145
43 28 49 96342
35 19 45 102
31 23 43 8
33 20 43 1
30 19 46 90
41 27 45 19090
35 26 45 2942
40 25 47 127
35 23 45 12
37 26 46 76
31 19 44 32
42 31 49 4951
43 30 44 38924
35 19 51 17
41 31 44 6637
33 22 42 2
33 25 46 12
31 24 44 10
27 16 49 4
39 24 45 16
33 20 40 8
39 31 48 5073
39 21 47 72
35 21 47 3
38 27 41 1168
35 22 43 8
28 18 45 1
38 28 40 776
33 22 51 3
34 22 41 370
37 25 43 3210
32 24 43 8
35 24 46 3
39 20 45 41
35 17 43 49
39 29 46 20
31 21 44 1
43 24 48 4400
36 23 48 350
38 29 47 520
36 24 45 49
39 27 43 493
34 15 45 6
41 31 43 59993
34 24 42 27
31 14 41 1
40 30 47 13295
35 23 47 202
36 22 47 35
38 26 45 18576
34 26 43 54
40 30 51 173
43 29 47 105
34 24 39 9
33 20 43 8
35 27 45 65
31 18 42 2
31 21 45 6
40 27 45 979
36 21 47 3
29 14 43 1
37 24 47 432
39 24 50 4778
33 20 44 2
40 27 44 7398
36 22 47 148
35 21 44 11
35 22 45 206
30 18 42 8
40 30 43 8
30 22 42 9
29 21 39 9
41 26 43 1248
39 24 43 14
38 24 49 605
35 20 42 155
33 22 47 53
34 20 43 10
35 26 49 21
31 18 45 1
32 19 39 9
31 20 43 19
41 23 41 157
36 23 42 9
28 19 45 1
33 19 43 10
38 22 44 25
29 19 41 2
34 19 42 8
35 21 39 9
34 23 45 2
41 30 47 71025
40 26 48 3059
36 24 45 1346
35 19 47 34
36 25 45 112
39 27 41 7065
38 24 47 4
29 18 42 1
30 20 41 2
32 22 49 3
40 29 45 4589
38 25 42 234
42 28 49 3171
35 22 45 34
39 24 41 5693
29 20 43 2
29 16 44 14
37 25 45 19
36 18 44 8
36 27 45 1224
38 28 47 8906
29 15 51 3
33 20 47 46
33 17 41 9
40 22 45 1775
32 22 45 8
35 21 43 8
38 24 41 9
41 22 47 10005
36 27 43 12
33 21 47 35
35 21 39 9
34 22 44 2
34 17 45 67
31 18 45 1
34 21 46 32
35 26 44 1
34 23 44 8
31 24 47 3
43 23 49 9210
40 20 48 114
36 25 42 8
37 24 46 336
37 23 43 138
38 26 47 89
38 24 47 6494
30 18 45 1
43 28 47 677
31 23 48 3
32 19 43 1
36 23 44 19
43 30 47 81276
37 22 48 106
37 24 45 12
37 22 45 68
28 17 43 24
43 28 45 1446
40 30 46 2753
35 23 44 1
28 16 43 2
29 19 42 2
31 21 42 2
39 26 48 98
41 30 47 21848
35 22 47 5
40 31 45 448
34 23 45 94
29 17 42 8
39 30 46 1231
41 22 47 49
30 15 51 7
35 26 41 9
29 17 49 7
33 22 43 12
33 19 46 5
35 24 45 12
33 22 42 9
34 18 43 13
36 21 43 63
37 27 45 32
37 23 49 474
31 17 46 19
38 24 41 2
40 28 47 1621
39 25 47 214
32 21 42 19
34 22 47 105
35 26 42 2
35 21 44 13
40 25 47 556
39 27 49 3
36 25 45 32
39 27 41 10
35 20 45 1
28 17 45 1
35 23 47 6
33 20 50 137
34 22 43 177
30 19 41 9
33 23 47 579
33 22 39 9
39 20 42 74
42 28 47 112
40 29 44 197
36 23 43 2
30 17 49 3
37 27 45 3815
35 24 43 74
35 22 47 24
40 27 46 82
36 25 41 366
33 23 44 1
37 21 40 131
34 22 45 16
36 24 45 306
39 26 47 82
29 17 45 1
36 23 48 3
35 20 44 63
35 23 46 5
39 25 43 792
32 22 49 5
35 23 41 9
37 24 41 12711
41 32 43 36575
34 23 42 8
31 21 43 2
35 24 41 2
35 24 39 8
37 23 48 75
35 19 43 12
40 25 49 914
38 22 49 60
34 19 42 10
42 33 44 9038
37 27 45 1849
29 20 42 138
37 27 43 332
36 26 45 36
32 18 45 6
37 25 46 4676
29 18 45 6
34 22 43 8
41 32 45 1966
30 18 42 12
33 20 45 1
31 23 45 6
30 21 46 1
36 21 43 14
34 18 45 37
42 32 47 3508
41 32 41 13
37 25 45 719
33 20 45 111
38 28 42 8
35 23 43 14
39 23 47 123
28 13 44 1
34 19 41 38
35 21 43 8
33 26 47 124
30 18 41 9
43 30 46 11935
40 28 48 2329
35 19 45 286
30 21 43 80
37 21 49 474
41 27 49 1560
42 24 46 1802
38 28 42 6807
38 24 43 63
33 24 49 35
41 27 41 9795
29 16 41 2
29 17 43 2
34 21 45 125
39 28 45 1008
34 21 42 8
36 23 45 2
34 22 41 8
34 21 41 74
37 21 43 262
30 18 41 8
33 22 49 3
33 21 42 1
35 28 49 21
31 19 43 1
36 24 44 10
40 23 49 583
33 19 37 9
32 21 45 6
38 24 47 15
42 27 47 2847
36 28 45 106
39 28 43 53
30 16 42 2
28 18 49 3
33 21 44 1
36 24 45 3050
37 27 40 8
35 19 43 12
41 29 43 19008
21 0 0 0
38 26 41 762
33 21 46 12
41 26 47 14517
33 24 49 3
41 31 47 287
35 24 51 17
37 27 42 38
34 22 43 24
39 26 46 135
38 26 41 493
35 22 42 8
38 24 41 1082
32 23 42 1
33 24 40 8
37 25 48 640
28 14 39 9
39 20 45 212
37 29 45 610
34 26 47 57
29 21 41 8
35 16 45 53
35 21 44 2
38 26 48 188
34 25 41 10
36 23 44 8
35 21 45 8
35 26 41 8
37 26 40 9
28 12 43 1
34 22 51 3
35 25 44 13
32 16 44 32
32 19 45 143
29 17 43 1
35 22 43 93
38 21 43 99
36 26 49 242
34 22 45 8
40 24 45 136
40 24 48 88
38 21 46 49
40 27 49 116
41 26 44 3696
35 23 42 8
28 15 45 104
33 21 43 106
35 25 45 31
33 24 40 113
36 24 46 23
37 25 45 334
32 21 46 12
35 21 41 2
36 22 45 8
37 18 43 13
37 26 47 48
39 25 46 400
37 27 43 174
37 23 47 41
40 21 47 1811
38 26 45 79
26 15 43 1
39 27 49 19
31 19 44 1
37 22 43 8
32 24 38 9
34 23 48 3
37 24 51 22
27 18 42 2
31 22 47 5
33 17 41 2
40 28 45 14534
37 21 47 5
27 15 43 2
43 26 47 46658
39 22 43 8
36 23 41 2
31 19 43 12
36 24 43 10
33 20 43 149
30 19 47 3
39 27 51 1236
41 26 45 4744
39 22 47 100
32 18 44 6
32 21 43 54
40 30 46 777
35 25 43 355
36 24 41 138
40 30 47 3056
39 28 46 19
34 21 46 6
34 18 46 52
36 27 41 232
35 25 51 3
36 28 44 110
33 23 45 1
37 22 46 64301
39 23 49 41
39 30 40 25
36 23 48 6
29 17 42 2
36 23 44 1
32 17 43 40
32 16 49 86
29 19 49 5
38 26 41 9
40 28 43 56710
41 29 45 1711
36 23 49 345
35 25 43 8
35 24 46 19
37 23 41 648
30 18 45 1
30 21 43 1
34 20 45 12
42 25 47 431
40 27 41 15878
34 22 43 8
41 29 48 49
32 21 43 2
37 22 43 2
39 28 49 86
43 28 45 8032
41 30 49 15674
34 22 48 17
36 24 48 107
28 20 44 1
43 28 48 1986
40 25 47 2585
38 21 43 59
38 28 41 167
34 22 39 9
43 27 48 4196
32 20 44 120
33 25 45 99
26 12 42 2
26 15 47 4
37 21 42 10
35 25 49 3
42 30 49 11151
33 20 44 2
39 26 45 65238
31 16 40 2
38 26 39 8
36 22 45 82
32 22 49 7
33 20 45 2
40 24 43 12
32 18 50 3
31 21 40 2
34 18 44 2
38 28 46 194
36 21 43 12
32 20 43 8
30 18 42 2
37 21 47 31
36 23 47 15
36 21 45 113
34 23 44 1
43 29 49 3889
37 24 47 32
41 22 43 243
38 25 47 707
35 22 43 18399
33 22 45 123
37 24 42 8
39 25 47 1087
34 23 47 107
32 21 42 2
42 25 47 106
39 24 42 13560
42 29 49 52387
38 27 43 59
31 18 39 9
40 28 48 41
37 25 45 11
30 23 45 242
38 23 47 1673
36 23 45 751
29 22 41 2
36 19 48 3
36 22 45 12
35 18 47 20
40 28 49 17369
29 19 46 2
36 26 42 25
42 30 49 4767
30 20 45 6
35 24 44 12
41 24 42 1537
38 25 47 629
31 21 44 2
34 22 43 1
33 20 47 3
34 20 43 8
40 26 49 4320
31 16 43 9
34 22 45 8
32 22 46 124
32 20 43 13
40 28 47 1185
41 24 45 30643
39 23 43 1658
33 23 44 8
36 22 46 23
41 25 47 114
36 21 42 12
33 19 48 31
42 28 48 76
29 22 39 9
36 21 47 3
37 27 45 282
42 29 46 24995
36 26 39 9
40 25 46 123
39 26 41 8
41 30 45 3143
34 20 41 27
38 31 42 17297
40 24 51 3052
36 28 45 190
31 23 42 8
42 26 42 68
39 31 45 37327
37 27 41 8
36 20 45 76
38 26 42 10
36 21 45 63
40 31 43 140
40 27 49 21
31 22 36 9
34 22 39 9
29 17 43 2
36 26 45 61
38 23 45 15
31 21 43 54
36 22 41 93
31 18 43 2
35 25 49 108
41 29 45 18292
37 25 45 104
28 20 41 2
35 26 46 35
34 20 46 19
38 22 51 183
34 14 43 8
32 23 43 16
27 17 44 1
29 15 42 2
37 26 41 129

View File

@ -1,27 +0,0 @@
SNR Files Sync BM FT Hint Total False BadSync
--------------------------------------------------------
-18.0 1000 1000 1000 1000 1000 1000 0 0
-18.5 1000 1000 1000 1000 1000 1000 0 0
-19.0 1000 1000 1000 1000 1000 1000 0 0
-19.5 1000 1000 1000 1000 1000 1000 0 0
-20.0 1000 1000 1000 1000 1000 1000 0 0
-20.5 1000 1000 1000 1000 1000 1000 0 0
-21.0 1000 1000 1000 1000 1000 1000 0 0
-21.5 1000 1000 991 1000 1000 1000 0 0
-22.0 1000 1000 918 1000 1000 1000 0 0
-22.5 1000 1000 631 1000 1000 1000 0 0
-23.0 1000 1000 261 1000 1000 1000 0 0
-23.5 1000 1000 57 990 1000 1000 0 0
-24.0 1000 1000 0 925 1000 1000 0 0
-24.5 1000 1000 0 737 1000 1000 0 0
-25.0 1000 999 0 445 999 999 1 ?
-25.5 1000 996 0 191 996 996 2 ?
-26.0 1000 980 0 68 985 985 3 ?
-26.5 1000 953 0 18 975 975 3 ?
-27.0 1000 904 0 3 926 926 4 ?
-27.5 1000 816 0 2 874 874 3 ?
-28.0 1000 722 0 0 786 786 7 ?
-28.5 1000 590 0 0 616 616 12 ?
-29.0 1000 451 0 0 479 479 15 ?
-29.5 1000 355 0 0 303 303 27 ?
-30.0 1000 277 0 0 173 173 28 ?

View File

@ -1,27 +0,0 @@
SNR Files Sync BM FT Hint Total False BadSync
--------------------------------------------------------
-18.0 1000 998 973 998 998 998 0 2
-18.5 1000 1000 960 1000 1000 1000 0 0
-19.0 1000 1000 917 1000 1000 1000 0 0
-19.5 1000 1000 849 1000 1000 1000 0 0
-20.0 1000 1000 725 1000 1000 1000 0 0
-20.5 1000 1000 549 1000 1000 1000 0 0
-21.0 1000 1000 373 1000 1000 1000 0 0
-21.5 1000 1000 216 1000 1000 1000 0 0
-22.0 1000 1000 100 998 1000 1000 0 0
-22.5 1000 1000 32 998 1000 1000 0 0
-23.0 1000 1000 12 991 1000 1000 0 0
-23.5 1000 998 2 958 1000 1000 0 2
-24.0 1000 992 0 878 998 998 1 8
-24.5 1000 986 0 739 995 995 0 14
-25.0 1000 977 0 533 991 991 0 23
-25.5 1000 959 0 324 975 975 3 41
-26.0 1000 930 0 153 953 953 1 70
-26.5 1000 874 0 51 924 924 8 126
-27.0 1000 808 0 14 866 866 6 192
-27.5 1000 716 0 3 799 799 10 284
-28.0 1000 610 0 1 689 689 14 390
-28.5 1000 497 0 0 596 596 19 503
-29.0 1000 399 0 0 451 451 21 601
-29.5 1000 300 0 0 270 270 27 700
-30.0 1000 243 0 0 172 172 26 757

View File

@ -1,27 +0,0 @@
SNR Files Sync BM FT Hint Total False BadSync
--------------------------------------------------------
-18.0 1000 998 917 998 998 998 1 2
-18.5 1000 998 824 998 998 998 0 2
-19.0 1000 999 695 999 999 999 0 1
-19.5 1000 999 504 999 999 999 0 1
-20.0 1000 1000 300 1000 1000 1000 0 0
-20.5 1000 1000 148 1000 1000 1000 0 0
-21.0 1000 1000 56 1000 1000 1000 0 0
-21.5 1000 1000 10 1000 1000 1000 0 0
-22.0 1000 999 3 995 1000 1000 0 1
-22.5 1000 998 0 972 1000 1000 0 2
-23.0 1000 997 0 899 999 999 0 3
-23.5 1000 996 0 758 999 999 0 4
-24.0 1000 990 0 545 999 999 0 10
-24.5 1000 981 0 305 988 988 2 19
-25.0 1000 964 0 128 987 987 0 36
-25.5 1000 930 0 43 956 956 4 70
-26.0 1000 870 0 15 932 932 4 130
-26.5 1000 810 0 4 889 889 8 190
-27.0 1000 737 0 0 798 798 9 263
-27.5 1000 632 0 0 650 650 10 368
-28.0 1000 522 0 0 526 526 15 478
-28.5 1000 426 0 0 383 383 19 574
-29.0 1000 332 0 0 226 226 34 668
-29.5 1000 260 0 0 136 136 32 740
-30.0 1000 209 0 0 64 64 47 791

View File

@ -1,7 +0,0 @@
-25.7 30 $10^5$
-25.25 36 $10^4$
-24.5 44 $10^3$
-24.15 48 $10^2$
-23.7 44 10
-22.5 48 BM
-25.2 24 KV

View File

@ -1,227 +0,0 @@
/*
ftrsdap.c
A soft-decision decoder for the JT65 (63,12) Reed-Solomon code.
This decoding scheme is built around Phil Karn's Berlekamp-Massey
errors and erasures decoder. The approach is inspired by a number of
publications, including the stochastic Chase decoder described
in "Stochastic Chase Decoding of Reed-Solomon Codes", by Leroux et al.,
IEEE Communications Letters, Vol. 14, No. 9, September 2010 and
"Soft-Decision Decoding of Reed-Solomon Codes Using Successive Error-
and-Erasure Decoding," by Soo-Woong Lee and B. V. K. Vijaya Kumar.
Steve Franke K9AN and Joe Taylor K1JT
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "../ftrsd/rs2.h"
static void *rs;
void getpp_(int workdat[], float *pp);
void ftrsdap_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[],
int ap[], int* ntrials0, int correct[], int param[], int ntry[])
{
int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63];
int workdat[63];
int indexes[63];
int era_pos[51];
int i, j, numera, nerr, nn=63;
int ntrials = *ntrials0;
int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768;
int ntotal=0,ntotal_min=32768,ncandidates;
int nera_best=0;
float pp,pp1,pp2;
static unsigned int nseed;
// Power-percentage symbol metrics - composite gnnf/hf
int perr[8][8] = {
{ 4, 9, 11, 13, 14, 14, 15, 15},
{ 2, 20, 20, 30, 40, 50, 50, 50},
{ 7, 24, 27, 40, 50, 50, 50, 50},
{13, 25, 35, 46, 52, 70, 50, 50},
{17, 30, 42, 54, 55, 64, 71, 70},
{25, 39, 48, 57, 64, 66, 77, 77},
{32, 45, 54, 63, 66, 75, 78, 83},
{51, 58, 57, 66, 72, 77, 82, 86}};
// Initialize the KA9Q Reed-Solomon encoder/decoder
unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51;
rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0);
// Reverse the received symbol vectors for BM decoder
for (i=0; i<63; i++) {
rxdat[i]=mrsym[62-i];
rxprob[i]=mrprob[62-i];
rxdat2[i]=mr2sym[62-i];
rxprob2[i]=mr2prob[62-i];
}
// Set ap symbols and ap mask
for (i=0; i<12; i++) {
if(ap[i]>=0) {
rxdat[11-i]=ap[i];
rxprob2[11-i]=-1;
}
}
// Sort rxprob to find indexes of the least reliable symbols
int k, pass, tmp, nsym=63;
int probs[63];
for (i=0; i<63; i++) {
indexes[i]=i;
probs[i]=rxprob[i];
}
for (pass = 1; pass <= nsym-1; pass++) {
for (k = 0; k < nsym - pass; k++) {
if( probs[k] < probs[k+1] ) {
tmp = probs[k];
probs[k] = probs[k+1];
probs[k+1] = tmp;
tmp = indexes[k];
indexes[k] = indexes[k+1];
indexes[k+1] = tmp;
}
}
}
// See if we can decode using BM HDD, and calculate the syndrome vector.
memset(era_pos,0,51*sizeof(int));
numera=0;
memcpy(workdat,rxdat,sizeof(rxdat));
nerr=decode_rs_int(rs,workdat,era_pos,numera,1);
if( nerr >= 0 ) {
// Hard-decision decoding succeeded. Save codeword and some parameters.
nhard=0;
for (i=0; i<63; i++) {
if( workdat[i] != rxdat[i] ) nhard=nhard+1;
}
memcpy(correct,workdat,63*sizeof(int));
param[0]=0;
param[1]=nhard;
param[2]=0;
param[3]=0;
param[4]=0;
param[5]=0;
param[7]=1000*1000;
ntry[0]=0;
return;
}
/*
Hard-decision decoding failed. Try the FT soft-decision method.
Generate random erasure-locator vectors and see if any of them
decode. This will generate a list of "candidate" codewords. The
soft distance between each candidate codeword and the received
word is estimated by finding the largest (pp1) and second-largest
(pp2) outputs from a synchronized filter-bank operating on the
symbol spectra, and using these to decide which candidate
codeword is "best".
*/
nseed=1; //Seed for random numbers
float ratio;
int thresh, nsum;
int thresh0[63];
ncandidates=0;
nsum=0;
int ii,jj;
for (i=0; i<nn; i++) {
nsum=nsum+rxprob[i];
j = indexes[62-i];
if( rxprob2[j]>=0 ) {
ratio = (float)rxprob2[j]/((float)rxprob[j]+0.01);
ii = 7.999*ratio;
jj = (62-i)/8;
thresh0[i] = 1.3*perr[ii][jj];
} else {
thresh0[i] = 0.0;
}
//printf("%d %d %d\n",i,j,rxdat[i]);
}
if(nsum<=0) return;
pp1=0.0;
pp2=0.0;
for (k=1; k<=ntrials; k++) {
memset(era_pos,0,51*sizeof(int));
memcpy(workdat,rxdat,sizeof(rxdat));
/*
Mark a subset of the symbols as erasures.
Run through the ranked symbols, starting with the worst, i=0.
NB: j is the symbol-vector index of the symbol with rank i.
*/
numera=0;
for (i=0; i<nn; i++) {
j = indexes[62-i];
thresh=thresh0[i];
long int ir;
// Generate a random number ir, 0 <= ir < 100 (see POSIX.1-2001 example).
nseed = nseed * 1103515245 + 12345;
ir = (unsigned)(nseed/65536) % 32768;
ir = (100*ir)/32768;
if((ir < thresh ) && numera < 51) {
era_pos[numera]=j;
numera=numera+1;
}
}
nerr=decode_rs_int(rs,workdat,era_pos,numera,0);
if( nerr >= 0 ) {
// We have a candidate codeword. Find its hard and soft distance from
// the received word. Also find pp1 and pp2 from the full array
// s3(64,63) of synchronized symbol spectra.
ncandidates=ncandidates+1;
nhard=0;
nsoft=0;
for (i=0; i<63; i++) {
if(workdat[i] != rxdat[i]) {
nhard=nhard+1;
if(workdat[i] != rxdat2[i]) {
nsoft=nsoft+rxprob[i];
}
}
}
nsoft=63*nsoft/nsum;
ntotal=nsoft+nhard;
getpp_(workdat,&pp);
if(pp>pp1) {
pp2=pp1;
pp1=pp;
nsoft_min=nsoft;
nhard_min=nhard;
ntotal_min=ntotal;
memcpy(correct,workdat,63*sizeof(int));
nera_best=numera;
ntry[0]=k;
} else {
if(pp>pp2 && pp!=pp1) pp2=pp;
}
if(nhard_min <= 41 && ntotal_min <= 71) break;
}
if(k == ntrials) ntry[0]=k;
}
param[0]=ncandidates;
param[1]=nhard_min;
param[2]=nsoft_min;
param[3]=nera_best;
param[4]=1000.0*pp2/pp1;
param[5]=ntotal_min;
param[6]=ntry[0];
param[7]=1000.0*pp2;
param[8]=1000.0*pp1;
if(param[0]==0) param[2]=-1;
return;
}

View File

@ -1,119 +0,0 @@
/* Initialize a RS codec
*
* Copyright 2002 Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*/
#include <stdlib.h>
#ifdef CCSDS
#include "ccsds.h"
#elif defined(BIGSYM)
#include "int.h"
#else
#include "char.h"
#endif
void FREE_RS(void *p){
struct rs *rs = (struct rs *)p;
free(rs->alpha_to);
free(rs->index_of);
free(rs->genpoly);
free(rs);
}
/* Initialize a Reed-Solomon codec
* symsize = symbol size, bits (1-8)
* gfpoly = Field generator polynomial coefficients
* fcr = first root of RS code generator polynomial, index form
* prim = primitive element to generate polynomial roots
* nroots = RS code generator polynomial degree (number of roots)
*/
void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim,
unsigned int nroots){
struct rs *rs;
int i, j, sr,root,iprim;
if(symsize > 8*sizeof(DTYPE))
return NULL; /* Need version with ints rather than chars */
if(fcr >= (1<<symsize))
return NULL;
if(prim == 0 || prim >= (1<<symsize))
return NULL;
if(nroots >= (1<<symsize))
return NULL; /* Can't have more roots than symbol values! */
rs = (struct rs *)calloc(1,sizeof(struct rs));
rs->mm = symsize;
rs->nn = (1<<symsize)-1;
rs->alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1));
if(rs->alpha_to == NULL){
free(rs);
return NULL;
}
rs->index_of = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1));
if(rs->index_of == NULL){
free(rs->alpha_to);
free(rs);
return NULL;
}
/* Generate Galois field lookup tables */
rs->index_of[0] = A0; /* log(zero) = -inf */
rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */
sr = 1;
for(i=0;i<rs->nn;i++){
rs->index_of[sr] = i;
rs->alpha_to[i] = sr;
sr <<= 1;
if(sr & (1<<symsize))
sr ^= gfpoly;
sr &= rs->nn;
}
if(sr != 1){
/* field generator polynomial is not primitive! */
free(rs->alpha_to);
free(rs->index_of);
free(rs);
return NULL;
}
/* Form RS code generator polynomial from its roots */
rs->genpoly = (DTYPE *)malloc(sizeof(DTYPE)*(nroots+1));
if(rs->genpoly == NULL){
free(rs->alpha_to);
free(rs->index_of);
free(rs);
return NULL;
}
rs->fcr = fcr;
rs->prim = prim;
rs->nroots = nroots;
/* Find prim-th root of 1, used in decoding */
for(iprim=1;(iprim % prim) != 0;iprim += rs->nn)
;
rs->iprim = iprim / prim;
rs->genpoly[0] = 1;
for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) {
rs->genpoly[i+1] = 1;
/* Multiply rs->genpoly[] by @**(root + x) */
for (j = i; j > 0; j--){
if (rs->genpoly[j] != 0)
rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)];
else
rs->genpoly[j] = rs->genpoly[j-1];
}
/* rs->genpoly[0] can never be zero */
rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)];
}
/* convert rs->genpoly[] to index form for quicker encoding */
for (i = 0; i <= nroots; i++)
rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
return rs;
}

View File

@ -1,54 +0,0 @@
/* Include file to configure the RS codec for integer symbols
*
* Copyright 2002, Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*/
#define DTYPE int
/* Reed-Solomon codec control block */
struct rs {
unsigned int mm; /* Bits per symbol */
unsigned int nn; /* Symbols per block (= (1<<mm)-1) */
int *alpha_to; /* log lookup table */
int *index_of; /* Antilog lookup table */
int *genpoly; /* Generator polynomial */
unsigned int nroots; /* Number of generator roots = number of parity symbols */
unsigned int fcr; /* First consecutive root, index form */
unsigned int prim; /* Primitive element, index form */
unsigned int iprim; /* prim-th root of 1, index form */
};
static inline int modnn(struct rs *rs,int x){
while (x >= rs->nn) {
x -= rs->nn;
x = (x >> rs->mm) + (x & rs->nn);
}
return x;
}
#define MODNN(x) modnn(rs,x)
#define MM (rs->mm)
#define NN (rs->nn)
#define ALPHA_TO (rs->alpha_to)
#define INDEX_OF (rs->index_of)
#define GENPOLY (rs->genpoly)
#define NROOTS (rs->nroots)
#define FCR (rs->fcr)
#define PRIM (rs->prim)
#define IPRIM (rs->iprim)
#define A0 (NN)
#define ENCODE_RS encode_rs_int
#define DECODE_RS decode_rs_int
#define INIT_RS init_rs_int
#define FREE_RS free_rs_int
void ENCODE_RS(void *p,DTYPE *data,DTYPE *parity);
int DECODE_RS(void *p,DTYPE *data,int *eras_pos,int no_eras, int calc_syn);
void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned int fcr,
unsigned int prim,unsigned int nroots);
void FREE_RS(void *p);

View File

@ -1,16 +0,0 @@
/* User include file for the Reed-Solomon codec
* Copyright 2002, Phil Karn KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*/
/* General purpose RS codec, integer symbols */
void encode_rs_int(void *rs,int *data,int *parity);
int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras, int calc_syn);
void *init_rs_int(int symsize,int gfpoly,int fcr,
int prim,int nroots,int pad);
void free_rs_int(void *rs);
/* Tables to map from conventional->dual (Taltab) and
* dual->conventional (Tal1tab) bases
*/
extern unsigned char Taltab[],Tal1tab[];

View File

@ -1,34 +0,0 @@
program rsdtest
real s3(64,63)
character msg*22,arg*12
integer param(0:7)
nargs=iargc()
if(nargs.ne.2) then
print*,'Usage: rsdtest ntrials nfiles'
go to 999
endif
call getarg(1,arg)
read(arg,*) ntrials
call getarg(2,arg)
read(arg,*) nfiles
open(10,file='s3_1000.bin',access='stream', status='old')
open(22,file='kvasd.dat',access='direct',recl=1024,status='unknown')
nadd=1
ifile0=0
if(nfiles.lt.0) then
ifile0=-nfiles
nfiles=99999
endif
do ifile=1,nfiles
read(10,end=999) s3
if(ifile.lt.ifile0) cycle
call extract2(s3,nadd,ntrials,param,msg)
if(ifile.eq.ifile0) exit
enddo
999 end program rsdtest

View File

@ -1,137 +0,0 @@
/*
sfrsd.c
A soft-decision decoder for the JT65 (63,12) Reed-Solomon code.
This decoding scheme is built around Phil Karn's Berlekamp-Massey
errors and erasures decoder. The approach is inspired by a number of
publications, including the stochastic Chase decoder described
in "Stochastic Chase Decoding of Reed-Solomon Codes", by Leroux et al.,
IEEE Communications Letters, Vol. 14, No. 9, September 2010 and
"Soft-Decision Decoding of Reed-Solomon Codes Using Successive Error-
and-Erasure Decoding," by Soo-Woong Lee and B. V. K. Vijaya Kumar.
Steve Franke K9AN, Urbana IL, September 2015
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "sfrsd2.h"
//***************************************************************************
void usage(void)
{
printf("Usage: sfrsd [options...] <path to kvasd.dat>\n");
printf(" input file should be in kvasd format\n");
printf("\n");
printf("Options:\n");
printf(" -n number of random erasure vectors to try\n");
printf(" -v verbose\n");
}
int main(int argc, char *argv[]){
extern char *optarg;
extern int optind;
int correct[63], indx[63], param[8];
int c,i;
char *infile;
FILE *datfile, *logfile;
int nsec, maxe, nads;
float xlambda;
int mrsym[63],mrprob[63],mr2sym[63],mr2prob[63];
int nsec2,ncount,dat4[12];
int ntrials, nverbose, ntry;
int nhard;
double tt;
ntrials=10000;
nverbose=1;
while ( (c = getopt(argc, argv, "n:qv")) !=-1 ) {
switch (c) {
case 'n':
ntrials=(int)strtof(optarg,NULL);
printf("ntrials set to %d\n",ntrials);
break;
case 'v':
nverbose=1;
break;
case 'q': //accept (and ignore) -q option for WSJT10 compatibility
break;
case '?':
usage();
exit(1);
}
}
if( optind+1 > argc) {
// usage();
// exit(1);
infile="kvasd.dat";
} else {
infile=argv[optind];
}
logfile=fopen("/tmp/sfrsd.log","a");
if( !logfile ) {
printf("Unable to open sfrsd.log\n");
exit(1);
}
datfile=fopen(infile,"rb");
if( !datfile ) {
printf("Unable to open kvasd.dat\n");
exit(1);
} else {
fread(&nsec,sizeof(int),1,datfile);
fread(&xlambda,sizeof(float),1,datfile);
fread(&maxe,sizeof(int),1,datfile);
fread(&nads,sizeof(int),1,datfile);
fread(&mrsym,sizeof(int),63,datfile);
fread(&mrprob,sizeof(int),63,datfile);
fread(&mr2sym,sizeof(int),63,datfile);
fread(&mr2prob,sizeof(int),63,datfile);
fread(&nsec2,sizeof(int),1,datfile);
fread(&ncount,sizeof(int),1,datfile);
fread(&dat4,sizeof(int),12,datfile);
fclose(datfile);
}
sfrsd2_(mrsym,mrprob,mr2sym,mr2prob,&ntrials,&nverbose,correct,param,indx,&tt,&ntry);
nhard=param[1];
if( nhard>=0 ) {
for (i=0; i<12; i++) {
dat4[i]=correct[11-i];
}
} else {
nhard=-1;
memset(dat4,0,12*sizeof(int));
}
datfile=fopen(infile,"wb");
if( !datfile ) {
printf("Unable to open kvasd.dat\n");
return 1;
} else {
fwrite(&nsec,sizeof(int),1,datfile);
fwrite(&xlambda,sizeof(float),1,datfile);
fwrite(&maxe,sizeof(int),1,datfile);
fwrite(&nads,sizeof(int),1,datfile);
fwrite(&mrsym,sizeof(int),63,datfile);
fwrite(&mrprob,sizeof(int),63,datfile);
fwrite(&mr2sym,sizeof(int),63,datfile);
fwrite(&mr2prob,sizeof(int),63,datfile);
fwrite(&nsec2,sizeof(int),1,datfile);
fwrite(&nhard,sizeof(int),1,datfile);
fwrite(&dat4,sizeof(int),12,datfile);
fclose(datfile);
}
exit(0);
}

View File

@ -1,3 +0,0 @@
void ftrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[],
int* ntrials0, int* verbose0, int correct[], int param[],
int indexes[], double tt[], int ntry[]);

View File

@ -1,243 +0,0 @@
/*
sfrsd2.c
A soft-decision decoder for the JT65 (63,12) Reed-Solomon code.
This decoding scheme is built around Phil Karn's Berlekamp-Massey
errors and erasures decoder. The approach is inspired by a number of
publications, including the stochastic Chase decoder described
in "Stochastic Chase Decoding of Reed-Solomon Codes", by Leroux et al.,
IEEE Communications Letters, Vol. 14, No. 9, September 2010 and
"Soft-Decision Decoding of Reed-Solomon Codes Using Successive Error-
and-Erasure Decoding," by Soo-Woong Lee and B. V. K. Vijaya Kumar.
Steve Franke K9AN and Joe Taylor K1JT
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "rs2.h"
static void *rs;
void sfrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[],
int* ntrials0, int* verbose0, int correct[], int param[],
int indexes[], double tt[], int ntry[])
{
int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63];
int workdat[63],workdat2[63];
int era_pos[51];
int c, i, j, numera, nmr2, nerr, nn=63, kk=12;
FILE *datfile, *logfile;
int ntrials = *ntrials0;
int verbose = *verbose0;
int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768, ncandidates;
int ngmd,nera_best;
clock_t t0=0,t1=0;
int perr[8][8] = {
12, 31, 44, 52, 60, 57, 50, 50,
28, 38, 49, 58, 65, 69, 64, 80,
40, 41, 53, 62, 66, 73, 76, 81,
50, 53, 53, 64, 70, 76, 77, 81,
50, 50, 52, 60, 71, 72, 77, 84,
50, 50, 56, 62, 67, 73, 81, 85,
50, 50, 71, 62, 70, 77, 80, 85,
50, 50, 62, 64, 71, 75, 82, 87};
int pmr2[8][8] = {
4, 8, 9, 7, 6, 0, 0, 0,
13, 18, 15, 11, 9, 7, 5, 0,
0, 23, 21, 15, 12, 10, 7, 4,
0, 34, 28, 20, 16, 14, 11, 7,
0, 20, 26, 25, 19, 14, 12, 9,
0, 0, 28, 27, 22, 19, 14, 11,
0, 0, 40, 29, 29, 23, 18, 12,
0, 0, 40, 35, 31, 21, 20, 13};
if(verbose) {
logfile=fopen("sfrsd.log","a");
if( !logfile ) {
printf("Unable to open sfrsd.log\n");
exit(1);
}
}
// Initialize the KA9Q Reed-Solomon encoder/decoder
unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51;
rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0);
// Reverse the received symbol vector for BM decoder
for (i=0; i<63; i++) {
rxdat[i]=mrsym[62-i];
rxprob[i]=mrprob[62-i];
rxdat2[i]=mr2sym[62-i];
rxprob2[i]=mr2prob[62-i];
}
// Sort the mrsym probabilities to find the least reliable symbols
int k, pass, tmp, nsym=63;
int probs[63];
for (i=0; i<63; i++) {
indexes[i]=i;
probs[i]=rxprob[i];
}
for (pass = 1; pass <= nsym-1; pass++) {
for (k = 0; k < nsym - pass; k++) {
if( probs[k] < probs[k+1] ) {
tmp = probs[k];
probs[k] = probs[k+1];
probs[k+1] = tmp;
tmp = indexes[k];
indexes[k] = indexes[k+1];
indexes[k+1] = tmp;
}
}
}
// See if we can decode using BM HDD, and calculate the syndrome vector.
memset(era_pos,0,51*sizeof(int));
numera=0;
memcpy(workdat,rxdat,sizeof(rxdat));
nerr=decode_rs_int(rs,workdat,era_pos,numera,1);
if( nerr >= 0 ) {
if(verbose) fprintf(logfile," BM decode nerrors= %3d : ",nerr);
memcpy(correct,workdat,63*sizeof(int));
ngmd=-1;
param[0]=0;
param[1]=0;
param[2]=0;
param[3]=0;
param[4]=0;
return;
}
/*
Generate random erasure-locator vectors and see if any of them
decode. This will generate a list of potential codewords. The
"soft" distance between each codeword and the received word is
used to decide which codeword is "best".
*/
#ifdef WIN32
srand(0xdeadbeef);
#else
srandom(0xdeadbeef);
#endif
float ratio, ratio0[63];
int threshe, thresh2, nsum;
int thresh0[63],thresh1[63], mr2flag;
ncandidates=0;
nsum=0;
int ii,jj;
for (i=0; i<nn; i++) {
nsum=nsum+rxprob[i];
j = indexes[62-i];
ratio = (float)rxprob2[j]/(float)rxprob[j];
ratio0[i]=ratio;
ii = 7.999*ratio;
jj = (62-i)/8;
thresh0[i] = 1.3*perr[ii][jj];
thresh1[i] = 0.4*pmr2[ii][jj];
}
if(nsum==0) return;
for( k=0; k<ntrials; k++) {
memset(era_pos,0,51*sizeof(int));
memcpy(workdat,rxdat,sizeof(rxdat));
/*
Mark a subset of the symbols as erasures.
Run through the ranked symbols, starting with the worst, i=0.
NB: j is the symbol-vector index of the symbol with rank i.
*/
numera=0;
nmr2=0;
for (i=0; i<nn; i++) {
j = indexes[62-i];
threshe=thresh0[i];
thresh2=thresh1[i];
long int ir, ir2;
#ifdef WIN32
ir=rand();
ir2=rand();
#else
ir=random();
ir2=random();
#endif
if( ((ir % 100) < threshe ) && (numera+2*nmr2) < 51 ) {
era_pos[numera]=j;
numera=numera+1;
}
if( ((ir2 % 100) < thresh2) && (numera+2*nmr2)<51) {
workdat[j]=rxdat2[j];
nmr2=nmr2+1;
}
}
t0=clock();
// rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 1);
nerr=decode_rs_int(rs,workdat,era_pos,numera,1);
t1=clock();
tt[0]+=(double)(t1-t0)/CLOCKS_PER_SEC;
if( nerr >= 0 ) {
ncandidates=ncandidates+1;
nhard=0;
nsoft=0;
for (i=0; i<63; i++) {
if(workdat[i] != rxdat[i]) {
nhard=nhard+1;
if(workdat[i] != rxdat2[i]) {
nsoft=nsoft+rxprob[i];
}
}
}
nsoft=63*nsoft/nsum;
if((nsoft < 33) && (nhard < 43) && (nhard+nsoft) < 74) { //???
if( (nsoft < nsoft_min) ) {
nsoft_min=nsoft;
nhard_min=nhard;
memcpy(correct,workdat,63*sizeof(int));
ngmd=0;
nera_best=numera;
ntry[0]=k;
}
}
if(nsoft_min < 27) break;
if((nsoft_min < 32) && (nhard_min < 43) &&
(nhard_min+nsoft_min) < 74) break;
}
if(k == ntrials-1) ntry[0]=k+1;
}
if(verbose) fprintf(logfile,
"%d trials and %d candidates after stochastic loop\n",k,ncandidates);
if( (ncandidates >= 0) && (nsoft_min < 36) && (nhard_min < 44) ) {
if(verbose) {
for (i=0; i<63; i++) {
fprintf(logfile,"%3d %3d %3d %3d %3d %3d\n",i,correct[i],
rxdat[i],rxprob[i],rxdat2[i],rxprob2[i]);
}
fprintf(logfile,"**** ncandidates %d nhard %d nsoft %d nsum %d\n",
ncandidates,nhard_min,nsoft_min,nsum);
}
} else {
nhard_min=-1;
}
if(verbose) {
fprintf(logfile,"exiting sfrsd\n");
fclose(logfile);
}
param[0]=ncandidates;
param[1]=nhard_min;
param[2]=nsoft_min;
param[3]=nera_best;
param[4]=ngmd;
if(param[0]==0) param[2]=-1;
return;
}

4
lib/g1
View File

@ -1,4 +0,0 @@
gcc -c gran.c
gfortran -c four2a.f90
gfortran -c f77_wisdom.f90
gfortran -o chkfft chkfft.f90 four2a.o f77_wisdom.o gran.o -lfftw3f

View File

@ -1,4 +0,0 @@
gcc -c gran.c
gfortran -c four2a.f90
gfortran -c f77_wisdom.f90
gfortran -o chkfft chkfft.f90 four2a.o f77_wisdom.o gran.o /JTSDK-QT/appsupport/runtime/libfftw3f-3.dll

View File

@ -1,4 +0,0 @@
gcc -c gran.c
gfortran -c fftw3mod.f90
gfortran -c f77_wisdom.f90
gfortran -o chkfft2 chkfft2.f90 f77_wisdom.o gran.o /JTSDK-QT/appsupport/runtime/libfftw3f-3.dll

View File

@ -1,4 +0,0 @@
gcc -c gran.c
gfortran -c fftw3mod.f90
gfortran -c f77_wisdom.f90
gfortran -o chkfft3 chkfft3.f90 f77_wisdom.o gran.o /JTSDK-QT/appsupport/runtime/libfftw3f-3.dll

View File

@ -1,3 +0,0 @@
gcc -c gran.c
gfortran -c -Wall fftw3mod.f90
gfortran -o timefft -Wall timefft.f90 timefft_opts.f90 gran.o libfftw3f-3.dll

Some files were not shown because too many files have changed in this diff Show More