Ejemplo n.º 1
0
    def test_002_t (self):
        vlen=16
        skip=4
        dc_null=2
        ofdm_sym=2
        expected_snr = ((1-0.01)/(0.01), (1-0.01)/(0.01))
        expected_noise = (0.01, 0.01)
        # define the blocks
        src_data = [0.1]*(skip/2) + [skip] + [0.1]*(skip/2-1)
        src_data = src_data * (vlen/skip)
        src_data = [0]*(dc_null/2) + src_data[:(vlen/2-dc_null/2)]  + src_data[(vlen/2+dc_null/2):] + [0]*(dc_null/2)
        src_data = src_data * (ofdm_sym)
        src = blocks.vector_source_c(src_data,False,vlen)
        snr_estim = ofdm.snr_estimator_dc_null(vlen,skip,dc_null)
        dst = blocks.vector_sink_f()
        dst_noise = blocks.vector_sink_f()

        # construct the flowgraph
        self.tb.connect(src,snr_estim)
        self.tb.connect((snr_estim,0),dst)
        self.tb.connect((snr_estim,1),dst_noise)

        # set up fg
        self.tb.run ()
        print "snr", dst.data()
        print "noise", dst_noise.data()

        # Compare with reference data from above
        self.assertFloatTuplesAlmostEqual(dst.data(),expected_snr)
        self.assertFloatTuplesAlmostEqual(dst_noise.data(),expected_noise)
Ejemplo n.º 2
0
    def test_002_t(self):
        vlen = 16
        skip = 4
        dc_null = 2
        ofdm_sym = 2
        expected_snr = ((1 - 0.01) / (0.01), (1 - 0.01) / (0.01))
        expected_noise = (0.01, 0.01)
        # define the blocks
        src_data = [0.1] * (skip / 2) + [skip] + [0.1] * (skip / 2 - 1)
        src_data = src_data * (vlen / skip)
        src_data = [0] * (dc_null / 2) + src_data[:(
            vlen / 2 - dc_null / 2)] + src_data[
                (vlen / 2 + dc_null / 2):] + [0] * (dc_null / 2)
        src_data = src_data * (ofdm_sym)
        src = blocks.vector_source_c(src_data, False, vlen)
        snr_estim = ofdm.snr_estimator_dc_null(vlen, skip, dc_null)
        dst = blocks.vector_sink_f()
        dst_noise = blocks.vector_sink_f()

        # construct the flowgraph
        self.tb.connect(src, snr_estim)
        self.tb.connect((snr_estim, 0), dst)
        self.tb.connect((snr_estim, 1), dst_noise)

        # set up fg
        self.tb.run()
        print "snr", dst.data()
        print "noise", dst_noise.data()

        # Compare with reference data from above
        self.assertFloatTuplesAlmostEqual(dst.data(), expected_snr)
        self.assertFloatTuplesAlmostEqual(dst_noise.data(), expected_noise)
Ejemplo n.º 3
0
    def test_001_t(self):
        d_vlen = 4
        d_skip = 2
        d_dc_null = 2

        sum_load = 0
        sum_null = 0

        #noise
        noise = np.random.normal(0, 1, 1000)
        src_data = [2, 1] * 10
        #        src_data=[sum(x) for x in zip(data,noise)]
        src = blocks.vector_source_c(src_data, vlen=4)
        snr = ofdm.snr_estimator(d_vlen, d_skip)
        snr_dc_null = ofdm.snr_estimator_dc_null(d_vlen, d_skip, d_dc_null)
        dst = blocks.vector_sink_f()
        dst_noise = blocks.vector_sink_f()
        dst_dc_null = blocks.vector_sink_f()
        dst_dc_null_noise = blocks.vector_sink_f()
        #construct the flowgraph
        self.tb.connect(src, snr_dc_null)
        self.tb.connect(src, snr)

        self.tb.connect((snr_dc_null, 0), dst_dc_null)
        self.tb.connect((snr_dc_null, 1), dst_dc_null_noise)

        self.tb.connect((snr, 0), dst)
        self.tb.connect((snr, 1), dst_noise)

        # set up fg
        self.tb.run()

        print "output", dst.data()
        print "output dc_null", dst_dc_null.data()
        # calculate reference data
        dc_null_noise = dst_dc_null.data()
        if not d_dc_null:
            for index, number in enumerate(src_data):
                square = number * number.conjugate()
                if not index % d_skip:
                    sum_load += square
                else:
                    sum_null += square
            estim = (1. / d_skip) * ((d_skip - 1) * sum_load / sum_null - 1)
            estim_noise = sum_null * d_skip / (d_skip - 1) / d_vlen
        else:
            results = [0] * 80
            estim_noise = results
            estim = results

