DCA1000 Radar Data Processing in MATLAB: 2D FFT and Velocity/Range Estimation
"clear" all\ndata=readDCA1000('matlab_lab_adc_data.bin');\n\nframe_cnt=size(data,2)/256/128;\n\nlightSpeed =300000000; \n\nSample_Rate_Hz = 10000000; \n\n\nSlope_Hz = 29982000000000; \n\nChirp_repetition_period_sec = 0.00016; \n\nStart_Frequency_Hz = 77000000000; \n\n\nSamples_Per_Chirp = 540;\nChirps_Per_Frame =128 ; % chris: no of loops in framecfg\n\nTx_antennas = 1;\nlambda =lightSpeed/ Start_Frequency_Hz;\n\nfftSize1D = 256;\nfftSize2D = 128;\nrange_step = ((Sample_Rate_Hz/Samples_Per_Chirp)/Slope_Hz)... (lightSpeed/2) * Samples_Per_Chirp / fftSize1D;\n\nvel_step = ((1/(Chirp_repetition_period_secTx_antennas))... /Chirps_Per_Frame)(lambda/2) * Chirps_Per_Frame / fftSize2D ; \nvel_axis = (-fftSize2D/2:fftSize2D/2-1)vel_step;\n\nrange_axis = (0:fftSize1D-1)range_step;\ntime_axis = (0:fftSize1D-1)/Sample_Rate_Hz;\nfor i =1:size(data,2)/256\n recv1_data(1:256,i) = data(1,(i-1)256+1:i256);\nend\nfor i=1:frame_cnt\n recv1_frame_data(i,:,:) = recv1_data(:,(i-1)Chirps_Per_Frame+1:iChirps_Per_Frame);\nend\nwindow_1D = hann(256);\nradar_data_1dFFT = fft(squeeze(recv1_frame_data(1,:,:)).window_1D, fftSize1D); \n\nradar_data_2dFFT = fft(radar_data_1dFFT,Chirps_Per_Frame,2);\nradar_data_2dFFT_fftshift = fftshift(radar_data_2dFFT,2);\n% surf(vel_axis, range_axis, abs(radar_data_2dFFT_fftshift));\nimagesc(vel_axis, range_axis, 10log10(abs(radar_data_2dFFT_fftshift)+1));\nview(0,270)\nylabel('range (meters)'); \nxlabel('velocity (metersc)'); \nzlabel('2D FFT Output (dB)');\ntitle('2D FFT amplitude profile')\n \n\n Tc =Chirp_repetition_period_sec;\n Tf = Chirp_repetition_period_secChirps_Per_Frame ;\n \n vel_resolution = lambda /(2 Tf); %input a formula here;\n disp( vel_resolution);\n \n max_vel = lambda/(4 Tc); %input a formula here;\n disp( max_vel);%%% This script is used to read the binary file produced by the DCA1000\n%%% and Mmwave Studio\n%%% Command to run in Matlab GUI -\nreadDCA1000('matlab_lab_adc_data.bin')\nfunction [retVal] = readDCA1000(fileName)\n%% global variables\n% change based on sensor config\nnumADCSamples = 256; % number of ADC samples per chirp\nnumADCBits = 16; % number of ADC bits per sample\nnumRX = 4; % number of receivers\nnumLanes = 2; % do not change. number of lanes is always 2\nisReal = 0; % set to 1 if real only data, 0 if complex data0\n%% read file\n% read .bin file\nfid = fopen(fileName,'r');\nif isempty(fid)\n error('Failed to open file');\nend\nadcData = fread(fid, 'int16');\n% if 12 or 14 bits ADC per sample compensate for sign extension\nif numADCBits ~= 16\nl_max = 2^(numADCBits-1)-1;\nadcData(adcData > l_max) = adcData(adcData > l_max) - 2^numADCBits;\nend\nfclose(fid);\nfileSize = size(adcData, 1);\n% real data reshape, filesize = numADCSamplesnumChirps\nif isReal\nnumChirps = fileSize/numADCSamples/numRX;\nLVDS = zeros(1, fileSize);\n%create column for each chirp\nLVDS = reshape(adcData, numADCSamplesnumRX, numChirps);\n%each row is data from one chirp\nLVDS = LVDS.';\nelse\n% for complex data\n% filesize = 2 * numADCSamples*numChirps\nnumChirps = fileSize/2/numADCSamples/numRX;\nLVDS = zeros(1, fileSize/2);\n%combine real and imaginary part into complex data\n%read in file: 2I is followed by 2Q\ncounter = 1;\nfor i=1:4:fileSize-1\nLVDS(1,counter) = adcData(i) + sqrt(-1)adcData(i+2); LVDS(1,counter+1) = adcData(i+1)+sqrt(-1)adcData(i+3); counter = counter + 2;\nend\n% create column for each chirp\nLVDS = reshape(LVDS, numADCSamplesnumRX, numChirps);\n%each row is data from one chirp\nLVDS = LVDS.';\nend\n%organize data per RX\nadcData = zeros(numRX,numChirpsnumADCSamples);\nfor row = 1:numRX\nfor i = 1: numChirps\nadcData(row, (i-1)numADCSamples+1:inumADCSamples) = LVDS(i, (row-1)numADCSamples+1:rownumADCSamples);\nend\nend\n% return receiver data\nretVal = adcData;\nend
原文地址: https://www.cveoy.top/t/topic/pyuL 著作权归作者所有。请勿转载和采集!