Compare commits

..

No commits in common. "b1e3ebf74ffa44af0a23bed054e65bafbbafc93a" and "71f23e3a967e26c983a0507a831c06ff77933b9c" have entirely different histories.

19 changed files with 93 additions and 51 deletions

View File

@ -956,8 +956,10 @@ def get_result_sizes( # noqa: C901 # TODO: Simplify function
# Check that each class that will be augmented does not already suffice target_size # Check that each class that will be augmented does not already suffice target_size
for cls_name, target_size_value in zip(classes_to_augment, target_size): for cls_name, target_size_value in zip(classes_to_augment, target_size):
if class_sizes[cls_name] >= target_size_value: if class_sizes[cls_name] >= target_size_value:
raise ValueError(f"""target_size of {target_size_value} is already sufficed for current size of raise ValueError(
{class_sizes[cls_name]} for class: {cls_name}""") f"""target_size of {target_size_value} is already sufficed for current size of
{class_sizes[cls_name]} for class: {cls_name}"""
)
for index, class_name in enumerate(classes_to_augment): for index, class_name in enumerate(classes_to_augment):
result_sizes[class_name] = target_size[index] result_sizes[class_name] = target_size[index]

View File

@ -474,8 +474,10 @@ class Blade(SDR):
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets \ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets \
the gain relative to the maximum possible gain."
)
else: else:
abs_gain = rx_gain_max + gain abs_gain = rx_gain_max + gain
else: else:
@ -548,8 +550,10 @@ class Blade(SDR):
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets\ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets\
the gain relative to the maximum possible gain."
)
else: else:
abs_gain = tx_gain_max + gain abs_gain = tx_gain_max + gain
else: else:

View File

@ -172,8 +172,10 @@ class HackRF(SDR):
tx_gain_max = 47 tx_gain_max = 47
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This \ raise SDRParameterError(
sets the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This \
sets the gain relative to the maximum possible gain."
)
else: else:
abs_gain = tx_gain_max + gain abs_gain = tx_gain_max + gain
else: else:

View File

@ -274,16 +274,20 @@ class Pluto(SDR):
data = [self._convert_tx_samples(samples), self._convert_tx_samples(samples)] data = [self._convert_tx_samples(samples), self._convert_tx_samples(samples)]
else: else:
if len(recording) > 2: if len(recording) > 2:
warnings.warn("More recordings were provided than channels in the Pluto. \ warnings.warn(
Only the first two recordings will be used") "More recordings were provided than channels in the Pluto. \
Only the first two recordings will be used"
)
sample0 = self._convert_tx_samples(recording.data[0]) sample0 = self._convert_tx_samples(recording.data[0])
sample1 = self._convert_tx_samples(recording.data[1]) sample1 = self._convert_tx_samples(recording.data[1])
data = [sample0, sample1] data = [sample0, sample1]
elif isinstance(recording, list): elif isinstance(recording, list):
if len(recording) > 2: if len(recording) > 2:
warnings.warn("More recordings were provided than channels in the Pluto. \ warnings.warn(
Only the first two recordings will be used") "More recordings were provided than channels in the Pluto. \
Only the first two recordings will be used"
)
if isinstance(recording[0], np.ndarray): if isinstance(recording[0], np.ndarray):
data = [self._convert_tx_samples(recording[0]), self._convert_tx_samples(recording[1])] data = [self._convert_tx_samples(recording[0]), self._convert_tx_samples(recording[1])]
@ -423,8 +427,10 @@ class Pluto(SDR):
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets \ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets \
the gain relative to the maximum possible gain."
)
else: else:
abs_gain = rx_gain_max + gain abs_gain = rx_gain_max + gain
else: else:
@ -534,8 +540,10 @@ class Pluto(SDR):
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets\ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets\
the gain relative to the maximum possible gain."
)
else: else:
abs_gain = tx_gain_max + gain abs_gain = tx_gain_max + gain
else: else:

View File

