def doppler_resolution(self): _, bw = dsp.range_resolution( self.cfg['profiles'][0]['adcSamples'], self.cfg['profiles'][0]['adcSampleRate'] / 1000, self.cfg['profiles'][0]['freqSlopeConst'] / 1e12) return dsp.doppler_resolution( bw, start_freq_const=self.cfg['profiles'][0]['start_frequency'] / 1e9, ramp_end_time=self.cfg['profiles'][0]['rampEndTime'] * 1e6, idle_time_const=self.cfg['profiles'][0]['idle'] * 1e6, num_loops_per_frame=self.cfg['numChirps'] / len(self.cfg['chirps']), num_tx_antennas=self.cfg['numTx'])
# numDopplerBins = numLoopsPerFrame numDopplerBins = numLoopsPerFrame numAngleBins = 64 # data processing parameter numDisplaySamples = 20 range_resolution, bandwidth = dsp.range_resolution( numADCSamples, dig_out_sample_rate=configParameters['digOutSampleRate'], freq_slope_const=configParameters['freqSlopeConst']) doppler_resolution = dsp.doppler_resolution( bandwidth, start_freq_const=configParameters['startFreq'], ramp_end_time=configParameters['rampEndTime'], idle_time_const=configParameters['idleTime'], num_loops_per_frame=configParameters['numLoops'], num_tx_antennas=numTxAntennas) print( f'Range Resolution: {range_resolution}, Bandwidth: {bandwidth}, Doppler Resolution: {doppler_resolution}' ) ims = [] max_size = 0 # (1) Reading in adc data if loadData: adc_data = np.fromfile(adc_data_path, dtype=np.int16) adc_data = adc_data.reshape(numFrames, -1) adc_data = np.apply_along_axis(DCA1000.organize,
# QOL settings loadData = True numFrames = 300 numADCSamples = 128 numTxAntennas = 3 numRxAntennas = 4 numLoopsPerFrame = 128 numChirpsPerFrame = numTxAntennas * numLoopsPerFrame numRangeBins = numADCSamples numDopplerBins = numLoopsPerFrame numAngleBins = 64 range_resolution, bandwidth = dsp.range_resolution(numADCSamples) doppler_resolution = dsp.doppler_resolution(bandwidth) plotRangeDopp = False plot2DscatterXY = False plot2DscatterXZ = False plot3Dscatter = True plotCustomPlt = False plotMakeMovie = False makeMovieTitle = "3dscatter" makeMovieDirectory = r"c://Users//Zber//Desktop//mymovie.mp4" visTrigger = plot2DscatterXY + plot2DscatterXZ + plot3Dscatter + plotRangeDopp + plotCustomPlt assert visTrigger < 2, "Can only choose to plot one type of plot at once" singFrameView = False
def generate_spectrum_from_RDC(filename, numFrames=500, numADCSamples=128, numTxAntennas=3, numRxAntennas=4, numLoopsPerFrame=128, numAngleBins=64, chirpPeriod=0.06, logGabor=False, accumulate=True, save_full=False): numChirpsPerFrame = numTxAntennas * numLoopsPerFrame # ============================================================================= # numADCSamples = number of range bins # numLoopsPerFrame = number of doppler bins # ============================================================================= range_resolution, bandwidth = dsp.range_resolution(numADCSamples) doppler_resolution = dsp.doppler_resolution(bandwidth) if filename[-4:] != '.bin': filename += '.bin' adc_data = np.fromfile(filename, dtype=np.int16) adc_data = adc_data.reshape(numFrames, -1) adc_data = np.apply_along_axis(DCA1000.organize, 1, adc_data, num_chirps=numChirpsPerFrame, num_rx=numRxAntennas, num_samples=numADCSamples) print("Data Loaded!") dataCube = adc_data micro_doppler_data = np.zeros((numFrames, numLoopsPerFrame, numADCSamples), dtype=np.float64) theta_data = np.zeros((numFrames, numLoopsPerFrame, numTxAntennas * numRxAntennas, numADCSamples), dtype=np.complex) for i, frame in enumerate(dataCube): # (2) Range Processing from mmwave.dsp.utils import Window radar_cube = dsp.range_processing(frame, window_type_1d=Window.BLACKMAN) assert radar_cube.shape == ( numChirpsPerFrame, numRxAntennas, numADCSamples), "[ERROR] Radar cube is not the correct shape!" # (3) Doppler Processing det_matrix, theta_data[i] = dsp.doppler_processing( radar_cube, num_tx_antennas=3, clutter_removal_enabled=True, window_type_2d=Window.HAMMING) # --- Shifts & Store det_matrix_vis = np.fft.fftshift(det_matrix, axes=1) micro_doppler_data[i, :, :] = det_matrix_vis # Data should now be ready. Needs to be in micro_doppler_data, a 3D-numpy array with shape [numDoppler, numRanges, numFrames] # LOG GABOR if logGabor: if accumulate: image = micro_doppler_data.sum(axis=1).T else: image = micro_doppler_data.T from LogGabor import LogGabor import holoviews as hv lg = LogGabor("default_param.py") lg.set_size(image) lg.pe.datapath = 'database/' image = lg.normalize(image, center=True) # display input image # hv.Image(image) # display log gabor'd image image = lg.whitening(image) * lg.mask hv.Image(image) uDoppler = image elif accumulate: uDoppler = micro_doppler_data.sum(axis=1).T else: uDoppler = micro_doppler_data.T if save_full: return range_resolution, doppler_resolution, uDoppler, theta_data else: return range_resolution, doppler_resolution, uDoppler
from etc.config_1 import NUM_CHIRPS, NUM_ADC_SAMPLES, sample_rate, freq_slope, adc_samples, \ start_freq, idle_time, ramp_end_time # Data specific parameters # DSP processing parameters # Data sampling configuration # Range and Velocity resolution range_res, band_width = range_resolution(NUM_ADC_SAMPLES, sample_rate, freq_slope) # range_res = RANGE_RESOLUTION print(f'Range Resolution: {range_res} [meters]') velocity_res = doppler_resolution(band_width, start_freq, ramp_end_time, idle_time, NUM_CHIRPS, 1) print(f'Velocity Resolution: {velocity_res} [meters/second]') # Apply the range resolution factor to the range indices ranges = np.arange(adc_samples) * range_res def load_file(file_path, radar_config=None, discard_rx=True): adc_data = np.fromfile(file_path, dtype=np.uint16) adc_data = adc_data.reshape(NUM_FRAMES, -1) all_data = np.apply_along_axis(DCA1000.organize, 1, adc_data, num_chirps=NUM_CHIRPS, num_rx=NUM_RX, num_samples=NUM_ADC_SAMPLES)