spectre-core 0.0.10__tar.gz → 0.0.11__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.
- {spectre_core-0.0.10 → spectre_core-0.0.11}/PKG-INFO +1 -1
- {spectre_core-0.0.10 → spectre_core-0.0.11}/pyproject.toml +1 -1
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pvalidators.py +2 -4
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_base.py +1 -1
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/__init__.py +1 -0
- spectre_core-0.0.11/src/spectre_core/receivers/_base.py +180 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_rsp1a.py +5 -5
- spectre_core-0.0.11/src/spectre_core/receivers/gr/_rspduo.py +227 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_test.py +2 -2
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/library/_rsp1a.py +4 -4
- spectre_core-0.0.11/src/spectre_core/receivers/library/_rspduo.py +69 -0
- spectre_core-0.0.10/src/spectre_core/receivers/_base.py → spectre_core-0.0.11/src/spectre_core/receivers/library/_sdrplay_receiver.py +6 -173
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/PKG-INFO +1 -1
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/SOURCES.txt +1 -0
- spectre_core-0.0.10/src/spectre_core/receivers/gr/_rspduo.py +0 -0
- spectre_core-0.0.10/src/spectre_core/receivers/library/_rspduo.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/LICENSE +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/README.md +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/setup.cfg +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/_file_io/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/_file_io/file_handlers.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_config.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_templates.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_parameters.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pconstraints.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_ptemplates.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_base.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_chunks.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_factory.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_register.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_callisto.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_fixed_center_frequency.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_swept_center_frequency.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/_paths.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/_time_formats.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/exceptions.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_configure.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_decorators.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_log_handlers.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_base.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_format.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_panel_stack.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_panels.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_factory.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_post_processor.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_register.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/library/_fixed_center_frequency.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/library/_swept_center_frequency.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_factory.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_register.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_spec_names.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_base.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/library/_test.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_analytical.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_array_operations.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_spectrogram.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_transform.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/wgetting/__init__.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/wgetting/_callisto.py +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/dependency_links.txt +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/requires.txt +0 -0
- {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/top_level.txt +0 -0
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pvalidators.py
RENAMED
@@ -131,10 +131,8 @@ def _validate_step_interval(
|
|
131
131
|
|
132
132
|
step_interval = samples_per_step * 1/ sample_rate # [s]
|
133
133
|
if step_interval < api_latency:
|
134
|
-
|
135
|
-
|
136
|
-
warn(warning_message)
|
137
|
-
_LOGGER.warning(warning_message)
|
134
|
+
raise ValueError(f"The computed step interval of {step_interval} [s] is of the order of empirically "
|
135
|
+
f"derived api latency {api_latency} [s]; you may experience undefined behaviour!")
|
138
136
|
|
139
137
|
|
140
138
|
def _validate_fixed_center_frequency_parameters(
|
@@ -104,7 +104,7 @@ class BaseEventHandler(ABC, FileSystemEventHandler):
|
|
104
104
|
self._cached_spectrogram = join_spectrograms([self._cached_spectrogram, spectrogram])
|
105
105
|
|
106
106
|
# if the time range is not specified
|
107
|
-
time_range = self._capture_config.get_parameter_value(PNames.TIME_RANGE) or
|
107
|
+
time_range = self._capture_config.get_parameter_value(PNames.TIME_RANGE) or 0.0
|
108
108
|
|
109
109
|
if self._cached_spectrogram.time_range >= time_range:
|
110
110
|
self._flush_cache()
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# SPDX-FileCopyrightText: © 2024 Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
|
2
|
+
# This file is part of SPECTRE
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
4
|
+
|
5
|
+
from abc import ABC, abstractmethod
|
6
|
+
from typing import Callable, Optional
|
7
|
+
from numbers import Number
|
8
|
+
|
9
|
+
from spectre_core.exceptions import ModeNotFoundError
|
10
|
+
from ._spec_names import SpecNames
|
11
|
+
from spectre_core.capture_configs import (
|
12
|
+
CaptureTemplate, CaptureModes, Parameters, Bound, PValidators, PNames,
|
13
|
+
get_base_capture_template, get_base_ptemplate, OneOf, CaptureConfig
|
14
|
+
)
|
15
|
+
|
16
|
+
class BaseReceiver(ABC):
|
17
|
+
def __init__(self,
|
18
|
+
name: str,
|
19
|
+
mode: Optional[str] = None):
|
20
|
+
self._name = name
|
21
|
+
|
22
|
+
self._specs: dict[str, Number | list[Number]] = {}
|
23
|
+
self._add_specs()
|
24
|
+
|
25
|
+
self._capture_methods: dict[str, Callable] = {}
|
26
|
+
self._add_capture_methods()
|
27
|
+
|
28
|
+
self._pvalidators: dict[str, Callable] = {}
|
29
|
+
self._add_pvalidators()
|
30
|
+
|
31
|
+
self._capture_templates: dict[str, CaptureTemplate] = {}
|
32
|
+
self._add_capture_templates()
|
33
|
+
|
34
|
+
self.mode = mode
|
35
|
+
|
36
|
+
|
37
|
+
@abstractmethod
|
38
|
+
def _add_specs(self) -> None:
|
39
|
+
pass
|
40
|
+
|
41
|
+
|
42
|
+
@abstractmethod
|
43
|
+
def _add_capture_methods(self) -> None:
|
44
|
+
pass
|
45
|
+
|
46
|
+
|
47
|
+
@abstractmethod
|
48
|
+
def _add_pvalidators(self) -> None:
|
49
|
+
pass
|
50
|
+
|
51
|
+
|
52
|
+
@abstractmethod
|
53
|
+
def _add_capture_templates(self) -> None:
|
54
|
+
pass
|
55
|
+
|
56
|
+
|
57
|
+
@property
|
58
|
+
def name(self) -> str:
|
59
|
+
return self._name
|
60
|
+
|
61
|
+
|
62
|
+
@property
|
63
|
+
def capture_methods(self) -> dict[str, Callable]:
|
64
|
+
return self._capture_methods
|
65
|
+
|
66
|
+
|
67
|
+
@property
|
68
|
+
def pvalidators(self) -> dict[str, Callable]:
|
69
|
+
return self._pvalidators
|
70
|
+
|
71
|
+
|
72
|
+
@property
|
73
|
+
def capture_templates(self) -> dict[str, CaptureTemplate]:
|
74
|
+
return self._capture_templates
|
75
|
+
|
76
|
+
|
77
|
+
@property
|
78
|
+
def specs(self) -> dict[str, Number]:
|
79
|
+
return self._specs
|
80
|
+
|
81
|
+
|
82
|
+
@property
|
83
|
+
def modes(self) -> list[str]:
|
84
|
+
capture_method_modes = list(self.capture_methods.keys())
|
85
|
+
pvalidator_modes = list(self.pvalidators.keys())
|
86
|
+
capture_template_modes = list(self.capture_templates.keys())
|
87
|
+
|
88
|
+
if capture_method_modes == pvalidator_modes == capture_template_modes:
|
89
|
+
return capture_method_modes
|
90
|
+
else:
|
91
|
+
raise ValueError(f"Mode mismatch for the receiver {self.name}.")
|
92
|
+
|
93
|
+
|
94
|
+
@property
|
95
|
+
def mode(self) -> str:
|
96
|
+
return self._mode
|
97
|
+
|
98
|
+
|
99
|
+
@mode.setter
|
100
|
+
def mode(self, value: Optional[str]) -> None:
|
101
|
+
if (value is not None) and value not in self.modes:
|
102
|
+
raise ModeNotFoundError((f"{value} is not a defined mode for the receiver {self.name}. "
|
103
|
+
f"Expected one of {self.modes}"))
|
104
|
+
self._mode = value
|
105
|
+
|
106
|
+
|
107
|
+
@property
|
108
|
+
def capture_method(self) -> Callable:
|
109
|
+
return self.capture_methods[self.mode]
|
110
|
+
|
111
|
+
|
112
|
+
@property
|
113
|
+
def pvalidator(self) -> Callable:
|
114
|
+
return self.pvalidators[self.mode]
|
115
|
+
|
116
|
+
|
117
|
+
@property
|
118
|
+
def capture_template(self) -> CaptureTemplate:
|
119
|
+
return self._capture_templates[self.mode]
|
120
|
+
|
121
|
+
|
122
|
+
def add_capture_method(self,
|
123
|
+
mode: str,
|
124
|
+
capture_method: Callable) -> None:
|
125
|
+
self._capture_methods[mode] = capture_method
|
126
|
+
|
127
|
+
|
128
|
+
def add_pvalidator(self,
|
129
|
+
mode: str,
|
130
|
+
pvalidator: Callable) -> None:
|
131
|
+
self._pvalidators[mode] = pvalidator
|
132
|
+
|
133
|
+
|
134
|
+
def add_capture_template(self,
|
135
|
+
mode: str,
|
136
|
+
capture_template: CaptureTemplate) -> CaptureTemplate:
|
137
|
+
self._capture_templates[mode] = capture_template
|
138
|
+
|
139
|
+
|
140
|
+
def add_spec(self,
|
141
|
+
name: str,
|
142
|
+
value: Number) -> None:
|
143
|
+
self.specs[name] = value
|
144
|
+
|
145
|
+
|
146
|
+
def get_spec(self,
|
147
|
+
spec_name: str) -> Number | list[Number]:
|
148
|
+
if spec_name not in self.specs:
|
149
|
+
raise KeyError(f"Spec not found with name '{spec_name}' "
|
150
|
+
f"for the receiver '{self.name}'")
|
151
|
+
return self.specs[spec_name]
|
152
|
+
|
153
|
+
|
154
|
+
def start_capture(self,
|
155
|
+
tag: str) -> None:
|
156
|
+
self.capture_method( tag, self.load_parameters(tag) )
|
157
|
+
|
158
|
+
|
159
|
+
def save_parameters(self,
|
160
|
+
tag: str,
|
161
|
+
parameters: Parameters,
|
162
|
+
force: bool = False) -> None:
|
163
|
+
|
164
|
+
parameters = self.capture_template.apply_template(parameters)
|
165
|
+
self.pvalidator(parameters)
|
166
|
+
|
167
|
+
capture_config = CaptureConfig(tag)
|
168
|
+
capture_config.save_parameters(self.name,
|
169
|
+
self.mode,
|
170
|
+
parameters,
|
171
|
+
force=force)
|
172
|
+
|
173
|
+
def load_parameters(self,
|
174
|
+
tag: str) -> Parameters:
|
175
|
+
capture_config = CaptureConfig(tag)
|
176
|
+
|
177
|
+
parameters = self.capture_template.apply_template(capture_config.parameters)
|
178
|
+
self.pvalidator(parameters)
|
179
|
+
|
180
|
+
return parameters
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
14
14
|
|
15
15
|
#
|
16
|
-
#
|
16
|
+
# RSP1A receiver top blocks
|
17
17
|
#
|
18
18
|
|
19
19
|
from functools import partial
|
@@ -31,7 +31,7 @@ class _fixed_center_frequency(gr.top_block):
|
|
31
31
|
def __init__(self,
|
32
32
|
tag: str,
|
33
33
|
parameters: Parameters):
|
34
|
-
gr.top_block.__init__(self,
|
34
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
35
35
|
|
36
36
|
##################################################
|
37
37
|
# Unpack capture config
|
@@ -42,7 +42,7 @@ class _fixed_center_frequency(gr.top_block):
|
|
42
42
|
bandwidth = parameters.get_parameter_value(PNames.BANDWIDTH)
|
43
43
|
if_gain = parameters.get_parameter_value(PNames.IF_GAIN)
|
44
44
|
rf_gain = parameters.get_parameter_value(PNames.RF_GAIN)
|
45
|
-
|
45
|
+
|
46
46
|
|
47
47
|
##################################################
|
48
48
|
# Blocks
|
@@ -86,7 +86,7 @@ class _swept_center_frequency(gr.top_block):
|
|
86
86
|
def __init__(self,
|
87
87
|
tag: str,
|
88
88
|
parameters: Parameters):
|
89
|
-
gr.top_block.__init__(self,
|
89
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
90
90
|
|
91
91
|
##################################################
|
92
92
|
# Unpack capture config
|
@@ -155,4 +155,4 @@ class _swept_center_frequency(gr.top_block):
|
|
155
155
|
@dataclass(frozen=True)
|
156
156
|
class CaptureMethods:
|
157
157
|
fixed_center_frequency = partial(capture, top_block_cls=_fixed_center_frequency)
|
158
|
-
|
158
|
+
swept_center_frequency = partial(capture, top_block_cls=_swept_center_frequency)
|
@@ -0,0 +1,227 @@
|
|
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 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 gnuradio import gr
|
23
|
+
from gnuradio import spectre
|
24
|
+
from gnuradio import sdrplay3
|
25
|
+
|
26
|
+
from spectre_core.capture_configs import Parameters, PNames
|
27
|
+
from spectre_core.config import get_chunks_dir_path
|
28
|
+
from ._base import capture
|
29
|
+
|
30
|
+
|
31
|
+
class _tuner_1_fixed_center_frequency(gr.top_block):
|
32
|
+
def __init__(self,
|
33
|
+
tag: str,
|
34
|
+
parameters: Parameters):
|
35
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
36
|
+
gr.top_block.__init__(self, "tuner_1_fixed", catch_exceptions=True)
|
37
|
+
|
38
|
+
##################################################
|
39
|
+
# Unpack capture config
|
40
|
+
##################################################
|
41
|
+
sample_rate = parameters.get_parameter_value(PNames.SAMPLE_RATE)
|
42
|
+
batch_size = parameters.get_parameter_value(PNames.BATCH_SIZE)
|
43
|
+
center_freq = parameters.get_parameter_value(PNames.CENTER_FREQUENCY)
|
44
|
+
bandwidth = parameters.get_parameter_value(PNames.BANDWIDTH)
|
45
|
+
if_gain = parameters.get_parameter_value(PNames.IF_GAIN)
|
46
|
+
rf_gain = parameters.get_parameter_value(PNames.RF_GAIN)
|
47
|
+
|
48
|
+
##################################################
|
49
|
+
# Blocks
|
50
|
+
##################################################
|
51
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(get_chunks_dir_path(),
|
52
|
+
tag,
|
53
|
+
batch_size,
|
54
|
+
sample_rate)
|
55
|
+
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
56
|
+
'',
|
57
|
+
rspduo_mode="Single Tuner",
|
58
|
+
antenna="Tuner 1 50 ohm",
|
59
|
+
stream_args=sdrplay3.stream_args(
|
60
|
+
output_type='fc32',
|
61
|
+
channels_size=1
|
62
|
+
),
|
63
|
+
)
|
64
|
+
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
65
|
+
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
66
|
+
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
67
|
+
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
68
|
+
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
69
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, 'IF')
|
70
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, 'RF')
|
71
|
+
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
72
|
+
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
73
|
+
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
74
|
+
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
75
|
+
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
76
|
+
self.sdrplay3_rspduo_0.set_dab_notch_filter(False)
|
77
|
+
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
78
|
+
self.sdrplay3_rspduo_0.set_biasT(False)
|
79
|
+
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
80
|
+
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
81
|
+
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
82
|
+
|
83
|
+
|
84
|
+
##################################################
|
85
|
+
# Connections
|
86
|
+
##################################################
|
87
|
+
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
88
|
+
|
89
|
+
|
90
|
+
class _tuner_2_fixed_center_frequency(gr.top_block):
|
91
|
+
def __init__(self,
|
92
|
+
tag: str,
|
93
|
+
parameters: Parameters):
|
94
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
95
|
+
gr.top_block.__init__(self, "tuner_1_fixed", catch_exceptions=True)
|
96
|
+
|
97
|
+
##################################################
|
98
|
+
# Unpack capture config
|
99
|
+
##################################################
|
100
|
+
sample_rate = parameters.get_parameter_value(PNames.SAMPLE_RATE)
|
101
|
+
batch_size = parameters.get_parameter_value(PNames.BATCH_SIZE)
|
102
|
+
center_freq = parameters.get_parameter_value(PNames.CENTER_FREQUENCY)
|
103
|
+
bandwidth = parameters.get_parameter_value(PNames.BANDWIDTH)
|
104
|
+
if_gain = parameters.get_parameter_value(PNames.IF_GAIN)
|
105
|
+
rf_gain = parameters.get_parameter_value(PNames.RF_GAIN)
|
106
|
+
|
107
|
+
##################################################
|
108
|
+
# Blocks
|
109
|
+
##################################################
|
110
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(get_chunks_dir_path(),
|
111
|
+
tag,
|
112
|
+
batch_size,
|
113
|
+
sample_rate)
|
114
|
+
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
115
|
+
'',
|
116
|
+
rspduo_mode="Single Tuner",
|
117
|
+
antenna="Tuner 2 50 ohm",
|
118
|
+
stream_args=sdrplay3.stream_args(
|
119
|
+
output_type='fc32',
|
120
|
+
channels_size=1
|
121
|
+
),
|
122
|
+
)
|
123
|
+
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate)
|
124
|
+
self.sdrplay3_rspduo_0.set_center_freq(center_freq)
|
125
|
+
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
126
|
+
self.sdrplay3_rspduo_0.set_antenna("Tuner 2 50 ohm")
|
127
|
+
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
128
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, 'IF')
|
129
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, 'RF', False)
|
130
|
+
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
131
|
+
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
132
|
+
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
133
|
+
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
134
|
+
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
135
|
+
self.sdrplay3_rspduo_0.set_dab_notch_filter(False)
|
136
|
+
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
137
|
+
self.sdrplay3_rspduo_0.set_biasT(False)
|
138
|
+
self.sdrplay3_rspduo_0.set_stream_tags(False)
|
139
|
+
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
140
|
+
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
141
|
+
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
142
|
+
|
143
|
+
|
144
|
+
##################################################
|
145
|
+
# Connections
|
146
|
+
##################################################
|
147
|
+
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
148
|
+
|
149
|
+
|
150
|
+
class _tuner_1_swept_center_frequency(gr.top_block):
|
151
|
+
def __init__(self,
|
152
|
+
tag: str,
|
153
|
+
parameters: Parameters):
|
154
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
155
|
+
|
156
|
+
##################################################
|
157
|
+
# Unpack capture config
|
158
|
+
##################################################
|
159
|
+
sample_rate = parameters.get_parameter_value(PNames.SAMPLE_RATE)
|
160
|
+
bandwidth = parameters.get_parameter_value(PNames.BANDWIDTH)
|
161
|
+
min_frequency = parameters.get_parameter_value(PNames.MIN_FREQUENCY)
|
162
|
+
max_frequency = parameters.get_parameter_value(PNames.MAX_FREQUENCY)
|
163
|
+
frequency_step = parameters.get_parameter_value(PNames.FREQUENCY_STEP)
|
164
|
+
samples_per_step = parameters.get_parameter_value(PNames.SAMPLES_PER_STEP)
|
165
|
+
if_gain = parameters.get_parameter_value(PNames.IF_GAIN)
|
166
|
+
rf_gain = parameters.get_parameter_value(PNames.RF_GAIN)
|
167
|
+
batch_size = parameters.get_parameter_value(PNames.BATCH_SIZE)
|
168
|
+
|
169
|
+
##################################################
|
170
|
+
# Blocks
|
171
|
+
##################################################
|
172
|
+
self.spectre_sweep_driver_0 = spectre.sweep_driver(min_frequency,
|
173
|
+
max_frequency,
|
174
|
+
frequency_step,
|
175
|
+
sample_rate,
|
176
|
+
samples_per_step,
|
177
|
+
'freq')
|
178
|
+
self.spectre_batched_file_sink_0 = spectre.batched_file_sink(get_chunks_dir_path(),
|
179
|
+
tag,
|
180
|
+
batch_size,
|
181
|
+
sample_rate,
|
182
|
+
True,
|
183
|
+
'freq',
|
184
|
+
min_frequency)
|
185
|
+
self.sdrplay3_rspduo_0 = sdrplay3.rspduo(
|
186
|
+
'',
|
187
|
+
rspduo_mode="Single Tuner",
|
188
|
+
antenna="Tuner 1 50 ohm",
|
189
|
+
stream_args=sdrplay3.stream_args(
|
190
|
+
output_type='fc32',
|
191
|
+
channels_size=1
|
192
|
+
),
|
193
|
+
)
|
194
|
+
self.sdrplay3_rspduo_0.set_sample_rate(sample_rate, True)
|
195
|
+
self.sdrplay3_rspduo_0.set_center_freq(min_frequency, True)
|
196
|
+
self.sdrplay3_rspduo_0.set_bandwidth(bandwidth)
|
197
|
+
self.sdrplay3_rspduo_0.set_antenna("Tuner 1 50 ohm")
|
198
|
+
self.sdrplay3_rspduo_0.set_gain_mode(False)
|
199
|
+
self.sdrplay3_rspduo_0.set_gain(if_gain, 'IF', True)
|
200
|
+
self.sdrplay3_rspduo_0.set_gain(rf_gain, 'RF', True)
|
201
|
+
self.sdrplay3_rspduo_0.set_freq_corr(0)
|
202
|
+
self.sdrplay3_rspduo_0.set_dc_offset_mode(False)
|
203
|
+
self.sdrplay3_rspduo_0.set_iq_balance_mode(False)
|
204
|
+
self.sdrplay3_rspduo_0.set_agc_setpoint(-30)
|
205
|
+
self.sdrplay3_rspduo_0.set_rf_notch_filter(False)
|
206
|
+
self.sdrplay3_rspduo_0.set_dab_notch_filter(True)
|
207
|
+
self.sdrplay3_rspduo_0.set_am_notch_filter(False)
|
208
|
+
self.sdrplay3_rspduo_0.set_biasT(False)
|
209
|
+
self.sdrplay3_rspduo_0.set_stream_tags(True)
|
210
|
+
self.sdrplay3_rspduo_0.set_debug_mode(False)
|
211
|
+
self.sdrplay3_rspduo_0.set_sample_sequence_gaps_check(False)
|
212
|
+
self.sdrplay3_rspduo_0.set_show_gain_changes(False)
|
213
|
+
|
214
|
+
|
215
|
+
##################################################
|
216
|
+
# Connections
|
217
|
+
##################################################
|
218
|
+
self.msg_connect((self.spectre_sweep_driver_0, 'freq'), (self.sdrplay3_rspduo_0, 'freq'))
|
219
|
+
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_batched_file_sink_0, 0))
|
220
|
+
self.connect((self.sdrplay3_rspduo_0, 0), (self.spectre_sweep_driver_0, 0))
|
221
|
+
|
222
|
+
|
223
|
+
@dataclass(frozen=True)
|
224
|
+
class CaptureMethods:
|
225
|
+
tuner_1_fixed_center_frequency = partial(capture, top_block_cls=_tuner_1_fixed_center_frequency)
|
226
|
+
tuner_2_fixed_center_frequency = partial(capture, top_block_cls=_tuner_2_fixed_center_frequency)
|
227
|
+
tuner_1_swept_center_frequency = partial(capture, top_block_cls=_tuner_1_swept_center_frequency)
|
@@ -33,7 +33,7 @@ class _cosine_signal_1(gr.top_block):
|
|
33
33
|
def __init__(self,
|
34
34
|
tag: str,
|
35
35
|
parameters: Parameters):
|
36
|
-
gr.top_block.__init__(self,
|
36
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
37
37
|
|
38
38
|
##################################################
|
39
39
|
# Unpack capture config
|
@@ -80,7 +80,7 @@ class _tagged_staircase(gr.top_block):
|
|
80
80
|
def __init__(self,
|
81
81
|
tag: str,
|
82
82
|
parameters: Parameters):
|
83
|
-
gr.top_block.__init__(self,
|
83
|
+
gr.top_block.__init__(self, catch_exceptions=True)
|
84
84
|
|
85
85
|
##################################################
|
86
86
|
# Unpack capture config
|
@@ -11,7 +11,7 @@ from spectre_core.capture_configs import (
|
|
11
11
|
)
|
12
12
|
from ..gr._rsp1a import CaptureMethods
|
13
13
|
from .._spec_names import SpecNames
|
14
|
-
from
|
14
|
+
from ._sdrplay_receiver import SDRPlayReceiver
|
15
15
|
from .._register import register_receiver
|
16
16
|
|
17
17
|
@dataclass
|
@@ -44,7 +44,7 @@ class _Receiver(SDRPlayReceiver):
|
|
44
44
|
self.add_capture_method(Modes.FIXED_CENTER_FREQUENCY,
|
45
45
|
CaptureMethods.fixed_center_frequency)
|
46
46
|
self.add_capture_method(Modes.SWEPT_CENTER_FREQUENCY,
|
47
|
-
CaptureMethods.
|
47
|
+
CaptureMethods.swept_center_frequency)
|
48
48
|
|
49
49
|
|
50
50
|
def _add_capture_templates(self):
|
@@ -55,7 +55,7 @@ class _Receiver(SDRPlayReceiver):
|
|
55
55
|
|
56
56
|
|
57
57
|
def _add_pvalidators(self):
|
58
|
-
self.add_pvalidator(
|
58
|
+
self.add_pvalidator(Modes.FIXED_CENTER_FREQUENCY,
|
59
59
|
self._get_pvalidator_fixed_center_frequency())
|
60
|
-
self.add_pvalidator(
|
60
|
+
self.add_pvalidator(Modes.SWEPT_CENTER_FREQUENCY,
|
61
61
|
self._get_pvalidator_swept_center_frequency())
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# SPDX-FileCopyrightText: © 2024 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 Optional
|
6
|
+
from dataclasses import dataclass
|
7
|
+
from functools import partial
|
8
|
+
|
9
|
+
from spectre_core.capture_configs import (
|
10
|
+
CaptureModes
|
11
|
+
)
|
12
|
+
from ..gr._rspduo import CaptureMethods
|
13
|
+
from .._spec_names import SpecNames
|
14
|
+
from ._sdrplay_receiver import SDRPlayReceiver
|
15
|
+
from .._register import register_receiver
|
16
|
+
|
17
|
+
@dataclass
|
18
|
+
class Modes:
|
19
|
+
TUNER_1_FIXED_CENTER_FREQUENCY = f"tuner-1-{CaptureModes.FIXED_CENTER_FREQUENCY}"
|
20
|
+
TUNER_2_FIXED_CENTER_FREQUENCY = f"tuner-2-{CaptureModes.FIXED_CENTER_FREQUENCY}"
|
21
|
+
TUNER_1_SWEPT_CENTER_FREQUENCY = f"tuner-1-{CaptureModes.SWEPT_CENTER_FREQUENCY}"
|
22
|
+
|
23
|
+
|
24
|
+
@register_receiver("rspduo")
|
25
|
+
class _Receiver(SDRPlayReceiver):
|
26
|
+
def __init__(self,
|
27
|
+
name: str,
|
28
|
+
mode: Optional[str]):
|
29
|
+
super().__init__(name,
|
30
|
+
mode)
|
31
|
+
|
32
|
+
|
33
|
+
def _add_specs(self) -> None:
|
34
|
+
self.add_spec( SpecNames.SAMPLE_RATE_LOWER_BOUND, 200e3 ) # Hz
|
35
|
+
self.add_spec( SpecNames.SAMPLE_RATE_UPPER_BOUND, 10e6 ) # Hz
|
36
|
+
self.add_spec( SpecNames.FREQUENCY_LOWER_BOUND , 1e3 ) # Hz
|
37
|
+
self.add_spec( SpecNames.FREQUENCY_UPPER_BOUND , 2e9 ) # Hz
|
38
|
+
self.add_spec( SpecNames.IF_GAIN_UPPER_BOUND , -20 ) # dB
|
39
|
+
self.add_spec( SpecNames.RF_GAIN_UPPER_BOUND , 0 ) # dB
|
40
|
+
self.add_spec( SpecNames.API_RETUNING_LATENCY , 50 * 1e-3 ) # s
|
41
|
+
self.add_spec( SpecNames.BANDWIDTH_OPTIONS,
|
42
|
+
[200000, 300000, 600000, 1536000, 5000000, 6000000, 7000000, 8000000])
|
43
|
+
|
44
|
+
|
45
|
+
def _add_capture_methods(self) -> None:
|
46
|
+
self.add_capture_method(Modes.TUNER_1_FIXED_CENTER_FREQUENCY,
|
47
|
+
CaptureMethods.tuner_1_fixed_center_frequency)
|
48
|
+
self.add_capture_method(Modes.TUNER_2_FIXED_CENTER_FREQUENCY,
|
49
|
+
CaptureMethods.tuner_2_fixed_center_frequency)
|
50
|
+
self.add_capture_method(Modes.TUNER_1_SWEPT_CENTER_FREQUENCY,
|
51
|
+
CaptureMethods.tuner_1_swept_center_frequency)
|
52
|
+
|
53
|
+
|
54
|
+
def _add_capture_templates(self):
|
55
|
+
self.add_capture_template(Modes.TUNER_1_FIXED_CENTER_FREQUENCY,
|
56
|
+
self._get_capture_template_fixed_center_frequency())
|
57
|
+
self.add_capture_template(Modes.TUNER_2_FIXED_CENTER_FREQUENCY,
|
58
|
+
self._get_capture_template_fixed_center_frequency())
|
59
|
+
self.add_capture_template(Modes.TUNER_1_SWEPT_CENTER_FREQUENCY,
|
60
|
+
self._get_capture_template_swept_center_frequency())
|
61
|
+
|
62
|
+
|
63
|
+
def _add_pvalidators(self):
|
64
|
+
self.add_pvalidator(Modes.TUNER_1_FIXED_CENTER_FREQUENCY,
|
65
|
+
self._get_pvalidator_fixed_center_frequency())
|
66
|
+
self.add_pvalidator(Modes.TUNER_2_FIXED_CENTER_FREQUENCY,
|
67
|
+
self._get_pvalidator_fixed_center_frequency())
|
68
|
+
self.add_pvalidator(Modes.TUNER_1_SWEPT_CENTER_FREQUENCY,
|
69
|
+
self._get_pvalidator_swept_center_frequency())
|
@@ -6,179 +6,12 @@ from abc import ABC, abstractmethod
|
|
6
6
|
from typing import Callable, Optional
|
7
7
|
from numbers import Number
|
8
8
|
|
9
|
-
from spectre_core.exceptions import ModeNotFoundError
|
10
|
-
from ._spec_names import SpecNames
|
11
9
|
from spectre_core.capture_configs import (
|
12
10
|
CaptureTemplate, CaptureModes, Parameters, Bound, PValidators, PNames,
|
13
11
|
get_base_capture_template, get_base_ptemplate, OneOf, CaptureConfig
|
14
12
|
)
|
15
|
-
|
16
|
-
|
17
|
-
def __init__(self,
|
18
|
-
name: str,
|
19
|
-
mode: Optional[str] = None):
|
20
|
-
self._name = name
|
21
|
-
|
22
|
-
self._specs: dict[str, Number | list[Number]] = {}
|
23
|
-
self._add_specs()
|
24
|
-
|
25
|
-
self._capture_methods: dict[str, Callable] = {}
|
26
|
-
self._add_capture_methods()
|
27
|
-
|
28
|
-
self._pvalidators: dict[str, Callable] = {}
|
29
|
-
self._add_pvalidators()
|
30
|
-
|
31
|
-
self._capture_templates: dict[str, CaptureTemplate] = {}
|
32
|
-
self._add_capture_templates()
|
33
|
-
|
34
|
-
self.mode = mode
|
35
|
-
|
36
|
-
|
37
|
-
@abstractmethod
|
38
|
-
def _add_specs(self) -> None:
|
39
|
-
pass
|
40
|
-
|
41
|
-
|
42
|
-
@abstractmethod
|
43
|
-
def _add_capture_methods(self) -> None:
|
44
|
-
pass
|
45
|
-
|
46
|
-
|
47
|
-
@abstractmethod
|
48
|
-
def _add_pvalidators(self) -> None:
|
49
|
-
pass
|
50
|
-
|
51
|
-
|
52
|
-
@abstractmethod
|
53
|
-
def _add_capture_templates(self) -> None:
|
54
|
-
pass
|
55
|
-
|
56
|
-
|
57
|
-
@property
|
58
|
-
def name(self) -> str:
|
59
|
-
return self._name
|
60
|
-
|
61
|
-
|
62
|
-
@property
|
63
|
-
def capture_methods(self) -> dict[str, Callable]:
|
64
|
-
return self._capture_methods
|
65
|
-
|
66
|
-
|
67
|
-
@property
|
68
|
-
def pvalidators(self) -> dict[str, Callable]:
|
69
|
-
return self._pvalidators
|
70
|
-
|
71
|
-
|
72
|
-
@property
|
73
|
-
def capture_templates(self) -> dict[str, CaptureTemplate]:
|
74
|
-
return self._capture_templates
|
75
|
-
|
76
|
-
|
77
|
-
@property
|
78
|
-
def specs(self) -> dict[str, Number]:
|
79
|
-
return self._specs
|
80
|
-
|
81
|
-
|
82
|
-
@property
|
83
|
-
def modes(self) -> list[str]:
|
84
|
-
capture_method_modes = list(self.capture_methods.keys())
|
85
|
-
pvalidator_modes = list(self.pvalidators.keys())
|
86
|
-
capture_template_modes = list(self.capture_templates.keys())
|
87
|
-
|
88
|
-
if capture_method_modes == pvalidator_modes == capture_template_modes:
|
89
|
-
return capture_method_modes
|
90
|
-
else:
|
91
|
-
raise ValueError(f"Mode mismatch for the receiver {self.name}.")
|
92
|
-
|
93
|
-
|
94
|
-
@property
|
95
|
-
def mode(self) -> str:
|
96
|
-
return self._mode
|
97
|
-
|
98
|
-
|
99
|
-
@mode.setter
|
100
|
-
def mode(self, value: Optional[str]) -> None:
|
101
|
-
if (value is not None) and value not in self.modes:
|
102
|
-
raise ModeNotFoundError((f"{value} is not a defined mode for the receiver {self.name}. "
|
103
|
-
f"Expected one of {self.modes}"))
|
104
|
-
self._mode = value
|
105
|
-
|
106
|
-
|
107
|
-
@property
|
108
|
-
def capture_method(self) -> Callable:
|
109
|
-
return self.capture_methods[self.mode]
|
110
|
-
|
111
|
-
|
112
|
-
@property
|
113
|
-
def pvalidator(self) -> Callable:
|
114
|
-
return self.pvalidators[self.mode]
|
115
|
-
|
116
|
-
|
117
|
-
@property
|
118
|
-
def capture_template(self) -> CaptureTemplate:
|
119
|
-
return self._capture_templates[self.mode]
|
120
|
-
|
121
|
-
|
122
|
-
def add_capture_method(self,
|
123
|
-
mode: str,
|
124
|
-
capture_method: Callable) -> None:
|
125
|
-
self._capture_methods[mode] = capture_method
|
126
|
-
|
127
|
-
|
128
|
-
def add_pvalidator(self,
|
129
|
-
mode: str,
|
130
|
-
pvalidator: Callable) -> None:
|
131
|
-
self._pvalidators[mode] = pvalidator
|
132
|
-
|
133
|
-
|
134
|
-
def add_capture_template(self,
|
135
|
-
mode: str,
|
136
|
-
capture_template: CaptureTemplate) -> CaptureTemplate:
|
137
|
-
self._capture_templates[mode] = capture_template
|
138
|
-
|
139
|
-
|
140
|
-
def add_spec(self,
|
141
|
-
name: str,
|
142
|
-
value: Number) -> None:
|
143
|
-
self.specs[name] = value
|
144
|
-
|
145
|
-
|
146
|
-
def get_spec(self,
|
147
|
-
spec_name: str) -> Number | list[Number]:
|
148
|
-
if spec_name not in self.specs:
|
149
|
-
raise KeyError(f"Spec not found with name '{spec_name}' "
|
150
|
-
f"for the receiver '{self.name}'")
|
151
|
-
return self.specs[spec_name]
|
152
|
-
|
153
|
-
|
154
|
-
def start_capture(self,
|
155
|
-
tag: str) -> None:
|
156
|
-
self.capture_method( tag, self.load_parameters(tag) )
|
157
|
-
|
158
|
-
|
159
|
-
def save_parameters(self,
|
160
|
-
tag: str,
|
161
|
-
parameters: Parameters,
|
162
|
-
force: bool = False) -> None:
|
163
|
-
|
164
|
-
parameters = self.capture_template.apply_template(parameters)
|
165
|
-
self.pvalidator(parameters)
|
166
|
-
|
167
|
-
capture_config = CaptureConfig(tag)
|
168
|
-
capture_config.save_parameters(self.name,
|
169
|
-
self.mode,
|
170
|
-
parameters,
|
171
|
-
force=force)
|
172
|
-
|
173
|
-
def load_parameters(self,
|
174
|
-
tag: str) -> Parameters:
|
175
|
-
capture_config = CaptureConfig(tag)
|
176
|
-
|
177
|
-
parameters = self.capture_template.apply_template(capture_config.parameters)
|
178
|
-
self.pvalidator(parameters)
|
179
|
-
|
180
|
-
return parameters
|
181
|
-
|
13
|
+
from .._base import BaseReceiver
|
14
|
+
from .._spec_names import SpecNames
|
182
15
|
|
183
16
|
class SDRPlayReceiver(BaseReceiver):
|
184
17
|
def _get_pvalidator_fixed_center_frequency(self) -> Callable:
|
@@ -280,10 +113,10 @@ class SDRPlayReceiver(BaseReceiver):
|
|
280
113
|
# Update the defaults
|
281
114
|
#
|
282
115
|
capture_template.set_defaults(
|
283
|
-
(PNames.BATCH_SIZE,
|
284
|
-
(PNames.MIN_FREQUENCY,
|
285
|
-
(PNames.MAX_FREQUENCY,
|
286
|
-
(PNames.SAMPLES_PER_STEP,
|
116
|
+
(PNames.BATCH_SIZE, 4.0),
|
117
|
+
(PNames.MIN_FREQUENCY, 95000000),
|
118
|
+
(PNames.MAX_FREQUENCY, 100000000),
|
119
|
+
(PNames.SAMPLES_PER_STEP, 80000),
|
287
120
|
(PNames.FREQUENCY_STEP, 1536000),
|
288
121
|
(PNames.SAMPLE_RATE, 1536000),
|
289
122
|
(PNames.BANDWIDTH, 1536000),
|
@@ -56,6 +56,7 @@ src/spectre_core/receivers/gr/_rspduo.py
|
|
56
56
|
src/spectre_core/receivers/gr/_test.py
|
57
57
|
src/spectre_core/receivers/library/_rsp1a.py
|
58
58
|
src/spectre_core/receivers/library/_rspduo.py
|
59
|
+
src/spectre_core/receivers/library/_sdrplay_receiver.py
|
59
60
|
src/spectre_core/receivers/library/_test.py
|
60
61
|
src/spectre_core/spectrograms/__init__.py
|
61
62
|
src/spectre_core/spectrograms/_analytical.py
|
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
|
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_config.py
RENAMED
File without changes
|
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_templates.py
RENAMED
File without changes
|
File without changes
|
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pconstraints.py
RENAMED
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
|
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_post_processor.py
RENAMED
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
|
{spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_array_operations.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|