@ -131,15 +131,19 @@ class RTLSDR(SDR):
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets\ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets\
the gain relative to the maximum possible gain."
)
target_gain = max_gain + gain target_gain = max_gain + gain
else: else:
target_gain = gain target_gain = gain
if target_gain < min_gain or target_gain > max_gain: if target_gain < min_gain or target_gain > max_gain:
print(f"Requested gain {target_gain} dB out of range;\ print(
clamping to valid span {min_gain}-{max_gain} dB.") f"Requested gain {target_gain} dB out of range;\
clamping to valid span {min_gain}-{max_gain} dB."
)
target_gain = min(max(target_gain, min_gain), max_gain) target_gain = min(max(target_gain, min_gain), max_gain)
target_gain = min(available_gains, key=lambda g: abs(g - target_gain)) target_gain = min(available_gains, key=lambda g: abs(g - target_gain))

View File

@ -392,8 +392,10 @@ class ThinkRF(SDR):
actual_sample_rate = self.BASE_SAMPLE_RATE / decimation actual_sample_rate = self.BASE_SAMPLE_RATE / decimation
if abs(actual_sample_rate - requested_sample_rate) > 1e3: # More than 1 kHz difference if abs(actual_sample_rate - requested_sample_rate) > 1e3: # More than 1 kHz difference
print(f"ThinkRF: Requested {requested_sample_rate/1e6:.2f} MS/s → \ print(
Using decimation={decimation} ({actual_sample_rate/1e6:.2f} MS/s)") f"ThinkRF: Requested {requested_sample_rate/1e6:.2f} MS/s → \
Using decimation={decimation} ({actual_sample_rate/1e6:.2f} MS/s)"
)
return decimation, actual_sample_rate return decimation, actual_sample_rate

View File

@ -148,8 +148,10 @@ class USRP(SDR):
gain_range = self.usrp.get_rx_gain_range() gain_range = self.usrp.get_rx_gain_range()
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets\ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets\
the gain relative to the maximum possible gain."
)
else: else:
# set gain relative to max # set gain relative to max
abs_gain = gain_range.stop() + gain abs_gain = gain_range.stop() + gain
@ -354,8 +356,10 @@ class USRP(SDR):
gain_range = self.usrp.get_tx_gain_range() gain_range = self.usrp.get_tx_gain_range()
if gain_mode == "relative": if gain_mode == "relative":
if gain > 0: if gain > 0:
raise SDRParameterError("When gain_mode = 'relative', gain must be < 0. This sets\ raise SDRParameterError(
the gain relative to the maximum possible gain.") "When gain_mode = 'relative', gain must be < 0. This sets\
the gain relative to the maximum possible gain."
)
else: else:
# set gain relative to max # set gain relative to max
abs_gain = gain_range.stop() + gain abs_gain = gain_range.stop() + gain

View File

