spectre-core 0.0.21__py3-none-any.whl → 0.0.23__py3-none-any.whl
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.
- spectre_core/_file_io/__init__.py +5 -5
- spectre_core/_file_io/file_handlers.py +61 -107
- spectre_core/batches/__init__.py +21 -4
- spectre_core/batches/_base.py +86 -135
- spectre_core/batches/_batches.py +56 -100
- spectre_core/batches/_factory.py +22 -21
- spectre_core/batches/_register.py +9 -9
- spectre_core/batches/plugins/_batch_keys.py +8 -7
- spectre_core/batches/plugins/_callisto.py +66 -98
- spectre_core/batches/plugins/_iq_stream.py +106 -170
- spectre_core/capture_configs/__init__.py +47 -18
- spectre_core/capture_configs/_capture_config.py +26 -53
- spectre_core/capture_configs/_capture_modes.py +9 -7
- spectre_core/capture_configs/_capture_templates.py +51 -111
- spectre_core/capture_configs/_parameters.py +38 -75
- spectre_core/capture_configs/_pconstraints.py +41 -41
- spectre_core/capture_configs/_pnames.py +37 -35
- spectre_core/capture_configs/_ptemplates.py +261 -348
- spectre_core/capture_configs/_pvalidators.py +99 -102
- spectre_core/config/__init__.py +14 -9
- spectre_core/config/_paths.py +19 -36
- spectre_core/config/_time_formats.py +7 -6
- spectre_core/exceptions.py +39 -1
- spectre_core/jobs/__init__.py +4 -7
- spectre_core/jobs/_duration.py +12 -0
- spectre_core/jobs/_jobs.py +73 -44
- spectre_core/jobs/_workers.py +56 -106
- spectre_core/logs/__init__.py +8 -3
- spectre_core/logs/_configure.py +14 -18
- spectre_core/logs/_decorators.py +7 -5
- spectre_core/logs/_logs.py +38 -90
- spectre_core/logs/_process_types.py +6 -4
- spectre_core/plotting/__init__.py +14 -4
- spectre_core/plotting/_base.py +65 -139
- spectre_core/plotting/_format.py +11 -9
- spectre_core/plotting/_panel_names.py +8 -6
- spectre_core/plotting/_panel_stack.py +83 -116
- spectre_core/plotting/_panels.py +121 -156
- spectre_core/post_processing/__init__.py +7 -4
- spectre_core/post_processing/_base.py +69 -69
- spectre_core/post_processing/_factory.py +15 -12
- spectre_core/post_processing/_post_processor.py +17 -13
- spectre_core/post_processing/_register.py +11 -8
- spectre_core/post_processing/plugins/_event_handler_keys.py +5 -4
- spectre_core/post_processing/plugins/_fixed_center_frequency.py +55 -48
- spectre_core/post_processing/plugins/_swept_center_frequency.py +200 -175
- spectre_core/receivers/__init__.py +10 -3
- spectre_core/receivers/_base.py +83 -149
- spectre_core/receivers/_factory.py +21 -31
- spectre_core/receivers/_register.py +8 -11
- spectre_core/receivers/_spec_names.py +18 -16
- spectre_core/receivers/plugins/_b200mini.py +48 -61
- spectre_core/receivers/plugins/_receiver_names.py +9 -7
- spectre_core/receivers/plugins/_rsp1a.py +45 -41
- spectre_core/receivers/plugins/_rspduo.py +60 -45
- spectre_core/receivers/plugins/_sdrplay_receiver.py +68 -84
- spectre_core/receivers/plugins/_test.py +137 -130
- spectre_core/receivers/plugins/_usrp.py +94 -86
- spectre_core/receivers/plugins/gr/__init__.py +2 -2
- spectre_core/receivers/plugins/gr/_base.py +15 -23
- spectre_core/receivers/plugins/gr/_rsp1a.py +53 -60
- spectre_core/receivers/plugins/gr/_rspduo.py +78 -90
- spectre_core/receivers/plugins/gr/_test.py +50 -58
- spectre_core/receivers/plugins/gr/_usrp.py +61 -59
- spectre_core/spectrograms/__init__.py +22 -14
- spectre_core/spectrograms/_analytical.py +109 -100
- spectre_core/spectrograms/_array_operations.py +40 -47
- spectre_core/spectrograms/_spectrogram.py +290 -323
- spectre_core/spectrograms/_transform.py +107 -74
- spectre_core/wgetting/__init__.py +2 -4
- spectre_core/wgetting/_callisto.py +88 -94
- {spectre_core-0.0.21.dist-info → spectre_core-0.0.23.dist-info}/METADATA +9 -23
- spectre_core-0.0.23.dist-info/RECORD +79 -0
- {spectre_core-0.0.21.dist-info → spectre_core-0.0.23.dist-info}/WHEEL +1 -1
- spectre_core-0.0.21.dist-info/RECORD +0 -78
- {spectre_core-0.0.21.dist-info → spectre_core-0.0.23.dist-info}/licenses/LICENSE +0 -0
- {spectre_core-0.0.21.dist-info → spectre_core-0.0.23.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
# SPDX-FileCopyrightText: © 2024 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
1
|
+
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
2
2
|
# This file is part of SPECTRE
|
3
3
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
4
4
|
|
@@ -10,31 +10,24 @@ from gnuradio import gr
|
|
10
10
|
|
11
11
|
from spectre_core.capture_configs import Parameters
|
12
12
|
|
13
|
+
|
13
14
|
class spectre_top_block(gr.top_block):
|
14
15
|
"""A thin wrapper around GNU Radio's `gr.top_block` class.
|
15
|
-
|
16
|
+
|
16
17
|
Propagate through the input tag and parameters to `flowgraph` in the constructor,
|
17
18
|
to make the GNU Radio flow graphs easily configurable.
|
18
19
|
"""
|
19
|
-
|
20
|
-
|
21
|
-
tag: str,
|
22
|
-
parameters: Parameters
|
23
|
-
) -> None:
|
20
|
+
|
21
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
24
22
|
"""Define the flowgraph for the block.
|
25
|
-
|
26
|
-
This method uses inline imports to allow the `spectre_core.receivers`
|
27
|
-
module to work without requiring all Out-Of-Tree (OOT) modules to be installed.
|
23
|
+
|
24
|
+
This method uses inline imports to allow the `spectre_core.receivers`
|
25
|
+
module to work without requiring all Out-Of-Tree (OOT) modules to be installed.
|
28
26
|
Only import the necessary OOT modules when implementing this method.
|
29
27
|
"""
|
30
28
|
raise NotImplementedError()
|
31
|
-
|
32
|
-
|
33
|
-
def __init__(
|
34
|
-
self,
|
35
|
-
tag: str,
|
36
|
-
parameters: Parameters
|
37
|
-
) -> None:
|
29
|
+
|
30
|
+
def __init__(self, tag: str, parameters: Parameters) -> None:
|
38
31
|
"""Create an instance of `spectre_top_block`.
|
39
32
|
|
40
33
|
:param tag: The capture config tag.
|
@@ -48,17 +41,17 @@ def capture(
|
|
48
41
|
tag: str,
|
49
42
|
parameters: Parameters,
|
50
43
|
top_block_cls: Type[spectre_top_block],
|
51
|
-
max_noutput_items: int = 10000000
|
44
|
+
max_noutput_items: int = 10000000,
|
52
45
|
) -> None:
|
53
46
|
"""
|
54
47
|
Run a GNU Radio flowgraph with the given number of output items.
|
55
48
|
|
56
49
|
Typically, this should be used with `partial` from `functools` to create
|
57
|
-
a capture method. For example,
|
50
|
+
a capture method. For example,
|
58
51
|
|
59
52
|
.. code-block:: python
|
60
53
|
capture_method = partial(capture, top_block_cls=<your GNU Radio top block>)
|
61
|
-
|
54
|
+
|
62
55
|
:param tag: The capture config tag
|
63
56
|
:param parameters: The parameters stored in the capture config
|
64
57
|
:param top_block_cls: The subclass of `spectre_top_block`, defining the GNURadio flowgraph.
|
@@ -66,8 +59,7 @@ def capture(
|
|
66
59
|
the maximum number of output items any block will handle during a call to work. Defaults to 10000000
|
67
60
|
(which has been chosen as per GNU Radio source code).
|
68
61
|
"""
|
69
|
-
tb = top_block_cls(tag,
|
70
|
-
parameters)
|
62
|
+
tb = top_block_cls(tag, parameters)
|
71
63
|
|
72
64
|
def sig_handler(sig=None, frame=None):
|
73
65
|
tb.stop()
|
@@ -77,4 +69,4 @@ def capture(
|
|
77
69
|
signal.signal(signal.SIGINT, sig_handler)
|
78
70
|
signal.signal(signal.SIGTERM, sig_handler)
|
79
71
|
|
80
|
-
tb.run(max_noutput_items)
|
72
|
+
tb.run(max_noutput_items)
|
@@ -9,43 +9,35 @@ from spectre_core.capture_configs import Parameters, PName
|
|
9
9
|
from spectre_core.config import get_batches_dir_path
|
10
10
|
from ._base import capture, spectre_top_block
|
11
11
|
|
12
|
+
|
12
13
|
class _fixed_center_frequency(spectre_top_block):
|
13
|
-
def flowgraph(
|
14
|
-
|
15
|
-
tag: str,
|
16
|
-
parameters: Parameters
|
17
|
-
) -> None:
|
18
|
-
# OOT Module inline imports
|
14
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
15
|
+
# OOT Module inline imports
|
19
16
|
from gnuradio import spectre
|
20
17
|
from gnuradio import sdrplay3
|
21
18
|
|
22
19
|
# Unpack the capture config parameters
|
23
20
|
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
24
|
-
batch_size
|
21
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
25
22
|
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
26
|
-
bandwidth
|
27
|
-
if_gain
|
28
|
-
rf_gain
|
29
|
-
|
23
|
+
bandwidth = parameters.get_parameter_value(PName.BANDWIDTH)
|
24
|
+
if_gain = parameters.get_parameter_value(PName.IF_GAIN)
|
25
|
+
rf_gain = parameters.get_parameter_value(PName.RF_GAIN)
|
30
26
|
|
31
27
|
# Blocks
|
32
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
33
|
-
|
34
|
-
|
35
|
-
sample_rate)
|
28
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
29
|
+
get_batches_dir_path(), tag, batch_size, sample_rate
|
30
|
+
)
|
36
31
|
self.sdrplay3_rsp1a_0 = sdrplay3.rsp1a(
|
37
|
-
|
38
|
-
stream_args=sdrplay3.stream_args(
|
39
|
-
output_type='fc32',
|
40
|
-
channels_size=1
|
41
|
-
),
|
32
|
+
"",
|
33
|
+
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
42
34
|
)
|
43
35
|
self.sdrplay3_rsp1a_0.set_sample_rate(sample_rate)
|
44
36
|
self.sdrplay3_rsp1a_0.set_center_freq(center_freq)
|
45
37
|
self.sdrplay3_rsp1a_0.set_bandwidth(bandwidth)
|
46
38
|
self.sdrplay3_rsp1a_0.set_gain_mode(False)
|
47
|
-
self.sdrplay3_rsp1a_0.set_gain(if_gain,
|
48
|
-
self.sdrplay3_rsp1a_0.set_gain(rf_gain,
|
39
|
+
self.sdrplay3_rsp1a_0.set_gain(if_gain, "IF")
|
40
|
+
self.sdrplay3_rsp1a_0.set_gain(rf_gain, "RF")
|
49
41
|
self.sdrplay3_rsp1a_0.set_freq_corr(0)
|
50
42
|
self.sdrplay3_rsp1a_0.set_dc_offset_mode(False)
|
51
43
|
self.sdrplay3_rsp1a_0.set_iq_balance_mode(False)
|
@@ -62,54 +54,50 @@ class _fixed_center_frequency(spectre_top_block):
|
|
62
54
|
|
63
55
|
|
64
56
|
class _swept_center_frequency(spectre_top_block):
|
65
|
-
def flowgraph(
|
66
|
-
|
67
|
-
tag: str,
|
68
|
-
parameters: Parameters
|
69
|
-
) -> None:
|
70
|
-
# OOT Module inline imports
|
57
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
58
|
+
# OOT Module inline imports
|
71
59
|
from gnuradio import spectre
|
72
60
|
from gnuradio import sdrplay3
|
73
61
|
|
74
62
|
# Unpack the capture config parameters
|
75
|
-
sample_rate
|
76
|
-
bandwidth
|
77
|
-
min_frequency
|
78
|
-
max_frequency
|
79
|
-
frequency_step
|
63
|
+
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
64
|
+
bandwidth = parameters.get_parameter_value(PName.BANDWIDTH)
|
65
|
+
min_frequency = parameters.get_parameter_value(PName.MIN_FREQUENCY)
|
66
|
+
max_frequency = parameters.get_parameter_value(PName.MAX_FREQUENCY)
|
67
|
+
frequency_step = parameters.get_parameter_value(PName.FREQUENCY_STEP)
|
80
68
|
samples_per_step = parameters.get_parameter_value(PName.SAMPLES_PER_STEP)
|
81
|
-
if_gain
|
82
|
-
rf_gain
|
83
|
-
batch_size
|
84
|
-
|
69
|
+
if_gain = parameters.get_parameter_value(PName.IF_GAIN)
|
70
|
+
rf_gain = parameters.get_parameter_value(PName.RF_GAIN)
|
71
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
85
72
|
|
86
73
|
# Blocks
|
87
|
-
self.spectre_sweep_driver_0 = spectre.sweep_driver(
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
74
|
+
self.spectre_sweep_driver_0 = spectre.sweep_driver(
|
75
|
+
min_frequency,
|
76
|
+
max_frequency,
|
77
|
+
frequency_step,
|
78
|
+
sample_rate,
|
79
|
+
samples_per_step,
|
80
|
+
"freq",
|
81
|
+
)
|
82
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
83
|
+
get_batches_dir_path(),
|
84
|
+
tag,
|
85
|
+
batch_size,
|
86
|
+
sample_rate,
|
87
|
+
True,
|
88
|
+
"freq",
|
89
|
+
min_frequency,
|
90
|
+
)
|
100
91
|
self.sdrplay3_rsp1a_0 = sdrplay3.rsp1a(
|
101
|
-
|
102
|
-
stream_args=sdrplay3.stream_args(
|
103
|
-
output_type='fc32',
|
104
|
-
channels_size=1
|
105
|
-
),
|
92
|
+
"",
|
93
|
+
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
106
94
|
)
|
107
95
|
self.sdrplay3_rsp1a_0.set_sample_rate(sample_rate, True)
|
108
96
|
self.sdrplay3_rsp1a_0.set_center_freq(min_frequency, True)
|
109
97
|
self.sdrplay3_rsp1a_0.set_bandwidth(bandwidth)
|
110
98
|
self.sdrplay3_rsp1a_0.set_gain_mode(False)
|
111
|
-
self.sdrplay3_rsp1a_0.set_gain(if_gain,
|
112
|
-
self.sdrplay3_rsp1a_0.set_gain(rf_gain,
|
99
|
+
self.sdrplay3_rsp1a_0.set_gain(if_gain, "IF", True)
|
100
|
+
self.sdrplay3_rsp1a_0.set_gain(rf_gain, "RF", True)
|
113
101
|
self.sdrplay3_rsp1a_0.set_freq_corr(0)
|
114
102
|
self.sdrplay3_rsp1a_0.set_dc_offset_mode(False)
|
115
103
|
self.sdrplay3_rsp1a_0.set_iq_balance_mode(False)
|
@@ -123,12 +111,17 @@ class _swept_center_frequency(spectre_top_block):
|
|
123
111
|
self.sdrplay3_rsp1a_0.set_show_gain_changes(False)
|
124
112
|
|
125
113
|
# Connections
|
126
|
-
self.msg_connect(
|
114
|
+
self.msg_connect(
|
115
|
+
(self.spectre_sweep_driver_0, "retune_command"),
|
116
|
+
(self.sdrplay3_rsp1a_0, "command"),
|
117
|
+
)
|
127
118
|
self.connect((self.sdrplay3_rsp1a_0, 0), (self.spectre_batched_file_sink_0, 0))
|
128
119
|
self.connect((self.sdrplay3_rsp1a_0, 0), (self.spectre_sweep_driver_0, 0))
|
129
120
|
|
130
121
|
|
131
122
|
@dataclass(frozen=True)
|
132
123
|
class CaptureMethod:
|
133
|
-
fixed_center_frequency
|
134
|
-
swept_center_frequency
|
124
|
+
fixed_center_frequency = partial(capture, top_block_cls=_fixed_center_frequency)
|
125
|
+
swept_center_frequency = partial(
|
126
|
+
capture, top_block_cls=_swept_center_frequency, max_noutput_items=1024
|
127
|
+
)
|
@@ -8,7 +8,7 @@
|
|
8
8
|
# Title: Test receiver
|
9
9
|
# GNU Radio version: 3.10.1.1
|
10
10
|
|
11
|
-
# SPDX-FileCopyrightText: © 2024 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
11
|
+
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
12
12
|
# This file is part of SPECTRE
|
13
13
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
14
14
|
|
@@ -25,44 +25,36 @@ from ._base import capture, spectre_top_block
|
|
25
25
|
|
26
26
|
|
27
27
|
class _tuner_1_fixed_center_frequency(spectre_top_block):
|
28
|
-
def flowgraph(
|
29
|
-
|
30
|
-
tag: str,
|
31
|
-
parameters: Parameters
|
32
|
-
) -> None:
|
33
|
-
# OOT Module inline imports
|
28
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
29
|
+
# OOT Module inline imports
|
34
30
|
from gnuradio import spectre
|
35
31
|
from gnuradio import sdrplay3
|
36
|
-
|
32
|
+
|
37
33
|
# Unpack the capture config parameters
|
38
34
|
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
39
|
-
batch_size
|
35
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
40
36
|
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
41
|
-
bandwidth
|
42
|
-
if_gain
|
43
|
-
rf_gain
|
37
|
+
bandwidth = parameters.get_parameter_value(PName.BANDWIDTH)
|
38
|
+
if_gain = parameters.get_parameter_value(PName.IF_GAIN)
|
39
|
+
rf_gain = parameters.get_parameter_value(PName.RF_GAIN)
|
44
40
|
|
45
41
|
# Blocks
|
46
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
47
|
-
|
48
|
-
|
49
|
-
sample_rate)
|
42
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
43
|
+
get_batches_dir_path(), tag, batch_size, sample_rate
|
44
|
+
)
|
50
45
|
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
51
|
-
|
46
|
+
"",
|
52
47
|
rspduo_mode="Single Tuner",
|
53
48
|
antenna="Tuner 1 50 ohm",
|
54
|
-
stream_args=sdrplay3.stream_args(
|
55
|
-
output_type='fc32',
|
56
|
-
channels_size=1
|
57
|
-
),
|
49
|
+
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
58
50
|
)
|
59
51
|
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
60
52
|
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
61
53
|
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
62
54
|
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
63
55
|
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
64
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain,
|
65
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain,
|
56
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF")
|
57
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF")
|
66
58
|
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
67
59
|
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
68
60
|
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
@@ -77,47 +69,39 @@ class _tuner_1_fixed_center_frequency(spectre_top_block):
|
|
77
69
|
|
78
70
|
# Connections
|
79
71
|
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
80
|
-
|
81
|
-
|
72
|
+
|
73
|
+
|
82
74
|
class _tuner_2_fixed_center_frequency(spectre_top_block):
|
83
|
-
def flowgraph(
|
84
|
-
|
85
|
-
tag: str,
|
86
|
-
parameters: Parameters
|
87
|
-
) -> None:
|
88
|
-
# OOT Module inline imports
|
75
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
76
|
+
# OOT Module inline imports
|
89
77
|
from gnuradio import spectre
|
90
78
|
from gnuradio import sdrplay3
|
91
|
-
|
79
|
+
|
92
80
|
# Unpack the capture config parameters
|
93
81
|
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
94
|
-
batch_size
|
82
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
95
83
|
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
96
|
-
bandwidth
|
97
|
-
if_gain
|
98
|
-
rf_gain
|
84
|
+
bandwidth = parameters.get_parameter_value(PName.BANDWIDTH)
|
85
|
+
if_gain = parameters.get_parameter_value(PName.IF_GAIN)
|
86
|
+
rf_gain = parameters.get_parameter_value(PName.RF_GAIN)
|
99
87
|
|
100
88
|
# Blocks
|
101
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
102
|
-
|
103
|
-
|
104
|
-
sample_rate)
|
89
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
90
|
+
get_batches_dir_path(), tag, batch_size, sample_rate
|
91
|
+
)
|
105
92
|
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
106
|
-
|
93
|
+
"",
|
107
94
|
rspduo_mode="Single Tuner",
|
108
95
|
antenna="Tuner 2 50 ohm",
|
109
|
-
stream_args=sdrplay3.stream_args(
|
110
|
-
output_type='fc32',
|
111
|
-
channels_size=1
|
112
|
-
),
|
96
|
+
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
113
97
|
)
|
114
98
|
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
115
99
|
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
116
100
|
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
117
101
|
self.sdrplay3_rspduo_0.set_antenna("Tuner 2 50 ohm")
|
118
102
|
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
119
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain,
|
120
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain,
|
103
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF")
|
104
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF", False)
|
121
105
|
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
122
106
|
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
123
107
|
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
@@ -131,62 +115,58 @@ class _tuner_2_fixed_center_frequency(spectre_top_block):
|
|
131
115
|
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
132
116
|
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
133
117
|
|
134
|
-
|
135
118
|
# Connections
|
136
|
-
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
119
|
+
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
137
120
|
|
138
121
|
|
139
122
|
class _tuner_1_swept_center_frequency(spectre_top_block):
|
140
|
-
def flowgraph(
|
141
|
-
|
142
|
-
tag: str,
|
143
|
-
parameters: Parameters
|
144
|
-
) -> None:
|
145
|
-
# OOT Module inline imports
|
123
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
124
|
+
# OOT Module inline imports
|
146
125
|
from gnuradio import spectre
|
147
126
|
from gnuradio import sdrplay3
|
148
127
|
|
149
128
|
# Unpack the capture config parameters
|
150
|
-
sample_rate
|
151
|
-
bandwidth
|
152
|
-
min_frequency
|
153
|
-
max_frequency
|
154
|
-
frequency_step
|
129
|
+
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
130
|
+
bandwidth = parameters.get_parameter_value(PName.BANDWIDTH)
|
131
|
+
min_frequency = parameters.get_parameter_value(PName.MIN_FREQUENCY)
|
132
|
+
max_frequency = parameters.get_parameter_value(PName.MAX_FREQUENCY)
|
133
|
+
frequency_step = parameters.get_parameter_value(PName.FREQUENCY_STEP)
|
155
134
|
samples_per_step = parameters.get_parameter_value(PName.SAMPLES_PER_STEP)
|
156
|
-
if_gain
|
157
|
-
rf_gain
|
158
|
-
batch_size
|
135
|
+
if_gain = parameters.get_parameter_value(PName.IF_GAIN)
|
136
|
+
rf_gain = parameters.get_parameter_value(PName.RF_GAIN)
|
137
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
159
138
|
|
160
139
|
# Blocks
|
161
|
-
self.spectre_sweep_driver_0 = spectre.sweep_driver(
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
140
|
+
self.spectre_sweep_driver_0 = spectre.sweep_driver(
|
141
|
+
min_frequency,
|
142
|
+
max_frequency,
|
143
|
+
frequency_step,
|
144
|
+
sample_rate,
|
145
|
+
samples_per_step,
|
146
|
+
"freq",
|
147
|
+
)
|
148
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
149
|
+
get_batches_dir_path(),
|
150
|
+
tag,
|
151
|
+
batch_size,
|
152
|
+
sample_rate,
|
153
|
+
True,
|
154
|
+
"freq",
|
155
|
+
min_frequency,
|
156
|
+
)
|
174
157
|
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
175
|
-
|
158
|
+
"",
|
176
159
|
rspduo_mode="Single Tuner",
|
177
160
|
antenna="Tuner 1 50 ohm",
|
178
|
-
stream_args=sdrplay3.stream_args(
|
179
|
-
output_type='fc32',
|
180
|
-
channels_size=1
|
181
|
-
),
|
161
|
+
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
182
162
|
)
|
183
163
|
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate, True)
|
184
164
|
self.sdrplay3_rspduo_0.set_center_freq(min_frequency, True)
|
185
165
|
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
186
166
|
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
187
167
|
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
188
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain,
|
189
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain,
|
168
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF", True)
|
169
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF", True)
|
190
170
|
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
191
171
|
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
192
172
|
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
@@ -200,15 +180,23 @@ class _tuner_1_swept_center_frequency(spectre_top_block):
|
|
200
180
|
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
201
181
|
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
202
182
|
|
203
|
-
|
204
183
|
# Connections
|
205
|
-
self.msg_connect(
|
184
|
+
self.msg_connect(
|
185
|
+
(self.spectre_sweep_driver_0, "retune_command"),
|
186
|
+
(self.sdrplay3_rspduo_0, "command"),
|
187
|
+
)
|
206
188
|
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
207
189
|
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_sweep_driver_0, 0))
|
208
|
-
|
209
|
-
|
190
|
+
|
191
|
+
|
210
192
|
@dataclass(frozen=True)
|
211
193
|
class CaptureMethod:
|
212
|
-
tuner_1_fixed_center_frequency
|
213
|
-
|
214
|
-
|
194
|
+
tuner_1_fixed_center_frequency = partial(
|
195
|
+
capture, top_block_cls=_tuner_1_fixed_center_frequency
|
196
|
+
)
|
197
|
+
tuner_2_fixed_center_frequency = partial(
|
198
|
+
capture, top_block_cls=_tuner_2_fixed_center_frequency
|
199
|
+
)
|
200
|
+
tuner_1_swept_center_frequency = partial(
|
201
|
+
capture, top_block_cls=_tuner_1_swept_center_frequency, max_noutput_items=1024
|
202
|
+
)
|
@@ -8,7 +8,7 @@
|
|
8
8
|
# Title: Test receiver
|
9
9
|
# GNU Radio version: 3.10.1.1
|
10
10
|
|
11
|
-
# SPDX-FileCopyrightText: © 2024 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
11
|
+
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
12
12
|
# This file is part of SPECTRE
|
13
13
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
14
14
|
|
@@ -30,87 +30,75 @@ from ._base import capture, spectre_top_block
|
|
30
30
|
|
31
31
|
|
32
32
|
class _cosine_signal_1(spectre_top_block):
|
33
|
-
def flowgraph(
|
34
|
-
|
35
|
-
tag: str,
|
36
|
-
parameters: Parameters
|
37
|
-
) -> None:
|
38
|
-
# Inline imports
|
33
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
34
|
+
# Inline imports
|
39
35
|
from gnuradio import spectre
|
40
36
|
|
41
37
|
# Unpack the capture config parameters
|
42
|
-
samp_rate
|
43
|
-
batch_size
|
44
|
-
frequency
|
45
|
-
amplitude
|
38
|
+
samp_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
39
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
40
|
+
frequency = parameters.get_parameter_value(PName.FREQUENCY)
|
41
|
+
amplitude = parameters.get_parameter_value(PName.AMPLITUDE)
|
46
42
|
|
47
43
|
# Blocks
|
48
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
self.
|
53
|
-
|
54
|
-
True)
|
55
|
-
self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1,
|
56
|
-
samp_rate,
|
57
|
-
True)
|
58
|
-
self.blocks_null_source_1 = blocks.null_source(gr.sizeof_float*1)
|
44
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
45
|
+
get_batches_dir_path(), tag, batch_size, samp_rate
|
46
|
+
)
|
47
|
+
self.blocks_throttle_0_1 = blocks.throttle(gr.sizeof_float * 1, samp_rate, True)
|
48
|
+
self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float * 1, samp_rate, True)
|
49
|
+
self.blocks_null_source_1 = blocks.null_source(gr.sizeof_float * 1)
|
59
50
|
self.blocks_float_to_complex_1 = blocks.float_to_complex(1)
|
60
|
-
self.analog_sig_source_x_0 = analog.sig_source_f(
|
61
|
-
|
62
|
-
|
63
|
-
amplitude,
|
64
|
-
0,
|
65
|
-
0)
|
66
|
-
|
51
|
+
self.analog_sig_source_x_0 = analog.sig_source_f(
|
52
|
+
samp_rate, analog.GR_COS_WAVE, frequency, amplitude, 0, 0
|
53
|
+
)
|
67
54
|
|
68
55
|
##################################################
|
69
56
|
# Connections
|
70
57
|
##################################################
|
71
58
|
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0))
|
72
|
-
self.connect(
|
59
|
+
self.connect(
|
60
|
+
(self.blocks_float_to_complex_1, 0), (self.spectre_batched_file_sink_0, 0)
|
61
|
+
)
|
73
62
|
self.connect((self.blocks_null_source_1, 0), (self.blocks_throttle_0_1, 0))
|
74
63
|
self.connect((self.blocks_throttle_0, 0), (self.blocks_float_to_complex_1, 0))
|
75
64
|
self.connect((self.blocks_throttle_0_1, 0), (self.blocks_float_to_complex_1, 1))
|
76
65
|
|
77
66
|
|
78
67
|
class _tagged_staircase(spectre_top_block):
|
79
|
-
def flowgraph(
|
80
|
-
|
81
|
-
tag: str,
|
82
|
-
parameters: Parameters
|
83
|
-
) -> None:
|
84
|
-
# Inline imports
|
68
|
+
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
69
|
+
# Inline imports
|
85
70
|
from gnuradio import spectre
|
86
71
|
|
87
72
|
##################################################
|
88
73
|
# Unpack capture config
|
89
74
|
##################################################
|
90
|
-
step_increment
|
91
|
-
samp_rate
|
92
|
-
min_samples_per_step = parameters.get_parameter_value(
|
93
|
-
|
94
|
-
|
95
|
-
|
75
|
+
step_increment = parameters.get_parameter_value(PName.STEP_INCREMENT)
|
76
|
+
samp_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
77
|
+
min_samples_per_step = parameters.get_parameter_value(
|
78
|
+
PName.MIN_SAMPLES_PER_STEP
|
79
|
+
)
|
80
|
+
max_samples_per_step = parameters.get_parameter_value(
|
81
|
+
PName.MAX_SAMPLES_PER_STEP
|
82
|
+
)
|
83
|
+
frequency_step = parameters.get_parameter_value(PName.FREQUENCY_STEP)
|
84
|
+
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
96
85
|
|
97
86
|
##################################################
|
98
87
|
# Blocks
|
99
88
|
##################################################
|
100
|
-
self.spectre_tagged_staircase_0 = spectre.tagged_staircase(
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
89
|
+
self.spectre_tagged_staircase_0 = spectre.tagged_staircase(
|
90
|
+
min_samples_per_step,
|
91
|
+
max_samples_per_step,
|
92
|
+
frequency_step,
|
93
|
+
step_increment,
|
94
|
+
samp_rate,
|
95
|
+
)
|
96
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
97
|
+
get_batches_dir_path(), tag, batch_size, samp_rate, True, "rx_freq", 0
|
98
|
+
) # zero means the center frequency is unset
|
99
|
+
self.blocks_throttle_0 = blocks.throttle(
|
100
|
+
gr.sizeof_gr_complex * 1, samp_rate, True
|
101
|
+
)
|
114
102
|
|
115
103
|
##################################################
|
116
104
|
# Connections
|
@@ -121,5 +109,9 @@ class _tagged_staircase(spectre_top_block):
|
|
121
109
|
|
122
110
|
@dataclass(frozen=True)
|
123
111
|
class CaptureMethod:
|
124
|
-
cosine_signal_1
|
125
|
-
|
112
|
+
cosine_signal_1: Callable[[str, Parameters], None] = partial(
|
113
|
+
capture, top_block_cls=_cosine_signal_1
|
114
|
+
)
|
115
|
+
tagged_staircase: Callable[[str, Parameters], None] = partial(
|
116
|
+
capture, top_block_cls=_tagged_staircase
|
117
|
+
)
|