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)
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)
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())
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")
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")