@ -24,7 +24,12 @@ For detailed examples and API reference, see the documentation.
""" """
from .basic import Add, FrequencyShift, MultiplyConstant, PhaseShift from .basic import Add, FrequencyShift, MultiplyConstant, PhaseShift
from .generators import PAMGenerator, PSKGenerator, QAMGenerator, SignalGenerator from .generators import (
PAMGenerator,
PSKGenerator,
QAMGenerator,
SignalGenerator,
)
from .mapping import Mapper, SymbolDemapper from .mapping import Mapper, SymbolDemapper
from .process_block import ProcessBlock from .process_block import ProcessBlock
from .pulse_shaping import ( from .pulse_shaping import (

View File

@ -37,8 +37,10 @@ class Add(RecordableBlock, ProcessBlock):
samples = block.get_samples(num_samples) samples = block.get_samples(num_samples)
if len(samples) != num_samples: if len(samples) != num_samples:
raise ValueError(f"Block {self.__class__.__name__} requested {num_samples} \ raise ValueError(
from block {block.__class__.__name__} but got {len(samples)}.") f"Block {self.__class__.__name__} requested {num_samples} \
from block {block.__class__.__name__} but got {len(samples)}."
)
return samples return samples

View File

@ -23,9 +23,11 @@ class ProcessBlock(Block, ABC):
) )
elif not all(isinstance(item, Block) for item in input): elif not all(isinstance(item, Block) for item in input):
raise ValueError(f"Invalid input to block '{self.__class__.__name__}'. \ raise ValueError(
f"Invalid input to block '{self.__class__.__name__}'. \
Expected a list of Block objects but got \ Expected a list of Block objects but got \
{'[' + ',' .join(f'{item.__class__.__name__}({repr(item)})' for item in input) + ']'}") {'[' + ',' .join(f'{item.__class__.__name__}({repr(item)})' for item in input) + ']'}"
)
elif len(input) != len(self.input_type): elif len(input) != len(self.input_type):
raise ValueError( raise ValueError(

View File

@ -20,8 +20,10 @@ class RecordableBlock(Block, Recordable):
:raises ValueError: If the number of samples is incorrect.""" :raises ValueError: If the number of samples is incorrect."""
samples = self.get_samples(num_samples) samples = self.get_samples(num_samples)
if len(samples) != num_samples: if len(samples) != num_samples:
raise ValueError(f"Error in block {self.__class__.__name__} record(). \ raise ValueError(
Requested {num_samples} samples but got {len(samples)}") f"Error in block {self.__class__.__name__} record(). \
Requested {num_samples} samples but got {len(samples)}"
)
metadata = self._get_metadata() metadata = self._get_metadata()
return Recording(data=samples, metadata=metadata) return Recording(data=samples, metadata=metadata)

View File

@ -39,7 +39,9 @@ class RecordingSource(SourceBlock, RecordableBlock):
:raises ValueError: If num_samples is greater than the recording length. :raises ValueError: If num_samples is greater than the recording length.
""" """
if num_samples - 1 >= self.recording.data.shape[1]: if num_samples - 1 >= self.recording.data.shape[1]:
raise ValueError(f"{num_samples} samples requested from recording source with \ raise ValueError(
{self.recording.data.shape[1]} samples available.") f"{num_samples} samples requested from recording source with \
{self.recording.data.shape[1]} samples available."
)
return self.recording.data[0, 0:num_samples] return self.recording.data[0, 0:num_samples]

View File

@ -610,8 +610,10 @@ def cut_out( # noqa: C901 # TODO: Simplify function
raise ValueError("signal must be CxN complex.") raise ValueError("signal must be CxN complex.")
if fill_type not in {"zeros", "ones", "low-snr", "avg-snr", "high-snr"}: if fill_type not in {"zeros", "ones", "low-snr", "avg-snr", "high-snr"}:
raise UserWarning("""fill_type must be "zeros", "ones", "low-snr", "avg-snr", or "high-snr", raise UserWarning(
"ones" has been selected by default""") """fill_type must be "zeros", "ones", "low-snr", "avg-snr", or "high-snr",
"ones" has been selected by default"""
)
if max_section_size < 1 or max_section_size >= n: if max_section_size < 1 or max_section_size >= n:
raise ValueError("max_section_size must be at least 1 and must be less than the length of signal.") raise ValueError("max_section_size must be at least 1 and must be less than the length of signal.")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -114,8 +114,8 @@ def view_sig(
logo: Optional[bool] = True, logo: Optional[bool] = True,
dark: Optional[bool] = True, dark: Optional[bool] = True,
spines: Optional[bool] = False, spines: Optional[bool] = False,
title_fontsize: Optional[int] = 35, title_fontsize: Optional[int] = 40,
subtitle_fontsize: Optional[int] = 15, subtitle_fontsize: Optional[int] = 20,
) -> None: ) -> None:
""" """
Create a plot of various signal visualizations as a png or svg image. Create a plot of various signal visualizations as a png or svg image.
@ -173,7 +173,7 @@ def view_sig(
plot_length = len(recording.data[0]) plot_length = len(recording.data[0])
# Plot preparation # Plot preparation
fig = plt.figure(figsize=(16, 14)) fig = plt.figure(figsize=(14, 12))
fig.suptitle(title, fontsize=title_fontsize) fig.suptitle(title, fontsize=title_fontsize)
gs = gridspec.GridSpec(subplot_height, subplot_width) gs = gridspec.GridSpec(subplot_height, subplot_width)
@ -209,7 +209,7 @@ def view_sig(
) )
set_spines(spec_ax, spines) set_spines(spec_ax, spines)
spec_ax.set_title("Spectrogram", fontsize=subtitle_fontsize) spec_ax.set_title("Spectrogram", loc="center", fontsize=subtitle_fontsize)
spec_ax.set_ylabel("Frequency (Hz)") spec_ax.set_ylabel("Frequency (Hz)")
spec_ax.set_xlabel("Time (s)") spec_ax.set_xlabel("Time (s)")
@ -295,7 +295,8 @@ def view_sig(
set_spines(meta_ax, spines) set_spines(meta_ax, spines)
if logo and os.path.isfile(logo_path): if logo and os.path.isfile(logo_path):
logo_ax = plt.subplot(gs[plot_y_indx + 2 :, 2]) logo_ax = plt.subplot(gs[plot_y_indx:, 2])
plot_x_indx = plot_x_indx + 1
logo_ax.axis("off") logo_ax.axis("off")
try: try:

View File

@ -246,20 +246,18 @@ def view_simple_sig(
ax2.set_xlabel("Time (s)") ax2.set_xlabel("Time (s)")
ax1.set_ylabel("Amplitude") ax1.set_ylabel("Amplitude")
ax1.set_title(f"Time Series - {sdr} SDR", loc="left", pad=10) ax1.set_title(f"Time Series - {sdr} SDR")
ax1.legend(loc="upper right") ax1.legend(loc="upper right")
ax2.set_ylabel("Frequency (Hz)") ax2.set_ylabel("Frequency (Hz)")
ax2.set_title( ax2.set_title(f"Spectrogram - {center_freq_hz / 1e6:.1f} MHz ± {sample_rate_hz / 2e6:.1f} MHz")
f"Spectrogram - {center_freq_hz / 1e6:.1f} MHz ± {sample_rate_hz / 2e6:.1f} MHz", loc="left", pad=10
)
yticks = ax2.get_yticks() yticks = ax2.get_yticks()
ax2.set_yticklabels([f"{y / 1e6:.1f}" for y in yticks]) ax2.set_yticklabels([f"{y / 1e6:.1f}" for y in yticks])
elif not compact_mode: elif not compact_mode:
ax1.set_title("Time Series", loc="left", pad=10) ax1.set_title("Time Series")
ax1.legend(loc="upper right", fontsize=8) ax1.legend(loc="upper right", fontsize=8)
ax2.set_title("Spectrogram", loc="left", pad=10) ax2.set_title("Spectrogram")
if ax_constellation is not None: if ax_constellation is not None:
constellation_samples = _get_plot_samples(signal=signal, fast_mode=fast_mode, slow_max=50_000, fast_max=20_000) constellation_samples = _get_plot_samples(signal=signal, fast_mode=fast_mode, slow_max=50_000, fast_max=20_000)
@ -310,7 +308,7 @@ def view_simple_sig(
else: else:
plt.tight_layout() plt.tight_layout()
if show_title: if show_title:
plt.subplots_adjust(top=0.90) plt.subplots_adjust(top=0.92)
if saveplot: if saveplot:
output_path, extension = set_path(output_path=output_path) output_path, extension = set_path(output_path=output_path)

View File

@ -299,7 +299,7 @@ def capture(
\b \b
Examples: Examples:
ria capture -d hackrf -s 2e6 -f 2.44e6 -b 2e6 -n 50 ria capture -d hackrf -s 2e6 -f 2.44e6 -b 2e6
ria capture -d pluto -s 1e6 -f 2e9 -b 2e6 -n 50 ria capture -d pluto -s 1e6 -f 2e9 -b 2e6 -n 50
""" """

View File

@ -39,7 +39,9 @@ from ria_toolkit_oss.signal.block_generator.symbol_modulation import (
OOKModulator, OOKModulator,
OQPSKModulator, OQPSKModulator,
) )
from ria_toolkit_oss.transforms.iq_impairments import iq_imbalance from ria_toolkit_oss.transforms.iq_impairments import (
iq_imbalance,
)
from ria_toolkit_oss_cli.ria_toolkit_oss.common import ( from ria_toolkit_oss_cli.ria_toolkit_oss.common import (
echo_progress, echo_progress,
echo_verbose, echo_verbose,