# SFND_P2_Radar_Target_Generation_and_Detection **Repository Path**: f-sj/SFND_P2_Radar_Target_Generation_and_Detection ## Basic Information - **Project Name**: SFND_P2_Radar_Target_Generation_and_Detection - **Description**: Udacity, Sensor Fusion, Project of Radar Target Generation and Detection - **Primary Language**: Matlab - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-10-23 - **Last Updated**: 2023-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SFND_P2_Radar_Target_Generation_and_Detection Udacity, Sensor Fusion, Project of Radar Target Generation and Detection ## Project Layout: * Refer to `radar_target_generation_and_detection.m` --- #### 1. Radar Specifications * Frequency of operation = 77GHz * Max Range = 200m * Range Resolution = 1 m * Max Velocity = 100 m/s ``` Max_Range_of_Radar = 200; Max_Velocity_of_Radar = 100; Range_Resolution_of_Radar = 1; speed_of_light = 3e8; ``` #### 2. User Defined Range and Velocity of target * define the target's initial position and velocity. * Note : Velocity remains contant ``` Range_of_target = 110; % Target Initial Range Velocity_of_target = -20; % Target Velocity ``` #### 3. FMCW Waveform Generation * Design the FMCW waveform by giving the specs of each of its parameters. * Calculate the Bandwidth (B), Chirp Time (Tchirp) and Slope (slope) of the FMCW chirp using the requirements above. * Operating carrier frequency of Radar ``` fc= 77e9; %carrier freq sweep_time_factor = 5.5; B = speed_of_light / (2 * Range_Resolution_of_Radar); % Bandwidth of the FMCW, Bsweep Tchirp = (sweep_time_factor*2*Max_Range_of_Radar)/speed_of_light; % Chirp Time of the FMCW slope = B/Tchirp; % Slope of the FMCW ``` * The number of chirps in one sequence. * Its ideal to have `2^value` for the ease of running the FFT for Doppler Estimation. ``` Nd=128; % # of doppler cells OR # of sent periods % number of chirps ``` * The number of samples on each chirp. ``` Nr=1024; % for length of time OR # of range cells ``` * Timestamp for running the displacement scenario for every sample on each chirp ``` t=linspace(0,Nd*Tchirp,Nr*Nd); %total time for samples ``` * Creating the vectors for Tx, Rx and Mix based on the total samples input. ``` Tx=zeros(1,length(t)); %transmitted signal Rx=zeros(1,length(t)); %received signal Mix = zeros(1,length(t)); %beat signal ``` * Similar vectors for range_covered and time delay. ``` r_t=zeros(1,length(t)); % range_covered td=zeros(1,length(t)); % time delay ``` #### 4. Signal generation and Moving Target simulation ``` for i=1:length(t) % For each time stamp update the Range of the Target for constant velocity. r_t(i) = Range_of_target + (Velocity_of_target*t(i)); % range_covered td(i) = (2*r_t(i)) / speed_of_light; % time delay % For each time sample we need update the transmitted and received signal. Tx(i) = cos( 2*pi*( fc*(t(i) ) + ( 0.5 * slope * t(i)^2) ) ); Rx(i) = cos( 2*pi*( fc*(t(i)-td(i) ) + ( 0.5 * slope * (t(i)-td(i))^2) ) ); % Now by mixing the Transmit and Receive generate the beat signal % This is done by element wise matrix multiplication of Transmit and Receiver Signal Mix(i) = Tx(i).*Rx(i); end ``` #### 5. Range Measurement * Reshape the vector into Nr*Nd array. * Nr and Nd here would also define the size of Range and Doppler FFT respectively. ``` Mix = reshape(Mix,[Nr,Nd]); ``` * run the FFT on the beat signal along the range bins dimension (Nr) and ``` sig_fft1 = fft(Mix,Nr); ``` * normalize. ``` sig_fft1 = sig_fft1./Nr; ``` * Take the absolute value of FFT output ``` sig_fft1 = abs(sig_fft1); ``` * Output of FFT is double sided signal, but we are interested in only one side of the spectrum. * Hence we throw out half of the samples. ``` single_side_sig_fft1 = sig_fft1(1:Nr/2); ``` * Plotting the range, plot FFT output ``` figure ('Name','Range from First FFT') plot(single_side_sig_fft1); axis ([0 200 0 1]); ``` * Simulation Result #### 6. Range Doppler Response * The 2D FFT implementation is already provided here. * This will run a 2DFFT on the mixed signal (beat signal) output and generate a range doppler map. * You will implement CFAR on the generated RDM Range Doppler Map Generation. * The output of the 2D FFT is an image that has reponse in the range and doppler FFT bins. * So, it is important to convert the axis from bin sizes to range and doppler based on their Max values. ``` Mix = reshape(Mix,[Nr,Nd]); ``` * 2D FFT using the FFT size for both dimensions. ``` sig_fft2 = fft2(Mix,Nr,Nd); ``` * Taking just one side of signal from Range dimension. ``` sig_fft2 = sig_fft2(1:Nr/2,1:Nd); sig_fft2 = fftshift (sig_fft2); RDM = abs(sig_fft2); RDM = 10*log10(RDM) ; ``` * Use the surf function to plot the output of 2DFFT and to show axis in both dimensions ``` doppler_axis = linspace(-100,100,Nd); range_axis = linspace(-200,200,Nr/2)*((Nr/2)/400); figure ('Name','Range and Speed From FFT2') surf(doppler_axis,range_axis,RDM); ``` * Simulation Result #### 7. CFAR implementation * Slide Window through the complete Range Doppler Map * Select the number of Training Cells in both the dimensions. ``` Tr = 10; Td = 8; ``` * Select the number of Guard Cells in both dimensions around the Cell under test (CUT) for accurate estimation ``` Gr = 4; Gd = 4; ``` * Offset the threshold by SNR value in dB ``` offset = 1.4; ``` * Create a vector to store noise_level for each iteration on training cells design a loop such that it slides the CUT across range doppler map by giving margins at the edges for Training and Guard Cells. * For every iteration sum the signal level within all the training cells. * To sum convert the value from logarithmic to linear using db2pow function. * Average the summed values for all of the training cells used. * After averaging convert it back to logarithimic using pow2db. * Further add the offset to it to determine the threshold. * Next, compare the signal under CUT with this threshold. * If the CUT level > threshold assign % it a value of `1`, else equate it to `0`. * Use `RDM[x,y]` as the matrix from the output of 2D FFT for implementing CFAR ``` RDM = RDM/max(max(RDM)); for i = Tr+Gr+1:(Nr/2)-(Gr+Tr) for j = Td+Gd+1:Nd-(Gd+Td) % Create a vector to store noise_level for each iteration on training cells noise_level = zeros(1,1); % Calculate noise SUM in the area around CUT for p = i-(Tr+Gr) : i+(Tr+Gr) for q = j-(Td+Gd) : j+(Td+Gd) if (abs(i-p) > Gr || abs(j-q) > Gd) noise_level = noise_level + db2pow(RDM(p,q)); end end end % Calculate threshould from noise average then add the offset threshold = pow2db(noise_level/(2*(Td+Gd+1)*2*(Tr+Gr+1)-(Gr*Gd)-1)); threshold = threshold + offset; CUT = RDM(i,j); if (CUT < threshold) RDM(i,j) = 0; else RDM(i,j) = 1; end end end ``` * The process above will generate a thresholded block, which is smaller than the Range Doppler Map as the CUT cannot be located at the edges of matrix. * Hence,few cells will not be thresholded. * To keep the map size same set those values to 0. ``` RDM(union(1:(Tr+Gr),end-(Tr+Gr-1):end),:) = 0; % Rows RDM(:,union(1:(Td+Gd),end-(Td+Gd-1):end)) = 0; % Columns ``` * Display the CFAR output using the Surf function like we did for Range * Doppler Response output. ``` figure('Name','CA-CFAR Filtered RDM') surf(doppler_axis,range_axis,RDM); colorbar; ``` * Simulation Result