From b681f0b2c662b62d8dfee3541fa2ff27464fe4e2 Mon Sep 17 00:00:00 2001 From: Christos Falas Date: Tue, 28 Jan 2025 21:40:28 +0000 Subject: [PATCH] Improve antenna order detection Remove a lot of the false positives that were occuring due to random noise --- where_fi/utils/antenna_order.py | 38 ++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/where_fi/utils/antenna_order.py b/where_fi/utils/antenna_order.py index 17673b7..388567a 100644 --- a/where_fi/utils/antenna_order.py +++ b/where_fi/utils/antenna_order.py @@ -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}")