1-
21# Authors: Veeresh Taranalli <[email protected] > 32# License: BSD 3-Clause
43
@@ -48,17 +47,15 @@ def modulate(self, input_bits):
4847
4948 """
5049 mapfunc = vectorize (lambda i :
51- self .constellation [bitarray2dec (input_bits [i :i + self .num_bits_symbol ])])
50+ self .constellation [bitarray2dec (input_bits [i :i + self .num_bits_symbol ])])
5251
5352 baseband_symbols = mapfunc (arange (0 , len (input_bits ), self .num_bits_symbol ))
5453
5554 return baseband_symbols
5655
57- def demodulate (self , input_symbols , demod_type , noise_var = 0 ):
56+ def demodulate (self , input_symbols , demod_type , noise_var = 0 ):
5857 """ Demodulate (map) a set of constellation symbols to corresponding bits.
5958
60- Supports hard-decision demodulation only.
61-
6259 Parameters
6360 ----------
6461 input_symbols : 1D ndarray of complex floats
@@ -78,10 +75,10 @@ def demodulate(self, input_symbols, demod_type, noise_var = 0):
7875
7976 """
8077 if demod_type == 'hard' :
81- index_list = map (lambda i : argmin (abs (input_symbols [i ] - self .constellation )), \
78+ index_list = map (lambda i : argmin (abs (input_symbols [i ] - self .constellation )),
8279 range (0 , len (input_symbols )))
8380 demod_bits = hstack (map (lambda i : dec2bitarray (i , self .num_bits_symbol ),
84- index_list ))
81+ index_list ))
8582 elif demod_type == 'soft' :
8683 demod_bits = zeros (len (input_symbols ) * self .num_bits_symbol )
8784 for i in arange (len (input_symbols )):
@@ -91,10 +88,12 @@ def demodulate(self, input_symbols, demod_type, noise_var = 0):
9188 llr_den = 0
9289 for const_index in self .symbol_mapping :
9390 if (const_index >> bit_index ) & 1 :
94- llr_num = llr_num + exp ((- abs (current_symbol - self .constellation [const_index ])** 2 )/ noise_var )
91+ llr_num = llr_num + exp (
92+ (- abs (current_symbol - self .constellation [const_index ]) ** 2 ) / noise_var )
9593 else :
96- llr_den = llr_den + exp ((- abs (current_symbol - self .constellation [const_index ])** 2 )/ noise_var )
97- demod_bits [i * self .num_bits_symbol + self .num_bits_symbol - 1 - bit_index ] = log (llr_num / llr_den )
94+ llr_den = llr_den + exp (
95+ (- abs (current_symbol - self .constellation [const_index ]) ** 2 ) / noise_var )
96+ demod_bits [i * self .num_bits_symbol + self .num_bits_symbol - 1 - bit_index ] = log (llr_num / llr_den )
9897 else :
9998 pass
10099 # throw an error
@@ -105,8 +104,10 @@ def demodulate(self, input_symbols, demod_type, noise_var = 0):
105104class PSKModem (Modem ):
106105 """ Creates a Phase Shift Keying (PSK) Modem object. """
107106
107+ Es = 1
108+
108109 def _constellation_symbol (self , i ):
109- return cos (2 * pi * ( i - 1 ) / self .m ) + sin (2 * pi * ( i - 1 ) / self .m )* ( 0 + 1j )
110+ return cos (2 * pi * ( i - 1 ) / self .m ) + sin (2 * pi * ( i - 1 ) / self .m ) * ( 0 + 1j )
110111
111112 def __init__ (self , m ):
112113 """ Creates a Phase Shift Keying (PSK) Modem object.
@@ -121,13 +122,13 @@ def __init__(self, m):
121122 self .num_bits_symbol = int (log2 (self .m ))
122123 self .symbol_mapping = arange (self .m )
123124 self .constellation = list (map (self ._constellation_symbol ,
124- self .symbol_mapping ))
125+ self .symbol_mapping ))
125126
126127class QAMModem (Modem ):
127128 """ Creates a Quadrature Amplitude Modulation (QAM) Modem object."""
128129
129130 def _constellation_symbol (self , i ):
130- return (2 * i [0 ]- 1 ) + (2 * i [1 ]- 1 ) * (1j )
131+ return (2 * i [0 ] - 1 ) + (2 * i [1 ] - 1 ) * (1j )
131132
132133 def __init__ (self , m ):
133134 """ Creates a Quadrature Amplitude Modulation (QAM) Modem object.
@@ -142,9 +143,11 @@ def __init__(self, m):
142143 self .m = m
143144 self .num_bits_symbol = int (log2 (self .m ))
144145 self .symbol_mapping = arange (self .m )
145- mapping_array = arange (1 , sqrt (self .m )+ 1 ) - (sqrt (self .m )/ 2 )
146+ mapping_array = arange (1 , sqrt (self .m ) + 1 ) - (sqrt (self .m ) / 2 )
146147 self .constellation = list (map (self ._constellation_symbol ,
147- list (product (mapping_array , repeat = 2 ))))
148+ list (product (mapping_array , repeat = 2 ))))
149+ self .Es = 2 * (self .m - 1 ) / 3
150+
148151
149152def ofdm_tx (x , nfft , nsc , cp_length ):
150153 """ OFDM Transmit signal generation """
@@ -155,29 +158,31 @@ def ofdm_tx(x, nfft, nsc, cp_length):
155158 ofdm_tx_signal = array ([])
156159
157160 for i in range (0 , shape (x )[1 ]):
158- symbols = x [:,i ]
161+ symbols = x [:, i ]
159162 ofdm_sym_freq = zeros (nfft , dtype = complex )
160- ofdm_sym_freq [1 :(nsc / 2 ) + 1 ] = symbols [nsc / 2 :]
161- ofdm_sym_freq [- (nsc / 2 ):] = symbols [0 :nsc / 2 ]
163+ ofdm_sym_freq [1 :(nsc / 2 ) + 1 ] = symbols [nsc / 2 :]
164+ ofdm_sym_freq [- (nsc / 2 ):] = symbols [0 :nsc / 2 ]
162165 ofdm_sym_time = ifft (ofdm_sym_freq )
163166 cp = ofdm_sym_time [- cp_length :]
164167 ofdm_tx_signal = concatenate ((ofdm_tx_signal , cp , ofdm_sym_time ))
165168
166169 return ofdm_tx_signal
167170
171+
168172def ofdm_rx (y , nfft , nsc , cp_length ):
169173 """ OFDM Receive Signal Processing """
170174
171- num_ofdm_symbols = int (len (y )/ (nfft + cp_length ))
175+ num_ofdm_symbols = int (len (y ) / (nfft + cp_length ))
172176 x_hat = zeros ([nsc , num_ofdm_symbols ], dtype = complex )
173177
174178 for i in range (0 , num_ofdm_symbols ):
175- ofdm_symbol = y [i * nfft + (i + 1 ) * cp_length :(i + 1 ) * (nfft + cp_length )]
179+ ofdm_symbol = y [i * nfft + (i + 1 ) * cp_length :(i + 1 ) * (nfft + cp_length )]
176180 symbols_freq = fft (ofdm_symbol )
177- x_hat [:,i ] = concatenate ((symbols_freq [- nsc / 2 :], symbols_freq [1 :(nsc / 2 ) + 1 ]))
181+ x_hat [:, i ] = concatenate ((symbols_freq [- nsc / 2 :], symbols_freq [1 :(nsc / 2 ) + 1 ]))
178182
179183 return x_hat
180184
185+
181186def mimo_ml (y , h , constellation ):
182187 """ MIMO ML Detection.
183188
@@ -195,7 +200,7 @@ def mimo_ml(y, h, constellation):
195200 """
196201 m = len (constellation )
197202 x_ideal = array ([tile (constellation , m ), repeat (constellation , m )])
198- y_vector = tile (y , m * m )
203+ y_vector = tile (y , m * m )
199204 min_idx = argmin (sum (abs (y_vector - dot (h , x_ideal )), axis = 0 ))
200205 x_r = x_ideal [:, min_idx ]
201206
0 commit comments