-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRadar_Altimeter.m
127 lines (98 loc) · 5.87 KB
/
Radar_Altimeter.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
fCenter = 4.3e9; % Center frequency (Hz)
bandwidth = 150e6; % Bandwidth (Hz)
prf = 143; % Pulse repetition frequency (Hz)
antBeamwidth = 40; % Beamwidth (degrees)
pTransmitter = 0.4; % Transmitter power (W)
rMax = 1676; % Highest altitude required (m)
sweepDir = 'Triangle'; % Sweep direction of the FMCW waveform
noiseFigure = 8; % Receiver noise figure (dB)
%% Antenna
% Generate the Gaussian antenna element
frequencyRange = [fCenter-bandwidth/2 fCenter+bandwidth/2];
altimeterAntennaElement = phased.GaussianAntennaElement("Beamwidth",antBeamwidth,"FrequencyRange",frequencyRange);
% Plot the beamwidth to verify that it matches the expected antenna beamwidth
beamwidth(altimeterAntennaElement,fCenter);
altimeterTxAntenna = phased.Radiator('OperatingFrequency',fCenter,'Sensor',altimeterAntennaElement, 'SensorGainMeasure','dBi');
altimeterRxAntenna = phased.Collector('OperatingFrequency',fCenter,'Sensor',altimeterAntennaElement,'SensorGainMeasure','dBi');
%% Waveform Design
tSweep = 1/(2*prf); % Sweep time (s) is half of the sweep period because this is a two sided FMCW waveform
nSweep = 2; % There are two sweeps in one processing interval, 1 upsweep, 1 downsweep
sweepSlope = bandwidth/tSweep; % Sweep slope (Hz / s)
waveformSamplingRate = round(bandwidth*tSweep)/tSweep; % Sampling rate of the waveform (Hz)
altimeterWaveform = phased.FMCWWaveform('SweepBandwidth',bandwidth,'SampleRate',waveformSamplingRate,'SweepDirection',sweepDir,'SweepTime',tSweep,'OutputFormat','Sweeps');
%% Transmiter and Receiver
altimeterTransmitter = phased.Transmitter('PeakPower',pTransmitter);
altimeterReceiver = phased.ReceiverPreamp('SampleRate', waveformSamplingRate,'NoiseFigure', noiseFigure);
altimeterTransceiver = radarTransceiver('Waveform',altimeterWaveform,...
'Transmitter',altimeterTransmitter, ...
'TransmitAntenna',altimeterTxAntenna, ...
'ReceiveAntenna',altimeterRxAntenna, ...
'Receiver',altimeterReceiver, ...
'MountingAngles', [0 -90 0], ...
'NumRepetitions', nSweep)
% altimeterTransceiver =
% radarTransceiver with properties:
%
% Waveform: [1x1 phased.FMCWWaveform]
% Transmitter: [1x1 phased.Transmitter]
% TransmitAntenna: [1x1 phased.Radiator]
% ReceiveAntenna: [1x1 phased.Collector]
% Receiver: [1x1 phased.ReceiverPreamp]
% MechanicalScanMode: 'None'
% ElectronicScanMode: 'None'
% MountingLocation: [0 0 0]
% MountingAngles: [0 -90 0]
% NumRepetitionsSource: 'Property'
% NumRepetitions: 2
% RangeLimitsSource: 'Property'
% RangeLimits: [0 Inf]
% RangeOutputPort: false
% TimeOutputPort: false
%% Signal Processor
upsweepWaveformSamples = altimeterTransceiver.Waveform(); % Upsloping signal IQ
downsweepWaveformSamples = altimeterTransceiver.Waveform(); % Downsloping signal IQ
figure;
stft([upsweepWaveformSamples;downsweepWaveformSamples],waveformSamplingRate,'FrequencyRange','twosided')
title('Spectrogram of Altimeter Waveform (BW = 150 MHz, PRF = 143 Hz)')
%% IQ signal
frmax = range2beat(rMax,sweepSlope); % Maximum frequency (Hz) due to range
vmax = 8; % Max rate of descent (m/s)
h = freq2wavelen(fCenter); % Wavelength (m)
fdmax = 2*speed2dop(vmax,h); % Maximum frequency shift (Hz) due to radial velocity
fbmax = frmax+fdmax; % Maximum beat frequency (Hz)
receiverSamplingRate = 2*fbmax; % Sampling rate of the receiver (Hz)
disp('upsweepWaveformSamples:');
disp(upsweepWaveformSamples);
disp('downsweepWaveformSamples:');
disp(downsweepWaveformSamples);
disp('sweepSlope:');
disp(sweepSlope);
disp('waveformSamplingRate:');
disp(waveformSamplingRate);
disp('receiverSamplingRate:');
disp(receiverSamplingRate);
altimeterSignalProcessor = helperAltimeterSignalProcessor(upsweepWaveformSamples,downsweepWaveformSamples,sweepSlope,waveformSamplingRate,receiverSamplingRate)
% altimeterSignalProcessor =
% helperAltimeterSignalProcessor with properties:
%
% UpsweepReference: [524476x1 double]
% DownsweepReference: [524476x1 double]
% Detector: [1x1 phased.CFARDetector]
% RangeResponse: [1x1 phased.RangeResponse]
%% Create a Land Surface Landing
tStart = 300; % Simulated trajectory start (s)
tStop = 395; % Simulated trajectory stop (s)
tUpdate = 5; % Simulated trajectory update interval (s)
scene = radarScenario('StopTime',tStop-tStart,'UpdateRate',1/tUpdate,'IsEarthCentered',true);
load('surfaceHeightData.mat','surfaceHeight') % Load surface elevation data
refl = surfaceReflectivityLand(Model = "APL", LandType = 'Urban'); % Land reflectivity model
boundaryLatLim = [41.9799 41.9879]; % Set the boundary latitude limits (deg)
boundaryLonLim = [-87.9000 -87.7750]; % Set the boundary longitude limits (deg)
% Create the land surface and clutter generator
surface = landSurface(scene,'Terrain',surfaceHeight.','Boundary',[boundaryLatLim; boundaryLonLim],'RadarReflectivity',refl);
clutter = clutterGenerator(scene,altimeterTransceiver);
%% Landing Scenario Simulation
flightTrajectoryFile = 'ORD_FlightTraj.mat';
landingFlightTrajectory = helperGetFlightTrajectory(surface,flightTrajectoryFile,tStart,tStop,tUpdate);
altimeterPlatform = platform(scene,'Sensors',altimeterTransceiver,'Trajectory',landingFlightTrajectory,'Dimensions',struct('Length',.00075,'Width',20,'Height',.007,'OriginOffset',[0 0 0]));
helperAltimeterGlobeAnimation(altimeterTransceiver,tStop,tStart,tUpdate,boundaryLatLim,boundaryLonLim,surfaceHeight,landingFlightTrajectory,'Landing')