From b78809bd45b2faf34c6455d8f688db8562bd13c3 Mon Sep 17 00:00:00 2001 From: Christos Falas Date: Wed, 14 May 2025 22:10:48 +0100 Subject: [PATCH] add example for noise analysis --- examples/measurements.py | 100 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 examples/measurements.py diff --git a/examples/measurements.py b/examples/measurements.py new file mode 100644 index 0000000..7bee965 --- /dev/null +++ b/examples/measurements.py @@ -0,0 +1,100 @@ +from itertools import product +from queue import Queue +from typing import cast + +import numpy as np + +from where_fi.application import CSIApplication +from where_fi.collection import CSIMatrix +from where_fi.collection.ingest import RealtimeCSIProducer +from where_fi.config import config +from where_fi.visualise import server as visualise + +producer = RealtimeCSIProducer() +app = CSIApplication(producer, visualise_raw=True) +visualise.figures.all_figures["median"] = visualise.figures.RandomVariable( + "Median Phase" +) +visualise.figures.all_figures["magn"] = visualise.figures.RandomVariable( + "Median Magnitude" +) + +measurements: list[np.complex64] = [] + + +subcarriers = [0, 1] +rx_antenna = [0, 1] +tx_antenna = [0] + +subcarrier_phase: dict[tuple[int, int, int], Queue[float]] = { + x: Queue(config.collection_sample_rate) + for x in product(subcarriers, rx_antenna, tx_antenna) +} +subcarrier_magn: dict[tuple[int, int, int], Queue[float]] = { + x: Queue(config.collection_sample_rate) + for x in product(subcarriers, rx_antenna, tx_antenna) +} + +proc_phase: dict[tuple[int, int, int], Queue[float]] = { + x: Queue(config.collection_sample_rate) + for x in product(subcarriers, rx_antenna, tx_antenna) +} + +proc_magn: dict[tuple[int, int, int], Queue[float]] = { + x: Queue(config.collection_sample_rate) + for x in product(subcarriers, rx_antenna, tx_antenna) +} + + +@app.on_sample +def _(sample: CSIMatrix) -> None: + for i in product(subcarriers, rx_antenna, tx_antenna): + phase = cast(float, np.angle(sample[i])) + magn = cast(float, np.abs(sample[i])) + if subcarrier_phase[i].full(): + subcarrier_phase[i].get() + subcarrier_phase[i].put(phase) + if subcarrier_magn[i].full(): + subcarrier_magn[i].get() + subcarrier_magn[i].put(magn) + + +cnt = 0 + + +@app.on_process +def _(proc: CSIMatrix) -> None: + global cnt + global proc_phase + + for i in product(subcarriers, rx_antenna, tx_antenna): + phase = cast(float, np.angle(proc[i])) + magn = cast(float, np.abs(proc[i])) + if proc_phase[i].full(): + proc_phase[i].get() + proc_phase[i].put(phase) + if proc_magn[i].full(): + proc_magn[i].get() + proc_magn[i].put(magn) + if cnt % 100 == 0: + print(sum(proc_phase[0, 0, 0].queue)) + app.visualise_data( + np.array([x.queue for x in proc_phase.values()]), + "median", + ) + app.visualise_data( + np.array([x.queue for x in proc_magn.values()]), + "magn", + ) + app.visualise_data( + np.array([x.queue for x in subcarrier_phase.values()]), + visualise.figures.Figure.PHASE_ANALYSIS, + ) + app.visualise_data( + np.array([x.queue for x in subcarrier_magn.values()]), + visualise.figures.Figure.MAGN_ANALYSIS, + ) + cnt += 1 + + +app.start()