summaryrefslogtreecommitdiff
path: root/gr-digital/python/digital/qa_meas_evm_cc.py
blob: cf3b4577dadfc15f92e2b9f78db70a63ec1450a2 (plain)
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)