Klasa za simulaciju aditivnog bijelog Gaussovog šuma (AWGN)
na kompleksnom baziopojasnom signalu.
Šum se modelira kao kompleksni Gaussov šum n[k] sa nultom
sredinom i varijancom određenom ciljnim SNR-om:
y[k] = x[k] + n[k]
gdje je SNR definisan kao:
SNR = P_signal / P_noise
u dB:
SNR_dB = 10 * log10(P_signal / P_noise)
Za kompleksni signal (I + jQ) varijanca po komponenti je
P_noise / 2, pa se standardna devijacija šuma računa kao:
sigma = sqrt(P_noise / 2).
Parametri
---------
snr_db : float
Ciljani SNR u decibelima (dB). Definisan kao odnos srednje
snage signala i snage šuma po kompleksnom uzorku.
seed : int, optional
Sjeme za generator slučajnih brojeva. Korisno za
determinističke (ponovljive) simulacije. Default je None,
što znači da se koristi globalni RNG state.
Napomene
--------
- Snaga signala procjenjuje se kao srednja vrijednost |x[k]|^2
preko svih uzoraka.
- Šum je kompleksan, nezavisan u I i Q komponenti, sa istom
varijancom u obje komponente.
| np.ndarray channel.awgn_channel.AWGNChannel.apply |
( |
| self, |
|
|
np.ndarray | tx_samples ) |
Primjenjuje AWGN na dati kompleksni signal.
Očekuje se da je `tx_samples` kompleksni NumPy niz bilo kog
oblika, pri čemu se šum dodaje element-po-element da bi
izlaz imao isti shape.
Parametri
---------
tx_samples : np.ndarray
Kompleksni baziopojasni signal (npr. izlaz OFDM modulatora).
Može biti 1D (N,), 2D (n_antena, N), ili višedimenzionalan.
Dtype treba biti kompleksan (complex64 ili complex128).
Povratna vrijednost
-------------------
np.ndarray
Niz iste dimenzije i dtype-a kao `tx_samples`, sa dodatim
AWGN šumom.
Raises
------
ValueError
Ako `tx_samples` nije kompleksan niz ili ako je snaga
signala nula (SNR se ne može definisati).
Primjeri
--------
Jednostavan primjer sa 1D signalom::
>>> import numpy as np
>>> from channel.awgn_channel import AWGNChannel
>>>
>>> # Dummy OFDM talasni oblik
>>> tx = (np.random.randn(1000) + 1j*np.random.randn(1000)).astype(np.complex64)
>>>
>>> ch = AWGNChannel(snr_db=15.0, seed=42)
>>> rx = ch.apply(tx)
>>> tx.shape == rx.shape
True
Primjer sa više antena (2D)::
>>> tx_mimo = np.vstack([tx, 1j * tx]) # shape (2, 1000)
>>> rx_mimo = ch.apply(tx_mimo)
>>> rx_mimo.shape
(2, 1000)