Source code for sigkit.impairments.frequency_shift

"""Frequency Shift Module utilized for impairments."""

import numpy as np

from sigkit.core.base import SigKitError, Signal
from sigkit.impairments.base import Impairment


[docs] class FrequencyShift(Impairment): """Shift a baseband Signal in frequency by a constant offset. Args: freq_offset: Frequency offset in Hz. Positive shifts up, negative shifts down. Example: >>> imp = FrequencyShift(freq_offset=1e3) >>> shifted = imp.apply(signal) """ def __init__(self, freq_offset: float): if not isinstance(freq_offset, (int, float)): raise SigKitError(f"freq_offset must be a number, got {type(freq_offset)}") self.freq_offset = float(freq_offset)
[docs] def apply(self, signal: Signal) -> Signal: x: np.ndarray = signal.samples if x.dtype != np.complex64: raise SigKitError( "FrequencyShift impairment expects samples to be of type np.complex64." ) t = np.arange(x.size) / signal.sample_rate shifted = x * np.exp(1j * 2 * np.pi * self.freq_offset * t) cf = signal.carrier_frequency + self.freq_offset return Signal( samples=shifted.astype(np.complex64), sample_rate=signal.sample_rate, carrier_frequency=cf, )