File size: 2,872 Bytes
e78c327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import numpy as np

class Target:
    def __init__(self, position, velocity, rcs):
        self.position = np.array(position)
        self.velocity = np.array(velocity)
        self.rcs = rcs  # Radar Cross Section

class RadarSimulation:
    def __init__(self, radar_position, radar_range, radar_frequency, c=3e8):
        self.radar_position = np.array(radar_position)
        self.radar_range = radar_range
        self.radar_frequency = radar_frequency * 1e9  # Convert GHz to Hz
        self.c = c  # Speed of light in m/s
        self.targets = {}
        self.positions = {}
        self.doppler_shifts = {}
        self.snr_values = {}
        self.rssi_values = {}

    def add_target(self, name, position, velocity, rcs):
        target = Target(position, velocity, rcs)
        self.targets[name] = target
        self.positions[name] = []
        self.doppler_shifts[name] = []
        self.snr_values[name] = []
        self.rssi_values[name] = []

    def run_simulation(self, time_steps, dt, loop_frequency=0.1):
        for step in range(time_steps):
            # Example specific behavior: Drone makes loops
            if "drone" in self.targets:
                self.targets["drone"].velocity[1] = 10 * np.sin(loop_frequency * step)

            for name, target in self.targets.items():
                target.position += target.velocity * dt
                distance = np.linalg.norm(target.position - self.radar_position)

                if distance != 0:
                    relative_velocity = np.dot(target.velocity, target.position - self.radar_position) / distance
                    doppler_shift = self.radar_frequency * (relative_velocity / self.c)
                    signal_strength = target.rcs / (distance ** 2)
                else:
                    relative_velocity = 0
                    doppler_shift = 0
                    signal_strength = np.inf

                noise = 1e-3
                snr = signal_strength / noise if distance != 0 else np.inf
                rssi = (target.rcs * signal_strength * self.radar_frequency) / (distance ** 2) if distance != 0 else np.inf
                rssi_dBm = 10 * np.log10(rssi / 1e-3) if rssi > 0 else -np.inf

                self.positions[name].append(target.position.tolist() if distance <= self.radar_range else [np.nan, np.nan])
                self.doppler_shifts[name].append(doppler_shift if distance <= self.radar_range else np.nan)
                self.snr_values[name].append(snr if distance <= self.radar_range else np.nan)
                self.rssi_values[name].append(rssi_dBm if distance <= self.radar_range else np.nan)

    def get_simulation_data(self):
        return {
            "positions": self.positions,
            "doppler_shifts": self.doppler_shifts,
            "snr_values": self.snr_values,
            "rssi_values": self.rssi_values
        }