Source code for quchip.extensions.signals

"""Reference classical signal transform."""

from __future__ import annotations

from typing import Any

from quchip.declarative.parameters import parameter, setting
from quchip.control.signal import SignalMap, SignalTransform
from quchip.declarative import qnp
from quchip.utils.labeling import resolve_label


[docs] class CableLoss(SignalTransform, serializable=True): """Attenuate one control line by a power loss specified in dB. Parameters ---------- line : str or object with a label Control-line label to transform. Resolved once, at construction. loss_db : float Positive power-loss value in dB. The complex amplitude is multiplied by ``10**(-loss_db/20)``. """ line: str = setting() loss_db: Any = parameter() def __init__(self, line: str | Any, loss_db: Any) -> None: object.__setattr__(self, "line", resolve_label(line)) object.__setattr__(self, "loss_db", loss_db)
[docs] def apply(self, signals: SignalMap) -> SignalMap: """Return signals with this line's amplitude attenuated. Parameters ---------- signals : SignalMap Mapping keyed by ``(line, channel)`` signal identifiers. """ factor = qnp.power(10.0, -self.loss_db / 20.0) return { key: signal.scaled(factor) if key[0] == self.line else signal for key, signal in signals.items() }
[docs] def referenced_lines(self) -> tuple[str, ...]: return (self.line,)