PRE2024 3 Group18/MatLab code: Difference between revisions

From Control Systems Technology Group
Jump to navigation Jump to search
Created page with "Here is the MatLab code of the simulation:"
Tag: 2017 source edit
 
No edit summary
Line 1: Line 1:
Here is the MatLab code of the simulation:
Here is the MatLab code of the simulation:
Mfsk.mlx<blockquote>close all;
clear;
clc;
rng(2025);
[fmcwwaveform,target,tgtmotion,channel,transmitter,receiver, ...
sensormotion,c,fc,lambda,fs,maxbeatfreq] = helperMFSKSystemSetup;
mfskwaveform = phased.MFSKWaveform( ...
'SampleRate',45e6, ...
'SweepBandwidth',44e6, ...
'StepTime', 2e-6, ...
'StepsPerSweep',700,...
'FrequencyOffset',-294e3/4, ...
'OutputFormat','Sweeps', ...
'NumSweeps',1);
numsamp_step = round(mfskwaveform.SampleRate*mfskwaveform.StepTime);
sig_display = mfskwaveform();
spectrogram(sig_display(1:8192),kaiser(3*numsamp_step,100), ...
ceil(2*numsamp_step),linspace(0,4e6,2048),mfskwaveform.SampleRate, ...
'yaxis','reassigned','minthreshold',-60)
Nsweep = 1;
release(channel);
channel.SampleRate = mfskwaveform.SampleRate;
release(receiver);
receiver.SampleRate = mfskwaveform.SampleRate;
xr = helperFMCWSimulate(Nsweep,mfskwaveform,sensormotion,tgtmotion, ...
transmitter,channel,target,receiver);
x_dechirp = reshape(xr(numsamp_step:numsamp_step:end),2,[]).';
fs_dechirp = 1/(2*mfskwaveform.StepTime);
xf_dechirp = fft(x_dechirp);
num_xf_samp = size(xf_dechirp,1);
beatfreq_vec = (0:num_xf_samp-1).'/num_xf_samp*fs_dechirp;
clf
subplot(211),plot(beatfreq_vec/1e3,abs(xf_dechirp(:,1)))
grid on
ylabel('Magnitude')
title('Frequency spectrum for sweep 1')
subplot(212),plot(beatfreq_vec/1e3,abs(xf_dechirp(:,2)))
grid on
ylabel('Magnitude')
title('Frequency spectrum for sweep 2')
xlabel('Frequency (kHz)')
cfar = phased.CFARDetector('ProbabilityFalseAlarm',10e-2, ...
'NumTrainingCells',8);
peakidx = cfar(abs(xf_dechirp(:,1)),1:num_xf_samp);
Fbeat = beatfreq_vec(peakidx);
phi = angle(xf_dechirp(peakidx,2))-angle(xf_dechirp(peakidx,1));
sweep_slope = mfskwaveform.SweepBandwidth/ ...
(mfskwaveform.StepsPerSweep*mfskwaveform.StepTime);
temp = ...
[-2/lambda 2*sweep_slope/c;-2/lambda*mfskwaveform.StepTime 2*mfskwaveform.FrequencyOffset/c]\ ...
[Fbeat phi/(2*pi)].';
r_est = temp(2,:)
v_est = temp(1,:)*3.6
function [filtered_r, filtered_v] = filter_values(r_est, v_est)
% Filter out values where speed is larger than 100 km/h or distance is larger than 200 meters
% Filters out the vehicles that passed the person already.
valid_indices = (abs(v_est) <= 100) & (r_est <= 200) & (v_est >= 0);
filtered_r = r_est(valid_indices);
filtered_v = v_est(valid_indices);
end
function [averaged_r, averaged_v] = average_similar_values(r_est, v_est)
% Combine r_est and v_est into a single matrix
combined = [r_est(:), v_est(:)];
% Sort the matrix based on the first column (r_est values)
combined = sortrows(combined, 1);
% Initialize arrays to store averaged values
averaged_r = [];
averaged_v = [];
% Initialize variables to keep track of current group
current_r = combined(1, 1);
current_v = combined(1, 2);
count = 1;
for i = 2:length(combined)
if abs(combined(i, 1) - current_r) <= 4.5 & abs(combined(i, 2) - current_v) <= 4.5  % If the value is similar (within 4 meters and 4 km/h)
current_r = [current_r, combined(i, 1)];
current_v = [current_v, combined(i, 2)];
count = count + 1;
else
averaged_r = [averaged_r, mean(current_r)];
averaged_v = [averaged_v, mean(current_v)];
current_r = combined(i, 1);
current_v = combined(i, 2);
count = 1;
end
end
% Append the last group
averaged_r = [averaged_r, mean(current_r)];
averaged_v = [averaged_v, mean(current_v)];
end
function arrival_times = calculate_arrival_times(r_est, v_est)
% Calculate the time it takes for each vehicle to arrive at the position
arrival_times = r_est ./ (v_est./3.6);
end
% Filter values
[filtered_r, filtered_v] = filter_values(r_est, v_est);
% Calculate averaged values
[averaged_r, averaged_v] = average_similar_values(filtered_r, filtered_v);
% Calculate arrival times
arrival_times = calculate_arrival_times(averaged_r, averaged_v);
disp('Averaged r values:');
disp(averaged_r);
disp('Averaged v values:');
disp(averaged_v);
disp('Arrival times (in seconds):');
disp(arrival_times);
function result = check_time_below_threshold(arrival_times, threshold)
% Check if there is any time below the threshold
if any(arrival_times < threshold)
result = 1;
disp('Stop');
else
result = 0;
disp('Go')
end
end
result = check_time_below_threshold(arrival_times, 8);</blockquote>
helperMFSKSystemSetup.m<blockquote>function [fmcwwaveform,target,tgtmotion,channel,transmitter,receiver,...
sensormotion,c,fc,lambda,fs,fr_max] = helperMFSKSystemSetup
% This function helperMFSKSystemSetup is only in support of MFSKExample.
% System parameter
fc = 78e9;      % operating frequency
c = 3e8;        % propagation speed
lambda = c/fc;  % wavelength
tm = 2222e-11;    % sweep time
%range_res = 1;              % range resolution
bw = 5e9;%rangeres2bw(range_res,c); % bandwidth
sweep_slope = bw/tm;        % sweep slope
range_max = 250;
fr_max = range2beat(range_max,sweep_slope,c);
v_max = 210*1000/3600;
fd_max = speed2dop(2*v_max,lambda);
fb_max = fr_max+fd_max;
fs = max(2*fb_max,bw);
fs = 7.5e11;
fmcwwaveform = phased.FMCWWaveform('SweepTime',tm,'SweepBandwidth',bw,...
'SampleRate',fs,'SweepDirection','Triangle');
car_dist = 60;
car_speed = 55*1000/3600;
car_rcs = db2pow(min(10*log10(car_dist)+5,20));
truck_dist = 40;
truck_speed = -50*1000/3600;
truck_rcs = db2pow(min(10*log10(truck_dist)+5,20));
bike_dist = 35;
bike_speed = -20*1000/3600;
bike_rcs = db2pow(min(10*log10(bike_dist)+5,20));
tgtpos = [[car_dist;0;0],[truck_dist;0;0],[bike_dist;0;0]];
tgtvel = [[car_speed;0;0],[truck_speed;0;0],[bike_speed;0;0]];
tgtmotion = phased.Platform('InitialPosition',tgtpos,'Velocity',tgtvel);
tgtrcs = [car_rcs,truck_rcs,bike_rcs];
target = phased.RadarTarget('MeanRCS',tgtrcs,'PropagationSpeed',c,...
'OperatingFrequency',fc);
channel = phased.FreeSpace('PropagationSpeed',c,...
'OperatingFrequency',fc,'SampleRate',fs,'TwoWayPropagation',true);
ant_aperture = 18.5*lambda*0.8*lambda+18.5/38*8*lambda*0.4*lambda; %6.06e-4;
ant_gain = aperture2gain(ant_aperture,lambda) ; % in dB
tx_ppower = db2pow(13)*1e-3;                    % in watts
tx_gain = 9+ant_gain;                          % in dB
rx_gain = 44;                                    % in dB
rx_nf = 11.5;                                    % in dB
transmitter = phased.Transmitter('PeakPower',tx_ppower,'Gain',tx_gain);
receiver = phased.ReceiverPreamp('Gain',rx_gain,'NoiseFigure',rx_nf,...
'SampleRate',fs);
radar_speed = 0*1000/3600;
sensormotion = phased.Platform('Velocity',[radar_speed;0;0]);</blockquote>HelperFMCWSimulate.m<blockquote>function [xr,xr_unmixed] = helperFMCWSimulate(Nsweep,waveform,...
radarmotion,carmotion,transmitter,channel,cartarget,receiver)
% This function helperFMCWSimulate is only in support of FMCWExample. It
% may be removed in a future release.
%  RSWEEP =
%  helperFMCWSimulate(NSWEEP,WAVEFORM,RADARMOTION,CARMOTION,TRANSMITTER,
%  CHANNEL,CARTARGET,RECEIVER) returns the simulated sweep train RSWEEP.
%
%  The input parameters are:
%      NSWEEP:            number of sweeps
%      WAVEFORM:          waveform object
%      RADARMOTION:        platform object for the radar
%      CARMOTION:          platform object for target car
%      TRANSMITTER:        transmitter object
%      CHANNEL:            propagation channel object
%      CARTARGET:          target car object
%      RECEIVER:          receiver object
%
%  The rows of RSWEEP represent fast time and its columns represent slow
%  time (pulses). When the pulse transmitter uses staggered PRFs, the
%  length of the fast time sequences is determined by the highest PRF.
%  Copyright 2010-2016 The MathWorks, Inc.
release(waveform);
release(radarmotion);
release(transmitter);
release(receiver);
release(carmotion);
release(channel);
release(cartarget);
if isa(waveform,'phased.MFSKWaveform')
sweeptime = waveform.StepTime*waveform.StepsPerSweep;
else
sweeptime = waveform.SweepTime;
end
Nsamp = round(waveform.SampleRate*sweeptime);
xr = complex(zeros(Nsamp,Nsweep));
xr_unmixed = xr;
Ntgt = numel(cartarget.MeanRCS);
for m = 1:Nsweep
% Update radar and target positions
[radar_pos,radar_vel] = radarmotion(sweeptime);
[tgt_pos,tgt_vel] = carmotion(sweeptime);
% Transmit FMCW waveform
sig = waveform();
txsig = transmitter(sig);
% Propagate the signal and reflect off the target
rxsig = complex(zeros(Nsamp,Ntgt));
for n = 1:Ntgt
rxsig(:,n) = channel(txsig,radar_pos,tgt_pos(:,n),radar_vel,tgt_vel(:,n));
end
rxsig = cartarget(rxsig);
% Dechirp the received radar return
rxsig = receiver(sum(rxsig,2));
xd = dechirp(rxsig,sig);
xr_unmixed(:,m) = rxsig;
xr(:,m) = xd;
end</blockquote>