#Compare with snr_estimator_block
        self.assertEqual(dst_dc_null.data(), dst.data())
        self.assertEqual(dst_dc_null_noise.data(), dst_noise.data())
    def test_001_t (self):
        d_vlen=4
        d_skip=2
        d_dc_null=2

        sum_load=0
        sum_null=0

        #noise
        noise=np.random.normal(0,1,1000)
        src_data=[2,1]*10
#        src_data=[sum(x) for x in zip(data,noise)]
        src=blocks.vector_source_c(src_data,vlen=4)
        snr=ofdm.snr_estimator(d_vlen,d_skip)
        snr_dc_null=ofdm.snr_estimator_dc_null(d_vlen,d_skip,d_dc_null)
        dst=blocks.vector_sink_f()
        dst_noise=blocks.vector_sink_f()
        dst_dc_null=blocks.vector_sink_f()
        dst_dc_null_noise=blocks.vector_sink_f()
        #construct the flowgraph
        self.tb.connect(src,snr_dc_null)
        self.tb.connect(src,snr)

        self.tb.connect((snr_dc_null,0),dst_dc_null)
        self.tb.connect((snr_dc_null,1),dst_dc_null_noise)

        self.tb.connect((snr,0),dst)
        self.tb.connect((snr,1),dst_noise)
                
        # set up fg
        self.tb.run ()
        
        print "output", dst.data()
        print "output dc_null", dst_dc_null.data()
        # calculate reference data
        dc_null_noise=dst_dc_null.data()
        if not d_dc_null:
            for index,number in enumerate(src_data):
                square=number*number.conjugate()
                if not index%d_skip:
                    sum_load+=square
                else:
                    sum_null+=square
            estim =(1./d_skip)*((d_skip-1)*sum_load/sum_null-1)
            estim_noise = sum_null*d_skip/(d_skip-1)/d_vlen
        else:
            results=[0]*80
            estim_noise=results
            estim=results

#Compare with snr_estimator_block
        self.assertEqual(dst_dc_null.data(),dst.data())
        self.assertEqual(dst_dc_null_noise.data(),dst_noise.data())
Ejemplo n.º 5
0
  def setup_snr_measurement_2(self):
    """
    Perform SNR measurement.
    It uses the data reference from the BER measurement. I.e. if that is not
    setup, it will be setup. Only data subcarriers that are assigned to the
    station are considered in the measurement. Note that there is no sink
    prepared. You need to setup a sink, e.g. with one or more invocation
    of a "publish.."-function.
    SNR output is in dB.
    """
    if not self.measuring_ber():
      self.setup_ber_measurement()
      print "Warning: Setup BER Measurement forced"

    if self.measuring_snr():
      return

    config = station_configuration()

    vlen = config.subcarriers
    frame_length = config.frame_length
    L = config.periodic_parts

    snr_est_filt_2_1 = skip(gr.sizeof_gr_complex*vlen,frame_length)
    for x in range(1,frame_length):
      snr_est_filt_2_1.skip_call(x)

#    log_to_file(self, snr_est_filt_2_1, "data/snr_est_filt_2_1.float")
    
    
    ## NOTE HACK!! first preamble is not equalized

    self.connect(self.symbol_output_2,snr_est_filt_2_1)
    self.connect(self.frame_trigger_2,(snr_est_filt_2_1,1))

