FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
defaults.ts
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2025-present FERS Contributors (see AUTHORS.md).
3
4import { generateSimId } from './idUtils';
5import { Antenna, GlobalParameters, Platform, Timing, Waveform } from './types';
6
7type WaveformType = Waveform['waveformType'];
8type WaveformDefaults<T extends WaveformType = WaveformType> =
9 T extends WaveformType
10 ? Omit<Extract<Waveform, { waveformType: T }>, 'id' | 'name'>
11 : never;
12
13export const defaultGlobalParameters: GlobalParameters = {
14 id: 'global-parameters',
15 type: 'GlobalParameters',
16 rotationAngleUnit: 'deg',
17 simulation_name: 'FERS Simulation',
18 start: 0.0,
19 end: 10.0,
20 rate: 10000.0,
21 simSamplingRate: null,
22 c: 299792458.0,
23 random_seed: null,
24 adc_bits: 12,
25 oversample_ratio: 1,
26 // Default: UCT, South Africa
27 origin: {
28 latitude: -33.957652,
29 longitude: 18.4611991,
30 altitude: 111.01,
31 },
32 coordinateSystem: {
33 frame: 'ENU',
34 },
35};
36
37export const defaultWaveform: WaveformDefaults<'pulsed_from_file'> = {
38 type: 'Waveform',
39 waveformType: 'pulsed_from_file',
40 power: 1000,
41 carrier_frequency: 1e9,
42 filename: '',
43};
44
45export function createWaveformForType(
46 waveformType: 'pulsed_from_file'
47): WaveformDefaults<'pulsed_from_file'>;
48export function createWaveformForType(
49 waveformType: 'cw'
50): WaveformDefaults<'cw'>;
51export function createWaveformForType(
52 waveformType: 'cw_from_file'
53): WaveformDefaults<'cw_from_file'>;
54export function createWaveformForType(
55 waveformType: 'fmcw_from_file'
56): WaveformDefaults<'fmcw_from_file'>;
57export function createWaveformForType(
58 waveformType: 'fmcw_linear_chirp'
59): WaveformDefaults<'fmcw_linear_chirp'>;
60export function createWaveformForType(
61 waveformType: 'fmcw_triangle'
62): WaveformDefaults<'fmcw_triangle'>;
63export function createWaveformForType(
64 waveformType: 'stepped_frequency'
65): WaveformDefaults<'stepped_frequency'>;
66export function createWaveformForType(
67 waveformType: WaveformType
68): WaveformDefaults {
69 const common = {
70 type: 'Waveform' as const,
71 power: defaultWaveform.power,
72 carrier_frequency: defaultWaveform.carrier_frequency,
73 };
74
75 switch (waveformType) {
76 case 'pulsed_from_file':
77 case 'cw_from_file':
78 case 'fmcw_from_file':
79 return {
80 ...common,
81 waveformType,
82 filename: '',
83 };
84 case 'cw':
85 return {
86 ...common,
87 waveformType,
88 };
89 case 'fmcw_linear_chirp':
90 return {
91 ...common,
92 waveformType,
93 direction: 'up',
94 chirp_bandwidth: 4e3,
95 chirp_duration: 1e-3,
96 chirp_period: 1e-3,
97 start_frequency_offset: 0,
98 chirp_count: null,
99 };
100 case 'fmcw_triangle':
101 return {
102 ...common,
103 waveformType,
104 chirp_bandwidth: 4e3,
105 chirp_duration: 1e-3,
106 start_frequency_offset: 0,
107 triangle_count: null,
108 };
109 case 'stepped_frequency':
110 return {
111 ...common,
112 waveformType,
113 start_frequency_offset: 0,
114 step_size: 1e3,
115 step_count: 16,
116 dwell_time: 1e-3,
117 step_period: 1e-3,
118 sweep_count: null,
119 };
120 }
121}
122
123export const defaultTiming: Omit<Timing, 'id' | 'name'> = {
124 type: 'Timing',
125 frequency: 10e6,
126 freqOffset: null,
127 randomFreqOffsetStdev: null,
128 phaseOffset: null,
129 randomPhaseOffsetStdev: null,
130 noiseEntries: [],
131};
132
133export const defaultAntenna: Omit<
134 Extract<Antenna, { pattern: 'isotropic' }>,
135 'id' | 'name'
136> = {
137 type: 'Antenna',
138 pattern: 'isotropic',
139 efficiency: 1.0,
140 meshScale: 1.0,
141 design_frequency: null,
142};
143
144export const createDefaultPlatform = (): Omit<Platform, 'id' | 'name'> => ({
145 type: 'Platform',
146 motionPath: {
147 interpolation: 'static',
148 waypoints: [
149 { id: generateSimId('Platform'), x: 0, y: 0, altitude: 0, time: 0 },
150 ],
151 },
152 rotation: {
153 type: 'fixed',
154 startAzimuth: 0,
155 startElevation: 0,
156 azimuthRate: 0,
157 elevationRate: 0,
158 },
159 components: [],
160});