st_edits #6

Merged
madrigal merged 14 commits from st_edits into main 2025-10-24 10:21:12 -04:00
Showing only changes of commit 2e0378ff9d - Show all commits

View File

@ -306,15 +306,31 @@ class ThinkRF(SDR):
raise NotImplementedError("ThinkRF radios do not expose a controllable bias-tee")
def _derive_decimation(self, target_sample_rate: int | float) -> int:
"""Round sample rate to nearest supported decimation."""
"""
Derive decimation from target sample rate.
Always rounds DOWN decimation (UP sample rate) to meet or exceed user's requested rate.
Example: 30 MS/s requested dec 4 (31.25 MS/s), NOT dec 8 (15.625 MS/s)
"""
if not target_sample_rate:
return 1
requested = float(target_sample_rate)
if requested >= self.BASE_SAMPLE_RATE:
return 1
desired = self.BASE_SAMPLE_RATE / requested
# Always round UP to next decimation (lower sample rate) to avoid exceeding user request
best = min((d for d in self.SUPPORTED_DECIMATIONS if d >= desired), default=self.SUPPORTED_DECIMATIONS[-1])
desired_decimation = self.BASE_SAMPLE_RATE / requested
# Round DOWN decimation (UP sample rate) to meet or exceed requested rate
# Find largest decimation that gives sample rate >= requested
valid_decimations = [d for d in self.SUPPORTED_DECIMATIONS if d <= desired_decimation]
if valid_decimations:
# Use largest valid decimation (gives sample rate >= requested)
best = max(valid_decimations)
else:
# Requested rate too low, use minimum decimation (max sample rate)
best = self.SUPPORTED_DECIMATIONS[0]
return int(best)
def enforce_sample_rate(self, requested_sample_rate: int | float, decimation: Optional[int] = None) -> tuple[int, float]: