Spaces:
Runtime error
Runtime error
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
} |