add wifi constellation objects
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 39 KiB |
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import numpy as np
|
||||
import matplotlib as mpl
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
import ieee802_11
|
||||
|
||||
###############################################
|
||||
# 16-QAM
|
||||
###############################################
|
||||
|
||||
c = ieee802_11.constellation_16qam()
|
||||
a = np.array(c.points())
|
||||
p = np.average(np.abs(a)**2)
|
||||
level = .1**.5
|
||||
|
||||
print "16-QAM, average power: {0:.4f}".format(p)
|
||||
|
||||
plt.scatter(a.real, a.imag)
|
||||
for i, x in enumerate(a):
|
||||
s = "{0:04b}".format(i)[::-1]
|
||||
plt.text(x.real, x.imag+0.1, s, ha='center')
|
||||
|
||||
plt.show()
|
||||
|
||||
#######################
|
||||
# test decison maker
|
||||
#######################
|
||||
|
||||
N = 1000
|
||||
data = np.random.randint(0, 16, N)
|
||||
orig_const = a[data]
|
||||
noisy_const = orig_const + np.random.sample(N) * 2 * level - level +\
|
||||
np.random.sample(N) * 2j * level - level * 1j
|
||||
|
||||
rx = np.array(map(lambda x: c.decision_maker_v([x]), noisy_const))
|
||||
rx_const = a[rx]
|
||||
|
||||
if any(rx != data):
|
||||
print "16-QAM: data does not match."
|
||||
else:
|
||||
print "16-QAM: points decoded successfully."
|
||||
|
||||
plt.scatter(a.real, a.imag)
|
||||
plt.scatter(noisy_const.real, noisy_const.imag, marker='x')
|
||||
for d, a, b in zip(rx, rx_const, noisy_const):
|
||||
plt.plot([a.real, b.real], [a.imag, b.imag], color=mpl.cm.hsv(d/16.0))
|
||||
|
||||
plt.show()
|
||||
|
||||
|
||||
|
||||
###############################################
|
||||
# 64-QAM
|
||||
###############################################
|
||||
|
||||
c = ieee802_11.constellation_64qam()
|
||||
a = np.array(c.points())
|
||||
p = np.average(np.abs(a)**2)
|
||||
level = (1.0/42)**.5
|
||||
|
||||
print "64-QAM, average power: {0:.4f}".format(p)
|
||||
|
||||
plt.scatter(a.real, a.imag)
|
||||
for i, x in enumerate(a):
|
||||
s = "{0:06b}".format(i)[::-1]
|
||||
plt.text(x.real, x.imag+0.06, s, ha='center')
|
||||
|
||||
plt.show()
|
||||
|
||||
#######################
|
||||
# test decison maker
|
||||
#######################
|
||||
|
||||
N = 1000
|
||||
data = np.random.randint(0, 64, N)
|
||||
orig_const = a[data]
|
||||
noisy_const = orig_const + np.random.sample(N) * 2 * level - level +\
|
||||
np.random.sample(N) * 2j * level - level * 1j
|
||||
|
||||
rx = np.array(map(lambda x: c.decision_maker_v([x]), noisy_const))
|
||||
rx_const = a[rx]
|
||||
|
||||
if any(rx != data):
|
||||
print "16-QAM: data does not match."
|
||||
else:
|
||||
print "16-QAM: points decoded successfully."
|
||||
|
||||
plt.scatter(a.real, a.imag)
|
||||
plt.scatter(noisy_const.real, noisy_const.imag, marker='x')
|
||||
for d, a, b in zip(rx, rx_const, noisy_const):
|
||||
plt.plot([a.real, b.real], [a.imag, b.imag], color=mpl.cm.hsv(d/64.0))
|
||||
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user