Revision as of 11:29, 10 April 2025

Here is the MatLab code of the simulation:


Mfsk.mlx

close all;

clear;

clc;

rng(2025);

[fmcwwaveform,target,tgtmotion,channel,transmitter,receiver, ...

sensormotion,c,fc,lambda,fs,maxbeatfreq] = helperMFSKSystemSetup;


mfskwaveform = phased.MFSKWaveform( ...

'SampleRate',45e6, ...

'SweepBandwidth',44e6, ...

'StepTime', 2e-6, ...

'StepsPerSweep',700,...

'FrequencyOffset',-294e3/4, ...

'OutputFormat','Sweeps', ...

'NumSweeps',1);

numsamp_step = round(mfskwaveform.SampleRate*mfskwaveform.StepTime);

sig_display = mfskwaveform();

spectrogram(sig_display(1:8192),kaiser(3*numsamp_step,100), ...

ceil(2*numsamp_step),linspace(0,4e6,2048),mfskwaveform.SampleRate, ...

'yaxis','reassigned','minthreshold',-60)

Nsweep = 1;

release(channel);

channel.SampleRate = mfskwaveform.SampleRate;

release(receiver);

receiver.SampleRate = mfskwaveform.SampleRate;

xr = helperFMCWSimulate(Nsweep,mfskwaveform,sensormotion,tgtmotion, ...

transmitter,channel,target,receiver);

