spectre-core 0.0.25__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.
Files changed (33) hide show
  1. spectre_core/__init__.py +1 -1
  2. spectre_core/capture_configs/_capture_config.py +2 -0
  3. spectre_core/plotting/_panel_stack.py +11 -4
  4. spectre_core/receivers/__init__.py +11 -8
  5. spectre_core/receivers/_factory.py +16 -11
  6. spectre_core/receivers/_receiver.py +246 -0
  7. spectre_core/receivers/_register.py +3 -3
  8. spectre_core/receivers/{_spec_names.py → _specs.py} +42 -7
  9. spectre_core/receivers/plugins/_b200mini.py +219 -34
  10. spectre_core/receivers/plugins/{gr/_usrp.py → _b200mini_gr.py} +38 -61
  11. spectre_core/receivers/plugins/_custom.py +20 -0
  12. spectre_core/receivers/plugins/{gr/_base.py → _gr.py} +1 -1
  13. spectre_core/receivers/plugins/_receiver_names.py +5 -3
  14. spectre_core/receivers/plugins/_rsp1a.py +38 -43
  15. spectre_core/receivers/plugins/_rsp1a_gr.py +112 -0
  16. spectre_core/receivers/plugins/_rspduo.py +47 -57
  17. spectre_core/receivers/plugins/_rspduo_gr.py +165 -0
  18. spectre_core/receivers/plugins/_sdrplay_receiver.py +146 -42
  19. spectre_core/receivers/plugins/_signal_generator.py +225 -0
  20. spectre_core/receivers/plugins/_signal_generator_gr.py +77 -0
  21. spectre_core/spectrograms/_analytical.py +18 -18
  22. {spectre_core-0.0.25.dist-info → spectre_core-0.0.26.dist-info}/METADATA +1 -1
  23. {spectre_core-0.0.25.dist-info → spectre_core-0.0.26.dist-info}/RECORD +26 -27
  24. spectre_core/receivers/_base.py +0 -242
  25. spectre_core/receivers/plugins/_test.py +0 -225
  26. spectre_core/receivers/plugins/_usrp.py +0 -213
  27. spectre_core/receivers/plugins/gr/__init__.py +0 -3
  28. spectre_core/receivers/plugins/gr/_rsp1a.py +0 -127
  29. spectre_core/receivers/plugins/gr/_rspduo.py +0 -202
  30. spectre_core/receivers/plugins/gr/_test.py +0 -117
  31. {spectre_core-0.0.25.dist-info → spectre_core-0.0.26.dist-info}/WHEEL +0 -0
  32. {spectre_core-0.0.25.dist-info → spectre_core-0.0.26.dist-info}/licenses/LICENSE +0 -0
  33. {spectre_core-0.0.25.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,3 +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
@@ -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
- )