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.
Files changed (71) hide show
  1. {spectre_core-0.0.10 → spectre_core-0.0.11}/PKG-INFO +1 -1
  2. {spectre_core-0.0.10 → spectre_core-0.0.11}/pyproject.toml +1 -1
  3. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pvalidators.py +2 -4
  4. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_base.py +1 -1
  5. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/__init__.py +1 -0
  6. spectre_core-0.0.11/src/spectre_core/receivers/_base.py +180 -0
  7. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_rsp1a.py +5 -5
  8. spectre_core-0.0.11/src/spectre_core/receivers/gr/_rspduo.py +227 -0
  9. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_test.py +2 -2
  10. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/library/_rsp1a.py +4 -4
  11. spectre_core-0.0.11/src/spectre_core/receivers/library/_rspduo.py +69 -0
  12. 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
  13. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/PKG-INFO +1 -1
  14. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/SOURCES.txt +1 -0
  15. spectre_core-0.0.10/src/spectre_core/receivers/gr/_rspduo.py +0 -0
  16. spectre_core-0.0.10/src/spectre_core/receivers/library/_rspduo.py +0 -0
  17. {spectre_core-0.0.10 → spectre_core-0.0.11}/LICENSE +0 -0
  18. {spectre_core-0.0.10 → spectre_core-0.0.11}/README.md +0 -0
  19. {spectre_core-0.0.10 → spectre_core-0.0.11}/setup.cfg +0 -0
  20. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/__init__.py +0 -0
  21. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/_file_io/__init__.py +0 -0
  22. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/_file_io/file_handlers.py +0 -0
  23. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/__init__.py +0 -0
  24. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_config.py +0 -0
  25. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_capture_templates.py +0 -0
  26. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_parameters.py +0 -0
  27. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_pconstraints.py +0 -0
  28. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/capture_configs/_ptemplates.py +0 -0
  29. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/__init__.py +0 -0
  30. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_base.py +0 -0
  31. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_chunks.py +0 -0
  32. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_factory.py +0 -0
  33. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/_register.py +0 -0
  34. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_callisto.py +0 -0
  35. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_fixed_center_frequency.py +0 -0
  36. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/chunks/library/_swept_center_frequency.py +0 -0
  37. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/__init__.py +0 -0
  38. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/_paths.py +0 -0
  39. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/config/_time_formats.py +0 -0
  40. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/exceptions.py +0 -0
  41. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/__init__.py +0 -0
  42. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_configure.py +0 -0
  43. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_decorators.py +0 -0
  44. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/logging/_log_handlers.py +0 -0
  45. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/__init__.py +0 -0
  46. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_base.py +0 -0
  47. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_format.py +0 -0
  48. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_panel_stack.py +0 -0
  49. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/plotting/_panels.py +0 -0
  50. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/__init__.py +0 -0
  51. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_factory.py +0 -0
  52. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_post_processor.py +0 -0
  53. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/_register.py +0 -0
  54. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/library/_fixed_center_frequency.py +0 -0
  55. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/post_processing/library/_swept_center_frequency.py +0 -0
  56. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_factory.py +0 -0
  57. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_register.py +0 -0
  58. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/_spec_names.py +0 -0
  59. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/__init__.py +0 -0
  60. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/gr/_base.py +0 -0
  61. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/receivers/library/_test.py +0 -0
  62. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/__init__.py +0 -0
  63. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_analytical.py +0 -0
  64. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_array_operations.py +0 -0
  65. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_spectrogram.py +0 -0
  66. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/spectrograms/_transform.py +0 -0
  67. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/wgetting/__init__.py +0 -0
  68. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core/wgetting/_callisto.py +0 -0
  69. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/dependency_links.txt +0 -0
  70. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/requires.txt +0 -0
  71. {spectre_core-0.0.10 → spectre_core-0.0.11}/src/spectre_core.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spectre-core
3
- Version: 0.0.10
3
+ Version: 0.0.11
4
4
  Summary: The core Python package used by the spectre program.
5
5
  Maintainer-email: Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spectre-core"
7
- version = "0.0.10"
7
+ version = "0.0.11"
8
8
  maintainers = [
9
9
  { name="Jimmy Fitzpatrick", email="jcfitzpatrick12@gmail.com" },
10
10
  ]
@@ -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
- warning_message = (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!")
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 self._capture_config.get_parameter_value(PNames.BATCH_SIZE)
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()
@@ -5,6 +5,7 @@
5
5
  # register decorators take effect on import
6
6
  from .library._test import _Receiver
7
7
  from .library._rsp1a import _Receiver
8
+ from .library._rspduo import _Receiver
8
9
 
9
10
  from ._base import BaseReceiver
10
11
  from ._factory import get_receiver
@@ -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
- # Test receiver top blocks
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, "fixed-center-frequency", catch_exceptions=True)
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
- is_sweeping = False
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, "sweep", catch_exceptions=True)
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
- _swept_center_frequency = partial(capture, top_block_cls=_swept_center_frequency)
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, "cosine-signal-1", catch_exceptions=True)
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, "tagged-staircase", catch_exceptions=True)
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 .._base import SDRPlayReceiver
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._swept_center_frequency)
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(CaptureModes.FIXED_CENTER_FREQUENCY,
58
+ self.add_pvalidator(Modes.FIXED_CENTER_FREQUENCY,
59
59
  self._get_pvalidator_fixed_center_frequency())
60
- self.add_pvalidator(CaptureModes.SWEPT_CENTER_FREQUENCY,
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
- 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
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, 3.0),
284
- (PNames.MIN_FREQUENCY, 90000000),
285
- (PNames.MAX_FREQUENCY, 110000000),
286
- (PNames.SAMPLES_PER_STEP, 300000),
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),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spectre-core
3
- Version: 0.0.10
3
+ Version: 0.0.11
4
4
  Summary: The core Python package used by the spectre program.
5
5
  Maintainer-email: Jimmy Fitzpatrick <jcfitzpatrick12@gmail.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -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