x_dechirp = reshape(xr(numsamp_step:numsamp_step:end),2,[]).';

fs_dechirp = 1/(2*mfskwaveform.StepTime);

xf_dechirp = fft(x_dechirp);

num_xf_samp = size(xf_dechirp,1);

beatfreq_vec = (0:num_xf_samp-1).'/num_xf_samp*fs_dechirp;

clf

subplot(211),plot(beatfreq_vec/1e3,abs(xf_dechirp(:,1)))

grid on

ylabel('Magnitude')

title('Frequency spectrum for sweep 1')

subplot(212),plot(beatfreq_vec/1e3,abs(xf_dechirp(:,2)))

grid on

ylabel('Magnitude')

title('Frequency spectrum for sweep 2')

xlabel('Frequency (kHz)')

cfar = phased.CFARDetector('ProbabilityFalseAlarm',10e-2, ...

'NumTrainingCells',8);

peakidx = cfar(abs(xf_dechirp(:,1)),1:num_xf_samp);

Fbeat = beatfreq_vec(peakidx);

phi = angle(xf_dechirp(peakidx,2))-angle(xf_dechirp(peakidx,1));

sweep_slope = mfskwaveform.SweepBandwidth/ ...

(mfskwaveform.StepsPerSweep*mfskwaveform.StepTime);

