Source code for sigkit.impairments.awgn
"""AWGN Method for the Impairments Module."""
import numpy as np
from sigkit.core.base import SigKitError, Signal
from sigkit.impairments.base import Impairment
[docs]
class AWGN(Impairment):
"""Apply Additive White Gaussian Noise to a Signal."""
def __init__(self, snr_db: float):
self.snr_db = snr_db
[docs]
def apply(self, signal: Signal) -> Signal:
"""Applies AWGN to the samples of input Signal and returns a new Signal.
Expects a Signal object with an np.ndarray of np.complex64 samples.
Returns the Signal with AWGN applied to the target snr_db.
"""
x: np.ndarray = signal.samples
if not x.dtype == np.complex64:
raise SigKitError(
"AWGN impairment expects samples to be of type np.complex64."
)
sig_power = np.mean(np.abs(x) ** 2)
snr_lin = 10.0 ** (self.snr_db / 10.0)
noise_power = sig_power / snr_lin
noise = np.sqrt(noise_power / 2) * (
np.random.randn(*x.shape) + 1j * np.random.randn(*x.shape)
)
return Signal(
samples=(x + noise).astype(np.complex64),
sample_rate=signal.sample_rate,
carrier_frequency=signal.carrier_frequency,
)