|
|
@@ -6,6 +6,7 @@ from models import basic
|
|
|
from models.basic import AWGNChannel, BPSKDemod, BPSKMod, BypassChannel, AlphabetMod, AlphabetDemod
|
|
|
import misc
|
|
|
from models.autoencoder import Autoencoder, view_encoder
|
|
|
+from models.optical_channel import OpticalChannel
|
|
|
|
|
|
|
|
|
def show_constellation(mod, chan, demod, samples=1000):
|
|
|
@@ -45,6 +46,16 @@ def get_AWGN_ber(mod, demod, samples=1000, start=-8, stop=5, steps=30):
|
|
|
return ber_x, ber_y
|
|
|
|
|
|
|
|
|
+def get_Optical_ber(mod, demod, samples=1000, start=-8, stop=5, steps=30, length=100, pulse_shape='rect'):
|
|
|
+ ber_x = np.linspace(start, stop, steps)
|
|
|
+ ber_y = []
|
|
|
+
|
|
|
+ for noise in ber_x:
|
|
|
+ tx_channel = OpticalChannel(noise_level=noise, dispersion=-21.7, symbol_rate=10e9, sample_rate=400e9,
|
|
|
+ length=length, pulse_shape=pulse_shape, sqrt_out=True)
|
|
|
+ ber_y.append(get_ber(mod, tx_channel, demod, samples=samples))
|
|
|
+ return ber_x, ber_y
|
|
|
+
|
|
|
if __name__ == '__main__':
|
|
|
# show_constellation(BPSKMod(10e6), AWGNChannel(-1), BPSKDemod(10e6, 10e3))
|
|
|
|
|
|
@@ -110,20 +121,52 @@ if __name__ == '__main__':
|
|
|
# plt.plot(*get_AWGN_ber(aenc.get_modulator(), aenc.get_demodulator(), samples=12000, start=-15), '-',
|
|
|
# label='AE 4bit -8dB')
|
|
|
|
|
|
- for scheme in ['64qam', '32qam', '16qam', 'qpsk', '8psk']:
|
|
|
- plt.plot(*get_AWGN_ber(
|
|
|
- AlphabetMod(scheme, 10e6),
|
|
|
- AlphabetDemod(scheme, 10e6),
|
|
|
- samples=20e3,
|
|
|
+ # for scheme in ['64qam', '32qam', '16qam', 'qpsk', '8psk']:
|
|
|
+ # plt.plot(*get_AWGN_ber(
|
|
|
+ # AlphabetMod(scheme, 10e6),
|
|
|
+ # AlphabetDemod(scheme, 10e6),
|
|
|
+ # samples=20e3,
|
|
|
+ # steps=40,
|
|
|
+ # start=-15
|
|
|
+ # ), '-', label=scheme.upper())
|
|
|
+
|
|
|
+ for l in np.logspace(start=0, stop=3, num=5):
|
|
|
+ plt.plot(*get_Optical_ber(
|
|
|
+ AlphabetMod('4pam', 10e6),
|
|
|
+ AlphabetDemod('4pam', 10e6),
|
|
|
+ samples=1000,
|
|
|
+ steps=40,
|
|
|
+ start=-15,
|
|
|
+ length=l,
|
|
|
+ pulse_shape='rcos'
|
|
|
+ ), '-', label=(str(int(l))+'km'))
|
|
|
+
|
|
|
+ plt.yscale('log')
|
|
|
+ plt.gca().invert_xaxis()
|
|
|
+ plt.grid()
|
|
|
+ plt.xlabel('Noise dB')
|
|
|
+ plt.ylabel('BER')
|
|
|
+ plt.title("BER against Fiber length")
|
|
|
+ plt.legend()
|
|
|
+ plt.show()
|
|
|
+
|
|
|
+ for ps in ['rect', 'rcos', 'rrcos']:
|
|
|
+ plt.plot(*get_Optical_ber(
|
|
|
+ AlphabetMod('4pam', 10e6),
|
|
|
+ AlphabetDemod('4pam', 10e6),
|
|
|
+ samples=1000,
|
|
|
steps=40,
|
|
|
- start=-15
|
|
|
- ), '-', label=scheme.upper())
|
|
|
+ start=-15,
|
|
|
+ length=10,
|
|
|
+ pulse_shape=ps
|
|
|
+ ), '-', label=ps)
|
|
|
|
|
|
plt.yscale('log')
|
|
|
plt.gca().invert_xaxis()
|
|
|
plt.grid()
|
|
|
plt.xlabel('Noise dB')
|
|
|
plt.ylabel('BER')
|
|
|
+ plt.title("BER for different pulse shapes")
|
|
|
plt.legend()
|
|
|
plt.show()
|
|
|
|