Compare commits

..

6 Commits

Author SHA1 Message Date
Christos Falas
638440feff fix heatmap generation 2025-01-30 13:58:08 +02:00
Christos Falas
785021b557 Use eigh instead of eig
The mean of Hermitian matrices is also Hermitian
2025-01-30 13:58:08 +02:00
Christos Falas
42ac105240 Improve logging 2025-01-30 13:58:08 +02:00
Christos Falas
c2963f4a9f Make heatmap on GPU
Still has some weird artifacts, some axis ordering might be incorrect
2025-01-30 13:58:08 +02:00
Christos Falas
a1e5f2fec7 set up torch AoA estimation 2025-01-30 13:58:08 +02:00
Christos Falas
b681f0b2c6
Improve antenna order detection
Remove a lot of the false positives that were occuring due to random
noise
2025-01-28 21:40:28 +00:00

View File

@ -1,17 +1,29 @@
import logging
from collections import deque
from typing import Any, Collection
from ..collection import ingest
from ..config import config
logger = logging.getLogger(__name__)
AntennaIdentifier = tuple[ingest.Host, int]
order: list[AntennaIdentifier] = []
prev_unplugged: set[AntennaIdentifier] = set()
antenna_average: dict[AntennaIdentifier, float] = {}
long_antenna_average: dict[AntennaIdentifier, deque[int]] = {
(host, 0): deque(maxlen=10 * config.sample_rate) for host in config.receive_hosts
} | {(host, 1): deque(maxlen=10 * config.sample_rate) for host in config.receive_hosts}
short_antenna_average: dict[AntennaIdentifier, deque[int]] = {
(host, 0): deque(maxlen=config.sample_rate) for host in config.receive_hosts
} | {(host, 1): deque(maxlen=config.sample_rate) for host in config.receive_hosts}
RSSI_THRESHOLD = 8
def average(data: Collection[Any]) -> float:
return sum(data) / len(data)
def callback(antenna_data: dict[ingest.Host, ingest.CSI]) -> None:
global prev_unplugged
global antenna_average
@ -27,18 +39,18 @@ def callback(antenna_data: dict[ingest.Host, ingest.CSI]) -> None:
)
)
for host, csi in antenna_data.items():
antenna_average[(host, 0)] = (
antenna_average.get((host, 0), csi.header.rssi1) * 0.99
+ csi.header.rssi1 * 0.01
)
antenna_average[(host, 1)] = (
antenna_average.get((host, 1), csi.header.rssi2) * 0.99
+ csi.header.rssi2 * 0.01
)
if csi.header.rssi1 > antenna_average[(host, 0)] + RSSI_THRESHOLD:
unplugged.add((host, 0))
if csi.header.rssi2 > antenna_average[(host, 1)] + RSSI_THRESHOLD:
unplugged.add((host, 1))
long_antenna_average[(host, 0)].append(csi.header.rssi1)
long_antenna_average[(host, 1)].append(csi.header.rssi2)
short_antenna_average[(host, 0)].append(csi.header.rssi1)
short_antenna_average[(host, 1)].append(csi.header.rssi2)
for antenna in range(2):
if (
average(short_antenna_average[(host, antenna)])
> average(long_antenna_average[(host, antenna)]) + RSSI_THRESHOLD
):
unplugged.add((host, antenna))
if prev_unplugged != unplugged:
if len(prev_unplugged) > len(unplugged):
logger.info(f"Antenna plugged in: {prev_unplugged - unplugged}")