spectre-core 0.0.24__py3-none-any.whl → 0.0.26__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/__init__.py +1 -1
- spectre_core/capture_configs/_capture_config.py +2 -0
- spectre_core/plotting/_panel_stack.py +11 -0
- spectre_core/receivers/__init__.py +11 -8
- spectre_core/receivers/_factory.py +16 -11
- spectre_core/receivers/_receiver.py +246 -0
- spectre_core/receivers/_register.py +3 -3
- spectre_core/receivers/{_spec_names.py → _specs.py} +42 -7
- spectre_core/receivers/plugins/_b200mini.py +219 -34
- spectre_core/receivers/plugins/{gr/_usrp.py → _b200mini_gr.py} +38 -61
- spectre_core/receivers/plugins/_custom.py +20 -0
- spectre_core/receivers/plugins/{gr/_base.py → _gr.py} +1 -1
- spectre_core/receivers/plugins/_receiver_names.py +5 -3
- spectre_core/receivers/plugins/_rsp1a.py +38 -43
- spectre_core/receivers/plugins/_rsp1a_gr.py +112 -0
- spectre_core/receivers/plugins/_rspduo.py +47 -57
- spectre_core/receivers/plugins/_rspduo_gr.py +165 -0
- spectre_core/receivers/plugins/_sdrplay_receiver.py +146 -42
- spectre_core/receivers/plugins/_signal_generator.py +225 -0
- spectre_core/receivers/plugins/_signal_generator_gr.py +77 -0
- spectre_core/spectrograms/_analytical.py +18 -18
- {spectre_core-0.0.24.dist-info → spectre_core-0.0.26.dist-info}/METADATA +1 -1
- {spectre_core-0.0.24.dist-info → spectre_core-0.0.26.dist-info}/RECORD +26 -27
- spectre_core/receivers/_base.py +0 -242
- spectre_core/receivers/plugins/_test.py +0 -225
- spectre_core/receivers/plugins/_usrp.py +0 -213
- spectre_core/receivers/plugins/gr/__init__.py +0 -3
- spectre_core/receivers/plugins/gr/_rsp1a.py +0 -127
- spectre_core/receivers/plugins/gr/_rspduo.py +0 -202
- spectre_core/receivers/plugins/gr/_test.py +0 -117
- {spectre_core-0.0.24.dist-info → spectre_core-0.0.26.dist-info}/WHEEL +0 -0
- {spectre_core-0.0.24.dist-info → spectre_core-0.0.26.dist-info}/licenses/LICENSE +0 -0
- {spectre_core-0.0.24.dist-info → spectre_core-0.0.26.dist-info}/top_level.txt +0 -0
@@ -1,213 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
2
|
-
# This file is part of SPECTRE
|
3
|
-
# SPDX-License-Identifier: GPL-3.0-or-later
|
4
|
-
|
5
|
-
from typing import Callable, overload
|
6
|
-
|
7
|
-
from spectre_core.capture_configs import (
|
8
|
-
CaptureTemplate,
|
9
|
-
CaptureMode,
|
10
|
-
Parameters,
|
11
|
-
Bound,
|
12
|
-
PName,
|
13
|
-
get_base_capture_template,
|
14
|
-
get_base_ptemplate,
|
15
|
-
OneOf,
|
16
|
-
validate_sample_rate_with_master_clock_rate,
|
17
|
-
validate_fixed_center_frequency,
|
18
|
-
validate_swept_center_frequency,
|
19
|
-
)
|
20
|
-
from .._base import BaseReceiver
|
21
|
-
from .._spec_names import SpecName
|
22
|
-
|
23
|
-
|
24
|
-
def get_pvalidator_fixed_center_frequency(
|
25
|
-
usrp_receiver: BaseReceiver,
|
26
|
-
) -> Callable[[Parameters], None]:
|
27
|
-
def pvalidator(parameters: Parameters) -> None:
|
28
|
-
validate_fixed_center_frequency(parameters)
|
29
|
-
validate_sample_rate_with_master_clock_rate(parameters)
|
30
|
-
|
31
|
-
return pvalidator
|
32
|
-
|
33
|
-
|
34
|
-
def get_pvalidator_swept_center_frequency(
|
35
|
-
usrp_receiver: BaseReceiver,
|
36
|
-
) -> Callable[[Parameters], None]:
|
37
|
-
def pvalidator(parameters: Parameters) -> None:
|
38
|
-
validate_swept_center_frequency(
|
39
|
-
parameters, usrp_receiver.get_spec(SpecName.API_RETUNING_LATENCY)
|
40
|
-
)
|
41
|
-
validate_sample_rate_with_master_clock_rate(parameters)
|
42
|
-
|
43
|
-
return pvalidator
|
44
|
-
|
45
|
-
|
46
|
-
def get_capture_template_fixed_center_frequency(
|
47
|
-
usrp_receiver: BaseReceiver,
|
48
|
-
) -> CaptureTemplate:
|
49
|
-
|
50
|
-
capture_template = get_base_capture_template(CaptureMode.FIXED_CENTER_FREQUENCY)
|
51
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.BANDWIDTH))
|
52
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.GAIN))
|
53
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.WIRE_FORMAT))
|
54
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.MASTER_CLOCK_RATE))
|
55
|
-
|
56
|
-
# TODO: Delegate defaults to receiver subclasses. Currently, these are sensible defaults for the b200mini
|
57
|
-
capture_template.set_defaults(
|
58
|
-
(PName.BATCH_SIZE, 4.0),
|
59
|
-
(PName.CENTER_FREQUENCY, 95800000),
|
60
|
-
(PName.SAMPLE_RATE, 2000000),
|
61
|
-
(PName.BANDWIDTH, 2000000),
|
62
|
-
(PName.WINDOW_HOP, 512),
|
63
|
-
(PName.WINDOW_SIZE, 1024),
|
64
|
-
(PName.WINDOW_TYPE, "blackman"),
|
65
|
-
(PName.GAIN, 35),
|
66
|
-
(PName.WIRE_FORMAT, "sc16"),
|
67
|
-
(PName.MASTER_CLOCK_RATE, 40e6),
|
68
|
-
)
|
69
|
-
|
70
|
-
capture_template.add_pconstraint(
|
71
|
-
PName.CENTER_FREQUENCY,
|
72
|
-
[
|
73
|
-
Bound(
|
74
|
-
lower_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_LOWER_BOUND),
|
75
|
-
upper_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_UPPER_BOUND),
|
76
|
-
)
|
77
|
-
],
|
78
|
-
)
|
79
|
-
capture_template.add_pconstraint(
|
80
|
-
PName.SAMPLE_RATE,
|
81
|
-
[
|
82
|
-
Bound(
|
83
|
-
lower_bound=usrp_receiver.get_spec(SpecName.SAMPLE_RATE_LOWER_BOUND),
|
84
|
-
upper_bound=usrp_receiver.get_spec(SpecName.SAMPLE_RATE_UPPER_BOUND),
|
85
|
-
)
|
86
|
-
],
|
87
|
-
)
|
88
|
-
capture_template.add_pconstraint(
|
89
|
-
PName.BANDWIDTH,
|
90
|
-
[
|
91
|
-
Bound(
|
92
|
-
lower_bound=usrp_receiver.get_spec(SpecName.BANDWIDTH_LOWER_BOUND),
|
93
|
-
upper_bound=usrp_receiver.get_spec(SpecName.BANDWIDTH_UPPER_BOUND),
|
94
|
-
)
|
95
|
-
],
|
96
|
-
)
|
97
|
-
capture_template.add_pconstraint(
|
98
|
-
PName.GAIN,
|
99
|
-
[
|
100
|
-
Bound(
|
101
|
-
lower_bound=0,
|
102
|
-
upper_bound=usrp_receiver.get_spec(SpecName.GAIN_UPPER_BOUND),
|
103
|
-
)
|
104
|
-
],
|
105
|
-
)
|
106
|
-
capture_template.add_pconstraint(
|
107
|
-
PName.WIRE_FORMAT, [OneOf(usrp_receiver.get_spec(SpecName.WIRE_FORMATS))]
|
108
|
-
)
|
109
|
-
capture_template.add_pconstraint(
|
110
|
-
PName.MASTER_CLOCK_RATE,
|
111
|
-
[
|
112
|
-
Bound(
|
113
|
-
lower_bound=usrp_receiver.get_spec(
|
114
|
-
SpecName.MASTER_CLOCK_RATE_LOWER_BOUND
|
115
|
-
),
|
116
|
-
upper_bound=usrp_receiver.get_spec(
|
117
|
-
SpecName.MASTER_CLOCK_RATE_UPPER_BOUND
|
118
|
-
),
|
119
|
-
)
|
120
|
-
],
|
121
|
-
)
|
122
|
-
return capture_template
|
123
|
-
|
124
|
-
|
125
|
-
def get_capture_template_swept_center_frequency(
|
126
|
-
usrp_receiver: BaseReceiver,
|
127
|
-
) -> CaptureTemplate:
|
128
|
-
|
129
|
-
capture_template = get_base_capture_template(CaptureMode.SWEPT_CENTER_FREQUENCY)
|
130
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.BANDWIDTH))
|
131
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.GAIN))
|
132
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.WIRE_FORMAT))
|
133
|
-
capture_template.add_ptemplate(get_base_ptemplate(PName.MASTER_CLOCK_RATE))
|
134
|
-
|
135
|
-
# TODO: Delegate defaults to receiver subclasses. Currently, these are sensible defaults for the b200mini
|
136
|
-
capture_template.set_defaults(
|
137
|
-
(PName.BATCH_SIZE, 4.0),
|
138
|
-
(PName.MIN_FREQUENCY, 95000000),
|
139
|
-
(PName.MAX_FREQUENCY, 105000000),
|
140
|
-
(PName.SAMPLES_PER_STEP, 30000),
|
141
|
-
(PName.FREQUENCY_STEP, 2000000),
|
142
|
-
(PName.SAMPLE_RATE, 2000000),
|
143
|
-
(PName.BANDWIDTH, 2000000),
|
144
|
-
(PName.WINDOW_HOP, 512),
|
145
|
-
(PName.WINDOW_SIZE, 1024),
|
146
|
-
(PName.WINDOW_TYPE, "blackman"),
|
147
|
-
(PName.GAIN, 35),
|
148
|
-
(PName.WIRE_FORMAT, "sc16"),
|
149
|
-
(PName.MASTER_CLOCK_RATE, 40e6),
|
150
|
-
)
|
151
|
-
|
152
|
-
capture_template.add_pconstraint(
|
153
|
-
PName.MIN_FREQUENCY,
|
154
|
-
[
|
155
|
-
Bound(
|
156
|
-
lower_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_LOWER_BOUND),
|
157
|
-
upper_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_UPPER_BOUND),
|
158
|
-
)
|
159
|
-
],
|
160
|
-
)
|
161
|
-
capture_template.add_pconstraint(
|
162
|
-
PName.MAX_FREQUENCY,
|
163
|
-
[
|
164
|
-
Bound(
|
165
|
-
lower_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_LOWER_BOUND),
|
166
|
-
upper_bound=usrp_receiver.get_spec(SpecName.FREQUENCY_UPPER_BOUND),
|
167
|
-
)
|
168
|
-
],
|
169
|
-
)
|
170
|
-
capture_template.add_pconstraint(
|
171
|
-
PName.SAMPLE_RATE,
|
172
|
-
[
|
173
|
-
Bound(
|
174
|
-
lower_bound=usrp_receiver.get_spec(SpecName.SAMPLE_RATE_LOWER_BOUND),
|
175
|
-
upper_bound=usrp_receiver.get_spec(SpecName.SAMPLE_RATE_UPPER_BOUND),
|
176
|
-
)
|
177
|
-
],
|
178
|
-
)
|
179
|
-
capture_template.add_pconstraint(
|
180
|
-
PName.BANDWIDTH,
|
181
|
-
[
|
182
|
-
Bound(
|
183
|
-
lower_bound=usrp_receiver.get_spec(SpecName.BANDWIDTH_LOWER_BOUND),
|
184
|
-
upper_bound=usrp_receiver.get_spec(SpecName.BANDWIDTH_UPPER_BOUND),
|
185
|
-
)
|
186
|
-
],
|
187
|
-
)
|
188
|
-
capture_template.add_pconstraint(
|
189
|
-
PName.GAIN,
|
190
|
-
[
|
191
|
-
Bound(
|
192
|
-
lower_bound=0,
|
193
|
-
upper_bound=usrp_receiver.get_spec(SpecName.GAIN_UPPER_BOUND),
|
194
|
-
)
|
195
|
-
],
|
196
|
-
)
|
197
|
-
capture_template.add_pconstraint(
|
198
|
-
PName.WIRE_FORMAT, [OneOf(usrp_receiver.get_spec(SpecName.WIRE_FORMATS))]
|
199
|
-
)
|
200
|
-
capture_template.add_pconstraint(
|
201
|
-
PName.MASTER_CLOCK_RATE,
|
202
|
-
[
|
203
|
-
Bound(
|
204
|
-
lower_bound=usrp_receiver.get_spec(
|
205
|
-
SpecName.MASTER_CLOCK_RATE_LOWER_BOUND
|
206
|
-
),
|
207
|
-
upper_bound=usrp_receiver.get_spec(
|
208
|
-
SpecName.MASTER_CLOCK_RATE_UPPER_BOUND
|
209
|
-
),
|
210
|
-
)
|
211
|
-
],
|
212
|
-
)
|
213
|
-
return capture_template
|
@@ -1,127 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# RSP1A receiver top blocks
|
3
|
-
#
|
4
|
-
|
5
|
-
from functools import partial
|
6
|
-
from dataclasses import dataclass
|
7
|
-
|
8
|
-
from spectre_core.capture_configs import Parameters, PName
|
9
|
-
from spectre_core.config import get_batches_dir_path
|
10
|
-
from ._base import capture, spectre_top_block
|
11
|
-
|
12
|
-
|
13
|
-
class _fixed_center_frequency(spectre_top_block):
|
14
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
15
|
-
# OOT Module inline imports
|
16
|
-
from gnuradio import spectre
|
17
|
-
from gnuradio import sdrplay3
|
18
|
-
|
19
|
-
# Unpack the capture config parameters
|
20
|
-
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
21
|
-
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
22
|
-
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
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)
|
26
|
-
|
27
|
-
# Blocks
|
28
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
29
|
-
get_batches_dir_path(), tag, batch_size, sample_rate
|
30
|
-
)
|
31
|
-
self.sdrplay3_rsp1a_0 = sdrplay3.rsp1a(
|
32
|
-
"",
|
33
|
-
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
34
|
-
)
|
35
|
-
self.sdrplay3_rsp1a_0.set_sample_rate(sample_rate)
|
36
|
-
self.sdrplay3_rsp1a_0.set_center_freq(center_freq)
|
37
|
-
self.sdrplay3_rsp1a_0.set_bandwidth(bandwidth)
|
38
|
-
self.sdrplay3_rsp1a_0.set_gain_mode(False)
|
39
|
-
self.sdrplay3_rsp1a_0.set_gain(if_gain, "IF")
|
40
|
-
self.sdrplay3_rsp1a_0.set_gain(rf_gain, "RF")
|
41
|
-
self.sdrplay3_rsp1a_0.set_freq_corr(0)
|
42
|
-
self.sdrplay3_rsp1a_0.set_dc_offset_mode(False)
|
43
|
-
self.sdrplay3_rsp1a_0.set_iq_balance_mode(False)
|
44
|
-
self.sdrplay3_rsp1a_0.set_agc_setpoint(-30)
|
45
|
-
self.sdrplay3_rsp1a_0.set_rf_notch_filter(False)
|
46
|
-
self.sdrplay3_rsp1a_0.set_dab_notch_filter(False)
|
47
|
-
self.sdrplay3_rsp1a_0.set_biasT(False)
|
48
|
-
self.sdrplay3_rsp1a_0.set_debug_mode(False)
|
49
|
-
self.sdrplay3_rsp1a_0.set_sample_sequence_gaps_check(False)
|
50
|
-
self.sdrplay3_rsp1a_0.set_show_gain_changes(False)
|
51
|
-
|
52
|
-
# Connections
|
53
|
-
self.connect((self.sdrplay3_rsp1a_0, 0), (self.spectre_batched_file_sink_0, 0))
|
54
|
-
|
55
|
-
|
56
|
-
class _swept_center_frequency(spectre_top_block):
|
57
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
58
|
-
# OOT Module inline imports
|
59
|
-
from gnuradio import spectre
|
60
|
-
from gnuradio import sdrplay3
|
61
|
-
|
62
|
-
# Unpack the capture config parameters
|
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)
|
68
|
-
samples_per_step = parameters.get_parameter_value(PName.SAMPLES_PER_STEP)
|
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)
|
72
|
-
|
73
|
-
# Blocks
|
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
|
-
)
|
91
|
-
self.sdrplay3_rsp1a_0 = sdrplay3.rsp1a(
|
92
|
-
"",
|
93
|
-
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
94
|
-
)
|
95
|
-
self.sdrplay3_rsp1a_0.set_sample_rate(sample_rate, True)
|
96
|
-
self.sdrplay3_rsp1a_0.set_center_freq(min_frequency, True)
|
97
|
-
self.sdrplay3_rsp1a_0.set_bandwidth(bandwidth)
|
98
|
-
self.sdrplay3_rsp1a_0.set_gain_mode(False)
|
99
|
-
self.sdrplay3_rsp1a_0.set_gain(if_gain, "IF", True)
|
100
|
-
self.sdrplay3_rsp1a_0.set_gain(rf_gain, "RF", True)
|
101
|
-
self.sdrplay3_rsp1a_0.set_freq_corr(0)
|
102
|
-
self.sdrplay3_rsp1a_0.set_dc_offset_mode(False)
|
103
|
-
self.sdrplay3_rsp1a_0.set_iq_balance_mode(False)
|
104
|
-
self.sdrplay3_rsp1a_0.set_agc_setpoint(-30)
|
105
|
-
self.sdrplay3_rsp1a_0.set_rf_notch_filter(False)
|
106
|
-
self.sdrplay3_rsp1a_0.set_dab_notch_filter(False)
|
107
|
-
self.sdrplay3_rsp1a_0.set_biasT(False)
|
108
|
-
self.sdrplay3_rsp1a_0.set_stream_tags(True)
|
109
|
-
self.sdrplay3_rsp1a_0.set_debug_mode(False)
|
110
|
-
self.sdrplay3_rsp1a_0.set_sample_sequence_gaps_check(False)
|
111
|
-
self.sdrplay3_rsp1a_0.set_show_gain_changes(False)
|
112
|
-
|
113
|
-
# Connections
|
114
|
-
self.msg_connect(
|
115
|
-
(self.spectre_sweep_driver_0, "retune_command"),
|
116
|
-
(self.sdrplay3_rsp1a_0, "command"),
|
117
|
-
)
|
118
|
-
self.connect((self.sdrplay3_rsp1a_0, 0), (self.spectre_batched_file_sink_0, 0))
|
119
|
-
self.connect((self.sdrplay3_rsp1a_0, 0), (self.spectre_sweep_driver_0, 0))
|
120
|
-
|
121
|
-
|
122
|
-
@dataclass(frozen=True)
|
123
|
-
class CaptureMethod:
|
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
|
-
)
|
@@ -1,202 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
|
-
#
|
5
|
-
# SPDX-License-Identifier: GPL-3.0
|
6
|
-
#
|
7
|
-
# GNU Radio Python Flow Graph
|
8
|
-
# Title: Test receiver
|
9
|
-
# GNU Radio version: 3.10.1.1
|
10
|
-
|
11
|
-
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
12
|
-
# This file is part of SPECTRE
|
13
|
-
# SPDX-License-Identifier: GPL-3.0-or-later
|
14
|
-
|
15
|
-
#
|
16
|
-
# RSPduo receiver top blocks
|
17
|
-
#
|
18
|
-
|
19
|
-
from functools import partial
|
20
|
-
from dataclasses import dataclass
|
21
|
-
|
22
|
-
from spectre_core.capture_configs import Parameters, PName
|
23
|
-
from spectre_core.config import get_batches_dir_path
|
24
|
-
from ._base import capture, spectre_top_block
|
25
|
-
|
26
|
-
|
27
|
-
class _tuner_1_fixed_center_frequency(spectre_top_block):
|
28
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
29
|
-
# OOT Module inline imports
|
30
|
-
from gnuradio import spectre
|
31
|
-
from gnuradio import sdrplay3
|
32
|
-
|
33
|
-
# Unpack the capture config parameters
|
34
|
-
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
35
|
-
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
36
|
-
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
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)
|
40
|
-
|
41
|
-
# Blocks
|
42
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
43
|
-
get_batches_dir_path(), tag, batch_size, sample_rate
|
44
|
-
)
|
45
|
-
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
46
|
-
"",
|
47
|
-
rspduo_mode="Single Tuner",
|
48
|
-
antenna="Tuner 1 50 ohm",
|
49
|
-
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
50
|
-
)
|
51
|
-
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
52
|
-
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
53
|
-
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
54
|
-
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
55
|
-
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
56
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF")
|
57
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF")
|
58
|
-
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
59
|
-
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
60
|
-
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
61
|
-
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
62
|
-
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
63
|
-
self.sdrplay3_rspduo_0.set_dab_notch_filter(False)
|
64
|
-
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
65
|
-
self.sdrplay3_rspduo_0.set_biasT(False)
|
66
|
-
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
67
|
-
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
68
|
-
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
69
|
-
|
70
|
-
# Connections
|
71
|
-
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
72
|
-
|
73
|
-
|
74
|
-
class _tuner_2_fixed_center_frequency(spectre_top_block):
|
75
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
76
|
-
# OOT Module inline imports
|
77
|
-
from gnuradio import spectre
|
78
|
-
from gnuradio import sdrplay3
|
79
|
-
|
80
|
-
# Unpack the capture config parameters
|
81
|
-
sample_rate = parameters.get_parameter_value(PName.SAMPLE_RATE)
|
82
|
-
batch_size = parameters.get_parameter_value(PName.BATCH_SIZE)
|
83
|
-
center_freq = parameters.get_parameter_value(PName.CENTER_FREQUENCY)
|
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)
|
87
|
-
|
88
|
-
# Blocks
|
89
|
-
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(
|
90
|
-
get_batches_dir_path(), tag, batch_size, sample_rate
|
91
|
-
)
|
92
|
-
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
93
|
-
"",
|
94
|
-
rspduo_mode="Single Tuner",
|
95
|
-
antenna="Tuner 2 50 ohm",
|
96
|
-
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
97
|
-
)
|
98
|
-
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
99
|
-
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
100
|
-
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
101
|
-
self.sdrplay3_rspduo_0.set_antenna("Tuner 2 50 ohm")
|
102
|
-
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
103
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF")
|
104
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF", False)
|
105
|
-
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
106
|
-
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
107
|
-
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
108
|
-
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
109
|
-
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
110
|
-
self.sdrplay3_rspduo_0.set_dab_notch_filter(False)
|
111
|
-
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
112
|
-
self.sdrplay3_rspduo_0.set_biasT(False)
|
113
|
-
self.sdrplay3_rspduo_0.set_stream_tags(False)
|
114
|
-
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
115
|
-
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
116
|
-
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
117
|
-
|
118
|
-
# Connections
|
119
|
-
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
120
|
-
|
121
|
-
|
122
|
-
class _tuner_1_swept_center_frequency(spectre_top_block):
|
123
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
124
|
-
# OOT Module inline imports
|
125
|
-
from gnuradio import spectre
|
126
|
-
from gnuradio import sdrplay3
|
127
|
-
|
128
|
-
# Unpack the capture config parameters
|
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)
|
134
|
-
samples_per_step = parameters.get_parameter_value(PName.SAMPLES_PER_STEP)
|
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)
|
138
|
-
|
139
|
-
# Blocks
|
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
|
-
)
|
157
|
-
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
158
|
-
"",
|
159
|
-
rspduo_mode="Single Tuner",
|
160
|
-
antenna="Tuner 1 50 ohm",
|
161
|
-
stream_args=sdrplay3.stream_args(output_type="fc32", channels_size=1),
|
162
|
-
)
|
163
|
-
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate, True)
|
164
|
-
self.sdrplay3_rspduo_0.set_center_freq(min_frequency, True)
|
165
|
-
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
166
|
-
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
167
|
-
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
168
|
-
self.sdrplay3_rspduo_0.set_gain(if_gain, "IF", True)
|
169
|
-
self.sdrplay3_rspduo_0.set_gain(rf_gain, "RF", True)
|
170
|
-
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
171
|
-
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
172
|
-
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
173
|
-
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
174
|
-
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
175
|
-
self.sdrplay3_rspduo_0.set_dab_notch_filter(True)
|
176
|
-
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
177
|
-
self.sdrplay3_rspduo_0.set_biasT(False)
|
178
|
-
self.sdrplay3_rspduo_0.set_stream_tags(True)
|
179
|
-
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
180
|
-
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
181
|
-
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
182
|
-
|
183
|
-
# Connections
|
184
|
-
self.msg_connect(
|
185
|
-
(self.spectre_sweep_driver_0, "retune_command"),
|
186
|
-
(self.sdrplay3_rspduo_0, "command"),
|
187
|
-
)
|
188
|
-
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
189
|
-
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_sweep_driver_0, 0))
|
190
|
-
|
191
|
-
|
192
|
-
@dataclass(frozen=True)
|
193
|
-
class CaptureMethod:
|
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
|
-
)
|
@@ -1,117 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
|
4
|
-
#
|
5
|
-
# SPDX-License-Identifier: GPL-3.0
|
6
|
-
#
|
7
|
-
# GNU Radio Python Flow Graph
|
8
|
-
# Title: Test receiver
|
9
|
-
# GNU Radio version: 3.10.1.1
|
10
|
-
|
11
|
-
# SPDX-FileCopyrightText: © 2024-2025 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
12
|
-
# This file is part of SPECTRE
|
13
|
-
# SPDX-License-Identifier: GPL-3.0-or-later
|
14
|
-
|
15
|
-
#
|
16
|
-
# Test receiver top blocks
|
17
|
-
#
|
18
|
-
|
19
|
-
from functools import partial
|
20
|
-
from typing import Callable
|
21
|
-
from dataclasses import dataclass
|
22
|
-
|
23
|
-
from gnuradio import gr
|
24
|
-
from gnuradio import blocks
|
25
|
-
from gnuradio import analog
|
26
|
-
|
27
|
-
from spectre_core.capture_configs import Parameters, PName
|
28
|
-
from spectre_core.config import get_batches_dir_path
|
29
|
-
from ._base import capture, spectre_top_block
|
30
|
-
|
31
|
-
|
32
|
-
class _cosine_signal_1(spectre_top_block):
|
33
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
34
|
-
# Inline imports
|
35
|
-
from gnuradio import spectre
|
36
|
-
|
37
|
-
# Unpack the capture config parameters
|
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)
|
42
|
-
|
43
|
-
# Blocks
|
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)
|
50
|
-
self.blocks_float_to_complex_1 = blocks.float_to_complex(1)
|
51
|
-
self.analog_sig_source_x_0 = analog.sig_source_f(
|
52
|
-
samp_rate, analog.GR_COS_WAVE, frequency, amplitude, 0, 0
|
53
|
-
)
|
54
|
-
|
55
|
-
##################################################
|
56
|
-
# Connections
|
57
|
-
##################################################
|
58
|
-
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0))
|
59
|
-
self.connect(
|
60
|
-
(self.blocks_float_to_complex_1, 0), (self.spectre_batched_file_sink_0, 0)
|
61
|
-
)
|
62
|
-
self.connect((self.blocks_null_source_1, 0), (self.blocks_throttle_0_1, 0))
|
63
|
-
self.connect((self.blocks_throttle_0, 0), (self.blocks_float_to_complex_1, 0))
|
64
|
-
self.connect((self.blocks_throttle_0_1, 0), (self.blocks_float_to_complex_1, 1))
|
65
|
-
|
66
|
-
|
67
|
-
class _tagged_staircase(spectre_top_block):
|
68
|
-
def flowgraph(self, tag: str, parameters: Parameters) -> None:
|
69
|
-
# Inline imports
|
70
|
-
from gnuradio import spectre
|
71
|
-
|
72
|
-
##################################################
|
73
|
-
# Unpack capture config
|
74
|
-
##################################################
|
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)
|
85
|
-
|
86
|
-
##################################################
|
87
|
-
# Blocks
|
88
|
-
##################################################
|
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
|
-
)
|
102
|
-
|
103
|
-
##################################################
|
104
|
-
# Connections
|
105
|
-
##################################################
|
106
|
-
self.connect((self.blocks_throttle_0, 0), (self.spectre_batched_file_sink_0, 0))
|
107
|
-
self.connect((self.spectre_tagged_staircase_0, 0), (self.blocks_throttle_0, 0))
|
108
|
-
|
109
|
-
|
110
|
-
@dataclass(frozen=True)
|
111
|
-
class CaptureMethod:
|
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
|
-
)
|
File without changes
|
File without changes
|
File without changes
|