def test_002_t(self): # set up fg # purpse is testing fft on high sample rates test_len = 2**19 packet_len = 2**17 min_output_buffer = packet_len * 2 samp_rate = 10000000 frequency = 200000 amplitude = 1 src = radar.signal_generator_cw_c(packet_len, samp_rate, (frequency, frequency), amplitude) src.set_min_output_buffer(min_output_buffer) head = blocks.head(8, test_len) head.set_min_output_buffer(min_output_buffer) fft1 = radar.ts_fft_cc(packet_len) fft1.set_min_output_buffer(min_output_buffer) fft2 = radar.ts_fft_cc(packet_len) fft2.set_min_output_buffer(min_output_buffer) snk1 = blocks.vector_sink_c() snk2 = blocks.vector_sink_c() self.tb.connect(src, head, fft1, snk1) self.tb.connect(head, fft2, snk2) self.tb.run() # check both ffts self.assertComplexTuplesAlmostEqual(snk1.data(), snk2.data(), 2) # compare both ffts
def test_001_t (self): # set up fg test_len = 1000 packet_len = 1024 samp_rate = 32000 frequency = (500, 500) amplitude = 1 test = radar.signal_generator_cw_c(packet_len, samp_rate, frequency, amplitude) head = blocks.head(8,test_len) sink = blocks.vector_sink_c() self.tb.connect(test,head,sink) self.tb.run () # create reference data ref_data = [0]*test_len phase = 0 for i in range(test_len): ref_data[i] = amplitude*np.exp(1j*phase) phase = phase + 2*np.pi*frequency[0]/samp_rate #phase = np.modf(phase,2*np.pi) ref_data = [0]*test_len phase = 0 for i in range(test_len): ref_data[i] = amplitude*np.exp(1j*phase) phase = phase+2*np.pi*frequency[0]/samp_rate # check data out_data = sink.data() self.assertEqual(len(out_data),test_len) # check out_data length self.assertComplexTuplesAlmostEqual(out_data,ref_data,2) # check out_data with ref_data
def test_003_t(self): # test fft against gnuradio fft # set up fg test_len = 1024 * 2 packet_len = test_len samp_rate = 2000 frequency = (100, 100) amplitude = 1 src = radar.signal_generator_cw_c(packet_len, samp_rate, frequency, amplitude) head = blocks.head(8, test_len) tsfft = radar.ts_fft_cc(packet_len) snk1 = blocks.vector_sink_c() self.tb.connect(src, head, tsfft, snk1) s2v = blocks.stream_to_vector(8, packet_len) fft_inbuild = fft.fft_vcc(test_len, 1, fft.window_rectangular(0)) snk2 = blocks.vector_sink_c() v2s = blocks.vector_to_stream(8, packet_len) self.tb.connect(head, s2v, fft_inbuild, v2s, snk2) self.tb.run() # compaire ffts data_tsfft = snk1.data() data_fft_inbuild = snk2.data() self.assertComplexTuplesAlmostEqual( data_tsfft, data_fft_inbuild, 2) # compare inbuild fft and fft from block
def test_003_t (self): # test fft against gnuradio fft # set up fg test_len = 1024*2 packet_len = test_len samp_rate = 2000 frequency = (100,100) amplitude = 1 src = radar.signal_generator_cw_c(packet_len,samp_rate,frequency,amplitude) head = blocks.head(8,test_len) tsfft = radar.ts_fft_cc(packet_len) snk1 = blocks.vector_sink_c() self.tb.connect(src,head,tsfft,snk1) s2v = blocks.stream_to_vector(8, packet_len) fft_inbuild = fft.fft_vcc(test_len,True,fft.window_rectangular(0)) snk2 = blocks.vector_sink_c() v2s = blocks.vector_to_stream(8, packet_len); self.tb.connect(head,s2v,fft_inbuild,v2s,snk2) self.tb.run() # compaire ffts data_tsfft = snk1.data() data_fft_inbuild = snk2.data() self.assertComplexTuplesAlmostEqual(data_tsfft,data_fft_inbuild,2) # compare inbuild fft and fft from block
def test_002_t (self): # set up fg # purpse is testing fft on high sample rates test_len = 2**19 packet_len = 2**17 min_output_buffer = packet_len*2 samp_rate = 10000000 frequency = 200000 amplitude = 1 src = radar.signal_generator_cw_c(packet_len,samp_rate,(frequency,frequency),amplitude) src.set_min_output_buffer(min_output_buffer) head = blocks.head(8,test_len) head.set_min_output_buffer(min_output_buffer) fft1 = radar.ts_fft_cc(packet_len) fft1.set_min_output_buffer(min_output_buffer) fft2 = radar.ts_fft_cc(packet_len) fft2.set_min_output_buffer(min_output_buffer) snk1 = blocks.vector_sink_c() snk2 = blocks.vector_sink_c() self.tb.connect(src,head,fft1,snk1) self.tb.connect(head,fft2,snk2) self.tb.run () # check both ffts self.assertComplexTuplesAlmostEqual(snk1.data(),snk2.data(),2) # compare both ffts
def test_001_t(self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 center_freq = 1e9 velocity = (5, 15, 20) src = radar.signal_generator_cw_c(packet_len, samp_rate, (0, 0), 1) head = blocks.head(8, test_len) sim = radar.static_target_simulator_cc( (10, 10, 10), velocity, (1e12, 1e12, 1e12), (0, 0, 0), (0, ), samp_rate, center_freq, 1, True, False) mult = blocks.multiply_cc() fft = radar.ts_fft_cc(packet_len) cfar = radar.os_cfar_c(samp_rate, 5, 0, 0.78, 10, True) est = radar.estimator_cw(center_freq) res1 = radar.print_results() res2 = radar.print_results() gate = radar.msg_gate(('velocity', 'bla'), (8, 8), (17, 17)) debug1 = blocks.message_debug() debug2 = blocks.message_debug() self.tb.connect(src, head, (mult, 1)) self.tb.connect(head, sim, (mult, 0)) self.tb.connect(mult, fft, cfar) self.tb.msg_connect(cfar, 'Msg out', est, 'Msg in') self.tb.msg_connect(est, 'Msg out', res1, 'Msg in') self.tb.msg_connect(est, 'Msg out', debug1, 'store') self.tb.msg_connect(est, 'Msg out', gate, 'Msg in') self.tb.msg_connect(gate, 'Msg out', debug2, 'store') self.tb.msg_connect(gate, 'Msg out', res2, 'Msg in') self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data msg1 = debug1.get_message(0) # msg without gate msg2 = debug2.get_message(0) # msg with gate self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth(0, (pmt.nth( 1, msg1))))) # check velocity message part (symbol), 1 self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth(0, (pmt.nth( 1, msg2))))) # check velocity message part (symbol), 2 self.assertEqual(pmt.length(pmt.nth(1, pmt.nth(1, msg1))), 3) # check number of targets without gate self.assertEqual(pmt.length(pmt.nth(1, pmt.nth(1, msg2))), 1) # check nubmer of targets with gate self.assertAlmostEqual( 1, velocity[1] / pmt.f32vector_ref(pmt.nth(1, (pmt.nth(1, msg2))), 0), 1) # check velocity value
def test_001_t(self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 center_freq = 1e9 velocity = (5, 15, 20) src = radar.signal_generator_cw_c(packet_len, samp_rate, (0, 0), 1) head = blocks.head(8, test_len) sim = radar.static_target_simulator_cc( (10, 10, 10), velocity, (1e12, 1e12, 1e12), (0, 0, 0), (0,), samp_rate, center_freq, 1, True, False ) mult = blocks.multiply_cc() fft = radar.ts_fft_cc(packet_len) cfar = radar.os_cfar_c(samp_rate, 5, 0, 0.78, 10, True) est = radar.estimator_cw(center_freq) res1 = radar.print_results() res2 = radar.print_results() gate = radar.msg_gate(("velocity", "bla"), (8, 8), (17, 17)) debug1 = blocks.message_debug() debug2 = blocks.message_debug() self.tb.connect(src, head, (mult, 1)) self.tb.connect(head, sim, (mult, 0)) self.tb.connect(mult, fft, cfar) self.tb.msg_connect(cfar, "Msg out", est, "Msg in") self.tb.msg_connect(est, "Msg out", res1, "Msg in") self.tb.msg_connect(est, "Msg out", debug1, "store") self.tb.msg_connect(est, "Msg out", gate, "Msg in") self.tb.msg_connect(gate, "Msg out", debug2, "store") self.tb.msg_connect(gate, "Msg out", res2, "Msg in") self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data msg1 = debug1.get_message(0) # msg without gate msg2 = debug2.get_message(0) # msg with gate self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth(0, (pmt.nth(1, msg1)))) ) # check velocity message part (symbol), 1 self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth(0, (pmt.nth(1, msg2)))) ) # check velocity message part (symbol), 2 self.assertEqual(pmt.length(pmt.nth(1, pmt.nth(1, msg1))), 3) # check number of targets without gate self.assertEqual(pmt.length(pmt.nth(1, pmt.nth(1, msg2))), 1) # check nubmer of targets with gate self.assertAlmostEqual( 1, velocity[1] / pmt.f32vector_ref(pmt.nth(1, (pmt.nth(1, msg2))), 0), 1 ) # check velocity value
def test_001_t(self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 center_freq = 1e9 velocity = 15 src = radar.signal_generator_cw_c(packet_len, samp_rate, (0, 0), 1) head = blocks.head(8, test_len) sim = radar.static_target_simulator_cc( (10, 10), (velocity, velocity), (1e9, 1e9), (0, 0), (0, ), samp_rate, center_freq, 1, True, False) mult = blocks.multiply_cc() fft = radar.ts_fft_cc(packet_len) cfar = radar.os_cfar_c(samp_rate, 5, 0, 0.78, 10, True) est = radar.estimator_cw(center_freq) res = radar.print_results() debug = blocks.message_debug() self.tb.connect(src, head, (mult, 1)) self.tb.connect(head, sim, (mult, 0)) self.tb.connect(mult, fft, cfar) self.tb.msg_connect(cfar, 'Msg out', est, 'Msg in') self.tb.msg_connect(est, 'Msg out', res, 'Msg in') self.tb.msg_connect(est, 'Msg out', debug, 'store') #self.tb.msg_connect(est,'Msg out',debug,'print') self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data msg = debug.get_message(0) self.assertEqual("rx_time", pmt.symbol_to_string(pmt.nth(0, (pmt.nth( 0, msg))))) # check rx_time message part (symbol) self.assertEqual(0, pmt.to_uint64( pmt.tuple_ref(pmt.nth(1, (pmt.nth(0, msg))), 0))) # check rx_time value self.assertEqual( 0.0, pmt.to_double(pmt.tuple_ref(pmt.nth(1, (pmt.nth(0, msg))), 1))) self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth( 0, (pmt.nth(1, msg))))) # check velocity message part (symbol) self.assertAlmostEqual( 1, velocity / pmt.f32vector_ref(pmt.nth(1, (pmt.nth(1, msg))), 0), 2) # check velocity value
def test_001_t(self): # check doppler freq (frequency shifting) # set up fg test_len = 1000 packet_len = test_len samp_rate = 2000 frequency = (0, ) amplitude = 1 Range = (10, ) velocity = (15, ) rcs = (1e9, ) azimuth = (0, ) position_rx = (0, ) center_freq = 1e9 rndm_phase = True self_coupling = False self_coupling_db = -10 src = radar.signal_generator_cw_c(packet_len, samp_rate, frequency, amplitude) head = blocks.head(8, test_len) sim = radar.static_target_simulator_cc(Range, velocity, rcs, azimuth, position_rx, samp_rate, center_freq, self_coupling_db, rndm_phase, self_coupling) mult = blocks.multiply_cc() snk = blocks.vector_sink_c() self.tb.connect(src, head, sim) self.tb.connect((sim, 0), (mult, 0)) self.tb.connect((head, 0), (mult, 1)) self.tb.connect(mult, snk) self.tb.run() # check data data = snk.data() doppler_freq = 2 * velocity[ 0] * center_freq / 3e8 # peak estimation, calc with doppler formula fft = numpy.fft.fft(data) # get fft num = np.argmax(abs(fft)) # index of max sample fft_freq = samp_rate * num / len( fft ) # calc freq out of max sample index, works only for frequencies < samp_rate/2! self.assertAlmostEqual(fft_freq, doppler_freq, 2) # check if peak in data is doppler peak
def test_001_t (self): # check doppler freq (frequency shifting) # set up fg test_len = 1000 packet_len = test_len samp_rate = 2000 frequency = (0,) amplitude = 1 Range = (10,) velocity = (15,) rcs = (1e9,) azimuth = (0,) position_rx = (0,) center_freq = 1e9 rndm_phase = True self_coupling = False self_coupling_db = -10; src = radar.signal_generator_cw_c(packet_len,samp_rate,frequency,amplitude) head = blocks.head(8,test_len) sim = radar.static_target_simulator_cc(Range, velocity, rcs, azimuth, position_rx, samp_rate, center_freq, self_coupling_db, rndm_phase, self_coupling) mult = blocks.multiply_cc() snk = blocks.vector_sink_c() self.tb.connect(src,head,sim) self.tb.connect((sim,0),(mult,0)) self.tb.connect((head,0),(mult,1)) self.tb.connect(mult,snk) self.tb.run () # check data data = snk.data() doppler_freq = 2*velocity[0]*center_freq/3e8 # peak estimation, calc with doppler formula fft = numpy.fft.fft(data) # get fft num = np.argmax(abs(fft)) # index of max sample fft_freq = samp_rate*num/len(fft) # calc freq out of max sample index, works only for frequencies < samp_rate/2! self.assertAlmostEqual(fft_freq,doppler_freq,2) # check if peak in data is doppler peak
def test_001_t (self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 center_freq = 1e9 velocity = 15 src = radar.signal_generator_cw_c(packet_len,samp_rate,(0,0),1) head = blocks.head(8,test_len) sim = radar.static_target_simulator_cc((10,10),(velocity,velocity),(1e9,1e9),(0,0),(0,),samp_rate,center_freq,1,True,False) mult = blocks.multiply_cc() fft = radar.ts_fft_cc(packet_len) cfar = radar.os_cfar_c(samp_rate, 5, 0, 0.78, 10, True) est = radar.estimator_cw(center_freq) res = radar.print_results() debug = blocks.message_debug() self.tb.connect(src,head,(mult,1)) self.tb.connect(head,sim,(mult,0)) self.tb.connect(mult,fft,cfar) self.tb.msg_connect(cfar,'Msg out',est,'Msg in') self.tb.msg_connect(est,'Msg out',res,'Msg in') self.tb.msg_connect(est,'Msg out',debug,'store') #self.tb.msg_connect(est,'Msg out',debug,'print') self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data msg = debug.get_message(0) self.assertEqual( "rx_time", pmt.symbol_to_string(pmt.nth(0,(pmt.nth(0,msg)))) ) # check rx_time message part (symbol) self.assertEqual( 0, pmt.to_uint64(pmt.tuple_ref(pmt.nth(1,(pmt.nth(0,msg))),0)) ) # check rx_time value self.assertEqual( 0.0, pmt.to_double(pmt.tuple_ref(pmt.nth(1,(pmt.nth(0,msg))),1)) ) self.assertEqual( "velocity", pmt.symbol_to_string(pmt.nth(0,(pmt.nth(1,msg)))) ) # check velocity message part (symbol) self.assertAlmostEqual( 1, velocity/pmt.f32vector_ref(pmt.nth(1,(pmt.nth(1,msg))),0), 2 ) # check velocity value
def test_001_t (self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 frequency = (100,100) amplitude = 1 src = radar.signal_generator_cw_c(packet_len,samp_rate,frequency,amplitude) head = blocks.head(8,test_len) fft = radar.ts_fft_cc(packet_len) snk1 = blocks.vector_sink_c() snk2 = blocks.vector_sink_c() self.tb.connect(src,head,fft,snk2) # snk2 holds fft data self.tb.connect(head,snk1) # snk1 holds time samples self.tb.run () # check data data = snk1.data() np_fft = numpy.fft.fft(data) # get fft self.assertComplexTuplesAlmostEqual(snk2.data(),np_fft,4) # compare numpy fft and fft from block
def test_001_t(self): # set up fg test_len = 1000 packet_len = 1024 samp_rate = 32000 frequency = (500, 500) amplitude = 1 test = radar.signal_generator_cw_c(packet_len, samp_rate, frequency, amplitude) head = blocks.head(8, test_len) sink = blocks.vector_sink_c() self.tb.connect(test, head, sink) self.tb.run() # create reference data ref_data = [0] * test_len phase = 0 for i in range(test_len): ref_data[i] = amplitude * np.exp(1j * phase) phase = phase + 2 * np.pi * frequency[0] / samp_rate #phase = np.modf(phase,2*np.pi) ref_data = [0] * test_len phase = 0 for i in range(test_len): ref_data[i] = amplitude * np.exp(1j * phase) phase = phase + 2 * np.pi * frequency[0] / samp_rate # check data out_data = sink.data() self.assertEqual(len(out_data), test_len) # check out_data length self.assertComplexTuplesAlmostEqual(out_data, ref_data, 2) # check out_data with ref_data
def test_001_t(self): # set up fg test_len = 1024 packet_len = test_len samp_rate = 2000 frequency = (100, 100) amplitude = 1 src = radar.signal_generator_cw_c(packet_len, samp_rate, frequency, amplitude) head = blocks.head(8, test_len) fft = radar.ts_fft_cc(packet_len) snk1 = blocks.vector_sink_c() snk2 = blocks.vector_sink_c() self.tb.connect(src, head, fft, snk2) # snk2 holds fft data self.tb.connect(head, snk1) # snk1 holds time samples self.tb.run() # check data data = snk1.data() np_fft = numpy.fft.fft(data) # get fft self.assertComplexTuplesAlmostEqual( snk2.data(), np_fft, 4) # compare numpy fft and fft from block
def test_001_t(self): # set up fg samp_rate = 20000 packet_len = 2048 freq = 0 ampl = 1 noise_ampl = 0.1 test_len = packet_len * 200 rng = (10, 10, 10) vlc = (5, -10, 0) rcs = (1e8, 1e8, 1e8) center_freq = 6e9 src = radar.signal_generator_cw_c(packet_len, samp_rate, freq, ampl) head = blocks.head(8, test_len) sim = radar.simulator_cc(rng, vlc, rcs, samp_rate, center_freq) noise = analog.noise_source_c(analog.GR_GAUSSIAN, noise_ampl, 0) add = blocks.add_cc() # estimator samp_compare = 10 samp_protect = 0 rel_threshold = 1 avg_mult = 6 dec_factor = 2 mult = blocks.multiply_cc() dec = radar.decimator_cc(dec_factor) fft = radar.tsfft_cc() cfar = radar.os_cfar_c(samp_rate / dec_factor, samp_compare, samp_protect, rel_threshold, avg_mult) est_v = radar.est_v_cw(center_freq) # end: estimator snk = blocks.vector_sink_c() # connect self.tb.connect(src, head, sim) self.tb.connect((sim, 0), (add, 0)) self.tb.connect((noise, 0), (add, 1)) self.tb.connect((head, 0), (mult, 0)) self.tb.connect((add, 0), (mult, 1)) self.tb.connect(mult, dec, fft, cfar) self.tb.msg_connect(cfar, 'cfar_out', est_v, 'cw_in') self.tb.connect(fft, snk) # run self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data data = snk.data() y = [0] * packet_len for k in range(packet_len): y[k] = pow(abs(data[k + 0 * packet_len / 2]), 2) x = [0] * packet_len for k in range(packet_len / 2): x[k] = k * samp_rate / packet_len x[k + packet_len / 2] = -samp_rate / 2.0 + k * samp_rate / packet_len plt.plot(x, y) # frequency on x, shifted #plt.plot(y) # samples on x, nonshifted plt.yscale('log') plt.title("FFT spectrum")
def test_001_t (self): # set up fg samp_rate = 20000 packet_len = 2048 freq = 0 ampl = 1 noise_ampl = 0.1 test_len = packet_len*200 rng = (10,10, 10) vlc = (5,-10, 0) rcs = (1e8,1e8, 1e8) center_freq = 6e9; src = radar.signal_generator_cw_c(packet_len,samp_rate,freq,ampl) head = blocks.head(8,test_len) sim = radar.simulator_cc(rng,vlc,rcs,samp_rate,center_freq) noise = analog.noise_source_c(analog.GR_GAUSSIAN,noise_ampl,0) add = blocks.add_cc() # estimator samp_compare = 10 samp_protect = 0 rel_threshold = 1 avg_mult = 6 dec_factor = 2 mult = blocks.multiply_cc() dec = radar.decimator_cc(dec_factor) fft = radar.tsfft_cc() cfar = radar.os_cfar_c(samp_rate/dec_factor, samp_compare,samp_protect, rel_threshold, avg_mult) est_v = radar.est_v_cw(center_freq) # end: estimator snk = blocks.vector_sink_c() # connect self.tb.connect(src,head,sim) self.tb.connect((sim,0),(add,0)) self.tb.connect((noise,0),(add,1)) self.tb.connect((head,0),(mult,0)) self.tb.connect((add,0),(mult,1)) self.tb.connect(mult,dec,fft,cfar) self.tb.msg_connect(cfar,'cfar_out',est_v,'cw_in') self.tb.connect(fft,snk) # run self.tb.start() sleep(0.5) self.tb.stop() self.tb.wait() # check data data = snk.data() y = [0]*packet_len for k in range(packet_len): y[k] = pow(abs(data[k+0*packet_len/2]),2) x = [0]*packet_len for k in range(packet_len/2): x[k] = k*samp_rate/packet_len x[k+packet_len/2]=-samp_rate/2.0+k*samp_rate/packet_len plt.plot(x, y) # frequency on x, shifted #plt.plot(y) # samples on x, nonshifted plt.yscale('log') plt.title("FFT spectrum")