#    snrm = self._snr_measurement = milans_snr_estimator( vlen, vlen, L )
#
#    self.connect(snr_est_filt,snrm)
#
#    if self._options.log:
#          log_to_file(self, self._snr_measurement, "data/milan_snr.float")

    #Addition for SINR estimation
    if self._options.sinr_est:
        snr_est_filt_2_2 = skip(gr.sizeof_gr_complex*vlen,frame_length)
        for x in range(frame_length):
          if x != config.training_data.channel_estimation_pilot[0]:
            snr_est_filt_2_2.skip_call(x)

        self.connect(self.symbol_output,snr_est_filt_2_2)
        self.connect(self.frame_trigger,(snr_est_filt_2_2,1))

        sinrm_2 = self._sinr_measurement_2 = milans_sinr_sc_estimator2( vlen, vlen, L )

        self.connect(snr_est_filt_2_1,sinrm_2)
        self.connect(snr_est_filt_2_2,(sinrm_2,1))
        if self._options.log:
            log_to_file(self, (self._sinr_measurement_2,0), "data/milan_sinr_sc.float")
            log_to_file(self, (self._sinr_measurement_2,1), "data/milan_snr.float")

    else:
        #snrm = self._snr_measurement = milans_snr_estimator( vlen, vlen, L )
        snr_estim_2 = snr_estimator_dc_null(vlen, L, config.dc_null)
        scsnrdb_2 = filter.single_pole_iir_filter_ff(0.1)
        snrm_2 = self._snr_measurement_2 = blocks.nlog10_ff(10,1,0)
        self.connect(snr_est_filt_2_1,snr_estim_2,scsnrdb_2,snrm_2)
        self.connect((snr_estim_2,1),blocks.null_sink(gr.sizeof_float))
        #log_to_file(self, snrm_2, "data/snrm_2.float")

        if self._options.log:
            log_to_file(self, self._snr_measurement_2, "data/milan_snr_2.float")
Ejemplo n.º 6
0
  def setup_snr_measurement(self):
    """
    Perform SNR measurement.
    It uses the data reference from the BER measurement. I.e. if that is not
    setup, it will be setup. Only data subcarriers that are assigned to the
    station are considered in the measurement. Note that there is no sink
    prepared. You need to setup a sink, e.g. with one or more invocation
    of a "publish.."-function.
    SNR output is in dB.
    """
    if not self.measuring_ber():
      self.setup_ber_measurement()
      print "Warning: Setup BER Measurement forced"

    if self.measuring_snr():
      return

    config = station_configuration()

    vlen = config.subcarriers
    frame_length = config.frame_length
    L = config.periodic_parts

    snr_est_filt = skip(gr.sizeof_gr_complex*vlen,frame_length)
    for x in range(1,frame_length):
      snr_est_filt.skip_call(x)

    ## NOTE HACK!! first preamble is not equalized

    self.connect(self.symbol_output,snr_est_filt)
    self.connect(self.frame_trigger,(snr_est_filt,1))

#    snrm = self._snr_measurement = milans_snr_estimator( vlen, vlen, L )
#
#    self.connect(snr_est_filt,snrm)
#
#    if self._options.log:
#          log_to_file(self, self._snr_measurement, "data/milan_snr.float")

    #Addition for SINR estimation
    if self._options.sinr_est:
        snr_est_filt_2 = skip(gr.sizeof_gr_complex*vlen,frame_length)
        for x in range(frame_length):
          if x != config.training_data.channel_estimation_pilot[0]:
            snr_est_filt_2.skip_call(x)

        self.connect(self.symbol_output,snr_est_filt_2)
        self.connect(self.frame_trigger,(snr_est_filt_2,1))



        sinrm = self._sinr_measurement = milans_sinr_sc_estimator2( vlen, vlen, L )

        self.connect(snr_est_filt,sinrm)
        self.connect(snr_est_filt_2,(sinrm,1))

        self.feedback_sink = ofdm.feedback_sink_vf(config.data_subcarriers,"tcp://*:3322")
        self.connect(self.id_dec, self.feedback_sink)

        #self.connect((sinrm,1),blocks.null_sink(gr.sizeof_float))
        self.connect((sinrm,0),pilot_subcarrier_filter(False), (self.feedback_sink,1))

        if self._options.log:
            log_to_file(self, (self._sinr_measurement,0), "data/milan_sinr_sc.float")
            log_to_file(self, (self._sinr_measurement,1), "data/milan_snr.float")

    else:
        #snrm = self._snr_measurement = milans_snr_estimator( vlen, vlen, L )
        snr_estim = snr_estimator_dc_null(vlen, L, config.dc_null)
        scsnrdb = filter.single_pole_iir_filter_ff(0.1)
        snrm = self._snr_measurement = blocks.nlog10_ff(10,1,0)
        self.connect(snr_est_filt,snr_estim,scsnrdb,snrm)
        self.connect((snr_estim,1),blocks.null_sink(gr.sizeof_float))
        #log_to_file(self, snrm, "data/snrm.float")

        if self._options.log:
            log_to_file(self, self._snr_measurement, "data/milan_snr.float")