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.
- {pyft8-3.7.0 → pyft8-3.7.1}/PKG-INFO +24 -2
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/gui.py +1 -1
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/pyft8.py +1 -1
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/PKG-INFO +24 -2
- {pyft8-3.7.0 → pyft8-3.7.1}/README.md +23 -1
- {pyft8-3.7.0 → pyft8-3.7.1}/pyproject.toml +1 -1
- {pyft8-3.7.0 → pyft8-3.7.1}/LICENSE +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/MANIFEST.in +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/__init__.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/databases.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/message_broker.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/osd.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/pskreporter.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/qso_manager.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/receiver.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/rigctrl.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/time_utils.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8/transmitter.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/SOURCES.txt +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/dependency_links.txt +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/entry_points.txt +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/requires.txt +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/PyFT8.egg-info/top_level.txt +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/setup.cfg +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/CQ AAAA.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/animation.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/bits_loopback.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/bits_loopback_short.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/osd.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/symbols_loopback.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/test_generate_wav.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/test_loopback_performance.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/text.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/misc/view_worked_before.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/Fine tuning compare IOS_PC.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/Targetted tests.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/pipeline/test_01.wav +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/play_wavs.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/plot_decode_times.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/spare.py +0 -0
- {pyft8-3.7.0 → pyft8-3.7.1}/tests/spare2.py +0 -0
- {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.
|
|
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 [](https://pepy.tech/projects/pyft8) [](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
|
|
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):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyFT8
|
|
3
|
-
Version: 3.7.
|
|
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 [](https://pepy.tech/projects/pyft8) [](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
|
|
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 [](https://pepy.tech/projects/pyft8) [](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
|
|
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
|
|
|
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
|
|
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
|