Module DigiCommPy.channels
Module: DigiCommPy.channels.py
Expand source code
"""
Module: DigiCommPy.channels.py
"""
from numpy import sum,isrealobj,sqrt
from numpy.random import standard_normal
def awgn(s,SNRdB,L=1):
"""
AWGN channel
Add AWGN noise to input signal. The function adds AWGN noise vector to signal
's' to generate a resulting signal vector 'r' of specified SNR in dB. It also
returns the noise vector 'n' that is added to the signal 's' and the power
spectral density N0 of noise added
Parameters:
s : input/transmitted signal vector
SNRdB : desired signal to noise ratio (expressed in dB)
for the received signal
L : oversampling factor (applicable for waveform simulation)
default L = 1.
Returns:
r : received signal vector (r=s+n)
"""
gamma = 10**(SNRdB/10) #SNR to linear scale
if s.ndim==1:# if s is single dimensional vector
P=L*sum(abs(s)**2)/len(s) #Actual power in the vector
else: # multi-dimensional signals like MFSK
P=L*sum(sum(abs(s)**2))/len(s) # if s is a matrix [MxN]
N0=P/gamma # Find the noise spectral density
if isrealobj(s):# check if input is real/complex object type
n = sqrt(N0/2)*standard_normal(s.shape) # computed noise
else:
n = sqrt(N0/2)*(standard_normal(s.shape)+1j*standard_normal(s.shape))
r = s + n # received signal
return r
def rayleighFading(N):
"""
Generate Rayleigh flat-fading channel samples
Parameters:
N : number of samples to generate
Returns:
abs_h : Rayleigh flat fading samples
"""
# 1 tap complex gaussian filter
h = 1/sqrt(2)*(standard_normal(N)+1j*standard_normal(N))
return abs(h)
def ricianFading(K_dB,N):
"""
Generate Rician flat-fading channel samples
Parameters:
K_dB: Rician K factor in dB scale
N : number of samples to generate
Returns:
abs_h : Rician flat fading samples
"""
K = 10**(K_dB/10) # K factor in linear scale
mu = sqrt(K/(2*(K+1))) # mean
sigma = sqrt(1/(2*(K+1))) # sigma
h = (sigma*standard_normal(N)+mu)+1j*(sigma*standard_normal(N)+mu)
return abs(h)
Functions
def awgn(s, SNRdB, L=1)
-
AWGN channel
Add AWGN noise to input signal. The function adds AWGN noise vector to signal 's' to generate a resulting signal vector 'r' of specified SNR in dB. It also returns the noise vector 'n' that is added to the signal 's' and the power spectral density N0 of noise added
Parameters
s
:input
/transmitted
signal
vector
SNRdB
:desired
signal
to
noise
ratio
(expressed
in
dB
)- for the received signal
L
:oversampling
factor
(applicable
for
waveform
simulation
)- default L = 1.
Returns
r
:received
signal
vector
(r
=s
+n
)
Expand source code
def awgn(s,SNRdB,L=1): """ AWGN channel Add AWGN noise to input signal. The function adds AWGN noise vector to signal 's' to generate a resulting signal vector 'r' of specified SNR in dB. It also returns the noise vector 'n' that is added to the signal 's' and the power spectral density N0 of noise added Parameters: s : input/transmitted signal vector SNRdB : desired signal to noise ratio (expressed in dB) for the received signal L : oversampling factor (applicable for waveform simulation) default L = 1. Returns: r : received signal vector (r=s+n) """ gamma = 10**(SNRdB/10) #SNR to linear scale if s.ndim==1:# if s is single dimensional vector P=L*sum(abs(s)**2)/len(s) #Actual power in the vector else: # multi-dimensional signals like MFSK P=L*sum(sum(abs(s)**2))/len(s) # if s is a matrix [MxN] N0=P/gamma # Find the noise spectral density if isrealobj(s):# check if input is real/complex object type n = sqrt(N0/2)*standard_normal(s.shape) # computed noise else: n = sqrt(N0/2)*(standard_normal(s.shape)+1j*standard_normal(s.shape)) r = s + n # received signal return r
def rayleighFading(N)
-
Generate Rayleigh flat-fading channel samples
Parameters
N
:number
ofsamples
to
generate
Returns
abs_h
:Rayleigh
flat
fading
samples
Expand source code
def rayleighFading(N): """ Generate Rayleigh flat-fading channel samples Parameters: N : number of samples to generate Returns: abs_h : Rayleigh flat fading samples """ # 1 tap complex gaussian filter h = 1/sqrt(2)*(standard_normal(N)+1j*standard_normal(N)) return abs(h)
def ricianFading(K_dB, N)
-
Generate Rician flat-fading channel samples
Parameters
K_dB
- Rician K factor in dB scale
N
:number
ofsamples
to
generate
Returns
abs_h
:Rician
flat
fading
samples
Expand source code
def ricianFading(K_dB,N): """ Generate Rician flat-fading channel samples Parameters: K_dB: Rician K factor in dB scale N : number of samples to generate Returns: abs_h : Rician flat fading samples """ K = 10**(K_dB/10) # K factor in linear scale mu = sqrt(K/(2*(K+1))) # mean sigma = sqrt(1/(2*(K+1))) # sigma h = (sigma*standard_normal(N)+mu)+1j*(sigma*standard_normal(N)+mu) return abs(h)
def standard_normal(...)
-
standard_normal(size=None)
Draw samples from a standard Normal distribution (mean=0, stdev=1).
Parameters
size
:int
ortuple
ofints
, optional- Output shape.
If the given shape is, e.g.,
(m, n, k)
, thenm * n * k
samples are drawn. Default is None, in which case a single value is returned.
Returns
out
:float
orndarray
- Drawn samples.
Examples
>>> s = np.random.standard_normal(8000) >>> s array([ 0.6888893 , 0.78096262, -0.89086505, ..., 0.49876311, #random -0.38672696, -0.4685006 ]) #random >>> s.shape (8000,) >>> s = np.random.standard_normal(size=(3, 4, 2)) >>> s.shape (3, 4, 2)