temp = ...

[-2/lambda 2*sweep_slope/c;-2/lambda*mfskwaveform.StepTime 2*mfskwaveform.FrequencyOffset/c]\ ...

[Fbeat phi/(2*pi)].';

r_est = temp(2,:)

v_est = temp(1,:)*3.6

function [filtered_r, filtered_v] = filter_values(r_est, v_est)

% Filter out values where speed is larger than 100 km/h or distance is larger than 200 meters

% Filters out the vehicles that passed the person already.

valid_indices = (abs(v_est) <= 100) & (r_est <= 200) & (v_est >= 0);

filtered_r = r_est(valid_indices);

filtered_v = v_est(valid_indices);

end

function [averaged_r, averaged_v] = average_similar_values(r_est, v_est)

% Combine r_est and v_est into a single matrix

combined = [r_est(:), v_est(:)];


% Sort the matrix based on the first column (r_est values)

combined = sortrows(combined, 1);


% Initialize arrays to store averaged values

averaged_r = [];

averaged_v = [];


% Initialize variables to keep track of current group

current_r = combined(1, 1);

current_v = combined(1, 2);

count = 1;


for i = 2:length(combined)

if abs(combined(i, 1) - current_r) <= 4.5 & abs(combined(i, 2) - current_v) <= 4.5  % If the value is similar (within 4 meters and 4 km/h)

current_r = [current_r, combined(i, 1)];

current_v = [current_v, combined(i, 2)];

count = count + 1;

else

averaged_r = [averaged_r, mean(current_r)];

averaged_v = [averaged_v, mean(current_v)];

current_r = combined(i, 1);

current_v = combined(i, 2);

count = 1;

end

end


% Append the last group

averaged_r = [averaged_r, mean(current_r)];

averaged_v = [averaged_v, mean(current_v)];

end

function arrival_times = calculate_arrival_times(r_est, v_est)

% Calculate the time it takes for each vehicle to arrive at the position

arrival_times = r_est ./ (v_est./3.6);

end

% Filter values

[filtered_r, filtered_v] = filter_values(r_est, v_est);

% Calculate averaged values

[averaged_r, averaged_v] = average_similar_values(filtered_r, filtered_v);

% Calculate arrival times

arrival_times = calculate_arrival_times(averaged_r, averaged_v);

disp('Averaged r values:');

disp(averaged_r);

disp('Averaged v values:');

disp(averaged_v);

disp('Arrival times (in seconds):');

disp(arrival_times);

function result = check_time_below_threshold(arrival_times, threshold)

% Check if there is any time below the threshold

if any(arrival_times < threshold)

result = 1;

disp('Stop');

else

result = 0;

disp('Go')

end

end

result = check_time_below_threshold(arrival_times, 8);


helperMFSKSystemSetup.m

function [fmcwwaveform,target,tgtmotion,channel,transmitter,receiver,...

sensormotion,c,fc,lambda,fs,fr_max] = helperMFSKSystemSetup

% This function helperMFSKSystemSetup is only in support of MFSKExample.

% System parameter

fc = 78e9;  % operating frequency

c = 3e8;  % propagation speed

lambda = c/fc;  % wavelength

tm = 2222e-11;  % sweep time

%range_res = 1;  % range resolution

bw = 5e9;%rangeres2bw(range_res,c); % bandwidth

sweep_slope = bw/tm;  % sweep slope

range_max = 250;

fr_max = range2beat(range_max,sweep_slope,c);

v_max = 210*1000/3600;

fd_max = speed2dop(2*v_max,lambda);

fb_max = fr_max+fd_max;

fs = max(2*fb_max,bw);

fs = 7.5e11;

