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
|
#!/usr/bin/env python
#
# Copyright 2020 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
from gnuradio import gr, gr_unittest
from gnuradio import blocks
import random, numpy
from gnuradio import digital
from gnuradio import channels
class qa_meas_evm_cc(gr_unittest.TestCase):
def setUp(self):
random.seed(987654)
self.tb = gr.top_block()
self.num_data = num_data = 1000
def tearDown(self):
self.tb = None
def test_qpsk(self):
# set up fg
expected_result = tuple(numpy.zeros((self.num_data,)))
self.cons = cons = digital.constellation_qpsk().base()
self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)]
self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data])
evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT)
vso = blocks.vector_source_c(symbols, False, 1, [])
# mc = blocks.multiply_const_cc(3.0+2.0j)
vsi = blocks.vector_sink_f()
self.tb.connect(vso, evm, vsi)
self.tb.run()
# check data
output_data = vsi.data()
self.assertEqual(expected_result, output_data)
def test_qpsk_nonzeroevm(self):
# set up fg
expected_result = tuple(numpy.zeros((self.num_data,)))
self.cons = cons = digital.constellation_qpsk().base()
self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)]
self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data])
evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT)
vso = blocks.vector_source_c(symbols, False, 1, [])
mc = blocks.multiply_const_cc(3.0+2.0j)
vsi = blocks.vector_sink_f()
self.tb.connect(vso, mc, evm, vsi)
self.tb.run()
# check data
output_data = vsi.data()
self.assertNotEqual(expected_result, output_data)
def test_qpsk_channel(self):
upper_bound = tuple(50.0*numpy.ones((self.num_data,)))
lower_bound = tuple(0.0*numpy.zeros((self.num_data,)))
self.cons = cons = digital.constellation_qpsk().base()
self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)]
self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data])
chan = channels.channel_model(
noise_voltage=0.1,
frequency_offset=0.0,
epsilon=1.0,
taps=[1.0 + 0.0j],
noise_seed=0,
block_tags=False)
evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT)
vso = blocks.vector_source_c(symbols, False, 1, [])
mc = blocks.multiply_const_cc(3.0+2.0j)
vsi = blocks.vector_sink_f()
self.tb.connect(vso, chan, evm, vsi)
self.tb.run()
# check data
output_data = vsi.data()
self.assertLess(output_data, upper_bound)
self.assertGreater(output_data, lower_bound)
def test_qam16_channel(self):
upper_bound = tuple(50.0*numpy.ones((self.num_data,)))
lower_bound = tuple(0.0*numpy.zeros((self.num_data,)))
self.cons = cons = digital.constellation_16qam().base()
self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)]
self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data])
chan = channels.channel_model(
noise_voltage=0.1,
frequency_offset=0.0,
epsilon=1.0,
taps=[1.0 + 0.0j],
noise_seed=0,
block_tags=False)
evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT)
vso = blocks.vector_source_c(symbols, False, 1, [])
mc = blocks.multiply_const_cc(3.0+2.0j)
vsi = blocks.vector_sink_f()
self.tb.connect(vso, chan, evm, vsi)
self.tb.run()
# check data
output_data = vsi.data()
self.assertLess(output_data, upper_bound)
self.assertGreater(output_data, lower_bound)
if __name__ == '__main__':
gr_unittest.run(qa_meas_evm_cc)
|