diff --git a/fxrt_ws_probe.py b/fxrt_ws_probe.py index ee5389a..a309b13 100644 --- a/fxrt_ws_probe.py +++ b/fxrt_ws_probe.py @@ -151,7 +151,8 @@ class WorkletSim: def make_block(): t = np.arange(BLOCK) / SR - sig = 0.2 * np.sin(2 * np.pi * 220 * t) + 0.1 * np.sin(2 * np.pi * 331 * t) + amp = float(os.environ.get("FXRT_PROBE_AMP", "1.0")) + sig = amp * (0.2 * np.sin(2 * np.pi * 220 * t) + 0.1 * np.sin(2 * np.pi * 331 * t)) inter = np.empty(BLOCK * 2, dtype=np.float32) inter[0::2] = sig inter[1::2] = 0.85 * sig @@ -179,6 +180,8 @@ async def run_ws_probe(port, chain, secs, stall): s_prob, s_min, s_max = stall_model(stall) sent_bursts = 0 recv_times = [] # (block_seq, time, peak) + out_peaks = [] # output peak per block (cause-5 clipping track) + out_flat = [] # flat-top samples per block (|x|>0.9999) recv_lock = asyncio.Lock() stop = asyncio.Event() produced = asyncio.Queue() # burst buffers @@ -265,9 +268,13 @@ async def run_ws_probe(port, chain, secs, stall): break if isinstance(msg, bytes) and len(msg) == BLOCK * 2 * 4: now = time.perf_counter() - pk = float(np.frombuffer(msg, dtype=np.float32)[::2].max()) + f = np.frombuffer(msg, dtype=np.float32) + pk = float(f[::2].max()) + flat = int(np.count_nonzero(np.abs(f) > 0.9999)) async with recv_lock: recv_times.append((len(recv_times), now, pk)) + out_peaks.append(pk) + out_flat.append(flat) # text frame (latency) bỏ qua async with websockets.connect(ws_url) as ws: @@ -319,6 +326,14 @@ async def run_ws_probe(port, chain, secs, stall): rate = n_recv / dur print(" sent=%d bursts (%d blocks) recv=%d blocks over %.1fs = %.1f blk/s (expect 187.5)" % (len(sent_times), n_sent, n_recv, dur, rate)) + if out_peaks: + op = np.array(out_peaks) + of = np.array(out_flat) + print(" OUT peak: min=%.4f p50=%.4f p95=%.4f max=%.4f" % + (op.min(), np.percentile(op, 50), np.percentile(op, 95), op.max())) + print(" OUT flat-top(|x|>0.9999): blocks=%d samples=%d (%.4f%%)" % + (int(np.count_nonzero(of > 0)), int(of.sum()), + 100.0 * of.sum() / max(1, len(of) * BLOCK * 2))) print(" lost blocks (sent-recv): %d" % max(0, n_sent - n_recv)) if len(times) > 1: gaps = [b - a for (i, a, _), (j, b, _) in zip(times[:-1], times[1:])]