fmcwwaveform = phased.FMCWWaveform('SweepTime',tm,'SweepBandwidth',bw,...

'SampleRate',fs,'SweepDirection','Triangle');

car_dist = 60;

car_speed = 55*1000/3600;

car_rcs = db2pow(min(10*log10(car_dist)+5,20));

truck_dist = 40;

truck_speed = -50*1000/3600;

truck_rcs = db2pow(min(10*log10(truck_dist)+5,20));

bike_dist = 35;

bike_speed = -20*1000/3600;

bike_rcs = db2pow(min(10*log10(bike_dist)+5,20));

tgtpos = [[car_dist;0;0],[truck_dist;0;0],[bike_dist;0;0]];

tgtvel = [[car_speed;0;0],[truck_speed;0;0],[bike_speed;0;0]];

tgtmotion = phased.Platform('InitialPosition',tgtpos,'Velocity',tgtvel);

tgtrcs = [car_rcs,truck_rcs,bike_rcs];

target = phased.RadarTarget('MeanRCS',tgtrcs,'PropagationSpeed',c,...

'OperatingFrequency',fc);

channel = phased.FreeSpace('PropagationSpeed',c,...

'OperatingFrequency',fc,'SampleRate',fs,'TwoWayPropagation',true);

ant_aperture = 18.5*lambda*0.8*lambda+18.5/38*8*lambda*0.4*lambda; %6.06e-4;

ant_gain = aperture2gain(ant_aperture,lambda) ; % in dB

tx_ppower = db2pow(13)*1e-3;  % in watts

tx_gain = 9+ant_gain;  % in dB

rx_gain = 44;  % in dB

rx_nf = 11.5;  % in dB

transmitter = phased.Transmitter('PeakPower',tx_ppower,'Gain',tx_gain);

receiver = phased.ReceiverPreamp('Gain',rx_gain,'NoiseFigure',rx_nf,...

'SampleRate',fs);

radar_speed = 0*1000/3600;

sensormotion = phased.Platform('Velocity',[radar_speed;0;0]);

HelperFMCWSimulate.m

function [xr,xr_unmixed] = helperFMCWSimulate(Nsweep,waveform,...

radarmotion,carmotion,transmitter,channel,cartarget,receiver)

% This function helperFMCWSimulate is only in support of FMCWExample. It

% may be removed in a future release.

% RSWEEP =

% helperFMCWSimulate(NSWEEP,WAVEFORM,RADARMOTION,CARMOTION,TRANSMITTER,

% CHANNEL,CARTARGET,RECEIVER) returns the simulated sweep train RSWEEP.

%

% The input parameters are:

% NSWEEP: number of sweeps

% WAVEFORM: waveform object

% RADARMOTION: platform object for the radar

% CARMOTION: platform object for target car

% TRANSMITTER: transmitter object

% CHANNEL: propagation channel object

% CARTARGET: target car object

% RECEIVER: receiver object

%

% The rows of RSWEEP represent fast time and its columns represent slow

% time (pulses). When the pulse transmitter uses staggered PRFs, the

% length of the fast time sequences is determined by the highest PRF.

% Copyright 2010-2016 The MathWorks, Inc.

release(waveform);

release(radarmotion);

release(transmitter);

release(receiver);

release(carmotion);

release(channel);

release(cartarget);

if isa(waveform,'phased.MFSKWaveform')

sweeptime = waveform.StepTime*waveform.StepsPerSweep;

else

sweeptime = waveform.SweepTime;

end

Nsamp = round(waveform.SampleRate*sweeptime);

xr = complex(zeros(Nsamp,Nsweep));

xr_unmixed = xr;

Ntgt = numel(cartarget.MeanRCS);

for m = 1:Nsweep

% Update radar and target positions

[radar_pos,radar_vel] = radarmotion(sweeptime);

[tgt_pos,tgt_vel] = carmotion(sweeptime);

% Transmit FMCW waveform

sig = waveform();

txsig = transmitter(sig);

% Propagate the signal and reflect off the target

rxsig = complex(zeros(Nsamp,Ntgt));

for n = 1:Ntgt

rxsig(:,n) = channel(txsig,radar_pos,tgt_pos(:,n),radar_vel,tgt_vel(:,n));

end

rxsig = cartarget(rxsig);

% Dechirp the received radar return

rxsig = receiver(sum(rxsig,2));

xd = dechirp(rxsig,sig);

xr_unmixed(:,m) = rxsig;

xr(:,m) = xd;

end