PyFT8 3.7.0__tar.gz → 3.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {pyft8-3.7.0 → pyft8-3.7.1}/PKG-INFO +24 -2
  2. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/gui.py +1 -1
  3. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/pyft8.py +1 -1
  4. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/PKG-INFO +24 -2
  5. {pyft8-3.7.0 → pyft8-3.7.1}/README.md +23 -1
  6. {pyft8-3.7.0 → pyft8-3.7.1}/pyproject.toml +1 -1
  7. {pyft8-3.7.0 → pyft8-3.7.1}/LICENSE +0 -0
  8. {pyft8-3.7.0 → pyft8-3.7.1}/MANIFEST.in +0 -0
  9. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/__init__.py +0 -0
  10. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/databases.py +0 -0
  11. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/message_broker.py +0 -0
  12. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/osd.py +0 -0
  13. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/pskreporter.py +0 -0
  14. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/qso_manager.py +0 -0
  15. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/receiver.py +0 -0
  16. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/rigctrl.py +0 -0
  17. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/time_utils.py +0 -0
  18. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/transmitter.py +0 -0
  19. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/SOURCES.txt +0 -0
  20. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/dependency_links.txt +0 -0
  21. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/entry_points.txt +0 -0
  22. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/requires.txt +0 -0
  23. {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/top_level.txt +0 -0
  24. {pyft8-3.7.0 → pyft8-3.7.1}/setup.cfg +0 -0
  25. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/CQ AAAA.py +0 -0
  26. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/animation.py +0 -0
  27. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/bits_loopback.py +0 -0
  28. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/bits_loopback_short.py +0 -0
  29. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/osd.py +0 -0
  30. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/symbols_loopback.py +0 -0
  31. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/test_generate_wav.py +0 -0
  32. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/test_loopback_performance.py +0 -0
  33. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/text.py +0 -0
  34. {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/view_worked_before.py +0 -0
  35. {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/Fine tuning compare IOS_PC.py +0 -0
  36. {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/Targetted tests.py +0 -0
  37. {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/test_01.wav +0 -0
  38. {pyft8-3.7.0 → pyft8-3.7.1}/tests/play_wavs.py +0 -0
  39. {pyft8-3.7.0 → pyft8-3.7.1}/tests/plot_decode_times.py +0 -0
  40. {pyft8-3.7.0 → pyft8-3.7.1}/tests/spare.py +0 -0
  41. {pyft8-3.7.0 → pyft8-3.7.1}/tests/spare2.py +0 -0
  42. {pyft8-3.7.0 → pyft8-3.7.1}/tests/test_batch_and_live.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFT8
3
- Version: 3.7.0
3
+ Version: 3.7.1
4
4
  Summary: FT8 Decoding and Encoding in Python with test/loopback code
5
5
  Author-email: G1OJS <g1ojs@yahoo.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -23,7 +23,7 @@ Dynamic: license-file
23
23
  # PyFT8 [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/pyft8) [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=weekly&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads/wk)](https://pepy.tech/projects/pyft8) [PyPI link](https://pypi.org/project/PyFT8/)
24
24
  # All-Python FT8 Transceiver GUI / Command Line Modem
25
25
 
26
- This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is about 70% of that achieved by WSJT-x in NORM mode, but (tbc) slightly above ft8_lib.
26
+ This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is very close to that of WSJT-x 2.7.0 running in FAST mode.
27
27
 
28
28
  PyFT8 is somewhat experimental, with a focus on demonstrating FT8 written in Python, but can be used as a standalone replacement for WSJT-x and other software.
29
29
 
@@ -116,6 +116,28 @@ The image below shows the number of decodes from PyFT8, WSJT-x V2.7.0 running in
116
116
 
117
117
  <img width="900" height="900" alt="live playback vs wsjtx_v2 7 0" src="https://github.com/user-attachments/assets/853e98b2-5b9b-4241-b5f3-181fe193642e" />
118
118
 
119
+ ## Decoding approach
120
+ The approach to decoding, as at v3.7.0, is as follows.
121
+
122
+ - As audio arrives
123
+ - FFT to a spectrum 4 times per symbol duration & assemble a time-frequency grid with 2 bins per tone.
124
+ - Collect all audio samples for later full cycle FFT
125
+ - Search the time frequency grid for candidates based on Costas array sync score (using middle Costas block)
126
+ - Send candidates for decode using symbol & tone points drawn directly from the search grid to get early decodes using limited LDPC cycles.
127
+
128
+ This often decodes around three quarters of the candidates decoded by WSJT-x, with the steps below getting most of the rest:
129
+
130
+ - For candidates that haven't decoded:
131
+ - FFT the full cycle audio, downsample to 200 samples per second & shift the signal to f = 0
132
+ - Explore fine time and frequency offsets to maximise the Costas sync score
133
+ - Check for bad candidates (count maxima of Costas tones)
134
+ - Extract the LLR & wait for decoder to pick up the candidate
135
+ - For candidates awaiting decode from above:
136
+ - Try more extensive LDPC
137
+ - Try several 'A Priori' masks and input to more LDPC attempts, recording the output LLR on failures
138
+ - Try Ordered Statistics Decoding on the base LLR
139
+ - Try Ordered Statistics Decoding on the LLRs output from the AP+LDPC runs above
140
+
119
141
  ## Limitations
120
142
  PyFT8 doesn't decode / encode *all* message types. The table below shows which are handled.
121
143
 
@@ -209,7 +209,6 @@ class Gui:
209
209
  x = int(message['t0'] / self.waterfall_data['dt'] + message['their_tx_cycle'] * self.waterfall_data['pixels_per_cycle'])
210
210
  y = int(message['fHz'] / self.waterfall_data['df'])
211
211
  mb.set_props(x, y, message)
212
- self.msg_boxes.append(mb)
213
212
 
214
213
  def update_message(self, display_text, update_dict):
215
214
  for mb in self.msg_boxes:
@@ -246,6 +245,7 @@ class Gui:
246
245
  break
247
246
  if not mb:
248
247
  mb = Msg_box(self.fig, self.ax_wf, self.waterfall_data['sig_w'], self.waterfall_data['sig_h'])
248
+ self.msg_boxes.append(mb)
249
249
  return mb
250
250
 
251
251
  def _set_band(self, band):
@@ -11,7 +11,7 @@ from PyFT8.databases import ADIF
11
11
  from PyFT8.qso_manager import QSO_manager
12
12
  from PyFT8.message_broker import Broker
13
13
 
14
- VER = '3.7.0'
14
+ VER = '3.7.1'
15
15
  PSKR_REFRESH_MINS = 20
16
16
  message_broker = None
17
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyFT8
3
- Version: 3.7.0
3
+ Version: 3.7.1
4
4
  Summary: FT8 Decoding and Encoding in Python with test/loopback code
5
5
  Author-email: G1OJS <g1ojs@yahoo.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -23,7 +23,7 @@ Dynamic: license-file
23
23
  # PyFT8 [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/pyft8) [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=weekly&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads/wk)](https://pepy.tech/projects/pyft8) [PyPI link](https://pypi.org/project/PyFT8/)
24
24
  # All-Python FT8 Transceiver GUI / Command Line Modem
25
25
 
26
- This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is about 70% of that achieved by WSJT-x in NORM mode, but (tbc) slightly above ft8_lib.
26
+ This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is very close to that of WSJT-x 2.7.0 running in FAST mode.
27
27
 
28
28
  PyFT8 is somewhat experimental, with a focus on demonstrating FT8 written in Python, but can be used as a standalone replacement for WSJT-x and other software.
29
29
 
@@ -116,6 +116,28 @@ The image below shows the number of decodes from PyFT8, WSJT-x V2.7.0 running in
116
116
 
117
117
  <img width="900" height="900" alt="live playback vs wsjtx_v2 7 0" src="https://github.com/user-attachments/assets/853e98b2-5b9b-4241-b5f3-181fe193642e" />
118
118
 
119
+ ## Decoding approach
120
+ The approach to decoding, as at v3.7.0, is as follows.
121
+
122
+ - As audio arrives
123
+ - FFT to a spectrum 4 times per symbol duration & assemble a time-frequency grid with 2 bins per tone.
124
+ - Collect all audio samples for later full cycle FFT
125
+ - Search the time frequency grid for candidates based on Costas array sync score (using middle Costas block)
126
+ - Send candidates for decode using symbol & tone points drawn directly from the search grid to get early decodes using limited LDPC cycles.
127
+
128
+ This often decodes around three quarters of the candidates decoded by WSJT-x, with the steps below getting most of the rest:
129
+
130
+ - For candidates that haven't decoded:
131
+ - FFT the full cycle audio, downsample to 200 samples per second & shift the signal to f = 0
132
+ - Explore fine time and frequency offsets to maximise the Costas sync score
133
+ - Check for bad candidates (count maxima of Costas tones)
134
+ - Extract the LLR & wait for decoder to pick up the candidate
135
+ - For candidates awaiting decode from above:
136
+ - Try more extensive LDPC
137
+ - Try several 'A Priori' masks and input to more LDPC attempts, recording the output LLR on failures
138
+ - Try Ordered Statistics Decoding on the base LLR
139
+ - Try Ordered Statistics Decoding on the LLRs output from the AP+LDPC runs above
140
+
119
141
  ## Limitations
120
142
  PyFT8 doesn't decode / encode *all* message types. The table below shows which are handled.
121
143
 
@@ -1,7 +1,7 @@
1
1
  # PyFT8 [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/pyft8) [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pyft8?period=weekly&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads/wk)](https://pepy.tech/projects/pyft8) [PyPI link](https://pypi.org/project/PyFT8/)
2
2
  # All-Python FT8 Transceiver GUI / Command Line Modem
3
3
 
4
- This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is about 70% of that achieved by WSJT-x in NORM mode, but (tbc) slightly above ft8_lib.
4
+ This repository contains the source code for PyFT8, an all-Python open source FT8 transceiver that you can run as a basic GUI or from the command line to receive and transmit. Decoding performance (number of decodes) is very close to that of WSJT-x 2.7.0 running in FAST mode.
5
5
 
6
6
  PyFT8 is somewhat experimental, with a focus on demonstrating FT8 written in Python, but can be used as a standalone replacement for WSJT-x and other software.
7
7
 
@@ -94,6 +94,28 @@ The image below shows the number of decodes from PyFT8, WSJT-x V2.7.0 running in
94
94
 
95
95
  <img width="900" height="900" alt="live playback vs wsjtx_v2 7 0" src="https://github.com/user-attachments/assets/853e98b2-5b9b-4241-b5f3-181fe193642e" />
96
96
 
97
+ ## Decoding approach
98
+ The approach to decoding, as at v3.7.0, is as follows.
99
+
100
+ - As audio arrives
101
+ - FFT to a spectrum 4 times per symbol duration & assemble a time-frequency grid with 2 bins per tone.
102
+ - Collect all audio samples for later full cycle FFT
103
+ - Search the time frequency grid for candidates based on Costas array sync score (using middle Costas block)
104
+ - Send candidates for decode using symbol & tone points drawn directly from the search grid to get early decodes using limited LDPC cycles.
105
+
106
+ This often decodes around three quarters of the candidates decoded by WSJT-x, with the steps below getting most of the rest:
107
+
108
+ - For candidates that haven't decoded:
109
+ - FFT the full cycle audio, downsample to 200 samples per second & shift the signal to f = 0
110
+ - Explore fine time and frequency offsets to maximise the Costas sync score
111
+ - Check for bad candidates (count maxima of Costas tones)
112
+ - Extract the LLR & wait for decoder to pick up the candidate
113
+ - For candidates awaiting decode from above:
114
+ - Try more extensive LDPC
115
+ - Try several 'A Priori' masks and input to more LDPC attempts, recording the output LLR on failures
116
+ - Try Ordered Statistics Decoding on the base LLR
117
+ - Try Ordered Statistics Decoding on the LLRs output from the AP+LDPC runs above
118
+
97
119
  ## Limitations
98
120
  PyFT8 doesn't decode / encode *all* message types. The table below shows which are handled.
99
121
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "PyFT8"
3
- version = "3.7.0"
3
+ version = "3.7.1"
4
4
  license = "GPL-3.0-or-later"
5
5
 
6
6
  authors = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes