-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.py
184 lines (153 loc) · 4.93 KB
/
Main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
'''
LABORATORIO 4: MODULACION DIGITAL
Estudiante: Francisco Rousseau
Ayudante: Nicole Reyes
Profesor: Carlos Gonzalez
'''
######################## LIBRERIAS ########################
import matplotlib.pyplot as plt
import numpy as np
######################## FUNCIONES ########################
# Se encarga de realizar la modulacion FSK.
#
# Entrada:
# bits - senal compuesta por bits
# bitrate - tasa de bit
#
# Salida:
# tiemposenal - tiempo de la senal modulada
# senal - senal obtenida por la modulacion
# largobit - largo de la senal modulada
def FSK(bits, bitrate):
senal = []
f1 = bitrate
f2 = 2 * f1
periodo = 1 / f1
print("Frecuencia 0: ", f1,"\nFrecuencia 1: ", f2)
largobit = int(periodo * 10 * f2)
tiempo = np.linspace(0, periodo, num = largobit)
print("Num muestras en 1 bit: ", largobit)
cero = np.cos(2 * np.pi * f1 * tiempo)
uno = np.cos(2 * np.pi * f2 * tiempo)
for bit in bits:
if bit == 0:
senal.extend(cero)
else:
senal.extend(uno)
tiempoT = len(bits) * periodo
tiemposenal = np.linspace(0, tiempoT, len(senal))
print("Tiempo total de la senal: ", tiempoT)
print("Numero de muestras de la senal: ", len(senal), "\n")
return tiemposenal, senal, largobit
# Se encarga de realizar la demodulacion FSK.
#
# Entrada:
# tiempo - tiempo de bit
# senal - senal
# largobit - numero de muestra que tiene un bit
# bitrate - tasa de bit
#
# Salida:
# bitsdemod - senal demodulada, arreglo de bits
def DFSK(tiempo, senal, largobit, bitrate):
f1 = bitrate
f2 = 2 * f1
cosf1 = np.cos(2 * np.pi * f2 * tiempo)
dembit1 = senal * cosf1
n_bits = int(len(dembit1) / largobit)
bitsdemod = []
for i in range(1, n_bits + 1):
voltaje = dembit1[((i - 1) * largobit): i * largobit - 1]
mediaV = np.mean(voltaje)
if mediaV > 0.25:
bitsdemod.append(1)
else:
bitsdemod.append(0)
return bitsdemod
# Se encarga de aregar el ruido AWGN
#
# Entrada:
# senal - senal
# snr - numero de muestra que tiene un bit
#
# Salida:
# awgn - senal con ruido agregado
def ruido(senal, snr):
ruido = np.random.normal(0, 1, len(senal))
energia_s = np.sum(np.abs(senal) * np.abs(senal))
energia_n = np.sum(np.abs(ruido) * np.abs(ruido))
snr_lineal = np.exp(snr/10)
sigma = np.sqrt(energia_s / (energia_n * snr_lineal))
print('Desviacion ruido: ' + str(sigma))
ruido = sigma * ruido
awgn = senal + ruido
return awgn
# Se encarga de calcular la la tasa de error binario en una senal digital demodulada.
#
# Entrada:
# bitsdemod - senal demodulada
# bits - senal
#
# Salida:
# ber - tasa de error
def error(bitsdemod, bits):
contador = 0
for i in range(len(bits)):
if bits[i] != bitsdemod[i]:
contador += 1
print("Numero de errores en la transmision: ",contador)
ber = float(contador / len(bits))
print("Error rate: ",ber)
return ber
# Se encarga de simular el canal con ruido
#
# Entrada:
# bitsrate - tasa de bit
def simulacionCanal( bitrate ):
largosenal = 1e5 # Se puede cambiar a conveniencia
bits = np.random.randint(2, size = int(largosenal))
colores = ['-b', '-g', '-r']
plt.figure(1)
for i in range(0, 3):
snr_x = []
ber_y = []
bitrate = bitrate + i*1000
tiempo, senal, len_bit = FSK(bits, bitrate)
for snr in range(-2, 12, 1):
print("##### Prueba SNR = {}[dB] para bitrate = {}[bits/s] #####".format(snr, bitrate))
awgn = ruido(senal, snr)
demod = DFSK(tiempo, awgn, len_bit, bitrate)
ber = error(demod, bits)
snr_x.append(snr)
ber_y.append(ber)
lab = str(bitrate) + ' [bps]'
print("##### Fin prueba #####\n")
plt.plot(snr_x, ber_y, colores[i], label=lab, marker="o")
plt.grid(True)
plt.xlabel('SNR (dB)')
plt.ylabel('BER')
plt.yscale('log')
plt.xscale('linear')
plt.title('Rendimiento SNR vs Bitrate')
plt.legend()
plt.show()
######################## MAIN ########################
print('Laboratorio N° 4\nBits de prueba:')
bits = [0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1]
print(bits)
print('Bitrate de prueba:')
bitrate = 100
print(bitrate)
print('...Aplicando modulacion FSK...')
time, senal, largobit = FSK(bits, bitrate)
print('...Obteniendo Grafico Senal Modulada...')
plt.plot(time,senal)
plt.show()
print('...Aplicando de-modulacion FSK...')
demod = DFSK(time, senal, largobit, bitrate)
print('Bits de Salida:')
print(demod)
print('TESTING FINALIZADO\n\nCOMENZANDO SIMULACION DE CANAL AWGN')
print('** Las imagenes solo se muestran, no se almacenan **')
bitrate = 1000 #Se puede cambiar a conveniencia
simulacionCanal(bitrate)