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: 8ea554ddaa8cc2
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: 6011f1e32fcabd
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:
parent
daa8cc2c3e
commit
c24e931f09
@ -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)
|
||||
|
@ -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><html><head/><body><p>Number of minutes before unattended heartbeat transmissions are aborted.</p></body></html></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><html><head/><body><p>Number of minutes before unattended heartbeat transmissions are aborted.</p></body></html></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>
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
32
commons.h
32
commons.h
@ -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
|
||||
|
@ -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_)
|
||||
|
@ -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
js8params.mod
Normal file
BIN
js8params.mod
Normal file
Binary file not shown.
15
keyeater.cpp
15
keyeater.cpp
@ -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);
|
||||
|
14
keyeater.h
14
keyeater.h
@ -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
|
||||
|
@ -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
|
@ -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?
|
@ -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
|
@ -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
|
71
lib/Makefile
71
lib/Makefile
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
124
lib/chkfft.txt
124
lib/chkfft.txt
@ -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!
|
466
lib/decoder.f90
466
lib/decoder.f90
@ -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
|
||||
|
@ -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
|
@ -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
41
lib/fer
@ -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
|
195
lib/fer65.f90
195
lib/fer65.f90
@ -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
|
@ -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
|
@ -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
|
@ -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="*"
|
||||
|
@ -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)
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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
|
@ -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(®[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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
@ -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 |
@ -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
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -1,4 +0,0 @@
|
||||
7.5 0.05 BM
|
||||
6.9 0.015 Theory
|
||||
5.55 0.05 KV
|
||||
5.3 0.005 FT
|
@ -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
|
||||
|
@ -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
|
@ -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.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 252 KiB |
Binary file not shown.
@ -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.
@ -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
|
@ -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'
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||
|
||||
|
@ -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
|
@ -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 ?
|
@ -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
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
@ -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[];
|
@ -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
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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[]);
|
@ -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
4
lib/g1
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
Loading…
Reference in New Issue
Block a user